{"notes":[{"id":"object-detection/dino-detr","category":"object-detection","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"DINO","subtitle":"近くても、まだ遠い","author":"Z. Yuan","paperDate":"2022-03-07","publishedOn":"2024-12-19","world":"external/dino-detector","paperTitle":"DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection","paperUrl":"https://arxiv.org/abs/2203.03605","bibliography":{"title":"DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection","authors":["Hao Zhang","Feng Li","Shilong Liu","Lei Zhang","Hang Su","Jun Zhu","Lionel M. Ni","Heung-Yeung Shum"],"url":"https://arxiv.org/abs/2203.03605","pdfUrl":"https://arxiv.org/pdf/2203.03605v4","codeUrl":"https://github.com/IDEA-Research/DINO","preprint":{"id":"2203.03605","submittedOn":"2022-03-07","url":"https://arxiv.org/abs/2203.03605"},"publication":{"venue":"ICLR","year":2023,"kind":"conference","url":"https://iclr.cc/virtual/2023/poster/11884"},"citation":"@misc{objectdetectiondinodetr2022,\n  title = {{DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection}},\n  author = {Hao Zhang and Feng Li and Shilong Liu and Lei Zhang and Hang Su and Jun Zhu and Lionel M. Ni and Heung-Yeung Shum},\n  year = {2022},\n  eprint = {2203.03605},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2203.03605}\n}\n","citationPath":"/content/papers/citations/object-detection/dino-detr.d8c8af775089.bib"},"thumbnail":{"src":"/content/papers/assets/6c328e7125d4762c3a4346a1c537cb4e917d47a640869bbf212de53f74ba64fc.png","width":942,"height":319},"locale":"ja","path":"/content/papers/ja/object-detection/dino-detr.f93ea7949119.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"全体の流れ","text":"全体の流れ","depth":3},{"id":"対比的デノイジング","text":"対比的デノイジング","depth":3},{"id":"混合クエリ選択","text":"混合クエリ選択","depth":3},{"id":"look-forward-twice","text":"Look forward twice","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"12-epoch","text":"12 epoch","depth":3},{"id":"もう少し長く学習する","text":"もう少し長く学習する","depth":3},{"id":"リーダーボードのあの1枠","text":"リーダーボードのあの1枠","depth":3},{"id":"アブレーション494はどう積み上がったか","text":"アブレーション：49.4はどう積み上がったか","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"contrastive-learning/dino","relation":"referenced","topic":""},{"id":"object-detection/detr","relation":"referenced","topic":""},{"id":"object-detection/deformable-detr","relation":"referenced","topic":""}]},{"id":"contrastive-learning/dino","category":"contrastive-learning","legacyPath":"contrastive-learning/2104-dino","legacySlug":"2104-dino","legacyPaths":[],"title":"DINO","subtitle":"ラベルなしでの自己蒸留","author":"Z. Yuan","paperDate":"2021-04-29","publishedOn":"2025-03-18","paperTitle":"Emerging Properties in Self-Supervised Vision Transformers","paperUrl":"https://arxiv.org/abs/2104.14294","bibliography":{"title":"Emerging Properties in Self-Supervised Vision Transformers","authors":["Mathilde Caron","Hugo Touvron","Ishan Misra","Hervé Jégou","Julien Mairal","Piotr Bojanowski","Armand Joulin"],"url":"https://arxiv.org/abs/2104.14294","pdfUrl":"https://arxiv.org/pdf/2104.14294","codeUrl":null,"preprint":{"id":"2104.14294","submittedOn":"2021-04-29","url":"https://arxiv.org/abs/2104.14294"},"publication":{"venue":"ICCV","year":2021,"kind":"conference","url":"https://doi.org/10.1109/iccv48922.2021.00951"},"citation":"@misc{contrastivelearningdino2021,\n  title = {{Emerging Properties in Self-Supervised Vision Transformers}},\n  author = {Mathilde Caron and Hugo Touvron and Ishan Misra and Hervé Jégou and Julien Mairal and Piotr Bojanowski and Armand Joulin},\n  year = {2021},\n  eprint = {2104.14294},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2104.14294}\n}\n","citationPath":"/content/papers/citations/contrastive-learning/dino.20875c1e301c.bib"},"thumbnail":{"src":"/content/papers/assets/c2d0ab75afb02750e17183e186f29b0ef6e184eda12673a31c96f199e338188f.jpg","width":664,"height":642},"locale":"ja","path":"/content/papers/ja/contrastive-learning/dino.9c1d36cb206d.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"モデルの崩壊を防ぐ","text":"モデルの崩壊を防ぐ","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"他の方法との比較","text":"他の方法との比較","depth":3},{"id":"異なるコンポーネントの重要性","text":"異なるコンポーネントの重要性","depth":3},{"id":"モデルの崩壊テスト","text":"モデルの崩壊テスト","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"contrastive-learning/dinov2","relation":"next","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":"ja","path":"/content/papers/ja/object-detection/detr.5e84d1db3678.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":{"問題の解決":"解決策","画像から物体の集合へ":"モデル構造","まず対応付け次に損失を計算":"損失設計","実験結果の検討":"討論","これでいけるまず条件を確認":"これでいいのか","どの部品が効いている":"モデル構成要素の解析","query-は何を学んだ":"モデル挙動分析"},"guide":null,"relatedReading":[{"id":"object-detection/deformable-detr","relation":"next","topic":"集合予測と Attention による検出"},{"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":"ja","path":"/content/papers/ja/object-detection/deformable-detr.357715629c52.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":"集合予測と Attention による検出"},{"id":"object-detection/h-detr","relation":"next","topic":"集合予測と Attention による検出"},{"id":"object-detection/smca-detr","relation":"comparison","topic":"Transformer 検出器の収束を速める"}]}],"text":"本稿の DINO は DETR with Improved deNoising anchOr boxes の略で、当サイトの自己教師あり学習のノート [DINO](/blog/papers/contrastive-learning/dino) とは別物です。名前がかぶっただけです。\n\n2022年初め、COCO test-dev のリーダーボードの上位にいた SwinV2-G や Florence などの検出器は、どれも大型のバックボーンを HTC++ や DyHead のような従来型の検出ヘッドにつないでいて、推論時には NMS で重複ボックスを消す必要がありました。DETR 派の論文は、たいてい ResNet-50 でどれだけ速く収束するかを競っていました。著者らは序論で、DETR 系モデルに大きなバックボーンを載せ、大量のデータを与えたらどうなるかを報告した人はまだいないと書いています。\n\nDINO はこの成績表を埋めました。SwinL バックボーンを使い、まず Objects365 で事前学習して、COCO test-dev で63.3 AP を得ています。著者らによると、エンドツーエンドの Transformer 検出器が COCO のリーダーボードで当時最良のモデルを上回ったのは、これが初めてです。同じ設計を ResNet-50 に戻し、12 epoch だけ学習しても49.4 AP あります。\n\nDETR の大枠は、この論文でも変わっていません。骨組みは Deformable DETR、DAB-DETR、DN-DETR から来ていて、著者らはその上に3つの変更を加えました。1つ目はデノイジング学習に手を入れるものです。DN-DETR はずれたボックスを直すことだけをモデルに教えましたが、DINO はさらに、一部のボックスに「ここには何もない」と答えることを教えます。\n\n## 問題の定義\n\nまず少し背景を補っておきます。DETR は固定数のクエリ（query）を1組用意し、各クエリがクラスとボックスを1つずつ出力します。学習時にはハンガリアン法で各正解物体を1つのクエリだけに割り当て、ほかのクエリの目標は「物体なし」にします。こうして学習すると推論時に NMS は要りませんが、代償として収束がとても遅くなります。\n\nその後の2年間で、いくつかの論文がそれぞれ1つずつ穴を埋め、DINO はこの3本の上に直接立っています：\n\n- **Deformable DETR**：注意は参照点の周りの少数のサンプリング点だけを見るので、計算が速く、収束も速くなります。2段階（two-stage）のクエリ初期化と、デコーダーが層ごとにボックスを修正するやり方も提案しました。\n- **DAB-DETR**：クエリを位置と内容の2つに分け、位置の部分をそのまま1つのアンカーボックス $(x, y, w, h)$ として書き、デコーダーの各層がそれを1回ずつ修正します。以下で「アンカーボックス」と言うときは、すべてこの意味です。\n- **DN-DETR**：収束が遅いのはマッチングが不安定だからだと考えました。同じクエリが、ある回ではこの物体に、次の回では別の物体にマッチするかもしれません。学習時には、ノイズを加えた正解ボックスを追加のクエリとしてデコーダーに入れ、もとのボックスに復元させます。これらのクエリの答えは最初からわかっているので、ハンガリアンマッチングは要りません。\n\n著者らは、この土台の上に3つの穴を見出しました。\n\n1つ目はデノイジングです。DN-DETR のノイズボックスはどれも正解ボックスから遠くなく、モデルは「近くに物体があるアンカーボックスは、その物体に直せばよい」と学びます。著者らは、近くに物体がないアンカーボックスに「物体なし」と答えさせることを、モデルが一度も学んでいないと指摘しています。\n\nこれがどんな問題を生むのでしょうか？ 著者らの §3.3 の分析によると、いくつものアンカーボックスが同じ物体に近いとき、モデルはどれを使うべきか決めにくくなります。うまく選べないと、同じ物体が何度も囲まれたり、比較的遠いアンカーボックスが選ばれたりします。DETR はもともと一対一マッチングとクエリ間の自己注意で重複ボックスを抑えていますが、著者らはその能力に限りがあることを認めています。\n\n2つ目はクエリの初期化です。DN-DETR のアンカーボックスは学習で得られる固定値で、どの画像でも同じ位置の組から出発します。Deformable DETR の2段階方式は、エンコーダーからスコアの最も高い位置を選び、位置と内容をまとめてクエリの初期化に使います。著者らは、内容の部分は当てにならないと考えています。エンコーダーが選んだ特徴はまだ粗く、2つの物体にまたがっていることもあれば、物体の一部しか覆っていないこともあるからです。\n\n3つ目は層ごとのボックス修正です。Deformable DETR はデコーダーの各層に前の層のボックスを修正させますが、層と層の間で勾配を切っているので、各層は自分の損失からしか学びません。著者らは、後ろの層でより正確に修正されたボックスが、前の層を手助けすることもできるはずだと推測しました。\n\n3つの穴のうち、重複ボックスに直接関わるのは1つ目です。デノイジングでボックスを直すことだけを教えられたモデルは、手放すことを覚えられるでしょうか？\n\n\n> [!TIP]\n> \n> DETR、Deformable DETR、DN-DETR の詳細については、私たちのノートを参照してください：\n> \n> - **[[20.05] DETR：跨分野の基盤を築く者](/blog/papers/object-detection/detr)**\n> - **[[20.10] Deformable DETR：可変形な注意力メカニズム](/blog/papers/object-detection/deformable-detr)**\n> - **[[22.03] DN-DETR：今日は犬、明日は猫](/blog/papers/object-detection/dn-detr)**\n\n\n## 問題の解決\n\n### 全体の流れ\n\nDINO の構成は一般的な DETR 系モデルと同じで、バックボーン1つ、Transformer エンコーダー6層、デコーダー6層に、分類とボックスの予測ヘッドが加わります。原論文のアーキテクチャ図には、新しい変更の位置が示されています：\n\n[![DINO のアーキテクチャ図：左のマルチスケール特徴と位置エンコーディングを平坦化してエンコーダーに送る。エンコーダーの上の Query Selection が位置を選び、Init Anchors に沿ってデコーダーへ初期アンカーとして送る。その横には学習可能な内容クエリがある。デコーダーの右側は破線で CDN が区切られ、ノイズを加えた正解ボックスから正・負のサンプルのクエリを作る](/content/papers/assets/6c328e7125d4762c3a4346a1c537cb4e917d47a640869bbf212de53f74ba64fc.png)](/content/papers/assets/6c328e7125d4762c3a4346a1c537cb4e917d47a640869bbf212de53f74ba64fc.png)\n\n*Zhang ら、原論文 Figure 2。[**v4 PDF の6ページ**](https://arxiv.org/pdf/2203.03605v4#page=6)から抜粋。DINO の全体アーキテクチャです。*\n\n左から見ていきます。マルチスケールの特徴を平坦化し、位置エンコーディングを加えてエンコーダーに送ります。エンコーダーの上の Query Selection が出力から位置を選び、Init Anchors の線に沿ってデコーダーの下部へ送り、初期アンカーボックスにします。その横の Learnable Content Queries は学習可能な内容ベクトルで、この2つを合わせたものが混合クエリ選択です。デコーダーの右側で破線に区切られた CDN は学習時に追加されるデノイジングクエリで、ノイズを加えた正解ボックス（GT+Noise）から作られ、正サンプル（Pos）と負サンプル（Neg）に分かれます。Look forward twice はデコーダーの層と層の間で起こるもので、図には描かれていません。\n\nデータの流れの順に、1枚の画像は次の段階を通ります：\n\n1. バックボーンがマルチスケールの特徴を抽出します。4-scale 版はバックボーンの第2〜第4ステージの出力を取り、第4ステージをもう一度ダウンサンプリングして4層にします。5-scale 版はさらに第1ステージ、つまり解像度が最も高い層を加えます。\n2. エンコーダーが deformable attention でこれらの特徴を整理します。\n3. **混合クエリ選択**：エンコーダーの出力からスコアが最も高い900個の位置を選び、それらが予測したボックスをデコーダーの初期アンカーボックスにします。\n4. デコーダーがこの900個のアンカーボックスを層ごとに修正し、修正の際には **look forward twice** で勾配を伝えます。学習時には、デコーダーはさらに**対比的デノイジング**（Contrastive DeNoising、CDN）のクエリを受け取ります。\n5. 予測ヘッドがクラスとボックスを出力します。900個のクエリは正解とハンガリアンマッチングを行い、デノイジングクエリは答えが既知なので、そのまま損失を計算します。\n\n推論時にはデノイジングのクエリを丸ごと取り除き、900個のクエリだけが残ります。[公式コード](https://github.com/IDEA-Research/DINO)は900個のクエリの各クラスのスコアを平坦化して上位300個を出力にするので、同じクエリが異なる2つのクラスでそれぞれ1回ずつ現れることもあります。後ろに NMS はつなぎません。設定ファイルには NMS のスイッチ（`nms_iou_threshold`）が残っていて、デフォルトは-1、つまりオフです。\n\n### 対比的デノイジング\n\nDN-DETR にはノイズのスケールが $\\lambda$ の1つしかなく、ノイズが $\\lambda$ を超えないボックスはすべて正解ボックスに復元させます。DINO は2つのスケール $\\lambda_1 < \\lambda_2$ を使い、ノイズボックスを2種類に分けます：\n\n- **正サンプル**：ノイズが $\\lambda_1$ より小さく、正解ボックスに復元させます。損失はボックスの L1 と GIoU に、分類の focal loss を加えたものです。\n- **負サンプル**：ノイズが $\\lambda_1$ と $\\lambda_2$ の間にあり、「物体なし」と答えさせます。分類の focal loss だけを計算し、ボックスの損失はありません。\n\n正解ボックスごとに正サンプルと負サンプルを1つずつ作ります。1枚の画像に正解ボックスが $n$ 個あれば、CDN クエリは1組で $2n$ 個です。DN-DETR と同じく、学習時には何組も入れます。原論文の Figure 3 は2組を描いています：\n\n[![CDN の模式図：左の2つの CDN group には、それぞれ黄色の正サンプルと茶色の負サンプルのクエリが3つずつあり、一緒にデコーダーを通る。正サンプルは reconstruction loss に、負サンプルは no object に対応する。右は同心の四角形で、内側の四角に positive と λ1、内側と外側の四角の間に negative と λ2 が書かれている](/content/papers/assets/2016ccac10bf8f058a0d252c75ab4adf790e4c28f042f38eeddd61a2c18c94e5.png)](/content/papers/assets/2016ccac10bf8f058a0d252c75ab4adf790e4c28f042f38eeddd61a2c18c94e5.png)\n\n*Zhang ら、原論文 Figure 3。[**v4 PDF の8ページ**](https://arxiv.org/pdf/2203.03605v4#page=8)から抜粋。CDN グループの構造と、正・負サンプルの模式図です。*\n\nまず左側を見ます。この画像には正解ボックスが3つあるので、各組には黄色の正サンプルが3つ、茶色の負サンプルが3つあり、2組が一緒にデコーダーへ送られます。正サンプルの出力では再構成損失（reconstruction loss）を計算し、負サンプルの目標は no object です。右側の同心の四角形は模式図で、中心点が正解ボックスを表し、ノイズが内側の四角に収まる（$\\lambda_1$ 未満）ものが正サンプル、内側と外側の四角の間（$\\lambda_1$〜$\\lambda_2$）に落ちるものが負サンプルです。アンカーボックスは実際には4次元の $(x, y, w, h)$ ですが、著者らは描きやすいように平面上の点として描いています。\n\n論文では $\\lambda_1 = 1.0$、$\\lambda_2 = 2.0$ としています。公式コードと照らし合わせると、ノイズはボックスの4辺に加えられ、各辺がそれぞれランダムに内側か外側へ動きます。正サンプルが動く距離はボックスの幅の半分未満（上下の2辺では高さの半分未満）で、負サンプルは幅の半分から幅1つ分まで動きます。公式の学習スクリプトでは `dn_box_noise_scale` が1.0に設定されていて、動く距離はこの大きさになります。\n\n組数は動的に決まります。DINO はおよそ100ペア、つまり200個のデノイジングクエリを固定で使い、batch の中で正解が最も多い画像に合わせて組数を調整します。公式コードは200をその画像の物体数の2倍で割り、整数にします。たとえば batch の中で最も混んだ画像に物体が7個あれば、14組、各組14個のクエリで、合計196個です。もとの900個と合わせて、学習時のデコーダーは1枚あたり1,096個のクエリを処理します。\n\nこれらのクエリの間は注意マスクで仕切られています。もとの900個のクエリは、どのデノイジングクエリも見られません。見えてしまうと、正解が自己注意を通じて漏れるからです。異なる組同士も互いに見えません。同じ組の中の正サンプルと負サンプルは、互いを見ることができます。\n\nでは、負サンプルは正解ボックスから実際どれくらい離れているのでしょうか？ 公式コードのノイズの加え方に従って、1つの正解ボックスに対して正・負のサンプルを10万個ずつ抽出し、正解ボックスとの IoU を計算してみます：\n\n```python\nimport numpy as np\n\nrng = np.random.default_rng(0)\n\ndef iou(boxes, gt):\n    # boxes: (N, 4)、gt: (4,)、形式はどちらも (x1, y1, x2, y2)\n    x1 = np.maximum(boxes[:, 0], gt[0])\n    y1 = np.maximum(boxes[:, 1], gt[1])\n    x2 = np.minimum(boxes[:, 2], gt[2])\n    y2 = np.minimum(boxes[:, 3], gt[3])\n    inter = np.clip(x2 - x1, 0, None) * np.clip(y2 - y1, 0, None)\n    area = np.clip(boxes[:, 2] - boxes[:, 0], 0, None) * np.clip(boxes[:, 3] - boxes[:, 1], 0, None)\n    gt_area = (gt[2] - gt[0]) * (gt[3] - gt[1])\n    return inter / (area + gt_area - inter)\n\ndef cdn_noise(gt, n, negative):\n    # 公式の prepare_for_cdn をまねて、4辺をそれぞれ内側か外側へ動かす\n    w, h = gt[2] - gt[0], gt[3] - gt[1]\n    half = np.array([w / 2, h / 2, w / 2, h / 2])\n    u = rng.random((n, 4)) + (1.0 if negative else 0.0)  # 正サンプルは [0, 1)、負サンプルは [1, 2)\n    sign = rng.choice([-1.0, 1.0], size=(n, 4))\n    return np.clip(gt + sign * u * half, 0.0, 1.0)\n\ngt = np.array([0.40, 0.35, 0.60, 0.65])  # 幅0.2、高さ0.3の正解ボックス、正規化座標\nfor name, negative in ((\"正サンプル\", False), (\"負サンプル\", True)):\n    boxes = cdn_noise(gt, 100_000, negative)\n    v = iou(boxes, gt)\n    p10, p50, p90 = np.percentile(v, [10, 50, 90])\n    crossed = ((boxes[:, 2] <= boxes[:, 0]) | (boxes[:, 3] <= boxes[:, 1])).mean()\n    print(f\"{name}：IoU 中央値 {p50:.2f}、10%–90% は {p10:.2f}–{p90:.2f}、\"\n          f\"最大 {v.max():.2f}、辺の交差 {crossed:.0%}\")\n```\n\n```text\n正サンプル：IoU 中央値 0.38、10%–90% は 0.21–0.56、最大 0.94、辺の交差 0%\n負サンプル：IoU 中央値 0.01、10%–90% は 0.00–0.12、最大 0.24、辺の交差 44%\n```\n\n正サンプル自体もかなりずれていて、IoU の中央値は0.38しかありません。モデルはこれらを正解ボックスに直さなければなりません。負サンプルはさらに遠く、中央値はほぼ0、最大でも0.24です。さらに4割あまりの負サンプルでは、左右または上下の2辺が交差しています。公式コードでは、こうしたボックスは幅か高さがほぼ0のアンカーボックスになり、シミュレーションでは IoU を0として記録しています。\n\n0.24は、手計算できる上限にすでに迫っています。物体が画像の端に接していなければ、負サンプルの各辺は少なくともボックスの幅または高さの半分は動かなければなりません。正解ボックスに最も近くなるのは、4辺がどれもちょうど半分だけ外側へ動き、幅も高さも2倍になって正解ボックスを真ん中に包む場合で、IoU は $\\frac{wh}{2w \\cdot 2h} = \\frac{1}{4}$ です。\n\nつまり、これらの負サンプルは重複ボックスにはまったく似ていません。NMS でよく使う0.5や0.7のしきい値で見れば、「重複」とはほど遠いのです。\n\nでは、負サンプルは何を教えているのでしょうか？ デコーダーがアンカーボックスをどう使うかに戻りましょう。アンカーボックスは出発点で、デコーダーはその周りから特徴を取り、1層ずつ修正していきます。正サンプルしかない DN-DETR では、モデルは近くのアンカーボックスをその物体に直す癖をつけます。いくつものアンカーボックスが同じ物体の近くにあると、この癖のとおりに全部を直してしまい、出力はほとんど同じボックスがいくつも並びます。重複は出力の側に現れ、出発したアンカーボックス同士は大きく異なっていてもかまいません。\n\n負サンプルは残りの半分を補います。負サンプルも物体の近くにいて、各辺のずれはボックス1つ分の幅までで、デコーダーが取る特徴も同じ物体のものですが、答えは「物体なし」です。同じ組には比較的近い正サンプルもあり、そちらは正解ボックスに直さなければなりません。モデルはこの2種類のアンカーボックスの違いから、出発点がどれだけずれたら手放すべきかを学ぶことになります。\n\n公式リポジトリには、逆方向の懸念を尋ねた issue があります。あるアンカーボックスと物体の IoU が0.7、別のものが0.5で、CDN が0.5のほうを負サンプルとして教えたとします。次の画像に IoU 0.5のアンカーボックスしか残っていなかったら、モデルはそれまで手放してしまうのではないかという問いです。[IDEA-Research/DINO #176、2023-03-23](https://github.com/IDEA-Research/DINO/issues/176) 上のシミュレーションによれば、公式設定では IoU 0.5のアンカーボックスは正サンプルの範囲に入り、負サンプルは最大でも0.25程度です。論文の著者の一人 Hao Zhang は、CDN の各組には常に正サンプルと負サンプルの両方があるので、物体にマッチするアンカーボックスは必ずあると答えています。質問のような状況はマッチングの側では起きず、しきい値をどう設定するかの問題だと彼は考えています。CDN がこうした状況を悪化させるかどうかについては、まだ研究していないそうです。\n\nCDN は本当に、モデルにより良いアンカーボックスを選ばせたのでしょうか？ 著者らは ATD(k)（Average Top-K Distance）という指標を定義しています。検証セットの各正解ボックスについて、最終的にそれにマッチしたクエリを見つけ、その出発時のアンカーボックスと正解ボックスがどれだけ離れているか（4つの座標の L1 距離）を求め、離れているものの上位 $k$ 個を平均します。遠くのアンカーボックスがマッチする場合が少ないほど、この数字は小さくなります。\n\nResNet-50、マルチスケール特徴、12 epoch の設定で、すべての物体を使って ATD(100) を計算すると、DN と CDN はほぼ同じです。小さな物体だけを見ると CDN の距離のほうが短く、小物体の AP も1.3高くなっています。重複ボックスについての直接の証拠は、原論文 Figure 8 の1例だけです：\n\n[![同じ子どもたちの集合写真が2枚並び、人のボックスだけが描かれている。左の図では白い矢印が小さな男の子を指し、その子にほぼ重なった赤いボックスが3つ重なっている。右の図の同じ位置にはボックスが1つだけ](/content/papers/assets/4aed72dc0127639f2eb01d2a2d681c46fbb1112ac82ea7dc1b2126a3559de642.png)](/content/papers/assets/4aed72dc0127639f2eb01d2a2d681c46fbb1112ac82ea7dc1b2126a3559de642.png)\n\n*Zhang ら、原論文 Figure 8。[**v4 PDF の15ページ**](https://arxiv.org/pdf/2203.03605v4#page=15)から抜粋。左は DN クエリで学習したモデル、右は DINO で、どちらも「人」クラスのボックスだけを描いています。*\n\n左の図で白い矢印が指す小さな男の子を見ると、ほぼ重なったボックスが3つ載っています。右の図の同じ位置には1つしか残っていません。論文は重複ボックスの割合を集計していません。\n\n単にクエリが増えただけではないのでしょうか？ 付録の Table 7 は、デノイジングクエリの数を変えて比べています：\n\n| デノイジングクエリ | AP |\n| --- | ---: |\n| デノイジングなし | 45.1 |\n| DN 10個 | 46.0 |\n| DN 50個 | 46.7 |\n| DN 100個 | 47.4 |\n| DN 200個 | 47.4 |\n| DN 1,000個 | 47.6 |\n| CDN 100ペア（200個） | 47.9 |\n\n*表：原論文 Table 7 をもとに整理、ResNet-50、COCO val2017。*\n\nDN クエリを0から100個まで増やすと AP は45.1から47.4に上がりますが、それ以上増やしてもほとんど動かず、1,000個にしても47.6だけです。同じ200個のクエリのうち半分を負サンプルに替えると、0.5 AP 伸びます。\n\n### 混合クエリ選択\n\nデコーダーの900個のクエリをどこから出発させるかには、3つのやり方があります：\n\n| やり方 | アンカーボックス（位置） | 内容 |\n| --- | --- | --- |\n| 静的（DETR、DN-DETR など） | 学習で得る固定値 | すべて0、または学習で得る固定値 |\n| 純粋なクエリ選択（Deformable DETR の2段階） | エンコーダーのスコア上位 K 個の位置が予測したボックス | 同じエンコーダー特徴の線形変換 |\n| 混合クエリ選択（DINO） | エンコーダーのスコア上位 K 個の位置が予測したボックス | 学習で得る固定値 |\n\n*表：原論文 §3.4 と Figure 5 をもとに整理。*\n\nDINO はエンコーダーからは位置だけを受け取り、内容は学習可能なベクトルのままにします。公式コードでは K は900で、スコアには各位置の全クラス中の最高スコアを使い、選ばれたボックスはまず勾配を切ってからアンカーボックスにします。\n\n著者らは、エンコーダーが選んだ特徴はまだ洗練されておらず、2つの物体が混ざっていたり物体の半分しかなかったりするので、内容として使うとかえって誤解を招くと考えています。一方、位置は役に立つ事前情報です。デコーダーはより良い位置をもとにエンコーダーから特徴を取り、内容は層を重ねるごとに育っていきます。\n\n### Look forward twice\n\nDeformable DETR の層ごとのボックス修正では、第 $i$ 層が前の層のボックス $b_{i-1}$ を受け取ってオフセット $\\Delta b_i$ を予測し、両者を合わせてこの層のボックスを得てから、勾配を切って次の層に渡します。そのため、第 $i$ 層のパラメータは第 $i$ 層自身の損失でしか更新されません。著者らはこれを look forward once と呼んでいます。\n\nDINO はこれを次のように変えました：\n\n$$\n\\begin{aligned}\n\\Delta b_i &= \\mathrm{Layer}_i(b_{i-1}), & b_i' &= \\mathrm{Update}(b_{i-1}, \\Delta b_i), \\\\\nb_i &= \\mathrm{Detach}(b_i'), & b_i^{(\\mathrm{pred})} &= \\mathrm{Update}(b_{i-1}', \\Delta b_i)\n\\end{aligned}\n$$\n\n$b_i'$ は勾配を保ったボックスで、$b_i$ は勾配を切った版です。次の層の入力は相変わらず $b_i$ です。変わったのは損失の計算に使う予測ボックス $b_i^{(\\mathrm{pred})}$ で、これは前の層のまだ勾配を持つ $b_{i-1}'$ につながっています。こうすると同じオフセット $\\Delta b_i$ が2回使われます。1回目はこの層の $b_i'$ を作るとき、2回目は $b_i'$ を通じて次の層の予測ボックスに入るときで、それで look forward twice という名前になっています。\n\n$\\mathrm{Update}$ は Deformable DETR と同じで、0〜1に正規化された座標にまず inverse sigmoid を取り、オフセットを加えてから sigmoid で戻します。\n\n座標1つ、デコーダー2層で、第2層の損失が第1層のオフセットまで伝わるかを見てみます：\n\n```python\nimport torch\n\ndef update(box, delta):\n    # 論文の脚注3：inverse sigmoid の空間で足してから、0〜1に戻す\n    return torch.sigmoid(torch.logit(box) + delta)\n\ntarget = torch.tensor(0.60)  # 正解ボックスのある座標\nb0 = torch.tensor(0.40)      # 第1層が受け取るアンカーボックスの座標\n\nfor mode in (\"look forward once\", \"look forward twice\"):\n    d1 = torch.tensor(0.30, requires_grad=True)  # 第1層が予測するオフセット Δb1\n    d2 = torch.tensor(0.20, requires_grad=True)  # 第2層が予測するオフセット Δb2\n\n    b1_prime = update(b0, d1)   # b1'：勾配を保つ\n    b1 = b1_prime.detach()      # b1：勾配を切り、第2層にアンカーボックスとして渡す\n\n    if mode == \"look forward once\":\n        pred2 = update(b1, d2)\n    else:\n        pred2 = update(b1_prime, d2)\n\n    loss2 = (pred2 - target).abs()  # 第2層の L1 損失だけを計算する\n    loss2.backward()\n    g1 = 0.0 if d1.grad is None else d1.grad.item()\n    print(f\"{mode}：第2層の予測 {pred2.item():.4f}、\"\n          f\"Δb1 への勾配 {g1:+.4f}、Δb2 への勾配 {d2.grad.item():+.4f}\")\n```\n\n```text\nlook forward once：第2層の予測 0.5236、Δb1 への勾配 +0.0000、Δb2 への勾配 -0.2494\nlook forward twice：第2層の予測 0.5236、Δb1 への勾配 -0.2494、Δb2 への勾配 -0.2494\n```\n\n2つのつなぎ方で計算される予測ボックスはまったく同じ0.5236で、違うのは勾配だけです。look forward once では第2層の損失は $\\Delta b_1$ に届きませんが、look forward twice では $\\Delta b_1$ にも戻っていきます。ここでは各層のオフセットを学習可能な1つの数に簡略化しています。実際のモデルでは $\\Delta b_i$ は第 $i$ 層の出力で、勾配はさらにその層のパラメータへ流れ込みます。また、勾配が戻るのは1層分だけです。$b_{i-1}$ は第 $i$ 層に入る前にすでに切られているからです。\n\n推論時の計算はまったく変わらず、この変更が影響するのは学習だけです。\n\n## 考察\n\n### 12 epoch\n\nまず ResNet-50、COCO val2017、12 epoch 学習での比較を見ます：\n\n| モデル | AP | AP_S | GFLOPs | パラメータ | FPS |\n| --- | ---: | ---: | ---: | ---: | ---: |\n| Faster-RCNN（5-scale） | 37.9 | 22.4 | 207 | 40M | 21 |\n| Deformable DETR（4-scale） | 41.1 | — | 196 | 40M | 24 |\n| DN-Deformable-DETR（4-scale） | 43.4 | 24.8 | 265 | 48M | 23 |\n| DINO-4scale | 49.0 | 32.0 | 279 | 47M | 24 |\n| DINO-5scale | 49.4 | 32.3 | 860 | 47M | 10 |\n\n*表：原論文 Table 1 をもとに整理。FPS はすべて同じ A100 で測定し、Faster-RCNN の FPS は mmdetection で測っています。*\n\nDN-Deformable-DETR と比べると、DINO-4scale は5.6 AP 高く、計算量とパラメータ数はほぼ同じです。小物体の AP_S は7.2伸びています。クエリ数も同程度で、DINO は900個のクエリを使い、DN-Deformable-DETR は300個のクエリに3つの pattern を組み合わせていて、著者らによれば900個に相当します。Deformable DETR は300個です。\n\n4-scale と 5-scale の違いは、バックボーンの第1ステージの特徴を使うかどうかです。この層は解像度が最も高く、GFLOPs は279から860と約3倍になり、FPS は24から10に落ちて、得られるのは0.4 AP です。要旨にある49.4は、5-scale の数字です。\n\n### もう少し長く学習する\n\n24 epoch と36 epoch まで学習すると、4-scale は50.4と50.9、5-scale は51.3と51.2です（Table 2）。対照の DN-Deformable-DETR は50 epoch 学習して48.6です。要旨にある「24 epoch で DN-DETR より2.7 AP 高い」は、DINO の24 epoch と DN-DETR の50 epoch を比べたものです。5-scale は24 epoch から36 epoch に延ばしても、スコアはもう上がっていません。\n\n学習コストは付録 B にあります。同じく A100 8枚で、DINO は1 epoch あたり約55分、1枚あたり16GB で、12 epoch でおよそ11時間です。Deformable DETR（2段階と層ごとのボックス修正を含まない基本版）は1 epoch の時間は同じで、50 epoch の学習におよそ46時間かかり、45.4 AP です。DETR は1 epoch がわずか16分ですが、300 epoch が必要で、およそ80時間、41.2 AP です。この表の DINO の成績は47.9で、後のアブレーション表と同じ時期の実装です。\n\n### リーダーボードのあの1枠\n\nリーダーボードに載った DINO は、上の条件とは大きく異なります：\n\n- バックボーンを SwinL に替え、ImageNet-22K で事前学習しています。\n- 検出器はまず Objects365（約170万枚のアノテーション付き画像）で26 epoch 事前学習し、A100 を64枚使っています。\n- 続いて COCO で18 epoch ファインチューニングし、A100 を16枚使い、画像を1.5倍（最長辺2000）に拡大しています。著者らによると、このステップでおよそ0.5 AP 伸びます。\n- デノイジングクエリを1,000個に増やしています。\n\n結果をいくつかの大規模モデルと並べると、次のようになります：\n\n| モデル | パラメータ | バックボーンの事前学習データ | 検出の事前学習データ | エンドツーエンド | test-dev AP（TTA なし／あり） |\n| --- | ---: | --- | --- | :---: | ---: |\n| Florence-CoSwin-H | ≥ 637M | FLD-900M | FLD-9M | | —／62.4 |\n| SwinV2-G | 3.0B | IN-22K-ext-70M | O365 | | —／63.1 |\n| DINO-SwinL | 218M | IN-22K-14M | O365 | ✓ | 63.2／63.3 |\n\n*表：原論文 Table 3 をもとに整理。IN は ImageNet、O365 は Objects365 です。SwinV2-G はさらにインスタンスセグメンテーションのアノテーションでも学習しています。*\n\nテスト時拡張（TTA）なしでも、DINO の63.2は TTA ありの SwinV2-G の63.1をすでに上回っていて、パラメータ数は218M 対3.0B です。val2017 では63.1、TTA ありで63.2です。著者らは、Table 3 のこれまでの SOTA モデルはどれも検出ヘッドに HTC++ か DyHead を使っていて、この位置に就いたエンドツーエンドの Transformer 検出器は DINO が初めてだと指摘しています。公式リポジトリの2022年3月8日の告知にも、63.3 AP で MS-COCO のリーダーボード1位を獲得したと書かれています。\n\n63.3という数字は TTA、つまりマルチスケールのテストと水平反転を使ったものです。従来型の検出器が複数回の推論結果を統合するときは、すべてのボックスを集めてから NMS や box voting で重複を消します。著者らによると、このやり方は DINO ではかえって点数を下げます。DETR 系モデルはもともと重複ボックスをあまり出さないので、NMS が正しいボックスを誤って消しやすいからです。そこで彼らは一対一の統合方法を使いました。ある拡張の予測を主とし、各ボックスについて、ほかの拡張の結果の中から IoU が最も高く、しかもしきい値を超えるものを探して、重み付き平均を取ります。\n\n同じ論文の中で、付録では DETR 系モデルは重複ボックスをあまり出さないと言い、§3.3 ではマッチング損失と自己注意で重複ボックスを抑える能力には限りがあると認めています。2つの文を並べて読むと、「たいていは重複しないが、ときどき取りこぼす」に近く、3回囲まれたあの小さな男の子は、その取りこぼしの例です。\n\n### アブレーション：49.4はどう積み上がったか\n\n最後に、3つの新しい設計がそれぞれどれだけ寄与したかを見ます：\n\n| 設定 | クエリ選択 | CDN | LFT | AP | AP_S |\n| --- | :---: | :---: | :---: | ---: | ---: |\n| 1. DN-DETR | なし | | | 43.4 | 24.8 |\n| 2. 実装を整理した DN-DETR | なし | | | 44.9 | 26.9 |\n| 3. 強いベースライン（2 に純粋なクエリ選択を追加） | 純粋 | | | 46.5 | 29.6 |\n| 4. 3 を混合クエリ選択に変更 | 混合 | | | 47.0 | 31.1 |\n| 5. 4 に look forward twice を追加 | 混合 | | ✓ | 47.4 | 29.9 |\n| 6. DINO（5 に CDN を追加） | 混合 | ✓ | ✓ | 47.9 | 31.2 |\n\n*表：原論文 Table 4 をもとに整理、ResNet-50、COCO val2017。*\n\nこの表の数字は論文の初版と同じで、後に Table 1 を49.0まで押し上げたエンジニアリング上の調整は含まれていません。そのため最後の行は47.9です。\n\nDN-DETR の43.4から DINO の47.9まで、合わせて4.5 AP 伸びています。最も大きな2つのステップは、著者らが DN-DETR の実装を整理したこと（+1.5）と、Deformable DETR の純粋なクエリ選択を借りたこと（+1.6）です。3つの新しい設計が順に加えたのは0.5、0.4、0.5で、合計1.4です。\n\n小物体の列には少し起伏があります。look forward twice を加えると AP_S は31.1から29.9に下がり、CDN を加えてようやく31.2に戻ります。論文はこの低下を説明していません。\n\nつまり、要旨の「12 epoch で49.4 AP」は、多くのものが積み重なった成績なのです。負サンプルそのものは、この表では0.5 AP に相当します。\n\n混合クエリ選択には、付録 C に副次的な効果もあります。エンコーダーを6層のまま、デコーダーを6層から2層に減らすと、DINO は3.0 AP 下がります（47.4から44.4）。著者らが引用する Dynamic DETR は、2層に減らしたときに13.8 AP 下がっています。著者らはこの差を混合クエリ選択の功績とし、エンコーダーが最初から良いアンカーボックスを与えるので、デコーダーが1層ずつ修正することにあまり頼らずに済むと考えています。この実験は12 epoch で、デノイジングクエリは100個、負サンプルはありません。\n\n## 結論\n\nDINO は DN-DETR の土台の上に、3つのものを加えました：\n\n1. **対比的デノイジング**：同じ正解ボックスの近くに、ずれの小さいアンカーボックスと大きいアンカーボックスを1つずつ置き、前者は正解ボックスに直し、後者は物体なしと答えさせます。公式設定では、負サンプルと正解ボックスの IoU は最大でも約0.25で、負サンプルが教えるのは、出発点がどれだけずれたら手放すべきかです。\n2. **混合クエリ選択**：アンカーボックスはエンコーダーから選び、内容は学習可能なベクトルのままにします。\n3. **Look forward twice**：次の層の損失を、もう1層前まで戻します。\n\nResNet-50、12 epoch では、4-scale と 5-scale がそれぞれ49.0と49.4 AP に達しました。SwinL と Objects365 の事前学習に替えると test-dev で63.2、TTA ありで63.3となり、当時の COCO リーダーボードで1位になりました。アブレーション表では3つの新しい設計がそれぞれ約0.5 AP で、進歩の大部分は実装の整理とクエリ選択から来ています。負サンプルが重複ボックスを抑える直接の証拠は例示の図1枚だけで、ATD の曲線からは、小さな物体により近いアンカーボックスがマッチするようになったことがわかります。\n\nDETR が NMS をつながずに済むのは、どのボックスを手放すべきかを学習時に見分けさせているからです。その能力には限りがあると、著者ら自身も述べています。デプロイの際は、公式コードのように NMS のスイッチを残しておき、必要なときにオンにするとよいでしょう。\n\nDINO の速度は、また別の話です。1年後、RT-DETR が T4 GPU、TensorRT FP16、800×1333 の入力で DINO-Deformable-DETR-R50 を測ったところ、わずか5 FPS でした。RT-DETR のデコーダーの学習は DINO の設定をほぼそのまま踏襲していて、デノイジングクエリまで持っています。RT-DETR が手を入れたのはエンコーダーで、マルチスケールの特徴のせいでエンコーダーが計算のボトルネックになっていたからです。この話の続きは、[RT-DETR](/blog/papers/object-detection/rt-detr) で読めます。\n","imageSizes":{"/content/papers/assets/6c328e7125d4762c3a4346a1c537cb4e917d47a640869bbf212de53f74ba64fc.png":{"width":942,"height":319},"/content/papers/assets/2016ccac10bf8f058a0d252c75ab4adf790e4c28f042f38eeddd61a2c18c94e5.png":{"width":766,"height":353},"/content/papers/assets/4aed72dc0127639f2eb01d2a2d681c46fbb1112ac82ea7dc1b2126a3559de642.png":{"width":938,"height":313}}}
