前置知识

 TRansformer

【超详细】【原理篇&实战篇】一文读懂Transformer

DETR

DETR 使用传统的 CNN 主干来学习输入图像的 2D 表示。该模型将其展平并用位 置编码对其进行补充,然后将其传递到变压器编码器。然后,变压器解码器将少量固定数量的学习位置嵌入(我们称之为 object queries)作为输入,并另外关注编码器输出。 我们将解码器的每个输出嵌入传递到共享前馈网络(FFN),该网络预测检测(类和边界框)或“无对象”类。​​​​

DETR 解码器中 N = 100 个预测槽中 20 个的 COCO 2017 val 集的所有图像上所有框预测的可视化。每个框预测都表示为一个点,其中心坐标位于按每个图像大小标准化的 1×1 正方形中。这些点采用颜色编码,绿色对应小框,红色对应大水平框,蓝色对应大垂直框。我们观察到,每个位置都会通过多种操作模式学习专门针对某些区域和框的尺寸。我们注意到,几乎所有槽都有一种预测 COCO 数据集中常见的大型图像宽框的模式。

论文讲解

背景

  • 现状: 现有的 DETR 类模型(如 DINO, Relation-DETR 等)普遍采用 “级联解码器”(Cascaded Decoder) 结构 。即 Object Queries 一层一层地往下传,每一层的输出直接决定下一层的输入 。
  • 问题: 这种串行结构限制了 Query 的更新方向,导致它只能学到相对有限的信息 。而且,随着层数加深,学到的信息可能变得冗余甚至产生负面效果 。
  • 比喻: 就像学生(Query)问老师(Image Features)问题。级联结构像是一个学生连续追问,每一个问题都被上一个问题的答案框住了;而这篇论文想做的是让“多个学生”同时从不同角度并行提问 。

由于自然场景的多样性和复杂性,物体可能非常小、被严重遮挡或与背景混淆地混合。为了适应多样化的场景,需要充分利用图像特征来学习综合信息。 然而,基于以上分析,现有模型采用的级联多次查询架构往往学习到的信息相对有限。这促使我们探索新的解码器架构来优化特征利用率。受传统基于 CNN 的方法发展的启发,该论文注意到许多方法可以通过合理的并行架构增强特征利用率。因此,MI-DETR 抛弃了单一的级联更新范式,通过参数独立的并行查询机制 (MI)U型特征交互 (UFI),实现了对图像特征的全方位、多模式挖掘,刷新了 DETR 类模型的性能上限。

(a)我们提出了具有参数相关查询头和解码器层融合操作的并行多次查询机制; (b)在最近提出的类DETR模型中, 主查询和辅助查询被连接并输入到解码器层中的同一查询头, 因此这种并行架构是参数共享并行

核心方法

并行多次查询机制

多次查询:Q_{i}^{k}=FFN_{i}^{k}(CrossAtt_{i}^{k}(SelfAtt_{i}^{k}(Q_{i-1}),E_{j}))

查询融合:Q_{i} = Linear(Concat(Q_{i}^{1} , Q_{i}^{2} , . . . , Q_{i}^{M} ))

对比维度 原始 DETR / DINO 等主流变体 MI-DETR (本文模型) 差异解析
拓扑结构

级联式 (Cascaded Inquiries) 

层内并行式 (Parallel Multi-time Inquiries) 

单线程 vs. 多线程

原始模型中,Object Query 在每一层只能进行一次更新,下一层的输入完全依赖上一层,导致信息获取受限 。MI-DETR 允许在同一层内并行进行多次查询。

内部模块

单个 Inquiry Head 

(包含 1组 SA + CA + FFN)

多个 Inquiry Heads + 融合模块 

(包含 M 组 SA + CA + FFN,最后由 Linear 融合)

信息单一 vs. 信息互补

MI-DETR 通过 M 个并行的 Head 挖掘不同模式的信息(例如有的 Head 关注大物体,有的关注小物体),最后通过 Concat + Linear 进行融合 。

参数策略 单套参数

独立参数 (Real Parallel) 

伪并行 vs. 真并行

不同于 Group-DETR 等为了 One-to-Many 匹配而做的“参数共享”并行,MI-DETR 的每个 Head 参数独立,确保学到不同的特征模式 。

