DAMO-YOLO | 超越所有YOLO,5行代码即可体验!
DAMO-YOLO 是阿里新推出来的 目标检测框架,兼顾模型速度与精度,其效果超越了目前的一众 YOLO 系列方法,且推理速度更快。DAMO-YOLO 还提供高效的训练策略和便捷易用的部署工具,能帮助开发者快速解决工业落地中的实际问题。
https://github.com/tinyvision/damo-yolo (上图源自官网)
本文提出了一种快速而精确的目标检测方案DAMO-YOLO,它取得了比其他YOLO系列方案更优的性能。DAMO-YOLO在YOLO的基础上引入了一些新技术,
NAS搜索高效骨干:采用MAE-NAS在低延迟高性能约束下进行骨干网络搜索,得到了带有SPP与Focus模块的类ResNet/CSP架构; RepGFPN+轻量头:在这方面,延续了"Large Neck, Small Head"理念,引入了GFPN、ELAN以及重参数进行优化升级; AlignedOTA:它用于解决标签分类过程中的恶不对齐问题; 蒸馏增强:用于进一步提升检测器的性能。
基于上述新技术,作者构建了不同尺寸的模型以满足不同场景需求:DAMO-YOLO-Tiny/Small/Medium。在T4 GPU上,它们分别取得了43.06/46.8/50.0的mAP指标,同时推理速度分别为2.78/3.83/5.62。该方案与其他YOLO方案(YOLOv5, YOLOv6, YOLOv7, YOLOX, PP-YOLOE)的性能对比可参考上图。
本文方案
上图为DAMO-YOLO整体架构示意图,它由MAE-NAS搜索骨干、GiraffeNeck样式的Neck、GFL样式的ZeroHead以及AlignedOTA标签分配策略构成,此外还采用了蒸馏技术进一步提升模型性能。
MAE-NAS骨干
在骨干网络方面,作者采用MAE-NAS技术在不同计算负载约束下进行搜索。作者采用新的搜索模块k1kx(类似DarkNet53所采用的模块)构建搜索空间,直接采用延迟作为评估准则。在搜索完成后,作者对所得模型添加了SPP、Focus以及CSP等模块
上表给出了CSP-DarkNet与所提方案搜索得到的模型性能对比,上述指标验证了MAE-NAS骨干的有效性。注:MAE-ResNet表示仅引入了SPP与Focus,MAE-CSP意味着还引入了CSP模块。考虑到性能与速度均衡问题,Tiny与Small版方案骨干采用的是MAE-ResNet,Medium版方案骨干采用的是MAE-CSP。
Efficient RepGFPN
FPN旨在与骨干网路输出的多分辨率特征进行信息聚合,它是目标检测非常重要且有效的部件。传统的FPN引入了一个top-down路径融合多尺度特征;PAFPN则在FPN基础上引入了额外的bottom-up路径进行信息聚合;BiFPN则移除了仅有一个输入边的节点,并在同级节点之间添加了跳过连接。GiraffeDet所提GFPN提供了另一种对高层与底层信息高效交互的方案。关于GiraffeDet的介绍可参考:小目标到大目标一网打尽!阿里提出首个轻骨干重Neck的轻量级目标检测器GiraffeDet。
直接采用GFPN对YOLO系列方案中的PAFPN进行替换后可以取得更高的性能,但其延迟也变得更高。通过分析,主要原因可以归因到以下几个维度:
不同尺度的特征具有相同的维度; queen融合操作无法满足实时检测模型的需求; 基于卷积的跨尺度融合不够高效。
基于GFPN,作者提出了Efficient-RepGFPN,改进方向包含以下几点:
由于不同尺度特征FLOPs的大差异,很难在有效计算复杂度下控制不同特征图具有相同的维度。因此,作者对不同尺度特征设置不同的维度。相关结果可参考下表,通过更细粒度的控制通道数可以取得更高的精度。
GFPN通过queen进行特征交互,但同时引入了额外的上采样与下采样操作。从下图表示3可以看到:额外上采样操作会导致0.75ms推理延迟,而性能提升仅为0.3mAP。话说,这里的箭头是"左灯右行"吗???因此,作者移除了queen融合过程中的上采样操作。
在特征融合模块中,作者首先采用CSPNet替换原始的卷积,取得了4.2mAP指标提升;进一步引入重参数机制与ELAN。在不会导致额外巨大计算负担前提下,模型性能大幅提升(可参考上图表4)。
ZeroHead与AlignOTA
"解耦头"已在近来优异检测方案中得到广泛应用,尽管这些方案具有更高AP,但延迟也大幅提升。为平衡延迟与性能,作者进行了一系列实验以评估Neck与Head的重要性,结果见下表。可以看到:"Large Neck + Small Head"可以取得更优性能。
有鉴于此,作者丢弃了"解耦头"方案,反而仅保留一个任务投影层,即一个线性层进行分类,一个线性层进行回归。由于该检测头并无其他可训练层,故作者将所得检测头称之为ZeroHead。
在后续的损失中,参考GFocal,作者采用QFL进行分类监督,采用DFL与GIOU进行回归监督。DAMO-YOLO的损失函数定义如下:
除了Head与Loss外,标签分类也是检测器训练过程中一个非常重要的成分。相比静态方案,动态标签分配可以根据预测与GT之间的分配损失进行标签分类,其中代表方案有OTA与TOOD。尽管分类与回归不对齐问题已得到广泛研究,但标签分配中的不对齐却鲜少被提到。为解决该问题,作者定义了如下方案:
Distillation Enhancement
知识蒸馏是一种有效的涨点方案,但在YOLO系列方案中有时难以取得显著改善(超参难以优化,特征包含太多噪声)。在DAMO-YOLO中,作者首次让蒸馏在所有尺寸模型上再次伟大。
上表对比了不同蒸馏方案的性能对比,很明显CWD与所提模型更切合。作者采用的蒸馏包含两个阶段:
在strong mosaic域,采用老师模型对学生模型进行蒸馏(约284epoch); 在no mosaic域,学生模型进行微调(约16epoch)。
本文实验
上表给出了不同YOLO方案的性能对比(加*表示使用了蒸馏技术),可以看到:在精度/速度方面,DAMO-YOLO超越了其他所有 YOLO系列方案。
快速体验
DAMO-YOLO已被继承在阿里达摩院推出的"魔搭"社区ModelScope[modelscope.cn],大家可以5行代码完成体验(当然,你需要先安装modelscope)。
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
object_detect = pipeline(Tasks.image_object_detection,model='damo/cv_tinynas_object-detection_damoyolo')
img_path ='https://modelscope.oss-cn-beijing.aliyuncs.com/test/images/image_detection.jpg'
result = object_detect(img_path)