Yolov5原理详细解析!一文看懂
引言
Yolo(You Only Look Once)是一种one-stage目标检测算法,即仅需要 “看” 一次就可以识别出图片中物体的class类别和边界框。Yolov5是由Alexey Bochkovskiy等人在YOLO系列算法的基础上进行改进和优化而开发的,使其性能与精度都得到了极大的提升。
Yolov5推出了Yolov5s、Yolov5m、Yolov5l、Yolov5x等四个版本的目标检测网络。四个模型的结构基本一致,区别主要在于模型深度depth_multiple和模型宽度width_multiple这两个参数,如下图所示。
如下图所示是Yolov5算法在COCO数据集上的测试结果。其中,Yolov5s是深度最浅、特征图宽度最小的网络,速度最快,AP精度也最低。其它的三种网络,在Yolov5s基础上,不断加深加宽,AP精度也不断提升,但速度的消耗也在不断增加。
笔者本文将以Yolov5s网络为主线进行分析。
Yolov5网络结构
Yolov5的网络结构如下图所示,主要包括Input、Backbone骨干网络、Neck颈部结构和Head头部结构(Prediction)四个模块,分别负责输入图片预处理、特征提取、特征融合、输出检测信息。其中,Backbone模块使用BottleNeckCSP结构从输入图像中提取丰富的信息特征。输入图像尺寸是608x608,特征图变化的规律是:608->304->152->76->38->19。
其中,
- Backbone(BottleNeckCSP结构):由Focus结构、三组CBL+CSP1_x和CBL+SPP串行搭建。
- CBL:由卷积Conv+批量归一化BN+激活函数Leaky Relu组成。
- Focus:对图像进行切片后再Concat。
- CSP1_x:借鉴了CSPNet网络结构,由CBL模块、Res uint模块以及卷积层Concat组成,其中x表示有x个CSP1模块。
- CSP2_x:不再使用Res unit,由卷积层CBL模块Concat组成。
- SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。
- Res unit:残差组件,输入通过两个CBL后,再与原输入进行add。这是一种常规的残差单元,以使得网络可以提取到更深层的特征,同时避免出现梯度消失或爆炸。
- 上采样:利用元素复制扩充的方法使得特征图尺寸扩大,例如线性插值。
- Concat:张量拼接,会扩充两个张量的维度,实现多尺度特征融合。例如26×26×256和26×26×512两个张量拼接,结果是26×26×768。
- Add:张量相加,张量直接相加,不会扩充维度,例如104×104×128和104×104×128相加,结果还是104×104×128。
- Y1、Y2、Y3:表示Yolov5三种尺度的输出。
输入端
输入端主要对输入图片进行预处理。该网络输入图像大小为608*608,预处理主要是将输入图像缩放至网络的输入大小,并进行归一化等操作。在网络训练阶段,Yolov5与Yolov4同样使用了Mosaic数据增强操作以提升模型的训练速度和网络精度;并提出了一种自适应锚框计算与自适应图片缩放方法。
Mosaic数据增强
Yolov5的输入端与Yolov4同样采用了Mosaic数据增强,对4张图片随机缩放、随机裁剪、随机排布之后再拼接。Mosaic具体步骤如下:
步骤1:从数据集中每次随机读取四张图片;
步骤2:分别对四张图片进行翻转(对原始图片进行左右的翻转)、缩放(对原始图片进行大小的缩放)、色域变化(对原始图片的明亮度、饱和度、色调进行改变)等操作;
步骤3:将四张图片组合到一张图片中,并筛除掉一些没用的框。
Mosaic数据增强主要有如下两个优点:
- 丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,尤其是随机缩放增加了很多小目标,从而提升了网络的鲁棒性。
- 节省GPU:Mosaic增强训练时,可以直接计算4张图片的数据,无需较大的mini batch,一个GPU就可以达到比较好的效果。
- 提升小目标检测性能:Mosaic数据增强图像由四张原始图像拼接而成,这样每张图像会有更大概率包含小目标,从而提升了模型的检测能力。
自适应锚框计算
Yolo系列算法中,针对不同的数据集,均需要设定固定长宽的初始锚框Anchor。网络训练阶段,模型会在初始锚框的基础上输出对应的预测框,并计算其与真实框Groung Truth之间的差距,并执行反向更新操作,迭代更新整个网络的参数。因此设定初始锚点框是关键的一环。Yolov5模型在每次训练时,根据数据集的名称自适应计算出最佳锚点框。Yolov5在COCO数据集上的初始锚框Anchor设定如下:
anchors:
#最小的特征图上的锚框
- [10,13, 16,30, 33,23] # P3/8
#中间特征图上的锚框
- [30,61, 62,45, 59,119] # P4/16
#最大特征图上的锚框
- [116,90, 156,198, 373,326] # P5/32
在Yolov3/Yolov4中,训练不同的数据集时,计算初始锚框的值通过单独的程序运行。但是在Yolov5中此功能嵌入到源代码中,每次训练时,可以自适应计算不同训练集中的最佳锚框。
parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')
自适应图片缩放
传统的缩放方式都是按照原始比例缩放图像并用黑色填充至目标大小,由于实际的使用中很多图片的宽高比不同,因此缩放填充之后,两端的黑边大小不一定相同,而如果填充过多,则会存在大量的信息冗余,从而影响整个算法的推理速度。
Yolov5算法则提出Letterbox方法,能够自适应的添加最少的黑边到缩放之后的图片中,这样推理时计算量减少,目标检测速度也会得到提升。具体实现步骤如下:
步骤1:计算缩放比例。如下图所示,原始缩放尺寸为416x416,都除以原始图像尺寸,可以得到0.52和0.69两个缩放系数,选择较小系数0.52。
步骤2:计算缩放后的尺寸。原始图片的长宽都乘以最小缩放系数0.52,宽变成了416,高变为312。
步骤3:计算黑边填充数值。将416-312=104,得到原本需要填充的高度。采用numpy中np.mod取余数的方式,得到8个像素,再除以2,即得到图片高度两端需要填充的数值。
注意: :缩减黑边方式仅在模型推理时使用,用于提高目标检测及推理速度。训练时仍采用传统填充方式,即缩放到416x416大小。
为什么np.mod函数的后面用32?
- 因为Yolov5的网络经过5次下采样,而2的5次方,等于32。所以至少要去掉32的倍数,再进行取余。
Backbone
Focus
Yolov5与Yolov4相比,添加了Focus结构。其中最关键的是切片操作。例如下图(右)所示,在每张图片中每隔一个像素采集一个值,这样可组合为4张互补且无信息丢失的图片,同时将宽高信息集中到通道空间,输入通道扩充4倍,拼接后的图片相对于原图片的RGB三通道模式变为12通道,即4x4x3的图像经切片后变为了2x2x12的特征图。
而在Yolov5s网络结构中,608x608x3的图像输入经Focus结构,进行切片操作,先变为304x304x12的特征图,再经过一次32个卷积核的卷积操作,最终变为304x304x32的特征图。
CSP结构
早在Yolov4网络结构中,便借鉴了CSPNet的设计思路,在主干网络中使用了CSP结构。Yolov5则是设计了两种CSP结构,其中CSP1_x结构应用于Backbone主干网络,另一种CSP2_x结构应用于Neck中。
Neck
Yolov5更新后的Neck与Yolov4同采用了FPN+PAN结构,如下图所示。
- 整个网络的输入为608x608,然后经过CSP模块,生成一个76x76大小的特征映射,再经过两次下采样操作之后生成19x19的特征映射。
- 接着传入FPN结构,依次对19x19、38x38、76x76执行融合操作,即先对比较小的特征映射层执行上采样操作,将其调整成相同大小,然后将两个同等大小的特征映射叠加起来。通过FPN操作可以将19x19大小的特征映射调整为76x76大小,这样不仅提升了特征映射的大小,可以更好的解决检测中尺度问题,而且增加了网络的深度,提升了网络的鲁棒性。
- 最后将其传入PAN结构,PANet网络的PAN结构是将两个相同大小的特征映射执行按位加操作,YOLOv5与Yolov4中同样使用Concat操作来代替它。经过两个PAN结构,可将76x76大小的特征映射重新调整为19x19大小,这样可以在一定程度上提升该算法的目标定位能力。
FPN层自顶向下可以捕获强语义特征,而PAN则通过自底向上传达强定位特征,通过组合这两个模块,可以很好的完成目标定位的功能。
但是,Yolov4的Neck结构中,采用的都是普通的卷积操作;而Yolov5的Neck中,采用了借鉴CSPnet设计的CSP2结构,从而加强网络特征融合能力。如下图所示。
Prediction
GIoU Loss
Yolov5延用了Yolov3和Yolov4的多尺度融合检测方法,与Yolov4采用CIOU_Loss作为Bounding box损失函数不同的是,Yolov5中采用GIOU_Loss作为Bounding box的损失函数。
IoU Loss
IoU即为交并比,用于度量目标检测中预测框与真实框的重叠程度。计算公式如下:
显而易见,IoU的值越高也说明预测框与真实框重合程度越高,模型预测越准确。反之,IoU越低模型性能越差。
IoU Loss计算公式如下:
由下图可以看出,如果两个目标没有重叠,IoU将会为0,并且不会反应两个目标之间的距离,在这种无重叠目标的情况下,如果IoU用作于损失函数,梯度为0,无法优化。
并且,IoU无法区分两个对象之间不同的对齐方式。更通俗的理解就是,不同方向上有相同交叉级别的两个重叠对象的IoU会完全相等。
GIoU(Generalized IoU)Loss
GIoU加入了C检测框(C检测框是包含了检测框和真实框的最小矩形框),这样就可以解决检测框和真实框没有重叠的问题。但是当检测框和真实框之间出现包含的现象的时候GIoU就和IoU loss是同样的效果了。GIoU Loss计算如下:
NMS非极大值抑制
在目标检测的后处理过程中,针对很多目标框的筛选,通常需要进行NMS操作。Yolov4在DIOU_Loss的基础上采用DIOU_nms的方式,而Yolov5中仍然采用加权NMS的方式。
加权NMS通过分类置信度和IOU对同类物体所有的边框坐标进行加权平均,并归一化。其中加权对象包括目标物自身和IOU>阈值的相邻框。
假定所有的Box来自相同的物体,通过考虑非极大结果充分考虑了目标的信息,提出了如下的非极大权重(Non-Maximum Weighting):
至此,关于Yolov5算法原理的梳理基本完成。
更多推荐
所有评论(0)