【深度学习】YOLOv6被官方正式收录,甚至性能还超越了v7?

机器学习初学者

共 5561字,需浏览 12分钟

 ·

2022-09-10 15:40

 作者丨happy      编辑丨极市平台

导读

 

已取得YOLO作者的许可,不再是YOLOv6-MT!一起来看看YOLOv6有哪些亮点提升

8d7e8fb26cd092cba878ed36e2ded5c2.webp

论文链接:https://arxiv.org/pdf/2209.02976

代码链接:https://github.com/meituan/YOLOv6

6599df7b97e7eb380e1f69e774fb670b.webp

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

5d0317ea87f928611d479e9155f185d3.webp

上图给出了YOLOv6整体架构示意图,我们主要从Backbone、Neck、Head三个维度进行简要介绍。

  • Backbone:相比多分支架构,单路径架构具有高并行度与低访存占用优势,具有跟高的推理效率。RepVGG借助重参数化技术取得了优异的速度-精度均衡。因此,作者设计了一种高效重参数模块EfficientRep(见下图a),在推理阶段EfficientRep则可以折叠为下图b所示的结构,进而使得所得骨干能更好利用硬件计算资源达成更低的推理延迟。注:EfficientRep仅用于小模型。针对大模型,作者借鉴CSP思想构建了下图c所示的CSPStackRepBlock模块。
c85f31625dea8e73e23daf60cf777642.webp
  • 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量化;
cf2b0897007de5dc1cc7e147c806b085.webp
  • Sensitivity Analysis:作者将量化敏感的操作转为浮点计算以进一步提升PTQ性能。在敏感性分析方面,作者采用了MSE、SNR以及Cosine Similarity等进行度量。

  • QAT with Channel-wise Distillation:作者进一步采用QAT技术提升量化性能。作者基于RepOptimizer构建QAT。此外,作者还引入了通道蒸馏技术,可参见下图。

8053f6b1e9bd583977cb328dbe0d4a20.webp

实验结果

04a48aa46286b8648b772bc7f65c586a.webp64e6cd3860f3d4ce1d8093d83969ac9f.webp1ec4c6a4642e8f7d427ef225c41672e0.webpcb2d67c7e3f050359c357a60f7201f1e.webp

上面三个表给出了不同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/

      
            
              
                
                  
                        
                                            往期
                                            精彩
                                            回顾
                                          
                                        



浏览 122
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报