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:
11融合成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个位置的概率,从而让网络更快的聚焦到目标位置的邻近区域的分布;
也就是说学出来的分布理论上是在真实浮点坐标的附近,并且以线性插值的模式得到距离左右整数坐标的权重。