当前位置: 首页 > article >正文

【论文阅读笔记】YOLOv10: Real-Time End-to-End Object Detection

论文地址:https://arxiv.org/abs/2405.14458

文章目录

  • 论文小结
  • 论文简介
  • 论文方法
    • 为NMS-free训练的一致性双标签分配
      • 双标签分配
      • 一致性匹配度量
    • 效率-精度整体驱动的模型设计
      • 效率驱动模型设计
        • 轻量级分类检测头
        • Spatial-channel 解耦下采样
        • Rank-guided block design
      • 精度驱动模型设计
        • 大Kernel卷积
        • Attention
  • 论文实验
    • 对比实验
    • 消融实验
      • 模块消融实验
      • NMS-free训练实验
      • 效率驱动模型设计
      • 精度驱动模型设计

论文小结

  简单来说,本文介绍了一个无NMS后处理的检测方法,并在COCO数据集上达到与NMS-based的方法一致的精度。因为无NMS,所以速度更快
  一般情况来说,一对一(gt object VS positive sample, o2o)的标签分配策略会导致模型收敛性能较低。作者提出使用一对多(o2m)的标签分配策略来辅助训练,并提出一个一致性指标来协调o2o标签和o2m标签。

  此外,文中提出使用dwConv加速模型推理,使用基于dwConv的attention来提升精度。同时,作者对分类检测头和回归检测头进行消融实验,明确分类检测头存在优化空间

论文简介

  YOLO系列的前作基本都含有网络的前馈部分以及NMS后处理部分。使用NMS的原因是因为o2m的标签分配策略(单个GT框对应多个正样本训练,也是平衡正负样本的一种方式)会导致预测时产生密集正样本,需要在最后选出最佳预测。此外,NMS对参数敏感,也让YOLO无法实现最佳端到端部署。

  摆脱NMS的限制有两个思路:

  1. 采用端到端的DETR架构。采用混合模型将DETR推向实时应用领域,如RT-DETR。此种方法复杂度高
  2. 探索端到端的CNN-based检测器,使用one-to-one的标签分配方式。

  有一些论文探索了端到端的CNN-based检测器,但由于缺乏像one-to-many标签分配的大量监督信息,最终检测器的性能差点意思。作者为NMS-free YOLO提出了双标签分配策略一致性匹配度量。简单来说,就是使用o2m的作为辅助监督分支,从而为网络训练提供大量监督信息。然后再提出一个指标来让辅助监督与推理时的o2o分支监督和谐

  作者在模型架构设计上,从效率和性能上分别进行考虑。
  从效率上来说,作者做了三点优化:

  1. 作者发现分类检测头的重要性不如回归检测头,所以对分类检测头进行了优化;
  2. 下采样层做了优化。一般使用下采样卷积的时候,会同时提升channel,这会在较高分辨率多进行计算。所以作者采用dwConv的策略,即使用pwConv升channel,使用dwConv下采样;
  3. 排序引导块设计。简单来说,对block的重要性进行排序,逐步进行高效率block的替换,直至性能有所下降;

  从性能上考虑,作者也做了两点尝试:

  1. 大kernel卷积的应用。但即使是大核dwConv,也会带来不少计算量的增加,降低延迟。故作者选择在网络的后半部分应用;
  2. attention的应用。attention的设计是transformer block的样式,但由于复杂度较高,所以在attention的输入上做了个channel split处理,以降低计算量;

  速度的测试是在Tesla T4 GPU上进行的,性能和效率如上图1所示。对比YOLOv8,YOLOv10的参数量和AP都要更优;对比YOLOv9,YOLOv10的参数量更低,速度更快

论文方法

为NMS-free训练的一致性双标签分配

双标签分配

  在前作的YOLOs中,经常使用TAL方法为每个实例分配多个正样本。这种一对多分配会产生大量监督信号,帮助模型优化和达到优秀性能。这也让YOLOs依赖于NMS后处理。
  一对一分配只有一个预测对应GT来避免NMS后处理,这就导致了弱监督,进而导致次优精度和次优收敛速度。其他作者的一对一分配方法,通常需要引入额外的推理开销或产生次优性能

  本文提出的NMS-free训练方法,是使用双标签分配及使用一致性匹配度量来达到高效高性能的结果。换句话说,是在训练时使用双检测头分支,一个o2o分支,一个o2m分支,如下图所示。如此设计,backbone和neck能充分接受o2m标签分配带来的大量监督信息,且在推理时丢弃o2m分支即可。

