YOLOv5算法的部分笔记

YOLOv5算法的部分笔记

yolov5还在快速度更新中,本文是以第三版为例所写,可能和最新的第四版有所出入,但变化应该不会很大。写此文主要是为了本人梳理yolov5知识点所用,若能帮助到他人,深感荣幸。本文内容主要来自笔者看yolov5代码、以下的知乎帖子,很多图、代码解析的内容都是从以下帖子中或借鉴、或摘抄而来,强烈建议大家先看一下这些大佬的帖子。
[1] https://zhuanlan.zhihu.com/p/172121380
[2] https://zhuanlan.zhihu.com/p/161083602
[3] https://zhuanlan.zhihu.com/p/183838757

1. mosaic增强方法

在yolov5中,mosaic增强方法的流程如下:
(1)原始图像缩放到固定尺寸:原始图像等比例缩放,长边缩放到640,短边不作限制。注意,此阶段只是等比例缩放,向上缩放和向下缩放使用的差值方法不同,短边不进行padding到 640大小。

(2)图像拼接:先生成一个1280x1280的空矩阵,用于存储拼接后的图像;然后随机选择一个拼接点,这个拼接点的范围限定在大图中心区域[640,640]范围内(笔者试过把中心范围改得小一点,但是精度会下降);然后依次将四张640x640的图像放在大图的左上、右上左下、右下的位置,如果超出了1280x1280的范围,则超出部分被丢弃,如果图像较小没有填充满,则填充像素114,由此构成拼接后的大图。

(3)调整groundtruth框:根据拼接后的1280x1280的大图,将640x640小图上的groundtruth坐标调整为大图上的坐标,并把超出大图边界的坐标部分舍去。

(4)随机perspective增强、截取640x640图像:官方代码采用了随机缩放、随机平移,自定义的话还可以使用随机旋转、随机剪切等。同时,这一步也将大图1280x1280调整为640x640大小,但是并没有采用reshape的方法,而是直接截取中间(640,640)的区域。
这一步很关键,之前笔者误以为mosaic增强是把1280x1280的大图缩放到640x640大小,这样一来可以增加小目标的数量,从而得出结论mosaic增强可以提高小目标检测能力。但是在看过yolov5代码后,我发现mosaic增强只是把4张等比例缩放(这种等比例缩放其它检测算法也都会做的)的图像拼接在一起、从而使送入网络的图像更加丰富,而没有增加小目标的数量。

(5)调整groundtruth框:在进行随机perspective增强后,对groundtruth框坐标也进行相应的调整,同时将调整后的面积过小的groundtruth框去掉。

(6)进行HSV颜色空间增强、上下/左右翻转、mixup增强,之后得到的图像就可以直接送入网络了。

2.损失函数

2.1正负样本匹配策略

       本文的正负样本指的都是预测框而不是groundtruth框。正负样本是根据groundtruth框和anchor的匹配情况来确定的。
       yolov3/4采用的都是基于IOU的匹配策略,而 Yolov5采用的是基于宽高比例的匹配策略。具体而言,对每一个groundtruth框,分别计算它与9种anchor的宽与宽的比值、高与高的比值,在宽比值、高比值这2个比值中,取最极端的一个比值,作为groundtruth框和anchor的比值,具体实现的伪代码为:max( anchor / groundtruth, groundtruth / anchor )。
       得到groundtruth框和anchor的比值后,若这个比值小于设定的比值阈值,那么这个anchor就负责预测groundtruth框,这个anchor的预测框就被称为正样本,所有其它的预测框都是负样本,yolov5中没有忽略样本。

2.2 正样本个数的增加策略

       yolov5共有3个预测分支(FPN、PAN结构),共有9种不同大小的anchor,每个预测分支上有3种不同大小的anchor。
       Yolov5算法通过以下3种方法大幅增加正样本个数:
(1)跨预测分支预测:假设一个groundtruth框可以和2个甚至3个预测分支上的anchor匹配,则这2个或3个预测分支都可以预测该groundtruth框,即一个groundtruth框可以由多个预测分支来预测。
(2)跨网格预测:假设一个groundtruth框落在了某个预测分支的某个网格内,则该网格有左、上、右、下4个邻域网格,根据groundtruth框的中心位置,将最近的2个邻域网格也作为预测网格,也即一个groundtruth框可以由3个网格来预测;
(3)跨anchor预测:假设一个groundtruth框落在了某个预测分支的某个网格内,该网格具有3种不同大小anchor,若groundtruth可以和这3种anchor中的多种anchor匹配,则这些匹配的anchor都可以来预测该groundtruth框,即一个groundtruth框可以使用多种anchor来预测。

2.3 损失函数

       分为坐标损失(loss_giou)、目标置信度损失(loss_obj)和分类损失(loss_cls)三部分。其中目标置信度损失和分类损失采用BCEWithLogitsLoss(带log的二值交叉熵损失),坐标损失采用CIoU损失。虽然代码里面损失的变量名字写的是giou,但是通过看代码可以发现,其损失的代码实现中写了GIOU/DIOU/CIOU三种方法,默认情况下使用的是CIOU损失。

       3个预测分支上的分类损失、坐标损失直接相加,得到总的分类损失和坐标损失,而3个预测分支上的目标置信度损失需要进行加权再相加,得到总的目标置信度损失,权中分别为[4.0, 1.0, 0.4],其中4.0是用在大特征图(预测小目标)上,所以,这里的加权,我认为是旨在提高小目标的检测精度。
最后将分类损失、坐标损失、置信度损失直接相加,得到一个总损失(每张图像的平均总损失),再乘以batch的大小,得到用于更新梯度的损失。

上一篇:coco2017与yolov5


下一篇:win10环境 Yolov5 + pytorch 运行成功