YOLOv5 目标检测

Posted 一颗小树x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YOLOv5 目标检测相关的知识,希望对你有一定的参考价值。

前言

YOLOv5官方发布的代码中,检测网络共有四个版本,依次为YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x 。其中YOLOv5s是“深度”和“特征图宽度”均最小的网络,另外三种可以认为是在其基础上,进行了加深、加宽。

看一下YOLOv5各个版本,在 COCO 数据集中的性能对比:

Modelsize
(pixels)
mAPval
0.5:0.95
mAPtest
0.5:0.95
mAPval
0.5
Speed
V100 (ms)
params
(M)
FLOPs
640 (B)
YOLOv5s64036.736.755.42.07.317.0
YOLOv5m64044.544.563.12.721.451.3
YOLOv5l64048.248.266.93.847.0115.4
YOLOv5x64050.450.468.86.187.7218.8
YOLOv5s6128043.343.361.94.312.717.4
YOLOv5m6128050.550.568.78.435.952.4
YOLOv5l6128053.453.471.112.377.2117.7
YOLOv5x6128054.454.472.022.4141.8222.9
YOLOv5x6 TTA128055.055.072.070.8--

 直观的看一下YOLOv5各个版本与EfficientDet的性能对比:

YOLOv5s 模型140FPS的推理速度非常惊艳。本文主要介绍YOLOv5s。

论文地址:尴尬,无;官方暂时没正式的论文。如果后面出了,麻烦call我一声。

Pytorch-YOLOv5 开源代码:https://github.com/ultralytics/yolov5

Yolov5_DeepSort_Pytorch:https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch

目录

一、网络结构

二、输入端

2.1 Mosaic马赛克增强

2.2 自适应锚框计算

2.3 自适应图片缩放

三、BackBone层

3.1 CSPDarknet53结构

3.2 Focus结构

四、Neck连接结构

4.1 PANet 结构

4.2 YOLOv5 Neck结构

五、输出层

5.1 多尺度特征检测

5.2 输出维度含义

5.3 DIOU_nms损失函数

5.4 CIOU_Loss损失函数

六、模型效果

参考文献


一、网络结构

YOLOv5s 整体网络可以分为4部分组成,分别是输入端、BackBone主干网络、Neck连接结构、Prediction Head输出然后预测。 先看一下整体的网络结构:

  1. 输入端,输入608*608的图像,进行三种数据增强:自适应图片缩放、色彩空间调整、Mosaic马赛克增强;还支持“自适应锚框计算”。
  2. BackBone主干网络,用于提取图像特征;v4和v5版本都使用CSPDarknet53作为主干网络。新思路是使用了Focus结构。
  3. Neck连接结构,用于连接BackBone主干网络和Head输出层。Yolov5的Neck 部分采用了 PANet 结构,Neck 主要用于生成特征金字塔。特征金字塔会增强模型对于不同缩放尺度对象的检测,从而能够识别不同大小和尺度的同一个物体。v4和v5版本都使用PAN结构作为Neck来聚合特征。这里还加入了CSP结构!!!
  4. Head输出层,用来完成目标检测结果的输出。模型Head与之前的YOLOv3和v4版本相似。训练时的损失函数GIOU_Loss,以及预测框筛选的DIOU_nms。输出的3个特征图,进行目标检测。

输入一张608*608的图像,CSPDarknet-53 网络后得到了 3 个分支,这些分支在经过SSP+PAN结构最终得到了三个尺寸不一的 feature map,形状分别为 [19, 19, 255]、[38, 38, 255] 和 [76, 76, 255]。 

输出的3个特征图中的255是指: 先验框个数*(5 + 类别个数)即:255 = 3*(5+80)

 对比一下YOLOv4 的网络结构,如下图所示:可以发现 YOLOv4 与YOLOv5 在结构上基本相似,只是在细节上稍有差异。 【经典论文解读】YOLOv4 目标检测

二、输入端

输入端进行三种数据增强:自适应图片缩放、Mosaic马赛克增强;还支持“自适应锚框计算”。
 

2.1 Mosaic马赛克增强

Mosaic 是一种数据增强方法。在Cutmix中组合了两张图像,而Mosaic 将 4 张训练图像组合成1张进行训练。

