yolov5及其算法改进
1、YOLOV5目标检测简介
YOLOv5 是一个基于 Anchor 的单阶段目标检测,其主要分为以下 5 个阶段:
1、输入端:Mosaic 数据增强、自适应Anchor计算、自适应图像缩放;
2、Backbone:提取出高中低层的特征,使用了 CSP 结构、SPPF、SiLU 等操作;
3、Neck:使用 FPN+PAN 结构,将各层次的特征进行融合,并提取出大中小的特征图;
4、Head:进行最终检测部分,在特征图上应用 Anchor Box,并生成带有类别概率、类别
得分以及目标框的最终输出向量;
5、损失函数:计算预测结果与 Ground Truth 之间的 Loss。
2、前处理
2.1、自适应 Anchor 计算
在 YOLOv3、YOLOv4 中,训练不同的数据集时,计算初始 Anchor 的值是通过单独的程序运行的。但 YOLOv5 中将此功能嵌入到代码中,每次训练时会自适应的计算不同训练集中的最佳 Anchor 值。
2.2、自适应计算 Anchor 的流程如下:
1、载入数据集,得到数据集中所有数据的 w、h;
2、将每张图像中 w、h 的最大值等比例缩放到指定大小,较小边也相应缩放;
3、将 bboxes 从相对坐标改成绝对坐标(乘以缩放后的 w、h);
4、筛选 bboxes,保留 w、h 都大于等于 2 像素的 bboxes;
5、使用 k-means 聚类得到 n 个 Anchors;
6、使用遗传算法随机对 Anchors 的 w、h 进行变异,如果变异后效果变得更好就将变异后的结果赋值给 Anchors,如果变异后效果变差就跳过。
2.3、图像自适应
在常用的目标检测算法中,不同的图像长宽都不相同,因此常用的方式是将原始图像统一缩放到一个标准尺寸,再送入检测网络中。
如图所示,YOLOv5 作者认为,在项目实际应用时,很多图像的长宽比不同,因此均直接进行缩放填充后,两端的灰边大小会不同,而如果填充的比较多,则存在信息的冗余,也可能会影响推理速度。
在 YOLOv5 中作者对 Letterbox 函数中进行了修改,对原始图像自适应的添加最少的灰边。
1、计算收缩比,这里的收缩比选取的是长宽方向变化范围最小的那个:
img _ w为原始图像的宽,img _ h为原始图像的高,img _ w为模型输入图像的宽,img _ h为模型输入图像的高。
2、计算收缩后图像的长宽:
3、计算要填充的像素,这里其实就是在计算那个收缩比大的那一边需要填充的像素:
式中,dr为模型的下采样倍数,比如 YOLOv5 的下采样倍数为 32, padding_num即为要填充边的填充像素的数量,s为缩放后的图像尺寸。
1、首先计算比例:
min(416/800, 416/600)=0.52
2、计算收缩后图像的长宽:
w,h = 8000.52,6000.52=416, 312
3、计算要填充的像素:
这里其实就是在计算那个需要收缩比大的那一边需要填充的像素:
padding_num = 0.5*(32*(1-(312/32 - int(312/32))))
= 0.5 * (32*(1-(9.75-9)))
=0.5 * (32 * 0.25)=4
通过前面的计算可以知道,上下单边的填充像素数量为4,因此最终的图像尺寸为416*(312+4+4)=416*320。
3、YOLOV4与YOLOV5的架构区别
3.1、SiLU激活函数
YOLOv5的Backbone和Neck模块和YOLOv4中大致一样,都采用CSPDarkNet和FPN+PAN的结构,但是网络中其他部分进行了调整,其中YOLOv5使用的激活函数是SiLU(YOLOv4为Mish激活函数),同时YOLOv5在CSP Block中没有使用Transition First卷积
Swish激活函数具备无上界有下届、平滑、非单调的特性,Swish在深层模型上效果优于ReLU,表达式如下
β是个常数或者可训练的参数,当β=1时,也称作SiLU激活函数。
3.2、CSPBlock结构图
注意:上图中Fusion last为Fusion first
对比一下YOLOv5中的C3模块与YOLOv4中的CSPResBlock模块:
- YOLOv4的激活函数主要使用了Mish激活函数,而YOLOv5的C3 Block主要使用了SiLU激活函数,在速度上更快;
- YOLOv4的CSPResBlock同时使用了Fusion First与Fusion Last操作,而YOLOv5的C3 Block仅仅使用了Fusion Last结构;
- YOLOv4的CSPResBlock的Fusion First模块以及短梯度路径分支都是用了单卷积结构,而YOLOv5的C3 Block使用了Conv-BN-SiLU;
- YOLOv4的CSPResBlock在进行Concat特征融合后,进行了BN-Mish操作,而YOLOv5的C3 Block没有此操作。
注意:上图中Fusion last为Fusion first ,Fusion first为Fusion last
注意:上图中Fusion last为Fusion first
3.3、yolov5的spp改进
SSPF模块将经过CBS的x与一次池化后的y1、两次池化后的y2和3次池化后的y3进行拼接,然后再CBS进一步提取特征。
仔细观察不难发现,虽然SSPF对特征图进行了多次池化,但是特征图尺寸并未发生变化,通道数更不会变化,所以后续的4个输出能够在channel维度进行融合。
这一模块的主要作用是对高层特征进行提取并融合,在融合的过程中多次运用最大池化,尽可能多的去提取高层次的语义特征。
4、正负样本匹配与损失函数
4.1、坐标表示
对于之前的 YOLOv3 和 YOLOv4,使用的是如图所示的坐标表示形式:
YOLOv5 参数化坐标的方式和 YOLOv3 和 YOLOv4 是不一样的,具体如图所示:
4.2、正负样本匹配
首先,将GT与当前特征图的 3 个 Anchors 作比较,如果GT的宽与Anchor 宽的比例、GT的高与 Anchor 高的比例都处于 1/4 到4区间内,那么当前GT就能与当前特征图匹配。
然后,将当前特征图的正样本分配给对应的 Grid;如图所示在 YOLOv5 中会将一个 Grid 点分为4个象限,针对第一步中匹配的GT,会计算该GT(图中蓝点)处于4个象限中的哪一个,并将邻近的两个特征点也作为正样本。
如图所示,左边所示的GT偏向于右下象限,会将GT所在 Grid 的右、下特征点也作为正样本。而图中右边所示的GT偏向于左上象限,会将GT所在 Grid 的左、上特征点作为正样本。
相比较 YOLOv3 和 YOLOv4 匹配正样本的方式,YOLOv5的这种匹配方式能够分配更多的正样本,有助于训练加速收敛,以及正负样本的平衡。而且由于每个特征图都会将所有的 GT与当前特征图的 Anchor 计算能否分配正样本,也就说明一个GT可能会在多个特征图中都分配到正样本。
yolov3:可以匹配最多一个正样本
yolov4:可以匹配1-3个正样本
yolov5:可以匹配3-9个正样本
4.3、损失函数
YOLOv5 和 YOLOv4 一样都采用 CIoU Loss 做 Bounding Box 的回归损失函数,而分类损失和目标损失都使用的是交叉熵损失。
对于回归损失,其数学表达式如下:
式中,d,c 分别表示预测结果与标注结果中心点的欧氏距离和框的对角线距离。这样CIOU Loss 将目标框回归函数应该考虑的 3 个重要几何因素都考虑进去了:重叠面积、中心点距离、长宽比。
对于分类损失和目标损失,其数学表达式如下: