当前位置: 首页 > article >正文

yolov6算法及其改进

yolov6算法及其改进

  • 1、YOLOV6简介
  • 2、RepVGG重参思想
  • 3、YOLOv6架构改进
    • 3.1、Backbone方面
    • 3.2、SPP改进
    • 3.3、Neck改进
    • 3.4、Head改进
  • 4、正负样本匹配与损失函数
    • 4.1、TaskAligned样本匹配
    • 4.2、VFL Loss分类损失函数
    • 4.3、SIOU损失函数
    • 4.4、DFL损失函数

1、YOLOV6简介

在这里插入图片描述
YOLOv6设计主要包含以下几个方面:

  • 网络架构设计:对于Backbone和Neck,延续了YOLOv4和YOLOv5的PAN架构思想并使用了重参思想进行了改进;关于Head部分,作者Decoupled Head进行了简化并将其命名为Efficient Decouple Head;
  • 标签匹配:对TaskAlign、SimOTA、ObjectBox以及ATSS等进行了评估,最终确认TaskAlign更为有效且训练友好;
  • 损失函数:损失函数一般包含cls loss、box-regression loss以及object loss。YOLOv6进行了系统性分析并最终选择VariFocal Loss作为分类损失,SIoU/GIoU作为回归损失;

2、RepVGG重参思想

ResNet,其残差结构也是多路结构。但是需要注意的是,多路结构需要保存中间结果,显存占有量会明显增高,只有到多路融合时,显存会会降低。这里如下图所示:
在这里插入图片描述
由ShuffleNet论文中提到的网络高效推理法则:模型分支越少,速度越快。所以,可想而知,多分支结果虽然会带来高性能收益,但是,显存占用明显增加,且模型推理速度会一定程度降低,这在工业场景上是不实用的。

VGG几乎都是由3×3卷积堆叠而成,而现在加速库,比如NVIDIA的cudNN,Intel的MKL和相关硬件对3×3的卷积核有非常好的性能优化,而在VGG中几乎都是3×3卷积。
VGG利用现有加速库会得到更好的性能优化,从下表就就可以看出,在相同channels、input_size和batchsize条件下,不同卷积核的FLOPs和TFLOPs和用时,可以看出3×3卷积非常快。
在GPU上,3×3卷积的计算密度(理论运算量(Theoretical FLOPs/Time usage)除以所用时间)可达1×1和5×5卷积的4倍。
在这里插入图片描述
VGG是一个直筒性单路结构,由上述分析可知,单路结构会占有更少的内存,因为不需要保存其中间结果,同时,单路架构非常快,因为并行度高。同样的计算量,大而整的运算效率远超小而碎的运算。

多分支结构会引入网络结构的约束,比如Resnet的残差结构要求输入和卷积出来的张量维度要一致(这样才能相加),这种约束导致网络不易延伸拓展,也一定程度限制了通道剪枝。对应的单路结构就比较友好,非常容易改变各层的宽度,这样剪枝后也能得到很好的加速比。
RepVGG主体部分只有一种算子:3×3卷积+ReLU。在设计专用芯片时,给定芯片尺寸或造价,可以集成海量的3×3卷积-ReLU来达到高效率。此外单路架构的省内存特性也可以帮降低存储单元。
综上所述,提出了RepVGG结构,如图所示:
在这里插入图片描述
在这里插入图片描述
从Step1到Step2的变换过程,涉及conv于BN层融合,1×1卷积与identity转化为等价的3×3卷积的形式;
结构重参化的最后一步也就是上图中Step2 => Step3, 这一步就是利用卷积可加性原理,将3个分支的卷积层和bias对应相加组成最终一个3×3卷积的形式即可。
这里,大家可能既然把BN、identity、1×1卷积和conv_3×3都融合在一起了,为什么不干脆把ReLU也融合进去呢?其实也是可以将ReLU层进行融合的,但是需要进行量化,conv输出tensor的值域直接使用relu输出的值阈,就可以完成conv和relu合并。无量化动作的优化是无法完成conv+relu的合并。

CONV+BN融合
在这里插入图片描述
这其实就是一个卷积层,只不过权重考虑了BN的参数,令:
在这里插入图片描述
最终的融合结果即为:
在这里插入图片描述
代码如下:
在这里插入图片描述
identity融合成33:
在这里插入图片描述
1
1融合成3*3
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、YOLOv6架构改进

在这里插入图片描述
网络架构设计:

  • 在Backbone方面,YOLOv6在小规模模型(n/t/s模型)采用RepBlock进行构建;对于大规模模型(m/l模型)采用CSPStackRepBlock进行构建;
  • 在Neck方面,YOLOv6延续了YOLOv4与YOLOv5的设计思想,依旧使用的是PAN-FPN架构,同时采用RepBlock(n/t/s模型)与CSPStackRepBlock(m/l模型)进行特征的增强;
  • 在Head方面,对Decoupled Head进行改进,最终使用Efficient Decouple Head;

3.1、Backbone方面

在这里插入图片描述
,YOLOv6作者设计了一种高效重参模块EfficientRep(图左),在推理阶段EfficientRep则可以折叠为图右所示的结构,进而使得Backbone能更好利用硬件计算资源达成更低的推理延迟。
在这里插入图片描述
中间是小模型,右边是大模型

YOLOv6作者实验发现,单方面的使用RepVGG Block的堆叠(EfficientRep Backbone),对于小规模模型是比较友好的,对于大模型表现并不是很理想。因此,针对大模型YOLOv6借鉴CSP思想构建了下图所示的CSPStackRepBlock模块。

3.2、SPP改进

在这里插入图片描述
1、对于小规模模型(n/t/s模型),RepBlock即为RepVGG Block;
2、对于大规模模型(m/l模型),RepBlock即为CSPStackRepBlock;
对于SimSPPF,其运行效率高于SPP。
下图依次为SPP、SPPF以及SimSPPF的结构图。

3.3、Neck改进

YOLOv6对YOLOv4和YOLOv5所采用的PAN-FPN架构进行了改进:
对于小模型,采用RepBlock替换CSPBlock;对于大模型,采用CSPStackRepBlock替换CSPBlock。作者将YOLOv6的Neck命名为Rep-PAN。
还研究了Neck宽度和深度对YOLOv6-L的影响。结果表明,在几乎相同的推理速度下,细长Neck的表现比宽浅Neck好0.2%。
这里的粗细指的是3个Stage对应的Channel的数量;
这里的深浅指的是模块堆叠的数量;
在这里插入图片描述
在这里插入图片描述

3.4、Head改进

在这里插入图片描述
YOLOv6采用了一种Hybrid-channel策略构建了一种更高效Decoupled Head。具体来说,将中间3×3卷积数量减少为1个,同时channel数量也随Neck进行调整。

4、正负样本匹配与损失函数

4.1、TaskAligned样本匹配

在YOLOv6的早期版本中使用了SimOTA作为标签分配方法。SimOTA 减少了额外的超参数并保持了性能,但是在实践中发现引入SimOTA会减慢训练过程。同时可能会使训练陷入不稳定。
之后,YOLOv6最新版本找到一个替代SimOTA的匹配方法,TaskAlign。

任务对齐学习(TAL)首次在TOOD中提出,其中设计了分类得分和bbox质量的统一度量。IoU被此度量替换以分配对象标签。在一定程度上,任务不一致的问题(分类和bbox)得到了缓解。
TOOD的另一个主要贡献是关于任务对齐头(T-head)。T-head堆叠卷积层以构建交互特征,在T-head上使用任务对齐预测器(TAP)。PP-YOLOE通过用ESE Attention取代T-head中的Layer Attention,从而改进了T-head,形成ET-head。
然而,ET-head会降低模型推理速度,并且不会带来精度增益。因此,保留了高效Decoupled Head设计。

为与NMS搭配,训练样例的Anchor分配需要满足以下两个规则:
1、正常对齐的Anchor应当可以预测高分类得分,同时具有精确定位;
2、不对齐的Anchor应当具有低分类得分,并在NMS阶段被抑制。
基于上述两个目标,TOOD设计了一个新的Anchor alignment metric 来在Anchor level 衡量Task-Alignment的水平。并且,Alignment metric 被集成在了 sample 分配和 loss function里来动态的优化每个 Anchor 的预测。

Anchor alignment metric:
分类得分和 IoU表示了这两个任务的预测效果,所以,TOOD使用分类得分和IoU的高阶组合来衡量Task-Alignment的程度。使用下列的方式来对每个实例计算Anchor-level 的对齐程度:

在这里插入图片描述
s 和 u 分别为分类得分和 IoU 值,α 和 β 为权重超参。
从上边的公式可以看出来,t 可以同时控制分类得分和IoU 的优化来实现 Task-Alignment,可以引导网络动态的关注于高质量的Anchor。

Training sample Assignment:
为提升两个任务的对齐性,TOOD聚焦于Task-Alignment Anchor,采用一种简单的分配规则选择训练样本:对每个实例,选择m个具有最大t值的Anchor作为正样本,选择其余的Anchor作为负样本。然后,通过损失函数(针对分类与定位的对齐而设计的损失函数)进行训练。

4.2、VFL Loss分类损失函数

在这里插入图片描述
其中y为0~1的质量标签,来自预测的bbox和gt bbox的iou值,注意如果是负样本,则y直接等于0,σ是分类分支经过sigmoid后的预测值。可以发现广义focal loss将focal loss只能支持离散label的限制推广到了连续label,并且强制将分类分支对应类别处的预测值变成了包括bbox预测准确度。
VFL主要改进是提出了非对称的加权操作,FL和QFL都是对称的。而非对称加权的思想来源于论文PISA,该论文指出首先正负样本有不平衡问题,即使在正样本中也存在不等权问题,因为mAP的计算是主正样本。

在这里插入图片描述
q是label,正样本时候q为bbox和gt的IoU,负样本时候q=0,当为正样本时候其实没有采用FL,而是普通的BCE,只不过多了一个自适应IoU加权,用于突出主样本。而为负样本时候就是标准的FL了。可以明显发现VFL比QFL更加简单,主要特点是正负样本非对称加权、突出正样本为主样本。

4.3、SIOU损失函数

IoU、GIoU、CIoU、DIoU loss等等,这些损失函数通过考虑预测框与目标框之前的重叠程度、中心点距离、纵横比等因素来衡量两者之间的差距,从而指导网络最小化损失以提升回归精度,但是这些方法都没有考虑到预测框与目标框之间方向的匹配性。

SIoU 损失函数通过引入了所需回归之间的向量角度,重新定义了距离损失,有效降低了回归的自由度,加快了网络模型的收敛,并且在小规模模型(n/t/s模型)上可以一定程度上提升精度。

YOLOv6对小模型采用SIoU损失,大模型采用GIoU损失。

Zhora Gevorgyan 证明了中心对齐的边界框会具有更快的收敛速度,以Angle cost、Distance cost、Shape cost 构造了SIoU。其中Angle cost 描述了边界框中心连线与 x-y 轴的最小夹角:
在这里插入图片描述
Distance cost 描述了两边界框的中心点在x轴和y轴上的归一化距离,其惩罚力度与 Angle cost 正相关。Distance cost 被定义为:
在这里插入图片描述
Shape cost 描述了两边界框的形状差异,当两边界框的尺寸不一致时不为 0。Shape cost 被定义为:

在这里插入图片描述
SIOU的惩罚项由Distance cost 和Shape cost 组成:
在这里插入图片描述

4.4、DFL损失函数

这里的DFL(Distribution Focal Loss),其主要是将框的位置建模成一个 general distribution,让网络快速的聚焦于和目标位置距离近的位置的分布。
在这里插入图片描述
在这里插入图片描述

yi和 yi+1是浮点值 y 的左右整数值,S是输出分布,长度为17;
DFL 能够让网络更快地聚焦于目标 y 附近的值,增大它们的概率;
DFL的含义是以交叉熵的形式去优化与标签y最接近的一左一右2个位置的概率,从而让网络更快的聚焦到目标位置的邻近区域的分布;
也就是说学出来的分布理论上是在真实浮点坐标的附近,并且以线性插值的模式得到距离左右整数坐标的权重。


http://www.kler.cn/a/456809.html

相关文章:

  • 03-spring-理-DefaultListableBeanFactory
  • linux--编译驱动模块【虚拟网卡 tun】
  • Type c系列接口驱动电路·内置供电驱动电路使用USB2.0驱动电路!!!
  • C语言 练习
  • uniapp——APP读取bin文件,解析文件的数据内容(二)
  • NSSCTFpwn刷题
  • 【ETCD】【实操篇(十四)】etcd 集群备份与还原指南
  • Pandas07
  • 使用 VSCode 学习与实践 LaTeX:从插件安装到排版技巧
  • 基于三种机器学习方法的磁芯损耗预测模型
  • 使用内网穿透工具,为树莓派配置公网地址实现远程ssh
  • springboot maven 构建 建议使用 --release 21 而不是 -source 21 -target 21,因为它会自动设置系统模块的位置
  • 分别查询 user 表中 avatar 和 nickname 列为空的用户数量
  • C# 6.0版本的WebAPI接口部署到Linux服务器
  • 【学习总结|DAY024】Maven基础
  • Git拉的项目maven无法下载
  • 24-12-28-pytorch深度学习中音频I/O 中遇到的问题汇总
  • 音视频入门基础:MPEG2-TS专题(24)——FFmpeg源码中,显示TS流每个packet的pts、dts的实现
  • python常用基础语法
  • win10系统上打包electron,实现在win7系统运行
  • Detected at node ‘truediv‘ defined at (most recent call last): Node: ‘truediv‘
  • BUU BRUTE 1
  • 剑指Offer|LCR 013. 二维区域和检索 - 矩阵不可变
  • LeetCode题练习与总结:IPO--502
  • linux查看访问外网本机ip地址的命令
  • 微信小程序打印生产环境日志