作用:增强了对正常背景(context)之外的对象的检测。每个 mini-batch 包含大量的图像,使用Mosaic后:是原来 mini-batch 所包含图像数量的 4 倍,因此,减少了估计均值和方差的时需要大mini-batch的要求。

2.2 自适应锚框计算

共同点:YOLOv2、v3、v4、v5版本中,其中通过聚类提取先验框尺度,针对不同的数据集,都需要设定特定长宽的锚点框。(对了YOLOv1不用锚框的)

区别:v2、v3、v4版本训练不同的数据集时,都是通过单独的程序运行来获得初始锚点框。

v5版本将此功能嵌入到代码中,每次训练时,根据数据集的名称自适应的计算出最佳的锚点框,用户可以根据自己的需求将功能关闭或者打开。

2.3 自适应图片缩放

自适应图片缩放操作仅在模型推理阶段执行,模型训练阶段仍然和传统的方法相同,将原始图片裁剪到416*416大小。

首先根据原始图片大小与输入到网络图片大小计算 缩放比例。比如输入一张800*600的图片,需要变换为长宽416*416大小的图片。那么“缩放比例”是:416 / 800 = 0.52;   416 / 600 = 0.69; 

然后根据原始图片大小与“其中一个缩放比例”计算缩放后的图片大小。比如,以0.52的缩放比例,进行缩放图片。那么输入800*600图片,进行缩放:800 * 0.52 =416;  600 * 0.42 = 312;

此时,图片的长符合416;图片的宽是312,暂时不符合416,需要进行变换:

416表示YOLOv5网络所要求的图片宽度,312表示缩放后图片的宽度。首先执行相减操作来获得需要填充的黑边长度104;然后对该数值执行取余操作,即104%32=8,使用32是因为整个YOLOv5网络执行了5次下采样操作,即;最后对该数值除以2,即将填充的区域分散到两边。这样将416*416大小的图片缩小到416*320大小,因而极大的提升了算法的推理速度。

三、BackBone层

BackBone层也称主干网络,使用CSPDarknet53网络提取特征;新思路是使用了Focus结构。

3.1 CSPDarknet53结构

CSPDarknet53是基于Darknet53,借鉴CSPNet,进行了一些改进,使得模型既保证了推理速度和准确率,又减小了模型尺寸。v5版本在 Backbone中,使用带有残差结构的 CSP1_X,因为Backbone网络较深,残差结构的加入使得层和层之间进行反向传播时,梯度值得到增强,有效防止网络加深时所引起的梯度消失,得到的特征粒度更细。

首先介绍一下CSPNet,全称是Cross Stage Partial Networks,也就是“跨阶段局部网络”。

 CSPNet 主要从网络结构设计的角度解决推理中“计算量大”的问题。CSPNet 的作者认为推理计算过高的问题是由于“网络优化中的梯度信息重复”导致的。 因此采用CSP先将基础层的特征映射划分为两部分,然后通过“跨阶段层次结构”将它们合并,在减少了计算量的同时可以保证准确率。CSP 连接如下图所示:

 不同类型的特征融合策略: (a) 单路径 DenseNet;(b) 提出的 CSPDenseNet:转换 → 串联 → 转换。

CSPNet论文地址:CSPNet: A New Backbone that can Enhance Learning Capability of CNN

检测效果好需要以下几点:

  • 更大的网络输入分辨率——用于检测小目标
  • 更深的网络层——能够覆盖更大面积的感受野
  • 更多的参数——更好的检测同一图像内不同size的目标

YOLOv4中,选择了具有CSP的darknet53,而是没有选择在imagenet 图像分类上跑分更高的CSPResNext50;因为在目标检测领域的精度来说,CSPDarknet53是要强于 CSPResNext50。

CSPDarknet53解决了一些大型卷积神经网络框架Backbone中网络优化的“梯度信息重复问题”。它是将梯度的变化从头到尾地集成到特征图中,因此减少了模型的参数量。

CSPDarknet53实际上是基于Densnet的思想,“复制基础层的特征映射图”,通过dense block发送副本到下一个阶段,从而将基础层的特征映射图分离出来。这样可以有效缓解梯度消失问题(通过非常深的网络很难去反推丢失信号) ,支持特征传播,鼓励网络重用特征,从而减少网络参数数量。 

