{"notes":[{"id":"object-detection/dn-detr","category":"object-detection","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"DN-DETR","subtitle":"今天配狗，明天配猫","author":"Z. Yuan","paperDate":"2022-03-02","publishedOn":"2024-11-27","world":"external/dn-detr","paperTitle":"DN-DETR: Accelerate DETR Training by Introducing Query DeNoising","paperUrl":"https://arxiv.org/abs/2203.01305","bibliography":{"title":"DN-DETR: Accelerate DETR Training by Introducing Query DeNoising","authors":["Feng Li","Hao Zhang","Shilong Liu","Jian Guo","Lionel M. Ni","Lei Zhang"],"url":"https://arxiv.org/abs/2203.01305","pdfUrl":"https://arxiv.org/pdf/2203.01305v3","codeUrl":"https://github.com/IDEA-Research/DN-DETR","preprint":{"id":"2203.01305","submittedOn":"2022-03-02","url":"https://arxiv.org/abs/2203.01305"},"publication":{"venue":"CVPR","year":2022,"kind":"conference","url":"https://doi.org/10.1109/CVPR52688.2022.01325"},"citation":"@misc{objectdetectiondndetr2022,\n  title = {{DN-DETR: Accelerate DETR Training by Introducing Query DeNoising}},\n  author = {Feng Li and Hao Zhang and Shilong Liu and Jian Guo and Lionel M. Ni and Lei Zhang},\n  year = {2022},\n  eprint = {2203.01305},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2203.01305}\n}\n","citationPath":"/content/papers/citations/object-detection/dn-detr.a68d09a3ed54.bib"},"thumbnail":{"src":"/content/papers/assets/9bc1349cc89c66b31d56322bf37750edc42acb78407ab06b9f72c8261252ea27.png","width":1095,"height":443},"locale":"zh-hans","path":"/content/papers/zh-hans/object-detection/dn-detr.b33b80cad811.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"每一轮重新匹配一次","text":"每一轮重新匹配一次","depth":3},{"id":"把换手的次数数出来","text":"把换手的次数数出来","depth":3},{"id":"解决问题","text":"解决问题","depth":2},{"id":"两批-query-一起进-decoder","text":"两批 query 一起进 decoder","depth":3},{"id":"一个标注框怎么变成练习题","text":"一个标注框怎么变成练习题","depth":3},{"id":"每个物体做好几份","text":"每个物体做好几份","depth":3},{"id":"不准偷看答案","text":"不准偷看答案","depth":3},{"id":"讨论","text":"讨论","depth":2},{"id":"实验设置","text":"实验设置","depth":3},{"id":"同样设置下的增益","text":"同样设置下的增益","depth":3},{"id":"加速怎么算","text":"加速怎么算","depth":3},{"id":"掩码标签和组数","text":"掩码、标签和组数","depth":3},{"id":"不只-dab-detr","text":"不只 DAB-DETR","depth":3},{"id":"练习题到底帮了谁","text":"练习题到底帮了谁？","depth":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"object-detection/detr","relation":"referenced","topic":""},{"id":"object-detection/deformable-detr","relation":"referenced","topic":""},{"id":"object-detection/h-detr","relation":"referenced","topic":""}]},{"id":"object-detection/detr","category":"object-detection","legacyPath":"object-detection/2005-detr","legacySlug":"2005-detr","legacyPaths":[],"title":"DETR","subtitle":"跨领域的奠基者","author":"Z. Yuan","paperDate":"2020-05-26","publishedOn":"2024-06-04","paperTitle":"End-to-End Object Detection with Transformers","paperUrl":"https://www.ecva.net/papers/eccv_2020/papers_ECCV/html/832_ECCV_2020_paper.php","bibliography":{"title":"End-to-End Object Detection with Transformers","authors":["Nicolas Carion","Francisco Massa","Gabriel Synnaeve","Nicolas Usunier","Alexander Kirillov","Sergey Zagoruyko"],"url":"https://www.ecva.net/papers/eccv_2020/papers_ECCV/html/832_ECCV_2020_paper.php","pdfUrl":"https://www.ecva.net/papers/eccv_2020/papers_ECCV/papers/123460205.pdf","codeUrl":"https://github.com/facebookresearch/detr","preprint":{"id":"2005.12872","submittedOn":"2020-05-26","url":"https://arxiv.org/abs/2005.12872"},"publication":{"venue":"ECCV","year":2020,"kind":"conference","url":"https://www.ecva.net/papers/eccv_2020/papers_ECCV/html/832_ECCV_2020_paper.php"},"citation":"@misc{objectdetectiondetr2020,\n  title = {{End-to-End Object Detection with Transformers}},\n  author = {Nicolas Carion and Francisco Massa and Gabriel Synnaeve and Nicolas Usunier and Alexander Kirillov and Sergey Zagoruyko},\n  year = {2020},\n  eprint = {2005.12872},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2005.12872}\n}\n","citationPath":"/content/papers/citations/object-detection/detr.5258ffe0b9a0.bib"},"thumbnail":{"src":"/content/papers/assets/dd7e8441e6460ff562cf558374789924518fafaed7ecde0e3e35ee778c316330.jpg","width":1024,"height":266},"locale":"zh-hans","path":"/content/papers/zh-hans/object-detection/detr.99d0f3b81385.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"解决问题","text":"解决问题","depth":2},{"id":"模型架构","text":"模型架构","depth":3},{"id":"损失设计","text":"损失设计","depth":3},{"id":"数据集","text":"数据集","depth":3},{"id":"技术细节","text":"技术细节","depth":3},{"id":"讨论","text":"讨论","depth":2},{"id":"这次行吗","text":"这次行吗？","depth":3},{"id":"模型组件分析","text":"模型组件分析","depth":3},{"id":"模型行为分析","text":"模型行为分析","depth":3},{"id":"对未见过目标数量的泛化能力","text":"对未见过目标数量的泛化能力","depth":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"object-detection/deformable-detr","relation":"next","topic":"集合预测与注意力检测器"},{"id":"object-detection/smca-detr","relation":"comparison","topic":"让 Transformer 检测器更快收敛"}]},{"id":"object-detection/deformable-detr","category":"object-detection","legacyPath":"object-detection/2010-deformable-detr","legacySlug":"2010-deformable-detr","legacyPaths":[],"title":"Deformable DETR","subtitle":"可变形的注意力机制","author":"Z. Yuan","paperDate":"2020-10-08","publishedOn":"2024-09-20","paperTitle":"Deformable DETR: Deformable Transformers for End-to-End Object Detection","paperUrl":"https://arxiv.org/abs/2010.04159","bibliography":{"title":"Deformable DETR: Deformable Transformers for End-to-End Object Detection","authors":["Xizhou Zhu","Weijie Su","Lewei Lu","Bin Li","Xiaogang Wang","Jifeng Dai"],"url":"https://arxiv.org/abs/2010.04159","pdfUrl":"https://arxiv.org/pdf/2010.04159","codeUrl":null,"preprint":{"id":"2010.04159","submittedOn":"2020-10-08","url":"https://arxiv.org/abs/2010.04159"},"publication":{"venue":"ICLR","year":2021,"kind":"conference","url":"https://arxiv.org/abs/2010.04159"},"citation":"@misc{objectdetectiondeformabledetr2020,\n  title = {{Deformable DETR: Deformable Transformers for End-to-End Object Detection}},\n  author = {Xizhou Zhu and Weijie Su and Lewei Lu and Bin Li and Xiaogang Wang and Jifeng Dai},\n  year = {2020},\n  eprint = {2010.04159},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2010.04159}\n}\n","citationPath":"/content/papers/citations/object-detection/deformable-detr.df721a30472e.bib"},"thumbnail":{"src":"/content/papers/assets/36edfc5595a85c73fcdc9a4bbb9e1ca512e1f100676eb7c37203d71c84905c05.jpg","width":1224,"height":752},"locale":"zh-hans","path":"/content/papers/zh-hans/object-detection/deformable-detr.d2987152d10d.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"解决问题","text":"解决问题","depth":2},{"id":"可变形注意力","text":"可变形注意力","depth":3},{"id":"多尺度计算","text":"多尺度计算","depth":3},{"id":"模型架构","text":"模型架构","depth":3},{"id":"程式码拆解","text":"程式码拆解","depth":3},{"id":"训练策略","text":"训练策略","depth":3},{"id":"讨论","text":"讨论","depth":2},{"id":"与-detr-的比较","text":"与 DETR 的比较","depth":3},{"id":"消融实验","text":"消融实验","depth":3},{"id":"sota-比较","text":"SOTA 比较","depth":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"object-detection/detr","relation":"background","topic":"集合预测与注意力检测器"},{"id":"object-detection/h-detr","relation":"next","topic":"集合预测与注意力检测器"},{"id":"object-detection/smca-detr","relation":"comparison","topic":"让 Transformer 检测器更快收敛"}]},{"id":"object-detection/h-detr","category":"object-detection","legacyPath":"object-detection/2207-h-detr","legacySlug":"2207-h-detr","legacyPaths":[],"title":"H-DETR","subtitle":"静默查询的反叛","author":"Z. Yuan","paperDate":"2022-07-26","publishedOn":"2025-07-06","paperTitle":"DETRs with Hybrid Matching","paperUrl":"https://arxiv.org/abs/2207.13080","bibliography":{"title":"DETRs with Hybrid Matching","authors":["Ding Jia","Yuhui Yuan","Haodi He","Xiaopei Wu","Haojun Yu","Weihong Lin","Lei Sun","Chao Zhang","Han Hu"],"url":"https://arxiv.org/abs/2207.13080","pdfUrl":"https://openaccess.thecvf.com/content/CVPR2023/papers/Jia_DETRs_With_Hybrid_Matching_CVPR_2023_paper.pdf","codeUrl":"https://github.com/HDETR/H-Deformable-DETR","preprint":{"id":"2207.13080","submittedOn":"2022-07-26","url":"https://arxiv.org/abs/2207.13080"},"publication":{"venue":"CVPR","year":2023,"kind":"conference","url":"https://openaccess.thecvf.com/content/CVPR2023/html/Jia_DETRs_With_Hybrid_Matching_CVPR_2023_paper.html"},"citation":"@misc{objectdetectionhdetr2022,\n  title = {{DETRs with Hybrid Matching}},\n  author = {Ding Jia and Yuhui Yuan and Haodi He and Xiaopei Wu and Haojun Yu and Weihong Lin and Lei Sun and Chao Zhang and Han Hu},\n  year = {2022},\n  eprint = {2207.13080},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2207.13080}\n}\n","citationPath":"/content/papers/citations/object-detection/h-detr.822184101757.bib"},"thumbnail":{"src":"/content/papers/assets/63f1bc60b92f58d360457c0e3bbef0a3d4b3bd2a07377983b2dc5f5591ce28c2.jpg","width":1784,"height":350},"locale":"zh-hans","path":"/content/papers/zh-hans/object-detection/h-detr.a4dc10ce4de4.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"解决问题","text":"解决问题","depth":2},{"id":"主要分支一对一监督","text":"主要分支：一对一监督","depth":3},{"id":"辅助分支一对多监督","text":"辅助分支：一对多监督","depth":3},{"id":"总损失与实现细节","text":"总损失与实现细节","depth":3},{"id":"更多形式的混合监督","text":"更多形式的混合监督","depth":3},{"id":"讨论","text":"讨论","depth":2},{"id":"coco-benchmark","text":"COCO Benchmark","depth":3},{"id":"lvis-benchmark","text":"LVIS Benchmark","depth":3},{"id":"sota-benchmark","text":"SOTA Benchmark","depth":3},{"id":"消融实验","text":"消融实验","depth":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"object-detection/deformable-detr","relation":"background","topic":"集合预测与注意力检测器"}]}],"text":"DETR 把目标检测改写成匹配问题，去掉了 anchor 和 NMS，训练却慢得惊人。要有好成绩，它通常得在 COCO 上训练 500 个 epoch，原版 Faster R-CNN 只训练 12 个。\n\n到了 2022 年初，想让 DETR 学得快一点的论文已经不少，大多从架构入手。Deformable DETR 让注意力只看参考点附近的几个采样点，Conditional DETR 把 query 拆成内容和位置两部分，DAB-DETR 则把每个 query 直接写成一个框，交给 decoder 一层一层修正。\n\n这篇论文来自深圳 IDEA 研究院、香港科技大学与清华大学的团队，他们把矛头转向 DETR 用来分配答案的匈牙利匹配。训练初期，同一张图里的同一个 query，这个 epoch 匹配到狗，下一个 epoch 可能就换成猫，模型要学的目标也跟着跳来跳去。\n\n他们在原有的 query 之外，另外给 decoder 输入一批加了噪声的标注框，要它还原成原来的框和类别。这批题目的答案事先就知道，用不着匹配；推理时，这批 query 整个拿掉。\n\n会议版是 CVPR 2022 的口头报告。扩展版把 deformable attention 加进 decoder，也把同一招用到原版 DETR、Anchor DETR、Faster R-CNN 和分割模型上，后来刊登在 2024 年的 IEEE TPAMI。\n\n## 定义问题\n\n### 每一轮重新匹配一次\n\n先回顾一下 DETR 怎么训练。模型有固定数量的 query，每个 query 输出一个类别和一个框。每算一次 loss，就用匈牙利算法把预测和标注做一对一匹配，挑出总成本最低的匹配方式；匹配到物体的 query 学那个物体的框和类别，没匹配到的学「没有物体」。\n\n\n> [!TIP]\n> \n> DETR 的整体架构、匈牙利匹配，以及把注意力改成只看采样点的 Deformable DETR，可以参考我们的笔记：\n> \n> - **[[20.05] DETR：跨领域的奠基者](/blog/papers/object-detection/detr)**\n> - **[[20.10] Deformable DETR：可变形的注意力机制](/blog/papers/object-detection/deformable-detr)**\n\n\n这份匹配在每个 iteration 都根据当前的预测重新计算。训练刚开始时，预测框还很乱，好几个 query 和同一个物体的成本差不多，成本矩阵稍微变动一点，匹配结果就可能整个换掉。作者引用稳定婚姻问题的研究指出，匈牙利算法只求总成本最低，匹配出来的结果并不稳定。\n\n对单个 query 来说，学习目标因此一直在变。这一轮要它把框往狗身上修，下一轮又要它往猫身上修。\n\nDN-DETR 建立在 DAB-DETR 之上。DAB-DETR 把每个 query 写成一个 4D 的 anchor 框 $(x, y, w, h)$，decoder 每一层输出一组修正量 $(\\Delta x, \\Delta y, \\Delta w, \\Delta h)$，把框往物体推。作者于是把训练拆成两件事来看，一是学出好的 anchor，二是学会从 anchor 修正到物体的相对偏移。anchor 对应的物体一直在换，偏移就学不稳。\n\n当时很少有研究怀疑匹配。Sun 等人在提出 TSP 的论文里，拿一个训练好的 DETR 当教师，直接为学生模型提供固定的标签分配，结果只在训练早期加快了收敛，最终成绩差不多，他们因此认为匈牙利 loss 不是收敛慢的主因。DN-DETR 盯住的恰好是那段训练早期。\n\n### 把换手的次数数出来\n\n作者设计了一个指标来衡量这件事，叫 IS（instability）。对一张图像，先记下第 $i$ 个 epoch 的匹配结果：\n\n$$\nV^i_n=\\begin{cases} m, & \\text{第 } n \\text{ 个预测匹配到第 } m \\text{ 个标注物体} \\\\ -1, & \\text{没匹配到任何物体} \\end{cases}\n$$\n\n相邻两个 epoch 之间，这个向量有几格不一样，就是这张图在第 $i$ 个 epoch 的 IS：\n\n$$\nIS^i=\\sum_{n=0}^{N-1}\\mathbf{1}\\left(V^i_n\\neq V^{i-1}_n\\right)\n$$\n\n其中 $N$ 是预测的数量，$\\mathbf{1}(\\cdot)$ 在条件成立时为 1。整个数据集再对所有图像取平均。\n\n拿五个 query、两个物体试一次：\n\n```python\nimport numpy as np\n\ndef match_vector(pairs, num_queries):\n    # 第 n 格记录第 n 个 query 匹配到哪个物体，没匹配到就是 -1\n    v = np.full(num_queries, -1)\n    for q, obj in pairs.items():\n        v[q] = obj\n    return v\n\nDOG, CAT = 0, 1\nprev = match_vector({0: DOG, 3: CAT}, 5)    # 上一个 epoch\nmoved = match_vector({1: DOG, 3: CAT}, 5)   # 狗换给 query 1 负责\nswap = match_vector({0: CAT, 3: DOG}, 5)    # 狗和猫互换\nworst = match_vector({1: DOG, 4: CAT}, 5)   # 两个物体都换了新的 query\n\nprint(\"上一轮:\", prev)\nfor name, cur in [(\"狗换人\", moved), (\"狗猫互换\", swap), (\"全部换人\", worst)]:\n    print(f\"{name}: {cur}  IS = {(cur != prev).sum()}\")\n```\n\n```text\n上一轮: [ 0 -1 -1  1 -1]\n狗换人: [-1  0 -1  1 -1]  IS = 2\n狗猫互换: [ 1 -1 -1  0 -1]  IS = 2\n全部换人: [-1  0 -1 -1  1]  IS = 4\n```\n\n狗换给别的 query 负责，旧的 query 从 0 变成 -1，新的从 -1 变成 0，IS 加 2。狗和猫互换，也是两格改变，两个物体各算 1。所以每个换手的物体，最多让 IS 加 2；全部换人时，IS 就是物体数的两倍。\n\n作者在 COCO val2017 上测量，平均每张图有 7.36 个物体，IS 的最大值因此是 7.36 × 2 = 14.72。\n\n论文 Figure 2 让 DETR、DAB-DETR 与 DN-DETR 在同样设置下训练 12 个 epoch，每个 epoch 测一次 IS。横轴是 epoch，纵轴是 IS，红色实线是 DN-DETR：\n\n[![原论文 Figure 2：横轴是 epoch 0 到 11，纵轴是 IS。红色实线 DN-DETR、蓝色虚线 DAB-DETR、绿色虚线 DETR 都从 13 左右往下降，红线在多数 epoch 最低，最后约 5.7。](/content/papers/assets/545670c262e59825de2002719a679b732b310a49a0ecc9d8cdfbba0304278793.png)](/content/papers/assets/545670c262e59825de2002719a679b732b310a49a0ecc9d8cdfbba0304278793.png)\n\n*原论文 Figure 2（Li 等人），取自 [**PDF 第 3 页**](https://arxiv.org/pdf/2203.01305v3#page=3)。在 COCO val2017 上测量相邻两个 epoch 的匹配变化；图注未收录。*\n\n最左边的点，三条线都在 13 上下，离最大值不远。反过来推，IS 约 13，表示平均每张图有 6 个以上的物体换了负责的 query，几乎是全部。\n\nDN-DETR 降得最快，第 2 个 epoch 就到 9 左右，DAB-DETR 还在 11 上下；最后一个 epoch，DN-DETR 约 5.7，DAB-DETR 约 6.9，原版 DETR 约 7.8。中间也有例外，第 7 个 epoch 时 DAB-DETR 短暂低于 DN-DETR，接下来两个 epoch 又跳到 10 以上。\n\n匹配不稳让训练初期的目标一直在变，一对一匹配却不能拿掉，DETR 推理时不接 NMS，靠的就是它。那么，能不能保留匹配，同时另外给 decoder 一份目标不会跳动的作业？\n\n## 解决问题\n\n### 两批 query 一起进 decoder\n\nDN-DETR 的 decoder 一次接收两批 query：\n\n- **匹配部分**：和 DAB-DETR 一样，是一组可学习的 anchor，输出用匈牙利匹配算 loss。\n- **去噪部分**：把标注物体的框和类别加上噪声后当作 query，每个 query 都要还原成自己来源的那个物体，不经过匹配。\n\n论文 Figure 6 把整个训练流程画在一起。左边的黄色和棕色是两个去噪组，各自算重建 loss；右边的绿色是匹配部分，算匈牙利 loss；最右边的方阵是注意力掩码，后面会再回来看：\n\n[![原论文 Figure 6 局部：decoder 里左边是两个去噪组，输入为加了噪声的框与标签，输出接重建 loss；右边是匹配部分，输入为学出来的 anchor 加 unknown 标签，输出接匈牙利 loss。三条彩色路线都被红叉挡住。最右边是注意力掩码方阵，灰格代表挡住。](/content/papers/assets/9bc1349cc89c66b31d56322bf37750edc42acb78407ab06b9f72c8261252ea27.png)](/content/papers/assets/9bc1349cc89c66b31d56322bf37750edc42acb78407ab06b9f72c8261252ea27.png)\n\n*原论文 Figure 6 局部（Li 等人），取自 [**PDF 第 5 页**](https://arxiv.org/pdf/2203.01305v3#page=5)。左侧的 encoder 与图注未收录。*\n\n图中三条彩色路线是可能的泄漏，打红叉表示被掩码挡掉。黄、橙两条连接两个去噪组，绿色那条从去噪部分通往匹配部分。\n\n论文把它写成 $\\mathbf{o}=D(\\mathbf{q},\\mathbf{Q},F\\mid A)$，$\\mathbf{q}$ 是去噪部分，$\\mathbf{Q}$ 是匹配部分，$F$ 是 encoder 输出的图像特征，$A$ 是注意力掩码。总 loss 是匹配部分的匈牙利 loss，加上去噪部分的重建 loss。推理时去噪部分整个拿掉，剩下的模型和 DAB-DETR 一样。\n\n去噪的 query 要同时带着框和类别，作者因此只改了 DAB-DETR 一个地方。DAB-DETR 的 query 除了 anchor 框，还有一个内容向量（decoder embedding）；DN-DETR 把它换成类别嵌入，后面再接一个指示位，1 代表去噪、0 代表匹配。匹配部分没有类别可给，统一用一个「unknown」类别的嵌入。\n\n\n> [!NOTE]\n> \n> 官方代码里，类别嵌入按 COCO 的类别编号开了 91 格，再加 1 格 unknown，每格 255 维；接上指示位，刚好凑成 decoder 的 256 维。\n\n\n### 一个标注框怎么变成练习题\n\n拿一只狗走一遍。它的标注框用归一化坐标写成 $(c_x, c_y, w, h) = (0.40, 0.50, 0.30, 0.40)$。\n\n框的噪声有两种：\n\n1. **中心平移**：中心加上 $(\\Delta x, \\Delta y)$，限制 $|\\Delta x| < \\lambda_1 w/2$、$|\\Delta y| < \\lambda_1 h/2$。$\\lambda_1$ 小于 1，新的中心一定还在原来的框里。\n2. **缩放**：宽在 $[(1-\\lambda_2)w, (1+\\lambda_2)w]$ 之间随机取，高也一样。\n\n类别的噪声是随机替换标签，比例由 $\\gamma$ 控制。论文默认 $\\lambda_1=\\lambda_2=0.4$、$\\gamma=0.2$。代入这只狗，中心最多左右移 0.06、上下移 0.08，宽落在 0.18 到 0.42 之间，高落在 0.24 到 0.56 之间。\n\n按照官方代码的做法，给这只狗做五份：\n\n```python\nimport numpy as np\n\nCLASSES = [\"人\", \"狗\", \"猫\", \"车\", \"鸟\", \"椅子\", \"瓶子\", \"沙发\"]\ngt_box = np.array([0.40, 0.50, 0.30, 0.40])  # (cx, cy, w, h)，按图像宽高归一化\ngt_label = CLASSES.index(\"狗\")\nlam, gamma, groups = 0.4, 0.2, 5             # 论文默认 λ1 = λ2 = 0.4、γ = 0.2、5 组\n\nrng = np.random.default_rng(2)\nw, h = gt_box[2:]\nfor g in range(groups):\n    # 中心最多移动 λ·w/2、λ·h/2；宽、高最多缩放 ±λ 倍\n    u = rng.uniform(-1, 1, size=4)\n    box = (gt_box + u * np.array([w / 2, h / 2, w, h]) * lam).clip(0, 1)\n    # 每个标签有 γ 的概率换成随机类别\n    label = gt_label\n    if rng.random() < gamma:\n        label = int(rng.integers(len(CLASSES)))\n    print(f\"第 {g} 组：框 {box.round(3)}，标签「{CLASSES[label]}」\")\n```\n\n```text\n第 0 组：框 [0.371 0.468 0.375 0.269]，标签「狗」\n第 1 组：框 [0.427 0.45  0.193 0.328]，标签「狗」\n第 2 组：框 [0.407 0.444 0.284 0.454]，标签「狗」\n第 3 组：框 [0.416 0.575 0.344 0.365]，标签「猫」\n第 4 组：框 [0.401 0.563 0.366 0.342]，标签「狗」\n```\n\n这个例子只放了 8 个类别。官方代码换标签时从全部类别里均匀抽一个，偶尔会抽回原来的类别。\n\n把五个框画出来：\n\n![一个狗的标注框，中心在 (0.40, 0.50)，周围叠着五个虚线噪声框。五个框的中心都落在标注框中央一块灰色区域里，大小各有伸缩；其中第 3 组的标签被换成了猫。](/content/papers/assets/d7edceb3f6d475d40e5aec628cf3fa840654183ef9ca5e771c8a37110dc2f3b5.png)\n\n*图：本文整理。黑框是狗的标注框，虚线是上面代码生成的五个噪声框，圆点是各框的中心。*\n\n五个框的中心都落在灰色区域里，宽高各有伸缩，但都还围着这只狗。这五个框接着直接作为五个 query 的 anchor，标签则查表变成内容向量。对 decoder 来说，每一个都是附近确定有物体的好 anchor，题目就是从它修回黑框，并说出「狗」。\n\n第 3 组的标签被换成了「猫」，模型得从框的位置和图像内容判断这里其实是狗。作者说，换标签是为了逼模型学到框和类别之间的关系。\n\n重建 loss 沿用 DAB-DETR 的组合，框用 L1 和 GIoU，类别用 focal loss。官方代码在 decoder 每一层都计算这份 loss，权重和匹配部分相同。\n\n### 每个物体做好几份\n\n一份噪声只是一个版本，作者让每个物体同时做好几份。每一份包含这张图全部的标注物体，称为一个去噪组（denoising group）。$P$ 组、每组 $M$ 个物体，去噪部分就有 $P \\times M$ 个 query。\n\n默认是 5 组。以 COCO val2017 平均每张图 7.36 个物体来算，去噪部分平均约 37 个 query，匹配部分则有 300 个。同一个 batch 里每张图的物体数不同，官方实现把每组补齐到 batch 内物体最多的那张图。作者在 GitHub 上回答这个问题时也这样说明，并提到后来的 DINO 改用动态的组数。[DN-DETR #8，2022-04-19](https://github.com/IDEA-Research/DN-DETR/issues/8)\n\n多出来的计算量很小。以 ResNet-50 的 DAB-DETR 为例，5 组让训练时的 GFLOPs 从 94.4 增加到 94.6；推理时没有任何额外计算。\n\n### 不准偷看答案\n\n把标注框直接塞进 decoder，self-attention 会让所有 query 互相看到，匹配部分的 query 只要看一眼旁边的去噪 query，就知道物体大概在哪里。\n\n作者列出两种泄漏：\n\n1. 匹配部分看到去噪部分，等于直接拿到标注框。\n2. 同一个物体的不同噪声版本互相看到，等于偷看了同一题的其他版本。\n\n注意力掩码 $A=[a_{ij}]_{W\\times W}$ 负责挡住这两条路。$W=P\\times M+N$，前 $P \\times M$ 个位置是去噪部分，后面 $N$ 个是匹配部分；$a_{ij}=1$ 表示第 $i$ 个 query 看不到第 $j$ 个：\n\n$$\na_{ij}= \\begin{cases} 1, & j<P\\times M \\text{ 且 } \\lfloor i/M\\rfloor \\neq \\lfloor j/M\\rfloor \\\\ 1, & j<P\\times M \\text{ 且 } i\\geq P\\times M \\\\ 0, & \\text{其他} \\end{cases}\n$$\n\n拿 2 组、每组 2 个物体、3 个匹配 query 算一次：\n\n```python\nimport numpy as np\n\nP, M, N = 2, 2, 3          # 2 组去噪、每组 2 个物体（A 狗、B 猫）、3 个匹配 query\nW = P * M + N\nnames = [\"g0A\", \"g0B\", \"g1A\", \"g1B\", \"m0\", \"m1\", \"m2\"]\n\nA = np.zeros((W, W), dtype=int)   # A[i, j] = 1：第 i 个 query 看不到第 j 个\nfor i in range(W):\n    for j in range(W):\n        if j < P * M and i // M != j // M:\n            A[i, j] = 1   # 不同组的去噪 query 互相看不到\n        if j < P * M and i >= P * M:\n            A[i, j] = 1   # 匹配 query 看不到任何去噪 query\n\nprint(\"     \" + \" \".join(f\"{n:>3}\" for n in names))\nfor n, row in zip(names, A):\n    print(f\"{n:>4} \" + \" \".join(f\"{v:>3}\" for v in row))\n```\n\n```text\n     g0A g0B g1A g1B  m0  m1  m2\n g0A   0   0   1   1   0   0   0\n g0B   0   0   1   1   0   0   0\n g1A   1   1   0   0   0   0   0\n g1B   1   1   0   0   0   0   0\n  m0   1   1   1   1   0   0   0\n  m1   1   1   1   1   0   0   0\n  m2   1   1   1   1   0   0   0\n```\n\n一行一行地读。g0A、g0B 是第 0 组的狗和猫，它们看得到彼此，看不到第 1 组的两个版本。m0 到 m2 那三行，前四格全是 1，匹配 query 看不到任何去噪 query。这和 Figure 6 最右边的方阵是同一个样子，图中的灰格就是这里的 1，彩色格是 0。\n\n最右边三列全是 0，所以去噪 query 可以看匹配 query。作者说这不影响结果，因为匹配 query 是学出来的向量，本来就不含任何标注信息。\n\n这个掩码只用在 decoder 的 self-attention。有人在 GitHub 上问，cross-attention 要不要也加掩码？作者回答，根据经验，cross-attention 不会造成泄漏。[DN-DETR #35，2022-07-26](https://github.com/IDEA-Research/DN-DETR/issues/35) 在 cross-attention 里，每个 query 只对图像特征做注意力，彼此之间没有通道。\n\n论文 Table 5 的消融用 ResNet-50、1 个去噪组、训练 50 个 epoch。框和标签都加噪声、也有掩码时是 43.4 AP；同样的噪声去掉掩码，掉到 24.0，比完全不做去噪的 42.2 还低 18.2。\n\n论文解释，少了掩码，匹配部分看得到带噪声的标注，很容易就预测出标注物体。由此推想，推理时去噪 query 已经拿掉，匹配 query 在训练时依赖的线索也跟着消失了。\n\n## 讨论\n\n### 实验设置\n\n实验都在 COCO 2017 上进行，train2017 训练、val2017 评估。主模型 DN-DETR 是 DAB-DETR 加上去噪训练，6 层 encoder、6 层 decoder，隐藏维度 256，300 个匹配 query。噪声用 $\\lambda_1=\\lambda_2=0.4$、$\\gamma=0.2$，默认 5 组。优化器是 AdamW，学习率 $10^{-4}$，8 张 A100、batch size 16。50 epoch 的训练计划在第 40 个 epoch 降学习率，12 epoch 的训练计划在第 11 个。\n\n作者也把同一套训练接到 Deformable DETR 上。DN-Deformable-DETR 只在 encoder 用 deformable attention，DN-Deformable-DETR++ 则 encoder 和 decoder 都用。这两组各有对应的 DAB-Deformable-DETR 作为基线，同样把 query 写成 4D 框、只是不做去噪，免得把 4D query 的好处算到去噪头上。\n\n### 同样设置下的增益\n\n最干净的对照在 Table 1。它用单尺度特征、训练 50 个 epoch，DAB-DETR 和 DN-DETR 只差在有没有去噪训练：\n\n| Backbone | DAB-DETR | DN-DETR |\n| --- | ---: | ---: |\n| ResNet-50 | 42.2 | 44.1（+1.9） |\n| ResNet-101 | 43.5 | 45.2（+1.7） |\n| ResNet-50-DC5 | 44.5 | 46.3（+1.8） |\n| ResNet-101-DC5 | 45.8 | 47.3（+1.5） |\n\n*表：整理自原论文 Table 1，COCO val2017 AP。两边的 GFLOPs 与参数量相同，例如 ResNet-50 都是 94 GFLOPs、44M 参数。*\n\n四种 backbone 都多了 1.5 到 1.9 AP。训练缩短到 12 个 epoch，差距更大。Table 2 里，DC5-R50 从 38.0 到 41.7（+3.7），DC5-R101 从 40.3 到 42.8（+2.5）。短训练计划的增益比较大，和作者「问题集中在训练初期」的说法一致。\n\n### 加速怎么算\n\n标题说加速，作者给了两种证据。\n\n一是收敛曲线。论文 Figure 7(a) 的图注写道，DC5-R50 在学习率下降前，DN-DETR 20 个 epoch 就到 40 AP，DAB-DETR 要 40 个 epoch。\n\n二是把训练轮数砍半，直接比较：\n\n| 模型 | 基线 | 加上去噪、epoch 减半 |\n| --- | ---: | ---: |\n| DAB-DETR-DC5-R50（50 对 25 epoch） | 44.5 | 44.4 |\n| DAB-Deformable-DETR-R50（50 对 25 epoch） | 46.9 | 46.8 |\n| DAB-Deformable-DETR-R50++（50 对 25 epoch） | 48.7 | 48.4 |\n| DETR-R50（500 对 250 epoch） | 42.0 | 42.2 |\n\n*表：整理自原论文第 11 页的 Table 1，COCO val2017 AP。*\n\n一半的 epoch，AP 只差 0.1 到 0.3，原版 DETR 那组还略高 0.2。摘要里「用 50% 的 epoch 达到相当的表现」，指的就是这张表。\n\nepoch 减半，时间却没有刚好减半。作者在 8 张 A100 上测了 ResNet-50 的实际训练时间，DAB-DETR 每个 epoch 51.1 分钟，加上去噪后是 57.7 分钟，多了约 13%。GFLOPs 几乎没变，实际耗时却多了一成多；估算训练成本时，还是得看实测时间。\n\n总时间算下来，DAB-DETR 训练 50 个 epoch 要 2,555 分钟，加上去噪的版本训练 25 个 epoch 要 1,443 分钟，省下约 44%。这张时间表测的是 ResNet-50，上面 25 epoch 的 AP 对照用的却是 DC5-R50，两者不是同一组模型。\n\n摘要里 12 个 epoch 46.0 AP、50 个 epoch 49.5 AP 这两个数字，来自 DN-Deformable-DETR++，用多尺度特征，encoder 和 decoder 都是 deformable attention；「+1.9 AP」才是 DAB-DETR 上的单尺度对照。和同样是 ++ 架构的基线比，50 个 epoch 的差距是 49.5 对 48.7，也就是 0.8 AP。\n\n### 掩码、标签和组数\n\nTable 5 剩下的两行，拆开了框和标签的贡献。只加框的噪声是 43.0，比不做去噪的 42.2 多 0.8；再加上换标签，到 43.4。\n\n组数看 Table 6：\n\n| Backbone | 不做去噪 | 1 组 | 5 组 |\n| --- | ---: | ---: | ---: |\n| ResNet-50 | 42.2 | 43.4 | 44.1 |\n| ResNet-50-DC5 | 44.5 | 45.6 | 46.3 |\n| ResNet-101 | 43.5 | 45.0 | 45.2 |\n| ResNet-101-DC5 | 45.8 | 46.5 | 47.3 |\n\n*表：整理自原论文 Table 6，ResNet 系列、50 epoch。*\n\n从不做到 1 组的增益，大多比 1 组到 5 组大，只有 ResNet-101-DC5 反过来。作者据此说组数越多越好，但边际收益递减，默认取 5 组。\n\n噪声大小看 Figure 8。这组实验用 ResNet-50、batch size 64、训练 20 个 epoch、不降学习率，固定一种噪声为 0.4，调另一种。两条曲线都是中间高、两头低。其中一种噪声设为 0 时，AP 在 33.5 到 34 之间；调到 0.2 至 0.4 时最高，图上标出的峰值是 35.5 和 35.7；拉到 0.8，又掉回 34 左右。论文的结论是两种噪声都有帮助，但噪声太大会拖累表现。\n\n### 不只 DAB-DETR\n\n扩展版把去噪训练接到其他模型上（Table 3，下列都是 ResNet-50）：\n\n- **Anchor DETR**：query 只有 2D 的 anchor 点，所以只做中心平移；DC5、12 epoch，38.2 到 39.4（+1.2）。\n- **原版 DETR**：query 没有明确的框，就用一层线性层把噪声框嵌入 query；300 epoch，40.6 到 42.6（+2.0）。\n- **Faster R-CNN**：没有内容向量，只加框的噪声，和 RPN 的候选框一起送进检测头；FPN、12 epoch，37.9 到 38.4（+0.5）。\n\n表上还有几行打了星号，数字取自 DINO、Group DETR 等采用去噪训练的后续论文自己的消融，例如 DINO 不做去噪是 46.0，加回来是 47.4。\n\nFaster R-CNN 的增益最小。它用 IoU 阈值分配标签，不经过匈牙利匹配；这和作者的诊断方向一致，但两种检测器的差异太多，单靠这一行分不出原因。\n\n### 练习题到底帮了谁？\n\n匹配 query 看不到去噪 query，两边的 loss 也分开算，那去噪到底在哪个环节帮了匹配？2024 年 10 月，有人在 GitHub 上这样问，这个提问在 repo 里没有回复。[DN-DETR #72，2024-10-14](https://github.com/IDEA-Research/DN-DETR/issues/72)\n\n两批 query 共用同一个 backbone、同一个 encoder、同一组 decoder 层和预测头，去噪的梯度会一路回传到这些参数。论文拿两项观察支持自己的解读。一是前面的 IS 曲线。二是 Figure 3，它测的是匹配 query 的初始 anchor 和最后一层 decoder 匹配到的标注框之间的平均 L1 距离；12 个 epoch 里，DAB-DETR 从约 0.146 降到约 0.096，DN-DETR 从约 0.110 降到约 0.082，一直比较近。作者认为，去噪让 query 学会在附近找物体，匹配也就不太会跳来跳去。\n\n后来的研究，对「帮在哪里」有不同的解读：\n\n- **Group DETR**（ICCV 2023）指出，去噪组里每个物体只有一个 query，也没有对应「没有物体」的 query；组内的 self-attention 看到的都是别的物体，看不到重复的框。它因此认为去噪主要是多给了正样本的监督，对压掉重复预测没有直接帮助。在 DAB-DETR、12 个 epoch 的设置下，Group DETR 再加上去噪还能多 1.5 AP，作者据此认为两者互补。\n- **[H-DETR](/blog/papers/object-detection/h-detr)** 的补充实验直接把参数拆开。在用对比式去噪的 DINO 上，让去噪分支改用自己的 decoder 和预测头，AP 从 49.1 变成 49.0；连 encoder 也拆开，掉到 48.5。按这组数字，去噪的好处大多经由 encoder 的训练传到匹配部分。\n- **DINO** 是同一个团队五天后放上 arXiv 的论文，它直接点出了 DN-DETR 的缺口。模型学会了从附近有标注框的 anchor 做预测，却没学过替附近没有物体的 anchor 回答「没有物体」。DINO 因此在练习题里加了负样本。\n\n这些说法可以同时成立。论文的证据显示 IS 下降和收敛加快同时出现；去噪是先稳住了 decoder 的目标，还是让 encoder 多吃到正样本的梯度，论文本身没有把这两条路拆开。\n\n## 结论\n\nDN-DETR 把 DETR 训练慢的一部分原因，指向每一轮重新计算的匈牙利匹配，并用 IS 把「今天配狗，明天配猫」画成了一条曲线。它在训练时多出一份有标准答案的练习题，把标注框和类别加上噪声后交给 decoder 还原，再用注意力掩码挡住匹配 query 偷看。\n\n在作者的设置下，单尺度、50 个 epoch 时多 1.5 到 1.9 AP，12 个 epoch 时多 2.5 到 3.7 AP；用一半的 epoch 就追上基线，代价是每个 epoch 多花约 13% 的时间。\n\n如果要在自己的 DETR 类模型上加去噪训练，先把掩码写对，论文的消融里少了它，AP 从 43.4 掉到 24.0。batch 里每张图的物体数不同，组要补齐。query 最好像 DAB-DETR 那样带着明确的框，没有的话，得像原版 DETR 那样另外把框嵌进去。推理部分则完全不用改动。\n\n这份练习题后来被不少 DETR 类模型沿用。[DINO](/blog/papers/object-detection/dino-detr) 在里面加了负样本，[RT-DETR](/blog/papers/object-detection/rt-detr) 训练时也带着 200 个去噪 query。\n","imageSizes":{"/content/papers/assets/545670c262e59825de2002719a679b732b310a49a0ecc9d8cdfbba0304278793.png":{"width":646,"height":344},"/content/papers/assets/9bc1349cc89c66b31d56322bf37750edc42acb78407ab06b9f72c8261252ea27.png":{"width":1095,"height":443},"/content/papers/assets/d7edceb3f6d475d40e5aec628cf3fa840654183ef9ca5e771c8a37110dc2f3b5.png":{"width":960,"height":1212}}}