一致性匹配度量

  使用一个指标来量化预测和实例之间的一致性水平,如下面公式所示:其中 b ^ \hat{b} b^为预测框, b b b为实例框, s s s是空间先验(anchor point), α \alpha α β \beta β是平衡因子。o2o( m o 2 o = m ( α o 2 m , β o 2 m ) m_{o2o}=m(\alpha_{o2m}, \beta_{o2m}) mo2o=m(αo2m,βo2m))和o2m( m o 2 m = m ( α o 2 o , β o 2 o ) m_{o2m}=m(\alpha_{o2o}, \beta_{o2o}) mo2m=m(αo2o,βo2o))分开统计该度量。
m ( α , β ) = s ⋅ p α ⋅ I O U ( b ^ , b ) β m(\alpha,\beta)=s\cdot p^{\alpha} \cdot {IOU}(\hat{b}, b)^{\beta} m(α,β)=spαIOU(b^,b)β

  作者发现o2m和o2o分支的监督差异主要在不同分类目标上面。其中,预测最大的IoU为 u ∗ u^\ast u,最大的o2m和o2o分别为 m o 2 m ∗ 和 m o 2 o ∗ m^\ast_{o2m}和m^\ast_{o2o} mo2mmo2o,假定o2m产生的正样本集为 Ω \Omega Ω,o2o分支选择第 i i i个预测的指标 m o 2 o , i = m o 2 o ∗ m_{o2o,i}=m^\ast_{o2o} mo2o,i=mo2o。我们获得的分类目标 t o 2 m , i = u ∗ ⋅ m o 2 m , j m o 2 m ∗ < u ∗ t_{o2m,i}=u^{\ast}\cdot \dfrac{m_{o2m,j}}{m^\ast_{o2m}}\lt u^\ast to2m,i=umo2mmo2m,j<u对于 j ∈ Ω j\in\Omega jΩ t o 2 o , i = u ∗ ⋅ m o 2 o , i m o 2 o ∗ = u ∗ t_{o2o,i}=u^\ast\cdot\dfrac{m_{o2o,i}}{m^\ast_{o2o}}=u^\ast to2o,i=umo2omo2o,i=u。两个分支的监督差距由 1 - Wasserstein距离1获得。

A = t o 2 o , i − I ( i ∈ Ω ) t o 2 m , i + ∑ k ∈ Ω ∖ { i } t o 2 m , k (1) A=t_{o2o,i}-\mathbb{I}(i\in \Omega)t_{o2m,i}+\sum_{k\in\Omega\setminus\{i\}}t_{o2m,k}\tag{1} A=to2o,iI(iΩ)to2m,i+kΩ{i}to2m,k(1)

  上述公式(1),当 t o 2 m , i t_{o2m,i} to2m,i上升时,gap会下降。当 t o 2 m , i = u ∗ t_{o2m,i}=u^\ast to2m,i=u时,gap达到最小,如上面的图2(a)所示。o2o和o2m的两个权重参数 α \alpha α β \beta β之间也存在关系,作者认为应该 α o 2 o = r ⋅ α o 2 m \alpha_{o2o}=r\cdot \alpha_{o2m} αo2o=rαo2m β o 2 o = r ⋅ β o 2 m \beta_{o2o}=r\cdot\beta_{o2m} βo2o=rβo2m,即 r r r为一样的。故o2m最好的正样本,也是o2o检测最好的。因此两个检测头可以持续和谐地优化。为简化,作者设 r = 1 r=1 r=1

  一致性匹配的作用如上图2(b)所示。

效率-精度整体驱动的模型设计

效率驱动模型设计

轻量级分类检测头

  在YOLO系列中,分类头和回归头通常用一样的架构。但其表现出不一样的计算量。在类别较多时,分类头的计算量是回归头的好几倍。以YOLOv8为例,分类图的参数量和计算量是检测头的2.5倍和2.4倍。但从下表的消融实验结果来看,回归头承担了YOLOs大部分的性能,故作者打算简化分类头。使用2个dwCon 3 × 3 3\times3 3×3接着1个Conv 1 × 1 1\times1 1×1来组成分类头。

