DINO (2022):基于改进的去噪锚框的DETR用于端到端目标检测,改进版 DETR,学术界基线,入门最后一站

DINO (2022):基于改进的去噪锚框的DETR用于端到端目标检测,改进版 DETR,学术界基线,入门最后一站

导出时间:2025/11/23 20:29:55

1、研究背景与动机

一、研究背景

  1. 传统目标检测方法的局限
    • 早期的目标检测主要依赖 卷积神经网络(CNN),例如 Faster R-CNN、YOLO、RetinaNet 等。
    • 这些方法往往依赖 人工设计的组件,如:
      • 锚框(anchor boxes):需要人为设定不同大小和比例的候选框。
      • 非极大值抑制(NMS):用于去除重复预测框。
    • 这种设计虽然效果不错,但人工成分较多,难以做到真正的端到端学习。
  2. DETR 的出现
    • 2020 年,Facebook 提出了 DETR (DEtection TRansformer)
    • 最大的创新:
      • 把目标检测转化为 集合预测问题,利用 Transformer 直接预测物体的类别和位置。
      • 不需要锚框设计和 NMS,是真正的端到端检测器。
    • 但是,DETR 也有明显问题:
      • 收敛速度很慢:训练需要数百个 epoch 才能达到较好效果。
      • 查询(query)含义不清晰:难以稳定学习到好的检测能力。
  3. 改进的 DETR 系列
    • 为了克服 DETR 的缺点,研究者提出了许多改进:
      • Deformable DETR:引入可变形注意力机制,加快训练。
      • DAB-DETR:把查询设计成 动态锚框,更直观地对应目标位置。
      • DN-DETR:加入 去噪训练(denoising training),加速收敛并增强稳定性。
    • 尽管这些改进提升了性能,但 DETR 系列整体表现仍然落后于一些经过高度优化的传统检测器(如 Swin Transformer + HTC++ 框架)。

二、研究动机

  1. 解决 DETR 类模型的两个核心问题
    • 性能差距:在 COCO 数据集上,最好的 DETR 类模型仍低于 50 AP,而经典检测器可以轻松超过。
    • 可扩展性不足:缺少在更大主干网络(如 Swin Transformer)和更大数据集(如 Objects365)上的系统研究。
  2. 研究目标
    • 让 DETR 类模型既快又准,缩小与优化版 CNN 检测器之间的差距。
    • 探索可扩展性:证明 DETR 类模型不仅能在小规模实验中有效,也能在大模型和大数据下达到 SOTA(state-of-the-art)。
  3. 核心思路
    • 结合 DAB-DETR(动态锚框)DN-DETR(去噪训练) 的优势。
    • 引入 新的改进
      • 对比去噪训练(Contrastive DN):解决重复预测、提升小目标检测效果。
      • 混合查询选择:更好地初始化锚框,提高查询质量。
      • 向前看两次机制:让后续层的预测信息反过来优化前面层的学习。

总结一句话: DINO 的动机就是 —— 在 DETR 的端到端检测优势基础上,通过新的训练策略和查询机制,解决训练慢、性能差、扩展性不足的问题,让基于 Transformer 的检测器真正能在大规模任务中超越传统 CNN 检测器

2、DINO 的核心创新点

一、对比去噪训练(Contrastive Denoising Training,CDN)

  • 传统 DN-DETR 问题 DN-DETR 在训练时会往真实标注框(GT box)里加噪声,然后训练模型去“还原”它。 → 好处:能加速收敛,让模型学会利用邻近的锚点预测目标。 → 问题:模型容易“混淆”,多个相邻锚点可能都预测到同一个物体,导致重复框。
  • DINO 的改进 提出 对比去噪训练
    • 每个 GT 框生成两种锚点:
      • 正样本(小噪声) → 期望预测目标。
      • 负样本(大噪声) → 期望预测“无目标”。
    • 这样训练能让模型学会区分“哪个锚点是真的在目标上,哪个只是干扰”。
  • 直观类比 就像学生做题:给他两道相似的题,一道是真题,一道是陷阱题。训练后,他能更快学会“不要被迷惑”,答案更准确。

二、混合查询选择(Hybrid Query Selection)

  • 传统 DETR 的问题
    • DETR 里的查询(query)是“凭空学来的向量”,缺乏空间信息。
    • Deformable DETR 改进后,可以从编码器输出中选 top-K 特征来初始化,但可能引入模糊信息(比如选到的特征可能覆盖多个目标)。
  • DINO 的改进 提出 混合查询选择
    • 位置查询(positional query) → 用编码器输出的 top-K 特征来初始化,提供空间先验。
    • 内容查询(content query) → 保持可学习,不直接用 top-K 特征,以避免歧义。
  • 直观类比 好比侦探破案:
    • “位置查询”就像根据监控录像先锁定几个可疑地点。
    • “内容查询”则是调查员凭经验继续深挖。
    • 两者结合,既有空间线索,又保留学习自由度。

三、向前看两次(Look Forward Twice,LFT)

  • 传统方法:Look Forward Once
    • 在 Deformable DETR 中,解码器逐层 refine 框,但梯度只从当前层往前传,前面层无法利用后面 refine 的信息。
    • 结果 → 早期层学得不够好。
  • DINO 的改进
    • 提出 向前看两次
      • 每一层的参数更新,不仅依赖本层的预测,还能利用 下一层 refine 后的预测
      • 等于“前一层能从后一层学经验”。
  • 直观类比 就像写作文:
    • 以前的方法是“写完初稿→改稿→定稿”,但初稿没机会学到后面怎么修改。
    • DINO 的方法是“初稿在修改过程中也能看到老师的修改意见”,所以写得越来越准。

四、总结

DINO 的三大核心创新点可以用一句话概括:
  • 对比去噪训练 → 让模型学会“分辨真伪锚点”,避免重复预测。
  • 混合查询选择 → 把空间线索与可学习内容结合,初始化更合理。
  • 向前看两次 → 利用后续层的经验指导前面层,提升框预测精度。
最终效果:训练更快、检测更准,尤其在小目标和大规模预训练场景下,DINO 超越了传统 CNN 检测器



3、模型的网络结构

image.png

DINO 网络结构(按图自左向右)

  1. Backbone 多尺度特征 + 位置编码
  • 用 ResNet/Swin 等主干抽取 多尺度特征(通常是 4~5 个尺度的金字塔)。
  • 对各尺度特征 Flatten 后,加上 Positional Embeddings(位置编码),作为 Transformer 的输入 token。
  1. Transformer Encoder(×N 层)
  • 编码器对多尺度 token 做特征增强(论文实现采用 Deformable Attention,在参考框附近稀疏采样,效率高)。
  • 编码器输出作为 Key/Value 提供给后续解码器使用。
  1. Query Selection(查询选择)
  • 最后一层编码器输出上,选出 top-K 的位置(根据一个轻量的 scoring 头/客观性得分),作为解码器“位置查询”的初始化;这些位置被显式表示成 锚框(anchor box / reference box)
  • 内容查询(Content Queries)仍是可学习参数,不直接用编码器特征初始化——避免把含糊的局部内容直接灌进解码器。
  • 这叫 混合查询选择:位置来自图像、内容保持可学习。图中蓝色方块上方的「Query Selection」和右下角的 Init Anchors 箭头对应这一过程。
  1. Transformer Decoder(×M 层)
对每一层,解码器执行:
  • 自注意力:不同查询(候选目标)之间交互,抑制重复、分工协作。
  • 交叉注意力:以查询自带的参考框为中心,在编码器特征上做可变形采样聚合证据。
  • 预测头:输出
    • 分类 logits(含 no-object 类别),
    • 边框回归 偏移量(对当前参考框进行 refine)。
  • 迭代细化:本层回归出的偏移量更新参考框,供下一层继续 refine(图中解码器层堆叠与向前箭头)。

直观上:每个查询就是“一个候选目标”。它带着一个“我大概在这儿”的锚框去对图像问讯,层层细化,框越来越准。

  1. Matching(集合匹配分配)
  • 主分支(蓝色查询)上,使用 Hungarian 匹配 将最终预测与 GT 一一对应,计算集合损失(分类:Focal Loss;回归:L1 + GIoU),并在每层都加辅助损失促收敛(图中「Matching」)。
  1. CDN:对比去噪分支(只在训练时启用)
  • 右侧黄色的 CDN(Contrastive DeNoising)会在 GT 上注入两档噪声生成额外查询:
    • 正样本(Pos):小噪声,目标是重建对应 GT 框与类别;
    • 负样本(Neg):较大噪声,目标是预测 no-object
  • 这些带噪查询与主分支共享同一个解码器,共同训练;通过“正负对比”,模型学会区分“哪个锚是真命中的、哪个只是近邻干扰”,显著减少重复框、提升小目标表现。训练仍使用 Focal + L1 + GIoU。推理时 CDN 分支被移除

训练/推理时的数据流

  • 训练: Backbone → Encoder → (A)主分支:Query Selection 产生初始化锚 + 可学习内容查询 → Decoder(逐层 refine)→ Matching 损失; (B)CDN 分支:由 GT+Noise 生成 Pos/Neg 查询 → 同一个 Decoder → 与主分支一起计算损失。
  • 推理: 仅走 主分支(不启用 CDN),解码器输出的一组去重后的目标,即为最终结果(端到端、无需 NMS)。

关键设计与图中要点的对齐

  • Multi-Scale Features / Positional Embeddings / Flatten” → 编码器输入。
  • Encoder Layers × N” → 多层特征增强,输出 Key & Value
  • Query Selection + Init Anchors” → 以 top-K 编码器特征初始化位置查询(锚)内容查询可学习
  • Decoder Layers × M” → 自注意 + 交叉注意,层层 box refine;每层有辅助预测头。
  • Matching” → 一对一集合匹配与分配损失。
  • CDN(Pos/Neg) + GT+Noise” → 训练期对比去噪查询,提升稳定性与去重能力。

一句话小结

DINO = 混合查询选择(位置由编码器 top-K 初始化,内容可学习)
  • 可变形注意的编解码器(多尺度、迭代细化)
  • 对比去噪分支(正负带噪查询联合训练) → 端到端无需 NMS收敛更快、精度更高