opencv dnn模块 示例(21) 目标检测 object_detection 之 yolov6

1、YOLOv6介绍

1.1、概述

2023年初,美团视觉智能部发布了 YOLOv6 3.0 版本,再一次将目标检测的综合性能推向新高。本次更新除了对 YOLOv6-N/S/M/L 模型进行全系列升级之外,还推出了大分辨率 P6 模型。其中,YOLOv6-L6 检测精度和速度超越 YOLOv7-E6E,取得当前实时目标检测榜单 SOTA。

YOLOv6 Github 传送门:github.com/meituan/YOLOv6,技术报告:YOLOv6 v3.0: A Full-Scale Reloading

yolov6 第一版发布于 2022年6月,截止到目前已经更新到4.0版本。
在这里插入图片描述
图1 YOLOv6 各尺寸模型与其他 YOLO 系列框架的性能对比图

在这里插入图片描述

表1 YOLOv6 各尺寸模型与其他 YOLO 系列框架的性能对比结果


注:YOLOv6 系列模型均在训练 300epoch 且不使用预训练模型或额外检测数据集下获得,“‡” 表示采用了自蒸馏算法,“*” 表示从官方代码库对发布模型进行重新测评的指标。以上速度指标均在 T4 TRT7.2 环境下测试。

1.2、关键技术

1.2.0、网络结构

Backbone:
在这里插入图片描述
受启发于RepVGG,作者设计了一个高效的重参数化骨架,称之为EfficientRep。对于小型模型,骨架的主要成分是Rep-Block,如图3a)所示;在推理阶段,RepBlock转化为RepConv,如图3b)所示。

与其他主流架构比较,作者发现RepVGG骨架在相似推理速度下,在小型网络中具有更多特征表征能力,尽管它比较难扩展到大模型由于参数和运算成本的爆炸增长。在这种情况下,作者采用RepBlock作为构建小型网络的构建模块;对于大型模型,作者改进了一个更有效的CSP块,即CSPStackRep Block。通常3*3卷积在硬件计算平台上被优化,因此在提升表征能力的同时也能提升推理速度。

但是,作者发现如果将模型进行扩展,将面临参数和计算陈本成指数级增长。为了获得更好的均衡,作者改进CSPStackRep Block,如图3c)所示。它吸取了CSP的优点,即Cross Stage partial连接,同时在训练阶段有RepVGG block构成,在推理阶段是RepConv构成。

在这里插入图片描述
Neck:

在实际中,多尺度的特征融合被证明是目标检测的一个关键的有效部分。作者采用PAN拓扑结构,与YOLOV4和V5一致。作者使用RepBlock增强颈部,构成Rep-PAN;

Head:
YOLOV5的检测头是一个耦合的检测头,其参数在分类和定位之间是共享的,它的同类如FCOS和YOLOX通过添加两个33的卷积来解耦两个分支以提升性能。

作者采用了混合通道策略来构建更高效的解耦头。作者只采用了一个33的卷积。检测头的宽度通过骨架和颈部的宽度乘积来决定,这个改进进一步减少运算以提升推理速度。作者简化了耦合的头部使其更加高效,称之为Efficient Decoupled Head。


v3.0 更新主要在 Neck 网络设计、训练和蒸馏策略等方面进行了创新和优化:

  • 设计了表征能力更强的可重参化双向融合 PAN(RepBi-PAN)Neck 网络;
  • 提出了全新的锚点辅助训练(Anchor-Aided Training)策略;
  • 提出了解耦定位蒸馏(Decoupled Location Distillation)策略以提升小模型的性能。

1.2.1、表征能力更强的 RepBi-PAN Neck 网络

有效的多尺度特征融合网络对目标检测的效果尤为关键,特征金字塔网络 (FPN) 通过自上而下的路径来融合来自骨干网络不同 Stage 的输出特征以弥补网络学习过程中目标位置信息的损失。鉴于单向信息流传输的局限性,PANet 在 FPN 之上添加了一个额外的自底向上路径。BiFPN 为不同的输入特征引入了可学习的权重,并简化了 PAN 以实现更好的性能和更高的效率。PRB-FPN 通过具有双向融合的并行残差 FPN 结构来保留高质量的特征,以进行准确定位。

基于以上研究,论文提出了一个表征能力更强的可重参化双向融合 PAN(RepBi-PAN)Neck 网络。一般而言,骨干网络浅层特征分辨率高,具有丰富的空间信息,有利于目标检测中的定位任务。为了聚合浅层特征,常见的做法是在 FPN 中增加 P2 融合层以及一个额外的检测头,但这往往会带来较大的计算成本。

