{"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-hant","path":"/content/papers/zh-hant/object-detection/dn-detr.d7125b24e469.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-hant","path":"/content/papers/zh-hant/object-detection/detr.5ef9bf1965a5.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-hant","path":"/content/papers/zh-hant/object-detection/deformable-detr.4eb78eef1d58.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-hant","path":"/content/papers/zh-hant/object-detection/h-detr.d66c2131bca7.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/4588c4bc938b5f7ef089b674dfe020d290233093b42b02261570db85e84121f0.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/4588c4bc938b5f7ef089b674dfe020d290233093b42b02261570db85e84121f0.png":{"width":960,"height":1212}}}
