本文来自公众号“每日一醒”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大道理
扫描下方“每日一醒”,选择“关注”公众号
—————————————————————
—————————————————————