# 1. 准备并行分支 (打包 M 个 Head 的层)
# self.layers 是主分支,branch2...branchM 是额外的分支
mi_layers = [self.layers] 
for i in range(2, self.inquiry_head_num + 1):
    branch_name = f"layers_for_branch{i}"
    # ... 获取分支代码 ...
# zip 的作用是将 "垂直" 的列表变成 "水平" 的组合
# 比如:[(Branch1_L1, Branch2_L1...), (Branch1_L2, Branch2_L2...), ...]
mi_layers = zip(*mi_layers)  

# 2. 并行执行循环
for layer_idx, inquiry_heads in enumerate(mi_layers):
    inquiry_outputs = []
    # 遍历并行的 Head (注意:这里是真并行,参数独立)
    for inquiry_head in inquiry_heads:
        inquiry_output = inquiry_head(
            output, # 输入:大家看的是同一个 Query
            memory_per_layer[layer_idx], # 输入:大家看的是同一层(或经UFI处理后)的图像特征
            # ... 其他参数 ...
        )
        # 收集结果:比如 Head1 觉得是猫,Head2 觉得是狗
        inquiry_outputs.append(inquiry_output)
# 1. 定义融合层 (Linear: M * 256 -> 256)
# 输入维度放大 M 倍,输出维度变回正常
self.state_aware_query_fusion = nn.Sequential(
    nn.Linear(inquiry_head_num * embed_dim, embed_dim),
    nn.LayerNorm(embed_dim),
)

# ... 在 forward 函数中 ...

# 2. 执行融合
# torch.cat: 把大家的话拼在一起。假如 embed_dim=256, 3个头,拼接后变成 768 维
# fusion:  把 768 维压缩回 256 维
output = self.state_aware_query_fusion(
    torch.cat(inquiry_outputs, dim=-1)
)

U型特征交互

Q_{i} = \mathcal{D}_{i}(Q_{i-1}, E_{j}), \quad j = L - i + 1,

E_j = \begin{cases} \text{linear}(\text{concat}(E_j, E_L)) & j=1, 2, \dots, L-1, \\ E_L & j=L \end{cases},

对比维度 原始 DETR / DINO MI-DETR (UFI 模块) 差异解析
特征来源

仅最后一层 (Last Layer Only) 

多层级对应

(U-like Feature Interaction) 

信息瓶颈 vs. 全局利用

原始 DETR 的所有 Decoder 层都只查阅 Transformer Encoder 最后一层的输出 ($E_L$),忽略了中间层的细节信息。

交互逻辑 $Decoder_i \leftarrow Encoder_L$

$Decoder_i \leftarrow Encoder_{L-i+1}$

U-Net 思想的迁移

MI-DETR 借鉴 U-Net,让 Decoder 的第 $i$ 层与 Encoder 的倒数第 $i$ 层进行交互。这样 Decoder 既能利用高层的语义抽象特征,也能利用低层的细节特征 。

# 1. 定义 UFI 融合层 (针对每一层都有一个)
self.fusion = nn.ModuleList([copy.deepcopy(self.fusion) for i in range(5)])

# ... 在 forward 函数中 ...

# 2. 执行 U-like 交互
# memory_per_layer[-1] 是 Encoder 最后一层的输出 (E_L),代表最高级、最抽象的全局语义(上帝视角)
memory_tmp = memory_per_layer[-1] 

memory_per_layer = [
    self.fusion[i](
        # 核心公式: Concat(全局语义 E_L, 当前层细节 E_i)
        torch.cat([memory_per_layer[-1], memory_per_layer[i]], dim=-1)
    ) 
    # 遍历 Encoder 的前几层 (E_1, E_2...)
    for i in range(len(memory_per_layer) - 1)
]
# 最后把 E_L 也放回去,并且倒序
memory_per_layer.append(memory_tmp)
memory_per_layer = memory_per_layer[::-1] # 倒序

总体框架

MI‐DETR 概述。主要的新颖之处在于 MI‐DETR 使用多次查询 (MI) 解码器层来取代之前类似 DETR 模型中采用的传统解码器层。主干和 L层变换器编码器提取图像特征E = {E0, . . . , EL}。对于第 i 个 MI 解码器层,输入是对象查询 Qi−1 , 输出是 Qi。对于第 i个MI解码器层中的查询头,对象查询通过与 Ej交互来学习多模式信息,其中 j = L − i + 1和 Ej 是经过 U‐like特征交互处理后对应的图像特征。最后一个 MI 解码器层(即 QL)的输出用于预测对象的位置和类别

