AI大视觉(十八) | Yolo v5的改进思想

 本文来自公众号“每日一醒”git

Yolo v5一共有四个模型,分别为Yolov5s、Yolov5m、Yolov5l、Yolov5x。算法

Yolov5s网络最小,速度最少,AP精度也最低,若是检测的以大目标为主,追求速度,倒也是个不错的选择。网络

其余的三种网络,在此基础上,不断加深加宽网络,AP精度也不断提高,但速度的消耗也在不断增长。app

 

YOLOV5的改进函数

一、backbone:CSPDarkNet53+Focus性能

二、neck:SPP+PAN学习

三、head:YOLOv3测试

四、自适应图片缩放优化

五、数据加强:马赛克(Mosaic)spa

六、自适应锚框计算

七、激活函数:Leaky ReLU 和 Sigmoid 激活函数。

八、损失函数:GIOU

九、跨网格预测(新的Loss计算方法)

 

Focus

Focus从高分辨率图像中,周期性的抽出像素点重构到低分辨率图像中,即将图像相邻的四个位置进行堆叠,聚焦wh维度信息到c通道空间,提升每一个点感觉野,并减小原始信息的丢失,该模块的设计主要是减小计算量加快速度。

以Yolov5s的结构为例,原始640*640*3的图像输入Focus结构,采用切片操做,先变成320*320*12的特征图,再通过一次32个卷积核的卷积操做,最终变成320*320*32的特征图。

简单来讲就是把数据切分为4份,每份数据都是至关于2倍下采样获得的,而后在channel维度进行拼接,最后进行卷积操做。

(4*4*3的图像切片后变成2*2*12的特征图)

 

Focus示意图:

 

 

为何要加fucus?

其最大好处是能够最大程度的减小信息损失而进行下采样操做。

 

 

CSP(跨阶段局部网络)

跨阶段局部网络缓解之前须要大量推理计算的问题。

Yolov4中只有主干网络使用了CSP结构,而Yolov5中设计了两种CSP结构。

以Yolov5s网络为例,CSP1_X结构应用于Backbone主干网络,另外一种CSP2_X结构则应用于Neck中。

Yolov4的Neck结构中,采用的都是普通的卷积操做。

Yolov5的Neck结构中,采用借鉴CSPnet设计的CSP2结构,增强网络特征融合的能力。

CSP示意图:

 

CSP代码实现:

Res unit模块:

 

 

SPP

SPP模块(空间金字塔池化模块), 分别采用五、九、13的最大池化,再进行concat融合,提升感觉野。

SPP的输入是512x20x20,通过1x1的卷积层后输出256x20x20,而后通过并列的三个Maxpool进行下采样,将结果与其初始特征相加,输出1024x20x20,最后用512的卷积核将其恢复到512x20x20。

SPP示意图:

SPP代码实现:

 

 

自适应锚框计算

在 yolov三、v4 中是采用 kmean 和遗传算法对自定义数据集进行分析,得到合适自定义数据集中对象边界框预测的预设锚点框,计算初始锚框的值是经过单独的程序运行的。

在YOLO V5 中锚定框是基于训练数据自动学习的,此功能嵌入到代码中,每次训练时,自适应的计算不一样训练集中的最佳锚框值。

在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算二者差距,再反向更新,迭代网络参数。

所以初始锚框也是比较重要的一部分,好比Yolov5在Coco数据集上初始设定的锚框:

 

自适应图片缩放

在项目实际使用时,不少图片的长宽比不一样,所以缩放填充后,两端的黑边大小都不一样,而若是填充的比较多,则存在信息冗余,影响推理速度。

Yolov5的代码中datasets.py的letterbox函数中进行了修改,对原始图像自适应的添加最少的黑边。

图像高度上两端的黑边变少了,在推理时,计算量也会减小,即目标检测速度会获得提高。

经过这种简单的改进,推理速度获得了37%的提高,能够说效果很明显。

 

 

训练时没有采用缩减黑边的方式,仍是采用传统填充的方式,即缩放到416*416大小。                                                                                                                只是在测试,使用模型推理时,才采用缩减黑边的方式,提升目标检测,推理的速度。

 

 

 

 

 

 

GIOU

Yolov5采用GIOU_Loss作Bounding box的损失函数,使用 二进制交叉熵(BCE) 和 Logits 损失函数 计算类几率和目标得分的损失。

进化二:不相交时,IOU=0,两个框距离变换,IOU loss不变,改进为GIOU。

GIOU Loss,在IOU的基础上引入了预测框和真实框的最小外接矩形。

GIoU公式:

 GIoU Loss公式:

 

GIOU算法流程以下:

 

当两框彻底重合时取最小值0,当两框的边外切时,损失函数值为1;

当两框分离且距离很远时,损失函数值为2。

使用外接矩形的方法不只能够反应重叠区域的面积,还能够计算非重叠区域的比例,所以GIOU损失函数能更好的反应真实框和预测框的重合程度和远近距离。

 

GIOU Loss存在的问题:

1)包含时计算获得的IOU、GIOU数值相等,损失函数值与IOUloss 同样,没法很好的衡量其相对的位置关系。

2)同时在计算过程当中出现上述状况,预测框在水平或垂直方向优化困难,致使收敛速度慢。

 


 

nms非极大值抑制

在目标检测的后处理过程当中,针对不少目标框的筛选,一般须要nms操做。