CSPDarknet53 结构就如下图:

3.2 Focus结构

Focus是一种对 feature map 的切片操作,把宽度 w 和高度 h 的信息整合到 c 维度。

具体来说就是将相距为 2 的四个位置进行堆叠到一个通道上去,因此长 h 和宽 w 都缩小两倍,通道 c 数增加了4倍,Focus模块设计用于降低FLOPS和提高速度,而不是提高mAP。

上图以一个的简单的 3*4*4 输入图片为例。对于红色的区域,宽和高都从 0 开始,每隔两个步长取值;黄色的区域,宽和高都从 1 开始,每隔两个步长取值;依次类推,对三个通道都采取这样的切片操作。最后将所有的切片,按照通道 concat 在一起,得到一个12*2*2的特征图。
 

四、Neck连接结构

Neck连接结构,用于连接BackBone主干网络和Head输出层。Yolov5的Neck 部分采用了 PANet 结构,Neck 主要用于生成特征金字塔。特征金字塔会增强模型对于不同缩放尺度对象的检测,从而能够识别不同大小和尺度的同一个物体。这里还加入了CSP结构!!!

4.1 PANet 结构

PANet,全称Path Aggregation Network;主要用来融合不同尺寸特征图的特征信息。PANet基于 Mask R-CNN 和 FPN 框架,同时加强了信息传播。

该网络的特征提取器采用了一种新的增强自下向上路径的 FPN 结构,改善了低层特征的传播。第三条通路的每个阶段都将前一阶段的特征映射作为输入,并用3x3卷积层处理它们。

 先看看下图:FPN是(a)中网络结构,PANet在此基础上增加了自底向上的路径(b),使低层信息更容易传播到顶层。

在FPN中,局部空间信息在红色箭头处向上传递。虽然图中没有清楚地显示,但红色的路径经过了大约100多个层。PAN引入了 short-cut 路径(绿色通道),只需要大约10层去顶部的N₅层。这种short-circuit 的概念使得最上层可以获得精确的局部信息。 

输出通过横向连接被添加到自上而下通路的同一阶段特征图中,这些特征图为下一阶段提供信息。

同时使用自适应特征池化(Adaptive feature pooling)恢复每个候选区域和所有特征层次之间被破坏的信息路径,聚合每个特征层次上的每个候选区域,避免被任意分配。

下面介绍早期深度学习中的结构、DenseNet结构、FPN结构,最后PAN结构。

在早期深度学习中,模型设计相对简单。每一层从前一层获取输入。浅层提取局部纹理和模式信息,建立后续层所需的语义信息。然而,当我们向右移动时,微调预测结果时所需的局部信息可能会丢失。

  在后来的深度学习发展中,层之间的互相连接变得越来越复杂。在DenseNet,它走到了极致。每一层都与之前的所有层相连。

后面发展到FPN,其全名是Feature Pyramid Networks,中文称为特征金字塔网络;FPN的预测是在不同特征层独立进行的,即:同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到预测的效果。

作者认为足够低层高分辨的特征对于检测小物体是很有帮助的。 

自底向上的过程也称为下采样,feature map尺寸在逐渐减小,同时提取到的特征语义信息逐渐丰富。在下采样过程中,feature map的大小在经过某些层后会改变,而在经过其他一些层的时候不会改变,作者将不改变feature map大小的层归为一个stage,因此每次抽取的特征都是每个stage的最后一个层输出,这样就能构成特征金字塔。

自顶向下的过程也称为上采样(upsampling)进行,而横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合(merge)。其中,1*1的卷积核减少卷积核的个数,也就是减少feature map的个数,并不改变feature map的尺寸大小。

可以看看这篇文章:FPN 用于目标检测的特征金字塔网络

接着发展到了PANet。

Neck连接结构小结:

4.2 YOLOv5 Neck结构

YOLOv5 Neck结构:PANet结构 + 生成特征金字塔 +CSP。它在 Neck 中使用 CSP2_X,相对于单纯的 CBL 将主干网络的输出分成了两个分支,后将其 concat,使网络对特征的融合能力得到加强,保留了更丰富的特征信息。

YOLOv4的Neck结构中,采用的都是普通的卷积操作。而YOLOv5的Neck网络中,采用借鉴CSPnet设计的CSP2结构,从而加强网络特征融合能力。

  YOLOv5 四种网络结构差异:

五、输出层

 Head输出层:输出层的锚框机制与YOLOv3相同,其中通过聚类提取先验框尺度,并约束预测边框的位置。主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的DIOU_nms。

5.1 多尺度特征检测

模型输出3种尺度的张量,19*19*255、38*38*255、72*72*255,这里体现了多尺度特征检测的特点。为什么要输出3种尺度的张量呢?

低层高分辨的特征 对于检测小物体是很有帮助的,低层高分辨的特征 对应76*76;(相对于输出608*608图像,做了8倍下采样,感受野较小)

高层抽象的特征 适合检测大物体,高层抽象的特征 对应19*19;(相对于输出608*608图像,做了32倍下采样,感受野较大)

38*38 适合检测一般大小的物体,感受野中等大小。

5.2 输出维度含义

模型输出3种尺度的张量,19*19*255、38*38*255、72*72*255。为什么都是输出255维的呢?

一个网格的维度 = 先验框数量 *( 坐标x、坐标y、宽度、高度、置信度 + 类别 )

即:255= 3 * (5 + 80) 

先验框数量 在每个尺度的特征图的每个网格设置3个先验框。即:每种尺度的输出张量,都有互不相同的3个先验框Anchor Boxes;13*13 用来检测大物体,使用3个尺寸较大的先验框;52*52 用来检测小物体,使用3个尺寸较小的先验框;26*26 用来检测一般大小物体,使用3个尺寸中等的先验框。这里一共有9个不同大小的先验框。

先验框维度 先验框中心坐标x、y;框的宽、高;这4个维度用来表达先验框的位置信息;还是框的置信度,是表示框内包含物体的概率。一共5维。

类别 如果用COCO数据集训练,一共有80种物体。 

5.3 DIOU_nms损失函数

IOU Loss:考虑检测框和目标框重叠面积。

GIOU Loss:在IOU的基础上,解决边界框不重合时的问题。

DIOU Loss:在IOU的基础上,考虑边界框中心距离的信息。

5.4 CIOU_Loss损失函数

CIOU Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。

详细原理参考:https://blog.csdn.net/qq_37099552/article/details/104464878

https://zhuanlan.zhihu.com/p/104236411

六、模型效果

 看一下YOLOv5各个版本,在 COCO 数据集中的性能对比:

Modelsize
(pixels)
mAPval
0.5:0.95
mAPtest
0.5:0.95
mAPval
0.5
Speed
V100 (ms)
params
(M)
FLOPs
640 (B)
YOLOv5s64036.736.755.42.07.317.0
YOLOv5m64044.544.563.12.721.451.3
YOLOv5l64048.248.266.93.847.0115.4
YOLOv5x64050.450.468.86.187.7218.8
YOLOv5s6128043.343.361.94.312.717.4
YOLOv5m6128050.550.568.78.435.952.4
YOLOv5l6128053.453.471.112.377.2117.7
YOLOv5x6128054.454.472.022.4141.8222.9
YOLOv5x6 TTA128055.055.072.070.8--

YOLOv5目标检测效果:

1)负责交通路口检测效果

 2)室内场景检测效果

3)移动端检测效果

参考文献

[1] https://mp.csdn.net/mp_blog/creation/editor/119673960

[2] https://github.com/ultralytics/yolov5

[3] https://blog.csdn.net/WZZ18191171661/article/details/113789486

[4] https://zhuanlan.zhihu.com/p/335345293

[5] https://zhuanlan.zhihu.com/p/161083602

[6] https://colab.research.google.com/github/pytorch/pytorch.github.io/blob/master/assets/hub/ultralytics_yolov5.ipynb#scrollTo=8dRTYXmK-5Rn

[7] YOLOv5算法改进及其现实应用

本篇文章只供参考学习,谢谢。

以上是关于YOLOv5 目标检测的主要内容,如果未能解决你的问题,请参考以下文章

目标检测 YOLOv5 开源代码项目-环境配置问题

深度学习目标检测:YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)

深度学习目标检测:YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)

Pyqt搭建YOLOV5目标检测界面

YOLOv5 目标检测

YOLOv5 目标检测