【深度学习】YOLOv6被官方正式收录,甚至性能还超越了v7?
共 5561字,需浏览 12分钟
·
2022-09-10 15:40
导读
已取得YOLO作者的许可,不再是YOLOv6-MT!一起来看看YOLOv6有哪些亮点提升
论文链接:https://arxiv.org/pdf/2209.02976
代码链接:https://github.com/meituan/YOLOv6
YOLOv6(已取得YOLO作者的许可,不再是YOLOv6-MT)是美团技术团队面向工业应用设计的单阶段目标检测方案,在吸收了近年来大量"先进知识"后取得了SOTA性能,可参考上图。相关指标简要描述如下:
-
YOLOv6-N取得了35.9%@COCO,吞吐量达1234FPS@Tesla T4 GPU;
-
YOLOv6-S取得了43.5%@COCO,吞吐量达495FPS,超越了YOLOv5-S,YOLOX-S,PPYOLOE-S;
-
Quantized-YOLOv6-S取得了43.3%@COCO,吞吐量达869FPS;
-
YOLOv6-M/L 分别取得了49.5%@COCO、52.3%@COCO,同等速度下性能超出其他方案。
简要概括
关于YOLOv6,其新颖设计主要包含以下几个方面:
-
Network Design:在骨干方面,对于小模型,作者采用RepBlock进行构建;在大模型方面,我们采用CSPStackRepBlock进行构建;在Neck方面,作者延续了YOLOv4与YOLOv5的PAN架构,同时采用RepBlock与CSPStackRepBlock进行增强;在Head方面,作者对"解耦头"进行了简化并将其命名为"Efficient Decouple Head";
-
Lable Assignment:在标签分配方面,作者对TOOD、YOLOX、SiouLoss、ObjectBox以及ATSS等方案进行了评估,最终确认TAL更为有效且训练友好;
-
Loss Function:损失函数一般包含cls loss、box-regression loss以及object loss。作者对齐进行了系统性分析并最终选择VariFocal Loss作为分类损失,SIoU/GIoU作为回归损失;
-
Industry-handy Improvement:作者还引入了自蒸馏与更长训练周期等技巧进一步提升性能;
-
Quantization and Deployment:为弥补重参数模型的量化损失,作者采用RepOptimizer对YOLOv6进行训练以得到PTQ友好的权值;作者还锦衣采用QAT、通道蒸馏以及图优化等技术进一步追求极致性能。最终Quantized-YOLOv6-S以869FPS(batch=32)吞吐量取得了新的SOTA性能42.3%。
各部件改进介绍
Network Design
上图给出了YOLOv6整体架构示意图,我们主要从Backbone、Neck、Head三个维度进行简要介绍。
- Backbone:相比多分支架构,单路径架构具有高并行度与低访存占用优势,具有跟高的推理效率。RepVGG借助重参数化技术取得了优异的速度-精度均衡。因此,作者设计了一种高效重参数模块EfficientRep(见下图a),在推理阶段EfficientRep则可以折叠为下图b所示的结构,进而使得所得骨干能更好利用硬件计算资源达成更低的推理延迟。注:EfficientRep仅用于小模型。针对大模型,作者借鉴CSP思想构建了下图c所示的CSPStackRepBlock模块。
-
Neck:多尺度特征集成对于目标检测非常重要,作者对YOLOv4和YOLOv5采用PAN架构进行了改进:对于小模型,采用RepBlock替换CSPBlock;对于大模型,采用CSPStackRepBlock进行替换。作者YOLOv6的Neck命名为Rep-PAN。
-
Head:不同于其他检测方案,YOLOv6采用了一种"Hybrid-channel"策略构建了一种更高效"解耦头"。具体来说,作者将中间3x3卷积数量减少为1,宽度随Neck进行调整。这种改动可以进一步减少计算量并取得更低推理延迟。
-
Anchor-free:受益于更高的泛化性与预测结果解码的简单性,其后处理耗时可以进一步降低。作者采用了FCOS类型的方案。
Label Assignment
标签分配是目标检测非常重要的一环,SimOTA是YOLOX采用的方案,它一种动态分配方案。作者发现:SimOTA会导致训练速度变慢,还不定时的导致训练不稳定。因此,作者选用了其他替代方案:TAL。TAL源自TOOD一文,对此感兴趣的同学可以查阅:51.1AP!单阶段检测器的新纪录,TOOD:即插即用的检测器换头术,显著提升性能。作者发现:相比SimOTA,TAL可以带来更多的性能提升,同时有助训练稳定性。
Loss Function
目标检测包含两个子任务:分类与定位。
-
对于分类损失,作者在对Focal Loss、VariFocal Loss(VFL)、PolyLoss进行评估后选择VFL作为默认损失;
-
对于回归损失,作者在对GIoU、DIoU、CIoU、a-IoU以及SIoU等进行评估后,对小模型采用SIoU损失,大模型采用GIoU损失。
此外,源自FCOS的目标损失有助于在后处理阶段过滤掉低质边框。作者层尝试将其引入YOLOv6,但发现:目标损失并未带来正面作用。
Industry-handy Improvements
在实际应用中,为进一步提升性能,作者还引入以下涨点技巧:
-
More Training Epochs: 将训练周期从300提升到400;
-
Self-distillation:对分类与回归均添加了蒸馏机制;
-
Gray-border of Images
Quantization and Deployment
对于工业应用,量化已成为加速的标配。常用量化技术有PTQ与QAT两种。但是,由于YOLOv6的重参数机制的重度依赖性,PTQ会导致大幅性能下降,同时难以集成QAT技术。有鉴于此,作者引入了以下两点:
- RepOptimizer:作者采用该方案对YOLOv6进行重构并得到了PTQ友好的权值。从下图可以看到:RepOpt训练得到的特征分布大幅收缩,这有益于后续的PTQ量化;
-
Sensitivity Analysis:作者将量化敏感的操作转为浮点计算以进一步提升PTQ性能。在敏感性分析方面,作者采用了MSE、SNR以及Cosine Similarity等进行度量。
-
QAT with Channel-wise Distillation:作者进一步采用QAT技术提升量化性能。作者基于RepOptimizer构建QAT。此外,作者还引入了通道蒸馏技术,可参见下图。
实验结果
上面三个表给出了不同YOLO方案在不同平台下的推理速度对比,毫无疑问:YOLOv6具有最优的性能-速度均衡,即同等速度我性能高,同等性能我速度快。
模型部署
关于模型部署,作者提供了ONNX、OpenCV、OpenViNO、TensorRT等方式,相关部署方式可参考如下链接:
- ONNX:https://github.com/meituan/YOLOv6/tree/main/deploy/ONNX
- OpenCV: https://github.com/meituan/YOLOv6/tree/main/deploy/ONNX/OpenCV
- OpenViNO: https://github.com/meituan/YOLOv6/tree/main/deploy/OpenVINO
- TensorRT: https://github.com/meituan/YOLOv6/tree/main/deploy/TensorRT
三方资源
除了上述YOLOv6官方提供的部署方案外,还可以关注一下下面的部署:
- NCNN-Android:https://github.com/FeiGeChuanShu/ncnn-android-yolov6
- TNN-C++:https://github.com/DefTruth/lite.ai.toolkit/blob/main/lite/tnn/cv/tnn_yolov6.cpp
- MNN-C++:https://github.com/DefTruth/lite.ai.toolkit/blob/main/lite/mnn/cv/mnn_yolov6.cpp
- ONNX-C++:https://github.com/DefTruth/lite.ai.toolkit/blob/main/lite/ort/cv/yolov6.cpp
此外,不想自己部署,只想体验还可以关注一下:
- HuggingFace:https://huggingface.co/spaces/nateraw/yolov6
- Colab:https://colab.research.google.com/github/mahdilamb/YOLOv6/blob/main/inference.ipynb
最后,如果想在自己的数据集上训练就可以关注一下如下博客:https://blog.roboflow.com/how-to-train-yolov6-on-a-custom-dataset/
往期 精彩 回顾
- 适合初学者入门人工智能的路线及资料下载
- (图文+视频)机器学习入门系列下载
- 机器学习及深度学习笔记等资料打印
- 《统计学习方法》的代码复现专辑
- 机器学习交流qq群955171419,加入微信群请 扫码