Spatial-channel 解耦下采样

  常规的下采样是使用 stride 为 2 2 2的Conv 3 × 3 3\times3 3×3,同时让channel变为输入的 2 2 2倍。在高分辨率进行更多的卷积,这会导致计算量较大。所以作者采用如下方案进行下采样:使用Conv 1 × 1 1\times1 1×1升channel,使用dwConv 3 × 3 3\times3 3×3下采样。这让计算量从 O ( 9 2 H W C 2 ) \Omicron(\frac92HWC^2) O(29HWC2)降到 O ( 2 H W C 2 + 9 2 H W C ) \Omicron(2HWC^2+\frac92HWC) O(2HWC2+29HWC),参数量从 O ( 18 C 2 ) \Omicron(18C^2) O(18C2)降到 O ( 2 C 2 + 18 C ) \Omicron(2C^2+18C) O(2C2+18C)

Rank-guided block design

  YOLOs经常在不同的stage中使用一样的基础block。作者统计每个stage上最后一个基础block的最后一个Conv,统计大于阈值的数量。统计结果如下图3(a)所示,深stage和大模型有更多的冗余。这表示简单应用一样的block是次优的,有冗余的。

  作者首先设计了一个紧凑可逆块(Compact Invert Block,CIB),主要是采用了dwConv和pwConv,如上图3(b)。以此block为基础,构建ELAN block等复杂Block。

  然后,作者提出一种排序引导的block分配策略,即按照图3(a)这样的统计顺序,一步步将冗余度较高的stage进行基础block的替换,直到性能下降为止。伪代码如下图所示

精度驱动模型设计

大Kernel卷积

  大Kernel dwConv能扩大感受野,加强模型容量。但简单应用它们可能会导致用于检测小目标的浅层特征受到污染。同时,在高分辨率阶段应用会带来 I/O 开销和延迟。所以,作者选择只在深层stage的CIB中使用大kernel dwConv。具体来说,是从dwConv 3 × 3 3\times3 3×3提升到dwConv 7 × 7 7\times7 7×7。此外,加入重参数分支dwConv 3 × 3 3\times3 3×3来缓解优化问题

  当深度增加时,感受野自然会扩大。所以,作者选择只在小尺度模型上应用大kernel卷积。

Attention

  本文使用的attention叫做 Partial self-attention(PSA) ,主题结构是transformer的attention block。

  整体结构如上图3©所示:输入经过Conv 1 × 1 1\times1 1×1之后按照channel划分为 2 2 2部分。只有一部分放入 N P S A N_{PSA} NPSA 个attention block中。然后两部分再Concat起来,接着Conv 1 × 1 1\times1 1×1

  此外,遵循[21]将Query和Key的维度设为MHSA的一半,并将LN替换为BN,从而快速推理。

  为了快速推理,作者选择只在低分辨率的stage4之后使用,避免自注意机制的二次计算复杂度带来的太大开销。在此情况下,就可以将全局表示学习能力融入到YOLO中,而只需少量计算开销。

论文实验

  论文实验以YOLOv8为baseline,可能是因为论文发布时,YOLOv9-t 和YOLOv9-s 模型未开放出来,无法测试延迟等。YOLOv10的相关性能指标都是training from scratch的,同YOLOv9一样。YOLOv10-B模型是YOLOv10-M模型的factor放大版。

  论文的延迟都是在Tesla T4 GPU,TensorRT FP16上测试的。

  训练参数如下表所示:

  YOLOv10相关指标如下表所示:

对比实验

  与其他SOTA方法的对比如下表所示:YOLOv10比YOLOv8的AP高,延迟低,参数少,计算量少。 L a t e n c y f Latency^f Latencyf是只看网络forward过程,不计算后处理耗时。只看forward过程,YOLOv10也是最有效率的。

消融实验

模块消融实验

  YOLOv10每个模块的消融实验如下表所示,对中等模型和小模型都进行了实验。
  在小模型上,NMS-free快了 4.63 4.63 4.63ms,AP少了 0.6 % 0.6\% 0.6%,Accuracy有效涨点 1.8 % 1.8\% 1.8%AP,时间只增加 0.18 0.18 0.18ms。
  在中模型上,efficiency就有较大区别,能够快 0.65 0.65 0.65ms,Accuracy涨 0.7 % 0.7\% 0.7%AP。

NMS-free训练实验

  从表 3 3 3可以看出,双标签分配方式达到与o2m相近的结果,简单的o2o标签分配方式有较大的AP下降( 1.5 % ↓ 1.5\%\downarrow 1.5%)。
  从表 4 4 4可以看出,引入一致性匹配让o2o和o2m检测头更协调。 α \alpha α β \beta β使用相同 r r r有最佳性能。默认 α o 2 m = 0.5 , β o 2 m = 6.0 \alpha_{o2m}=0.5,\beta_{o2m}=6.0 αo2m=0.5,βo2m=6.0 α o 2 o = r ⋅ α o 2 m , β o 2 o = r ⋅ β o 2 m \alpha_{o2o}=r\cdot\alpha_{o2m},\beta_{o2o}=r\cdot\beta_{o2m} αo2o=rαo2m,βo2o=rβo2m

