1. 简介
近几年来,方针检测模型,尤其是单阶段方针检测模型在工业场景中已经得到广泛使用。关于检测算法来说,模型的精度以及运转功率是实践运用时最受关注的指标。因而,咱们对目前的单阶段方针检测器进行了全面的改善:从增强模型的特征提取才能和对各个组件的核算量进行均衡化,到运用动态的软标签来优化练习战略,再到对数据增强的功率和功能进行改善, 咱们对算法的各个方面都提出了新的优化方案。
经过这些改善,咱们得到了从 tiny 到 extra-large 巨细的一系列高功能检测模型,咱们将这套实时方针检测模型(R eal- T ime M odels for object Det ection)命名为 RTMDet。其间,RTMDet-x 取得了 52.8 mAP 的精度和 300+FPS 的运转速度,一起,RTMDet-tiny 在仅有 4M 参数量的情况下达到了 41.1 mAP 的精度,逾越了同级其他一切模型。RTMDet 不只仅在方针检测这一使命上功能优异,在实时实例切割以及旋转方针检测这两个使命中也相同达到了 SOTA 的水平!
除了具有超高的精度,RTMDet 的工程优化也十分全面:根据 MMDeploy,RTMDet 全系列已经支持了 ONNXRuntime 以及 TensorRT 等推理结构的布置。一起,为了节约广阔炼丹师的宝贵时间,RTMDet 的练习功率也相同进行了大幅的优化,咱们在 MMYOLO 中供给了高效练习版其他代码,RTMDet-s 练习 300 epoch 仅需 14 8 GPU 时!
检测和实例切割模型代码已开源至:
github.com/open-mmlab/…
根据 MMYOLO 的高效练习版别:
github.com/open-mmlab/…
根据 MMRotate 的旋转框检测模型:
github.com/open-mmlab/…
技能报告链接:
arxiv.org/abs/2212.07…
话不多说,接下来就让咱们来详细了解 RTMDet 在各方面的改善吧~
2. 算法和工程优化详解
2.1 模型结构规划
具有一个高效的模型结构是规划实时方针检测器最关键的问题之一。自 YOLOv4 将 Cross Stage Partial Network 的结构引进 DarkNet 之后,CSPDarkNet 因其简练高效而被广泛使用于 YOLO 系列的各个改善版中。
而 RTMDet 也将 CSPDarkNet 作为基线,并运用相同构建单元组成的 CSPPAFPN 进行多规范的特征交融,终究将特征输入给不同的检测头,进行方针检测、实例切割和旋转框检测等使命。全体的模型结构如下图所示:
图 1. RTMDet 模型结构图
全体的微观架构与 YOLO 系列并没有太大差异,RTMDet 对模型的批改主要聚集于两点:添加根本构建单元的特征提取才能,以及探究模型不同组件间的核算功率和精度的平衡。
首先让咱们回忆一下 DarkNet 根本的构建单元,如图 2.(a) 所示,它由 1 个 1×1 的卷积和 1 个 3×3 的卷积组成,以及残差衔接组成。为了提高根本单元的特征提取才能,咱们挑选引进更大的卷积核来增大感触野。在经过对不同 kernel size 的融化试验(表 1)后咱们发现,在根本单元中参加一个 5×5 的深度可分离卷积,取得了最好的核算功率与精度的平衡。新的根底单元结构如 图 2.(b) 所示。
表 1. 不同 kernel size 的精度与速度的比照试验
值得注意的是,最近提出的 YOLO 的不同改善版,如 YOLOv6,v7,以及 PPYOLO-E,都挑选在根本单元中参加 RepVGG 的重参数化卷积模块,如图 2.(c),图 2.(d) 所示。
图 2. CSPDarknet、RTMDet 、PPYOLOE、YOLOv6 的根本构建单元
重参数化经过练习时运用多分支的结构,然后再在推理时交融成单分支的办法,在不添加推理核算量的情况下提高功能。
但是,重参数化也有其坏处,比方会明显添加练习的显存开支,一起也会导致运用低精度对模型进行量化时发生较大的功能下降。虽然可以经过 QAT 等办法处理量化掉点的问题,但这也使得从模型练习到布置的流程变得更为杂乱。
因而,咱们认为引进大卷积核添加感触野的办法比较引进重参数化来说,不论是从练习仍是布置都可以供给更好的作用。
除了根本构建单元的批改之外,RTMDet 还对整个模型的不同分辨率层级之间、以及 backbone 和 neck 之间的核算量分配进步行了全面的调整。因为在根本单元中引进了深度可分离卷积,使得模型全体的层数比较于 CSPDarkNet 来说变得更深,然后导致推理速度的减慢。
为了处理这一问题,咱们对模型不同分辨率层级的根本单元数量进行了调整,从原本 C2~C5 别离为 3-9-9-3 个 block,调整为了 3-6-6-3 个 block
图 3. Backbone 结构改善
一起为了坚持模型的全体核算量不变,咱们略微增大了模型的宽度,而且在每个 stage 之后添加一个 ChannelAttention 模块来供给通道注意力(如图 4)。
图 4. 添加通道注意力前后的 C5 stage 特征比照
如表 2 所示,在经过调整之后,模型的推理速度更快,而且可以坚持类似的精度。
表 2. Backbone 结构比照试验
而关于用来进行多规范特征交融的 neck 模块来说,以往的办法,如 EfficientDet、GiraffeDet 等,都是经过添加更多的特征交融次数,也就是参加更多的衔接来提高功能。
但是,过多的特征层之间的衔接会显著添加显存的占用,也会因为访存问题而添加推理耗时。因而,咱们挑选仅经过添加 neck 模块的核算量占比来提高其功能,当 backbone 与 neck 的参数量调整至类似时,整个检测器的推理速度更快,功能也更高:
表 3. Backbone neck 参数量分配比照试验
除了 backbone 和 neck 之外,咱们对模型的检测头也进行了调整。YOLO 系列往往在不同的特征层级上别离运用独立的检测头,这就导致了模型参数的利用率低下。因为关于不同的特征层级来说,其检测出的物体的特征,在相对的规范巨细下应当是附近的,而学术界常用的检测器(如 RetinaNet、FCOS)运用同享参数的检测头也正印证了这一点。
可是,因为不同层级之间特征的统计量仍存在差异,Normalization layer 仍然是有必要的,因为直接在同享参数的检测头中引进 BN 会导致其滑动平均值发生差错,而引进 GN 又会添加推理时的开支,因而咱们参阅 NASFPN 的做法,让检测头同享卷积层,而 BN 则别离独立核算。
在运用同享的检测头后,模型的参数量得到了削减,而且功能非但没有下降,反而还得到了略微的提高:
表 4. Head 结构比照
经过选用以上这些战略,咱们又对通道和深度的超参数进行缩放,得到了 tiny、s、m、l、x 五种不同巨细的模型,其参数量别离从 4M 到 90M 递加,以供给给不同的使用场景。
2.2 练习战略优化
正负样本的标签分配战略是方针检测练习过程中最重要的一环,近几年来,标签分配战略从最初的根据 anchor IoU 的静态匹配办法,逐步演进为运用价值函数进行动态标签分配。但是,目前干流的动态标签分配战略,如匈牙利匹配、OTA 等均运用与丢失函数共同的函数核算价值矩阵。
咱们经过试验发现,与丢失函数完全共同的价值矩阵核算办法并不是最优的。因而,RTMDet 根据 YOLOX 的 SimOTA 进行改善,运用了动态的软标签分配战略,其价值矩阵核算公式如下:
它由三个价值函数组成,首先是分类价值函数,传统的分类价值往往运用 0-1 散布的二值化标签进行丢失核算,这很容易导致,一个具有很高分类置信度可是具有过错检测框的低质量猜测成果得到一个很低的分类价值,反之也是如此。
因而咱们参阅 GFL,将猜测框与 Ground Truth 的 IoU 得分作为软标签,并对不同得分的匹配进行了从头加权,使得分类价值的匹配成果更为准确和安稳,其公式如下:
而关于回归价值,运用与丢失函数共同的 GIoU,很容易导致一个低质量的匹配和一个高质量的匹配区分度不够高,这是因为关于 GIoU 函数来说,一个完全正确的检测框和一个完全过错的检测框,他们之间的 IoU 得分也只相差了 1 而已。因而,咱们挑选取对数来增大低质量与高质量匹配之间的差异:
终究,咱们还引进了一个“软化”的中心先验价值。与之前的很多办法运用固定的先验区域(如 ATSS,SimOTA)不同,中心先验价值将位置先验也引进价值矩阵的核算之中,一方面可以安稳收敛,另一方面也可以使匹配的正样本区域更为灵敏。
为了公正比较,咱们在规范的 ResNet-50 12 epoch 的 setting 下与其他标签分配战略进行了比照,成果显示咱们的办法取得了最优的精度:
表 5. R50 1x setting 下的标签分配战略功能比照
为了验证这套办法的通用性,咱们也在 300 epoch 和强数据增强的情况下与 YOLOX 的 SimOTA 进行了比照,成果显示,咱们的办法也相同得到了更高的精度:
表 6. 运用 RTMDet-s 练习 300 epoch 的标签分配战略功能比照
咱们运用 MMYOLO 中供给的 GradCAM++ 可视化东西(demo/boxam_vis_demo.py
)可视化了 neck 部分的特征图,从下图中可以看出,与 YOLOv6 比较,运用了动态软标签分配战略的 RTMDet 的检测方针的特征呼应十分集中,且没有误检:
图 5. 运用 GradCAM++ 对 neck 部分特征呼应的可视化(左:RTMDet-l,右:YOLOv6-l)
2.3 数据增强改善
数据增强不只关乎模型的精度,也对练习的功率有着巨大的影响。跟着 GPU 核算功能的不断添加,模型前向和反向传播的速度在不断提高。
但是,当咱们在练习工业级的模型时,因为引进大量的数据增强,CPU 的核算才能以及存储的 IO 往往成为了制约模型练习速度的瓶颈。尤其是当运用了 YOLO 系列中广泛运用的 Mosaic 和 MixUp 这样涉及到多张图片混合的数据增强,因为需求读取和处理的图片数量成倍添加,数据增强的耗时也大幅添加。
图 6. Mosaic MixUp 数据增强作用图
为了处理多图混合数据增强的耗时问题,咱们在这些数据增强中引进了缓存机制。咱们运用一个缓存行列将前史的图片保存下来,当需求进行图片混合操作时,不再经过 dataset 从头加载图片,而是从缓存行列中随机选取前史的图片进行混合。经过试验发现,当缓存行列足够大,且运用随机出队的办法时,练习得到的模型精度与传统的 Mosaic & MixUp 并无差异。因为引进了缓存机制,两种数据增强的运转功率得到了大幅提高。
经过运用 MMDetection 中的 benchmark 东西 tools/analysis_tools/benchmark.py
,咱们将 RTMDet 与以高效练习著称的 YOLOv5 的数据增强进行了比照:
YOLOv5 的数据增强(MixUp 概率仅为 0.1)的吞吐量: Overall fps: 30.2 img/s, times per img: 33.1 ms/img;RTMDet 的数据增强(MixUp 全程敞开)的吞吐量:Overall fps: 52.4 img/s, times per img: 19.1 ms/img。
从 benchmark 的成果来看, RTMDet 在全程敞开图画混合的数据增强的情况下,数据处理吞吐量仍然显著高于 YOLOv5,每秒处理的图片数量达到了 YOLOv5 的 1.7 倍!运用缓存机制加快的 Mosaic 和 MixUp 已经在 MMYOLO 中得到了全面的支持,不只 RTMDet 可以运用,YOLOv5,v6,v7上都可以经过 use_cached=True
开关直接敞开,真实做到了一键加快练习!
除了优化数据增强的运转功率,咱们也对数据增强的逻辑进行了优化。咱们分析了 YOLOX 的数据增强后发现了其间的问题:YOLOX 运用强弱两个阶段的数据增强,但其第一个练习阶段引进了旋转和切变等操作,导致标示框发生了比较大的差错,使其第二个练习阶段需求对回归分支额定添加一个 L1 loss 来对回归使命进行批改。这就造成了数据增强与模型的丢失函数规划发生了耦合。
为了使数据增强和模型解耦,得到更通用的增强战略,咱们挑选在第一个练习阶段不引进导致标示差错的数据增强,而是经过添加 Mosaic MixUp 混合图片的数量来提高强度,咱们将总体混合的图片数量从 YOLOX 运用的 5 张添加至 8 张。
得益于上文提到的缓存机制,添加混合图片的数量并不会导致练习速度变慢。在第二个练习阶段,咱们封闭 Mosaic 和 MixUp,转而运用 Large Scale Jitter(LSJ),使模型在更契合原数据集特征散布的状态下微调。经过比照试验可以看出,咱们的数据增强显著优于之前的办法:
表 7. 数据增强练习精度比照
2.4 终究作用
经过上文的种种改善,咱们终究得到了 RTMDet 系列模型,咱们可以将试验拆解,并逐个使用在咱们的对照组模型 YOLOX 之上,来解析怎么从 YOLOX 一步一步批改为 RTMDet:
表 8. 从 YOLOX 到 RTMDet step-by-step 比照
首先,为了处理 CosineLr 学习率衰减过快以及 SGD 收敛不安稳的问题,咱们将优化器以及学习率别离替换为了 AdamW 和 FlatCosineLR,得到了 0.4% 的提高。
然后咱们运用新的根底单元构建而成的 backbone 和 neck 替换了原有的模型结构,这一改善又提高了 1.2% 的 AP,而且推理速度只减慢了 0.02ms。在运用同享权重的检测头后,参数量过大的问题得到了处理,而模型精度和推理速度都没有下降。在此根底之上,咱们又添加了动态软标签分配战略以及改善后的数据增强,别离带来了 1.1% 和 1.3% 的精度提高。
终究,锦上添花的一点,咱们又将 backbone 在 imagenet 进步行了预练习,也使精度得到了略微的提高。不过预练习模型仅在 tiny 和 s 模型上有精度提高的作用,在更大的模型结构上则体现不出优势。
归纳以上这些批改,RTMDet 比较于 YOLOX 在类似的模型巨细以及推理速度上提高了 4.3% AP!
经过调整深度以及宽度的系数进行模型缩放,咱们终究得到了 tiny/s/m/l/x 五种不同巨细的模型,在不同量级上均逾越了同级其他模型:
表 9. RTMDet 与其他同等级模型的功能比照(推理测速运用 3090 GPU,TensorRT 8.4.3)
- 别的,咱们还在工业界常用的 T4 GPU 进步行了测速,作用如下表所示:
-
Model latency(ms) FPS RTMDet-tiny 2.34 427.35 RTMDet-s 2.96 337.84 RTMDet-m 6.41 156.01 RTMDet-l 10.32 96.90 RTMDet-x 18.80 53.19
表 10. RTMDet 在 T4 GPU 上的推理速度(测速运用 TensorRT 8.4,FP16,batchsize=1)
3. 多项使命取得 SOTA
为了验证 RTMDet 算法的通用性,咱们经过仅添加使命头的办法,对模型进行了最小限度的批改,将其拓宽至了实例切割以及旋转方针检测使命上。在仅进行 了 十分简略的批改的情况下,RTMDet 也仍然取得了 SOTA 的作用!
图 7. RTMDet 在三种不同使命上的可视化作用
3.1 实例切割
传统的实例切割往往选用双阶段的办法来猜测 mask,但近两年来,根据 kernel 的办法正逐步兴起。为了坚持单阶段检测器的简练高效和易于布置的特性,咱们参阅 CondInst 为 RTMDet 添加了 mask head 以及 kernel head。
mask head 由 4 个卷积层组成,经过 neck 输出的多规范特征猜测出维度为 8 的 mask prototype feature。而 kernel head 则为每个 instance 猜测 169 维的向量,然后组成 3 个动态卷积的卷积核,与 mask feature 进行交互,终究得到每个 instance 的 mask。
图 8. RTMDet-Ins 实例切割分支示意图
为了最大化利用 mask 的标示信息,咱们还将标签分配中的中心先验价值的检测框中心批改为了 mask 的重心。为了与其他实例切割办法做公正比照,咱们运用 ResNet50 FPN 12 epoch 的规范 setting 进行了试验,一起参阅 CondInst 参加了语义切割的辅助分支加快收敛。
试验成果表明,咱们的办法在规范 setting 下,不只逾越了 CondInst,SOLOv2 等单阶段模型,也逾越了 Cascade Mask R-CNN 这样的多阶段模型。在运用与 RTMDet 共同的模型结构以及练习战略后,得到的 RTMDet-Ins 模型,精度不只大幅逾越 YOLOv5-seg,也逾越了前几天刚刚推出的 YOLOv8,取得了实时实例切割的 SOTA。
表 11. RTMDet-Ins 与其他实例切割算法的功能比照
3.2 旋转方针检测
旋转方针检测是遥感范畴运用最广泛的办法,而将 RTMDet 拓宽至此使命也十分简略,得益于 MMDetection 3.0 版别,咱们只需求添加回归分支的输出特征维度,添加角度分量,一起替换 box 的编解码器, 便能让 RTMDet 支持猜测旋转框。因为旋转框与普通方针检测使命仅有回归分支有差异,因而旋转框的模型也可以加载方针检测的预练习模型并从中获益。
咱们在遥感范畴最常用的 DOTA 数据集上验证了咱们的办法,成果表明,咱们的模型不只逾越了很多的多阶段办法,也逾越了之前最优的算法 PPYOLOE-R,成为了 SOTA。
图 9. RTMDet-R 与其他旋转方针检测办法在 DOTA 数据集上的比照
为了验证模型的泛化才能,咱们还在 DOTA 1.5 以及 HRSC 两个数据集进步行了练习,也相同取得了最优的成果。
表 12. RTMDet-R 在 DOTA 1.5 上的功能
表 13. RTMDet-R 在 HRSC 上的功能,仅运用 tiny 模型就逾越了之前的多阶段算法
4. 总结
经过在模型结构的根本单元引进大 kernel 深度可分离卷积增大感触野,并平衡不同分辨率层级间以及 backbone 和 neck 间的核算量、参数量平衡,改善标签分配以及数据增强战略,RTMDet 不论是在方针检测使命上,仍是在实例切割以及旋转方针检测使命上,均取得了优异的功能。咱们期望咱们探究出的这些改善方案可以对规划实时的方针检测模型有所启示,也期望咱们在工程及算法上的优化可以在实践的工业场景中有所使用。
终究,别忘了给 MMDetection、MMYOLO、MMRotate 点个 Star 哦~
方针检测和实例切割项目地址:github.com/open-mmlab/…
MMYOLO 高效练习版别地址:github.com/open-mmlab/…
旋转框检测项目地址:github.com/open-mmlab/…