这篇文章是我在自己完成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。
使用切片操作的目的是将高分辨率的图像或特征图拆分成多个低分辨率的图像或特征图,即进行隔列采样和拼接。这一操作有助于减少下采样带来的信息损失,将w-h平面上的信息转换到通道维度,并通过3×3卷积的方式提取不同特征。
以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的损失函数。文章来源:https://www.toymoban.com/news/detail-469156.html
(2)非极大值抑制NMS
非极大值抑制顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索。
这个局部代表的是一个邻域,邻域的“维度”和“大小”都是可变的参数。
为了提高召回率,很直观的想法是“宁肯错杀一千,绝不放过一个”。因此在目标检测中,模型往往会提出远高于实际数量的区域提议。
这就导致最后输出的边界框数量往往远大于实际数量,而这些模型的输出边界框往往是堆叠在一起的。
因此,我们需要NMS从堆叠的边框中挑出最好的那个。
Yolov4在DIOU_Loss的基础上采用DIOU_nms的方式,而Yolov5中仍然采用加权nms的方式。
在同样的参数情况下,将nms中IOU修改成DIOU_nms。对于一些遮挡重叠的目标,确实会有一些改进。
原本两个人重叠的部分,在参数和普通的IOU_nms一致的情况下,修改成DIOU_nms,可以将两个目标检出。
虽然大多数状态下效果差不多,但在不增加计算成本的情况下,有稍微的改进也是好的。文章来源地址https://www.toymoban.com/news/detail-469156.html
到了这里,关于yolov5学习笔记整理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!