由于CIOU_Loss中包含影响因子v,涉及groudtruth的信息,而测试推理时,是没有groundtruth的。

因此Yolov4在DIOU_Loss的基础上采用DIOU_nms的方式,Yolov5中采用加权nms的方式。

 

激活函数

YOLO V5的做者使用了 Leaky ReLU 和 Sigmoid 激活函数。

在 YOLO V5中,中间/隐藏层使用了 Leaky ReLU 激活函数,最后的检测层使用了 Sigmoid 形激活函数。

而YOLO V4使用Mish激活函数。

跨网格预测(新的Loss计算方法)

yolov5的loss设计和前yolo系列差异比较大的地方就是正样本anchor区域计算。

yolov3的loss计算过程很是简单,核心是如何获得loss计算所需的target。

yolov5的很大区别就是在于正样本区域的定义。

 

yolov3的正样本区域也就是anchor匹配策略很是粗暴:

保证每一个gt bbox必定有一个惟一的anchor进行对应,匹配规则就是IOU最大,而且某个gt必定不可能在三个预测层的某几层上同时进行匹配。

(不考虑一个gt bbox对应多个anchor的场合,也不考虑anchor是否设置合理,不考虑一个gt bbox对应多个anchor的场合的设定会致使总体收敛比较慢。)

yolov5采用了增长正样本anchor数目的作法来加速收敛。

 

yolov5核心匹配规则为:

(1) 对于任何一个输出层,抛弃了基于max iou匹配的规则,而是直接采用shape规则匹配,也就是该bbox和当前层的anchor计算宽高比,若是宽高比例大于设定阈值,则说明该bbox和anchor匹配度不够,将该bbox过滤暂时丢掉,在该层预测中认为是背景

(2) 对于剩下的bbox,计算其落在哪一个网格内,同时利用四舍五入规则,找出最近的两个网格,将这三个网格都认为是负责预测该bbox的,能够发现粗略估计正样本数相比前yolo系列,至少增长了三倍。

绿点表示该Bbox中心,如今须要额外考虑其2个最近的邻域网格也做为该bbox的正样本anchor。

bbox的xy回归分支的取值范围再也不是0~1,而是-0.5~1.5(0.5是网格中心偏移),由于跨网格预测了。

在任何一预测层,将每一个bbox复制和anchor个数同样多的数目,而后将bbox和anchor一一对应计算,去除不匹配的bbox,而后对原始中心点网格坐标扩展两个邻居像素,增长正样本anchor。

有个细节须要注意,前面shape过滤时候是不考虑bbox的xy坐标的,也就是说bbox的wh是和全部anchor匹配的,会致使找到的邻居也至关于进行了shape过滤规则,故对于任何一个输出层,若是该bbox保留,那么至少有3个anchor进行匹配,而且保留的3个anchor shape是同样大的。

即保留的anchor在不考虑越界状况下是3或者6或者9。

 

(1) 不一样于yolov3和v4,其gt bbox能够跨层预测即有些bbox在多个预测层都算正样本

(2) 不一样于yolov3和v4,其gt bbox的匹配数范围从3-9个,明显增长了不少正样本(3是由于多引入了两个邻居)

(3) 不一样于yolov3和v4,有些gt bbox因为和anchor匹配度不高,而变成背景

这种特别暴力增长正样本作法仍是存在很大弊端,虽然能够加速收敛,可是因为引入了不少低质量anchor,对最终结果仍是有影响的。

 

yolo v5深度与宽度控制

Yolov5代码中的四种网络,和以前的Yolov3,Yolov4中的cfg文件不一样,都是以yaml的形式来呈现。

并且四个文件的内容基本上都是同样的,只有最上方的depth_multiple和width_multiple两个参数不一样。

四种结构就是经过上面的两个参数,来进行控制网络的深度和宽度。

其中depth_multiple控制网络的深度,width_multiple控制网络的宽度。

 

深度:四种网络结构中每一个CSP结构的深度都是不一样的。

yolov5s,第一个CSP1中,使用了1个残差组件,是CSP1_1。

Yolov5m,在第一个CSP1中,使用了2个残差组件,是CSP1_2。

Yolov5l,在第一个CSP1中,使用了3个残差组件,是CSP1_3。

Yolov5x,在第一个CSP1中,使用了4个残差组件,是CSP1_4。

 

宽度:四种yolov5结构在不一样阶段的卷积核的数量都是不同的,所以也直接影响卷积后特征图的第三维度,即厚度。

Yolov5s,第一个Focus结构中,最后卷积操做使用了32个卷积核,所以通过Focus结构,特征图的大小变成304*304*32。

yolov5m,第一个Focus结构中,最后卷积操做使用了48个卷积核,所以通过Focus结构,特征图的大小变成304*304*48。

yolov5l,yolov5x也是一样的原理。

 

总结

yolov5:

(1) 考虑了邻域的正样本anchor匹配策略,增长了正样本。

(2) 经过灵活的配置参数,能够获得不一样复杂度的模型。

(3) 经过一些内置的超参优化策略,提高总体性能。

(4) 和yolov4同样,都用了mosaic加强,提高小物体检测性能。


 

 

 

   

 

 ——————

浅谈则止,细致入微AI大道理

扫描下方“每日一醒”,选择“关注”公众号

—————————————————————

 

—————————————————————

投稿吧   | 留言吧

 


相关文章
相关标签/搜索