Lite多次查询

Lite 多次查询 (Lite‐MI) 是 MI 的轻量级版本,如图

Lite‐MI 架构

Q_{i}^{k}=FFN_{i}^{k}(CrossAtt_{i}^{k}(SelfAtt_{i}(Q_{i-1}),E_{j}))

对比维度 原始 DETR MI-DETR (Lite-MI) 差异解析
SA  每个 Decoder 层独立计算 SA

共享 SA (Shared Self-Attention) 

去重功能的参数复用

作者认为 Self-Attention 的主要作用是去除重复的候选框(NMS-like),且不涉及图像特征交互。因此,在 Lite-MI 版本中,并行的多个 Head 共享同一个 SA 模块,只独立计算 Cross-Attention 和 FFN,从而大幅减少参数量。

实验

设置

我们在 COCO数据集上进行实验。按照惯例, COCO train2017 split(118k 图像)用于训练,COCO val2017split(5k 图像)用于验证。 AdamW用于优化,学习率为 1 × 10^{^{-4}} ,权重衰减为1 × 10^{^{-4}}。 我们报告了使用两种常用骨干网(包括在 ImageNet‐1k上预训练的 ResNet‐50和在 ImageNet‐22k 上预训练的 Swin‐L)在 1x(12 epochs)和 2x(24 epochs)训练计划下的实验结果。 该指标是不同 IoU 阈值和对象尺度下的标准平均精度 (AP)。当主干网为 ResNet‐50 时,使用 RTX3090 GPU;当主干网为 Swin‐L 时,使用 A100 GPU。查询头数量为4个。

对比实验

相关模型

1. DINO (DETR with Improved DeNoising Anchor Boxes)
  • 当前 DETR 家族的性能“天花板”与标准基线。

  • 核心改进(去噪训练): 它解决了 DETR 收敛慢的问题。它在训练时人为加入带噪声的“假框”,让模型学习如何去除噪声(去噪),从而让模型能更快、更准地锁定物体。它是第一个在 COCO 数据集上完全超越主流 CNN 模型的 Transformer 检测器。

2. Group DETR
  •  通过“分身术”来加速训练的插件。

  • 核心改进(一对多匹配): 普通 DETR 每次只给模型极少的正样本(一对一),导致训练吃不饱。Group DETR 引入了多组 Query(像是使用了多个分身),每组都独立进行训练,让模型一次能学到更多正样本。推断时只需用其中一组,所以速度不变,但训练收敛快得多。

3. Relation DETR
  • 让物体之间“懂社交”,利用上下文提升精度。

  • 核心改进(显式关系建模): 虽然 Transformer 本身有注意力机制,但 Relation DETR 认为这还不够。它显式地去计算物体之间的几何关系(如位置、距离)和语义关系(如“人”骑“车”),利用物体间的相互作用来辅助检测,特别适合处理拥挤场景或模糊物体。

不同骨干网和训练时期下的比较实验
方法 (Method) 训练轮数 AP (总计) AP50​ AP75​ APS​ (小目标) APM​ (中目标) APL​ (大目标)
DINO 12 49.0 66.6 53.5 32.0 52.3 63.0
Stable-DINO 12 50.4 67.4 55.0 32.9 54.0 65.5
Group-DETR 12 49.8 67.4 55.1 32.4 53.0 64.2
Relation-DETR 12 51.7 69.1 56.3 36.1 55.6 66.1
MI-DETR (Ours) 12 52.4 69.8 57.0 35.6 56.1 67.2

诊断实验

主要部件消融实验测试

MI(多次查询)、Lite‐MI(Lite 多次查询)和 UFI (类 U 特征交互)的诊断实验。实验是基于 DINO 基线(# 1)进行的,我们采用 ResNet‐50 主干和 1x(12 epoch)训 练计划。结果如表所示。 

MI对其他模型的影响

代表性模型上的 MI 诊断实验

MI查询头号

查询头数诊断实验       “IHN”是“查询头数”的缩写

MI查询头组合

查询头组合的诊断实验

可视化分析

基于单查询头和多查询头的物体检测结果

DINO 和我们的方法之间的定性比较。红色/黄色虚线圆圈 表示缺失/错误检测
Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