yolov5学习笔记整理

这篇文章是我在自己完成yolov5的学习之后,整理出的笔记,可供学习参考,如有错误还请指正。

首先,yolov5主要分为四个部分,输入端,backbone,neck,输出端。

一、输入端


(1)Mosaic数据增强

在Yolo-V4的paper中,以及在还未发表paper的Yolo-V5中,都有一个很重要的技巧,就是Mosaic数据增强,这种数据增强方式简单来说就是把4张图片,
通过随机缩放、随机裁减、随机排布的方式进行拼接。根据论文的说法,优点是丰富了检测物体的背景和小目标,并且在计算Batch Normalization的时候
一次会计算四张图片的数据,使得mini-batch大小不需要很大,一个GPU就可以达到比较好的效果。

优点
  丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好
  减少GPU:直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果
缺点
  如果我们的数据集本身就有很多的小目标,那么Mosaic数据增强会导致本来较小的目标变得更小,导致模型的泛化能力变差

Concat操作:张量拼接,会扩充两个张量的维度,例如26×26×256和26×26×512两个张量拼接,结果是26×26×768。Concat和cfg文件中的route功
能一样。
Add操作:张量相加,张量直接相加,不会扩充维度,例如104×104×128和104×104×128相加,结果还是104×104×128。add和cfg文件中的
shortcut功能一样。

(2)自适应锚框计算
Anchor Boxes(锚框)
由于对象检测每个格子智能检测到一个对象,但是往往一个图像中不止一个对象,于是,就有了anchor boxes这个概念
anchor boxes的形状可以自定义,于是,我们就能根据目标,定义不同形状的anchor boxes来检测出更多的对象

在yolo算法中,针对不同的数据集,都会有不同初始设定长宽的锚框
在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算两者差距,再反向更新,迭代网络参数。
在Yolov3、Yolov4中,训练不同的数据集时,计算初始锚框的值是通过单独的程序运行的。
但Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。

所以,总的来说,anchor box是这么来做的,现在每个对象和以前一样根据中心点分配到一个格子中,然后看和每
个anchor box的IoU(交并比),选择IoU最高的那个,用这个anchor box来进行预测。输出y的维度是nxnxmxc
(n为图片分成nxn份,m为anchor box数量,c为class类别数)

(3)自适应图片缩放
在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。
在Yolov5代码中datasets.py的letterbox函数中进行了修改,对原始图像自适应的添加最少的黑边。
图像高度上两端的黑边变少了,在推理时,计算量也会减少,即目标检测速度会得到提升。

二、backbone

(1)focus结构
focus结构,在yolov3和yolov4中都没有,其中比较关键的就是切片操作。
它能将4×4×3的图像,切片成2×2×12的feature map。
以yolov5s为例,原始608×608×3的图像输入focus结构,采用切片操作,304×304×12的feature map,再经过一次32个卷积核的
卷积操作,最终变成304×304×32的feature map。

(2)csp结构
CSPDarknet53是在Yolov3主干网络Darknet53的基础上,借鉴2019年CSPNet的经验,产生的Backbone结构,其中包含了5个CSP模块。
每个CSP模块前面的卷积核的大小都是3×3,步长为2,因此可以起到下采样的作用。
因为Backbone有5个CSP模块,输入图像是608*608,所以特征图变化的规律是:608->304->152->76->38->19
经过5次CSP模块后得到19*19大小的特征图。
而且作者只在Backbone中采用了Mish激活函数,网络后面仍然采用Leaky_relu激活函数
    ·mish函数和leaky_relu函数在另一个文本有有更加详细的描述
上述为yolov4中的csp结构
Yolov5与Yolov4不同点在于,Yolov4中只有主干网络使用了CSP结构,而Yolov5中设计了两种CSP结构,以Yolov5s网络为例,以CSP1_X结
构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中。
 

三、neck

FPN+PAN结构
FPN是自顶向下的,将高层的特征信息通过上采样的方式进行传递融合,得到进行预测的特征图。(个人感觉更像是经过了上采样然后再融合)
和Yolov3的FPN层不同,Yolov4在FPN层的后面还添加了一个自底向上的特征金字塔。
其中包含两个PAN结构。
这样结合操作,FPN层自顶向下传达强语义特征,而特征金字塔则自底向上传达强定位特征,两两联手,从不同的主干层对不同的检测层进行特征聚合。
上述为yolov4中的csp结构
Yolov5和Yolov4的不同点在于,Yolov4的Neck中,采用的都是普通的卷积操作。
而Yolov5的Neck结构中,采用借鉴CSPNet设计的CSP2结构,加强网络特征融合的能力。
 

四、输出端

(1)Bounding box损失函数
Yolov5中采用其中的CIOU_Loss做Bounding box的损失函数。

(2)非极大值抑制NMS
非极大值抑制顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索。
这个局部代表的是一个邻域,邻域的“维度”和“大小”都是可变的参数。
为了提高召回率,很直观的想法是“宁肯错杀一千,绝不放过一个”。因此在目标检测中,模型往往会提出远高于实际数量的区域提议。
这就导致最后输出的边界框数量往往远大于实际数量,而这些模型的输出边界框往往是堆叠在一起的。
因此,我们需要NMS从堆叠的边框中挑出最好的那个。
Yolov4在DIOU_Loss的基础上采用DIOU_nms的方式,而Yolov5中仍然采用加权nms的方式。
在同样的参数情况下,将nms中IOU修改成DIOU_nms。对于一些遮挡重叠的目标,确实会有一些改进。
原本两个人重叠的部分,在参数和普通的IOU_nms一致的情况下,修改成DIOU_nms,可以将两个目标检出。
虽然大多数状态下效果差不多,但在不增加计算成本的情况下,有稍微的改进也是好的。

你可能感兴趣的:(学习,目标检测,计算机视觉,深度学习)