效率驱动模型设计

  下表 5 5 5展示了(1) lightweight classification head;(2) spatial-channel decouple downsample;(3) rank-guided block的消融实验结果。

  下表 6 6 6展示了无class error和regression error的对照组。 A P w / o   r v a l AP^{val}_{w/o\ r} APw/o rval A P w / o   c v a l AP^{val}_{w/o\ c} APw/o cval更高,表示消除回归误差有更大的改善。性能瓶颈更多地在回归任务上。
  下表 7 7 7展示了采用了pwConv和dwConv后,原策略优化性能和本文优化策略的对比。
  下表 8 8 8展示了以IRB(Inverted Residual block)作为baseline( 43.7 % 43.7\% 43.7%AP),添加一个dwCon 3 × 3 3\times3 3×3命名为“IRB-DW”,这带来了 0.5 % 0.5\% 0.5%AP的增长。对比 I R B − D W IRB-DW IRBDW,本文的CIB又增长了 0.3 % 0.3\% 0.3%AP。
  下表 9 9 9展示了使用高效CIB逐步代替各阶段的瓶颈块,按照图 3 3 3(a)的顺序 S t a g e   8 − 4 − 7 − 3 − 5 − 1 − 6 − 2 Stage\ 8-4-7-3-5-1-6-2 Stage 84735162,在阶段 7 7 7才有所下降。故本文CIB替换应用只在stage8和stage4.

精度驱动模型设计

  下表 10 10 10展示了Large Kernel和PSA的消融实验,
  下表 11 11 11,Large Kernnel的Kernel Size实验,Kernel Size为 7 7 7效果最好。此外,没有重参数分支时,少 0.1 % 0.1\% 0.1%AP。
  下表 12 12 12,在YOLOv10-N/S上,Large Kernel带来小幅提升。
  下表 13 13 13,引入transformer快,标为"Trans"。对比下,PSA带来 0.3 % 0.3\% 0.3%AP提升,且降低 0.05 0.05 0.05ms的延迟。对PSA block的重复数量进行实验, N P S A N_{PSA} NPSA=2能带来 0.2 % 0.2\% 0.2%AP提升,但增加了 0.1 0.1 0.1ms延迟。故选择 N P S A = 1 N_{PSA}=1 NPSA=1


  1. https://arxiv.org/abs/1806.05500 ↩︎


http://www.kler.cn/news/311801.html

相关文章:

  • 【高级编程】网络编程 基于 TCPUDP 协议的 Socket 编程
  • Remix 学习 - @remix-run/react 中的主要组件
  • 网络-内核是如何与用户进程交互
  • MySQL从入门到精通
  • MyBatis 数据处理:主键获取、批量删除与动态表名
  • Linux 磁盘清理重新格式化挂载脚本及问题解决
  • flink doris批量sink
  • 我可真厉害,3分钟让你成为AI高手:提示词(prompt)制作及调优(免费教你,别再被割了)
  • 企业EMS -能源管理系统-能源管理系统源码-能源在线监测平台
  • Linux进阶系列(四)——awk、sed、端口管理、crontab
  • 好菜每回味不同——建造者模式
  • GEE教程:对降水数据进行重投影(将10000m分辨率提高到30m)
  • ESP32配网接入Wifi
  • Spring Boot从0到1 -day02
  • 【踩坑】装了显卡,如何让显示器从主板和显卡HDMI都输出
  • QTAndroid编译环境配置
  • Linux基础命令——文件系统的日常管理
  • TaskRes: Task Residual for Tuning Vision-Language Models
  • vue项目中——如何用echarts实现动态水球图
  • 828华为云征文 | 华为云X实例监控与告警管理详解
  • 【Linux入门】基本指令(一)
  • 服务器上PFC配置丢失问题排查与解决方案
  • Python | Leetcode Python题解之第412题Fizz Buzz
  • 简评2024.9.16北京大运河音乐节
  • Prompt最佳实践|指定输出的长度
  • 深度学习自编码器 - 收缩自编码器(CAE)篇
  • 74、Python之函数式编程:深入理解惰性求值与生成器
  • MySql 初次见面
  • Java 基础知识九(网络编程)
  • 二叉树(下)