为了实现更好的精度和时延权衡,设计了一个双向联结(Birectional Concatenate, BiC)模块,在自上而下的传输路径中引入自底向上的信息流,使得浅层特征能以更高效的方式参与多尺度特征融合,进一步增强融合特征的表达能力。此模块能够帮助保留更准确的定位信号,这对于小物体的定位具有重要意义。

此外,对上一版本的 SimSPPF 模块进行了特征增强优化,以丰富特征图的表示能力。发现 YOLOv7 使用的 SPPCSPC 模块能够提升检测精度,但对网络推理速度的影响较大。于是我们对其进行了简化设计,在检测精度影响不大的情况下,大大提升了推理效率。同时,我们引入了可重参数化思想并对 Neck 网络的通道宽度和深度进行了相应的调整。最终 RepBi-PAN 网络结构如下图 2 所示:
在这里插入图片描述
图2 RepBi-PAN 网络结构图

在这里插入图片描述
表2 BiC 模块消融实验结果

从表2可以看到,在 YOLOv6-S/L 模型上,仅在 PAN 网络自上而下的传输路径引入 BiC 模块后,对推理速度影响保持在 4% 的情况下,检测精度分别提升 0.6% 和 0.4% AP。当我们尝试额外地在自底向上的信息流中将常规联结替换成 BiC 模块时,反而没有获得进一步正向的增益,因此我们仅在自上而下的路径中应用 BiC 模块。与此同时,我们还注意到,BiC 模块能够为小目标的检测精度带来 1.8% AP 的提升。

在这里插入图片描述
表3 不同的 SPP 模块对模型精度和速度的对比结果

在表 3 中,对不同的 SPP 模块对模型精度和速度影响做了实验对比,其中包括经过简化设计的 SPPF、SPPCSPC 和 CSPSPPF 模块。除此之外,还尝试了在骨干网络 C3、C4 和 C5 的输出特征后分别采用了 SimSPPF 模块以加强特征的聚合表达,在表中用 SimSPPF * 3表示。从实验结果来看,重复使用 SimSPPF 模块虽然增加了计算量,但并没有带来检测精度的进一步提升。

经简化设计的 SPPCSPC 模块对比 SimSPPF 模块 在 YOLOv6-N/S 模型上分别提升了 1.6% 和 0.3% AP,但对推理速度 FPS 降低约10%。而当将 SimSPPF 模块替换为优化后的 SimCSPSPPF 模块后,在 YOLOv6-N/S/M 模型上分别取得了1.1%/0.4%/0.1% 的精度增益,同时推理速度对比 SimSPPCSPC 模块有较大的提升。因此,为了更好的精度-效率权衡,在 YOLOv6-N/S 上采用 SimCSPSPPF 模块,而在 YOLOv6-M/L 上采用 SimSPPF 模块。

1.2.2、全新的锚点辅助训练(Anchor-Aided Training)策略

使用 YOLOv6-N 作为基线,对 Anchor-based 和 Anchor-free 范式的异同点进行了相关的实验和分析
在这里插入图片描述
YOLOv6-N 分别采用 Anchor-based 和 Anchor-free 训练范式时,模型的整体 mAP 几乎接近,但采用 Anchor-based 的模型在小、中、大目标上的 AP 指标会更高。从以上的实验可以得出结论:相比于 Anchor-free 范式,基于 Anchor-based 的模型存在额外的性能增益。

同时发现,YOLOv6 使用 TAL 进行标签分配时,其模型精度的稳定性与是否采用 ATSS 预热有较大关系。当不使用 ATSS 预热时,对同样参数配置的 YOLOv6-N 进行多次训练,模型精度最高可达35.9% mAP,最低至 35.3% mAP,相同模型会有 0.6% mAP 的差异。但当使用 ATSS 预热时,模型精度最高却只能到达 35.7% mAP。从实验结果可以分析得出,ATSS 的预热过程利用了 Anchor-based 的预设信息,进而达到稳定模型训练的目的,但也会在一定程度上限制网络的峰值能力,因此并不是一种最优的选择。

受到上述工作的启发,我们提出了基于锚点辅助训练(Anchor-Aided Training,AAT)策略。在网络训练过程中,同时融合 Anchor-based 和 Anchor-free 的两种训练范式,并对全阶段网络进行映射及优化,最终实现了Anchor 的统一,充分发挥了结合不同 Anchor 网络的各自优势,从而进一步提升了模型检测精度。之外,还提出灵活配置的训练策略,仅在训练过程中引入额外的辅助分支,在测试过程中不予使用。最终在不增加推理时间的情况下,提升网络精度,无痛涨点
在这里插入图片描述
采用 AAT 训练策略的消融实验结果如下表 5 所示。我们在 YOLOv6 的各尺寸模型上进行了实验,其中 YOLOv6-S 模型采用 AAT 策略后有 0.3% 的精度增益,而在 YOLOv6-M/L 模型上分别带来了0.5% 的精度增益。值得注意的是,YOLOv6-N/S/M 在小目标检测的精度指标得到了显着增强。
在这里插入图片描述

1.2.3、无痛涨点的 DLD 解耦定位蒸馏策略

基于解耦检测任务和蒸馏任务的 DLD(Decoupled Location Distillation)算法,在网络每一层的回归头上分别添加了额外的强化回归分支,在训练阶段,该分支同样会参与 IoU 损失的计算,并将其累加到最终的 Loss 中。

在目标检测的蒸馏任务中,LD 通过引入 DFL 分支,从而达到了在网络中对定位信息蒸馏的目的,弥补了 Logit Mimicking 方法无法使用定位蒸馏信息的不足。但是DFL 分支的添加,对于小模型速度的影响是很明显的,YOLOv6-N 的速度下降了 16.7%,YOLOv6-S 的速度下降了 5.2%。而在实际的工业应用当中,对于小模型速度的要求往往很高。因此,目前的蒸馏策略并不适合于工业落地。

针对这个问题,我们提出了基于解耦检测任务和蒸馏任务的 DLD(Decoupled Location Distillation)算法。DLD 算法会在网络每一层的回归头上分别添加了额外的强化回归分支,在训练阶段,该分支同样会参与 IoU 损失的计算,并将其累加到最终的 Loss 中。通过增加的额外的强化回归分支,可以对网络添加更多的额外约束,从而对网络进行更全面细致的优化。并且,DLD算法在对强化回归分支进行训练时,引入了分支蒸馏学习策略。
在这里插入图片描述

1.3、总结

从商业应用的角度,对YOLO开源目标检测器进行了深度的改进实验,从骨架模型的构建到检测头的解耦操作,从损失函数的选取到量化部署,始终保持了速度与精度的均衡优势。该YOLOv6是无锚检测器。

第三方的评价
当YOLOv7被大量报道,并被冠以“当前最快最强”的目标检测器时,YOLOv6最近版本已经在推理速度精度的均衡把YOLOv7打败,但YOLOV6引起一阵争议。

美团出品的YOLO模型“拿”其它家的技术,搞成一个超级“缝合怪”把V6的坑给占了。有人指出它虽然在速度和精度上取得了优势,但避开参数量的对比。但作者从商业应用角度出发,比起参数量和运算量的对比,更关注速度性能,无可厚非。

2、测试

使用的模型 yolov6m.pt 进行测试。

2.1、官方项目测试

修改yolov6/core/inferer.pyinfer()函数的代码,进行模型预热、显示时间的代码

    for i in range(0,5): self.model(img)         # 增加
                
    t1 = time.time()
    pred_results = self.model(img)
    det = non_max_suppression(pred_results, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)[0]
    t2 = time.time()

    print("img_src process time: ", t2-t1)       # 增加

测试如下

>python tools\infer.py --weights=weights/yolov6m.pt --source=data/images/bus.jpg --yaml=data/coco.yaml --img-size 640 640 --device cpu

在这里插入图片描述

切换到 GPU 的代码 --device 0 测试结果
在这里插入图片描述

2.2、opencv dnn测试

首先导出onnx模型,脚本为

python deploy\ONNX\export_onnx.py --weights weights\yolov6m.pt --img 640 --batch 1 --simplify

由于网络输出结果与 yolov5、yolor一致(见前面博客代码),复用之前的代码测试,python脚本默认预处理将原图等比缩放调整到640*640,使用之前的测试图片,识别置信度都是100%,有点离谱;

另外,不进行等比缩放调整 bool letterBoxForSquare = false;,竟然将楼房阳台上的自行车识别出来了,又强的离谱了。

在这里插入图片描述

2.3、测试统计

python(CPU):393ms
python(GPU):25ms

opencv dnn(CPU):350ms
opencv dnn(GPU):35ms

openvino(CPU):337ms
onnxruntime(GPU):31ms
TensorRT:15ms

猜你喜欢

转载自blog.csdn.net/wanggao_1990/article/details/133269792