物体検出DETR （DEtection TRansformer）

<font color="gray">
本書は筆者たちが勉強した際のメモを、後に学習する方の一助となるようにまとめたものです。誤りや不足、加筆修正すべきところがありましたらぜひご指摘ください。継続してブラッシュアップしていきます。
© 2021 [NPO法人AI開発推進協会](https://sites.google.com/deepaelurus.com/aboutus/home)</font>

本書はTransformerを使った物体検出モデルであるDETRを説明します。（Transformerを理解している前提で記載しています。まだ理解していない方は当法人で作成している別冊「Seq2Seq&Transformer」を先に読んでください。）

【参考文献、サイト】  

+ [論文　End-to-End Object Detection withTransformers](https://arxiv.org/pdf/2005.12872.pdf)  
+ [End-to-End Object Detection with Transformers(DETR)の解説](https://qiita.com/sasgawy/items/61fb64d848df9f6b53d1)
+ [Transformerを物体検出に採用！話題のDETRを詳細解説！](https://deepsquare.jp/2020/07/detr/) 


# １．はじめに  
DETRはFacebook AI Research（FAIR）が2020年5月に公開した、<font color="red">Transformerを使った初めての物体検出モデル</font>です。これまでの物体検出は、NMS（Non Maxinum Suppression）、Anchor boxの数、アスペクト比、Bounding boxのデフォルト座標等を人手でチューニングする必要があり実質的にEnd to Endが実現されていませんでした。  
※物体検出モデルの詳細は別冊のSSDまたはFaster R-CNNを参照してください。  
  
DETRは、物体検出問題を直接集合予測問題（a direct set prediction problem）として捉え、NMSやRPN等の複雑な仕組みや上記人手のチューニングをなくした「CNN ＋ Transformer」のシンプルな構成でEnd to Endな物体検出を実現します。  

※<font color="red">（筆者のイメージでは）DETRでのTransformerのシーケンス（時系列）は「画像内のオブジェクトの関連性」を把握するために使われていると思われます</font>。例えば、馬がいればその上に乗っているオブジェクトは人間である可能性が高い等です。  
  
DETRはTansformerを活用することでシンプルな構成ながらFaster R-CNN等に匹敵する性能を達成しています。  


# ２．DETRアーキテクチャ
従来の物体検出モデルは、複数の物体を検出してNMSで絞り込むというプロセスを介していましたが、<font color="red">DETRでは入力した画像内に写っているすべてのオブジェクトを一括して推論します。</font>また、画像内の推論したすべてのオブジェクトとすべての正解ラベルとをハンガリアン法（後述、推論と正解を比べ最も当てはまりの良いペアを見つけてそれらに対して損失をとるものです）で対応付けを実施しています。


## (1) DETRの推論フロー    
  
推論フローは図１のように非常にシンプルです。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412761/daedd88a-a9bc-f87b-8c8b-8b92c6d3c2c8.png)
<dd>図１　DETR推論時のフロー</dd>

1. 画像をCNN（ResNet等）に入力する。<br>
   CNNで出力されたチャネル数（ex.2048）を１×１畳み込みでチャネル数をより小さい次元d(ex.256)に縮小する。 
1. 特徴マップが生成される（d個） 
1. Transformerにd個の特徴マップを入力する
1. N個のオブジェクト情報（クラス、位置、サイズ）が出力される<br>※N個が一括して推論されます。なお、Nは１００個等入力画像に含まれるよりも十分に多い数を選びます



## (2) ハンガリアン法（推論結果と正解ラベルの自動対応付け）  
  
直接集合予測問題を解く上で、推論と正解とのマッチングが正しく行われているのか正しく判断できる必要があります（人手でなく機械で）。DETRでは、二部マッチング問題として考え、ハンガリアン法で適切な対応付けを行います。

+ 二部マッチング問題
異なる２つの集合の要素をどのように組み合わせると目的を最大値で達成することができるの
かを解くものです。


+ ハンガリアン法
<font color="red">二部マッチング問題を効率的に解くための手法</font>。全検索すると n! の計算量が必要になるとこを　n3 で計算できます。　DETRではこの手法を用いてオブジェクトの推論結果（N、 ex.100）と正解ラベル（Nとの差分はすべてNo Object）の対応付けを行います。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412761/10292ba5-9109-36f7-ad1d-9641b68e3b78.png)
<dd>図２　２部マッチングの例</dd>
　

実際の対応付けイメージは下記にようになります。  
  
- まず正解ラベル y と推論結果 y^ を突き合わせて、コスト行列（ex. N=100であれば、100×100行列に各ペアのロスが入る）を作ります。  

- ハンガリアンアルゴリズムでこの行列を解いて、総和が最小なマッチングパタンσ^（重複なしのN（100）ペア）を求めます。
  
このマッチングパターン σ^ が正解ラベル y (n個はオブジェクト、「N-n」個はNo Object)と推論結果 y^ の対応付けになります。  


## (3) ハンガリアンアルゴリズムを用いたロスの算出
  
ロス計算は以下の流れになります。

1. DETRに画像を入力し、推論結果y^(N個分（ex.100個）のオブジェクト推論)を出力<br>※yiには分類クラス情報ciと矩形情報biを持つ
1. 正解ラベルyと推論結果y^をもとに、ハンガリアンアルゴリズムで最適なマッチングパターンσ^を見つけ出す
1. 正解ラベルyと推論結果y^の最適なマッチングパターンσ^におけるロスを計算する
　

マッチングパターンσ^の計算は以下になります。  

+ L<sub>box</sub> : Generalized IoUロス（IoUに距離の概念を追加したもの）と回帰ロス（位置・サイズ）を足したものです。回帰ロス（位置・サイズ）はスケール変化に弱いため、IoUロスを追加しています。
Generalized IoUロスと回帰ロス（位置・サイズ）の和を矩形ロス（L<sub>box</sub>）としています。 
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412761/a0c2c1f6-c254-abe6-42f3-7f2f52ecc60b.png)

+ L<sub>match</sub> : 予測と正解ラベルをマッチングしたときに生じるロスです。 
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412761/a0ce3559-1267-6bec-fb7d-9d81efdb1c79.png) 
クラスロス(そのクラスである確率 X - 1 )と、矩形ロス（ L<sub>box</sub> ）の和をL<sub>match</sub>としています。


+ σ<sup>^</sup> : Lmatchをすべて計算し、その結果から物体の対応関係一覧を得ます。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412761/b8a46c4d-1af0-cb79-989d-59e49d7bb2b4.png)
各マッチングパターン σ∈ €Nにおいて、各ペア（正解ラベル y<sub>i</sub> と推論結果 y<sub>i</sub><sup>^</sup> ）のロス L<sub>match</sub> の総和が最小となるマッチングパターン σ<sup>^</sup >を求め
ています

+ L<sub>Hungarian</sub> : σ<sup>^</sup>によって得た物体の対応関係一覧から最適な予測と正解ラベルのマッチングを算出します。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412761/094440f3-10e1-755b-f28b-c438f45c1ada.png)

クラスロスと矩形ロス（L<sub>box</sub>）の和の全オブジェクト総和を L<sub>Hungarian</sub> としています。

# ３．DETRアーキテクチャ
  
DETR全体のアーキテクチャは図３のようにシンプルで、「CNNバックボーン」、「エンコーダー・デコーダートランスフォーマ」、最終的な検出予測をシンプルな「FFN（フィードフォワードネットワーク）の３つのコンポーネントで構成されています。  

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412761/3ce73440-119c-57a1-2baa-162aa0e136f8.png) 
<dd>図３　DETRアーキテクチャ</dd>

## (1) 処理の流れ  
 
1. CNN出力の特徴マップ（ResNetだと2048）を、 1 × 1 Convolutionでdチャネルに圧縮する
1. Transformer encoderへ、サイズH * Wの特徴マップd個を、H * W個のd次元特徴として入力する。このときpositional encodingで位置情報を補足する。
1. Transformer encoderは、H * W個の中間オブジェクト特徴（各d次元）を出力する
1. Transformer decoderへ、 H * W個の中間オブジェクト特徴とN個のobject query（※１）を入力する
1. Transformer decoderは、N個のオブジェクト特徴（各d次元）を出力する  
1. N個のオブジェクト特徴をそれぞれＦＦＮを通して、Ｎ個のオブジェクト推論結果（クラス、矩形）が出てきます

<dd>
<font color="gray">
※１　画像内から「物体検出」と「分類」をするために学習される値。初期値は完全にランダムなベクトル数値。分類するクラスに対して十分に大きな値にします。（イメージ的には画像内に映っている物体の関連性をみながら対応付けていくと思われます）

図４は原論文に記載されているＮ＝１００のときの内２０個のボックスの予測を可視化したものです。画像サイズごとにポイントは色分けされており、緑の色が小さい画像、赤は大きな横長のボックス、青は大きな縦長のボックスを示します。各Ｎそれぞれで見方の傾向に違いがあることが見て取れます。この違いが適切に物体検出と分類を行うことを可能にしています。
</font>
</dd>

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412761/5d73ab34-40aa-b354-83e0-200e685f9217.png)
<dd>図４　COCO 2017 val画像セットでボックス予測の可視化</dd>



## (2) Auxiliary decoding loss  

オブジェクトの識別性能をあげるために、補助（Auxiliary）ロスを用います。デコーダも各層の出力にFFN（最終層のコピー）を設けて、各層で最終層と同様の推論をします。そして、各層でロス計算を同様にして、各層で誤差伝搬を走らせます。

# ４．詳細なアーキテクチャ

DETRにおいて、各アテンション層に展開される位置エンコーディングを用いたトランスフォーマーの詳細は図５のとおりです。　CNNバックボーンからの画像特徴量は、トランスフォーマー・エンコーダーを通じて、空間位置エンコーダとともに渡されます。空間位置エンコーダ（図５のSpatial positional encoding）は、マルチヘッド・セルフアテンション層ごとにQueryとKeyに追加されます。  
 
その後、デコーダはQuery(初期値はゼロに設定されています)、出力位置エンコーディング（オブジェクトクエリ）、エンコーダメモリを受信し、予測したクラスラベルとバウンディングボックスの最終的なセットを生成します。　この処理は、複数のマルチヘッドのセルフ・アテンションとデコーダエンコーダ・アテンションを介して行います。最終デコーダの最初のセルフアテンション層はスキップ可能です。  
   
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412761/82eaffce-1fd8-780c-3974-256ac17ac8d0.png)
<dd>図５　DETRのトランスフォーマーの構成図</dd>


# ５．識別結果（論文より）

## (1) Eecoder最終層のattentionマップ  
  
図６は、Encoderの256スロットの中から、顕著なattentionマップを持つ4スロットを可視化した図です。これからEncoderの段階で既にオブジェクト分離できているのがわかります。  

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412761/7bcca9a8-c7d3-5a79-6973-5411e3376346.png)
<dd>図６　　エンコーダのセルフアッテンションの可視化</dd>

## (2) Decoder最終層のattentionマップ

図７は、Decoderの100スロットの中から、顕著なattentionマップを持つ2スロットを可視化したものです。上述のようにEncoderで大まかなオブジェクト分離は完了しているため、Decoder側ではオブジェクト境界（足や鼻先）を集中して見ることで、精密なオブジェクトの境界線を判断しています。  

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412761/3f8b8976-9d2e-4d20-e042-d81e0f66d1b6.png)
<dd>図７　デコーダアテンションの可視化</dd>


# ６．シンプルさ  
論文上に記載されているPytorchで記載された推論コードは下記のように約３０行程度のコードになっています。  


![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412761/4a05cc27-ec43-84b4-dd9d-c852708863dc.png)
<dd> 図８　DETRコード</dd>

# ７．おわりに
本稿では、直接集合予測を行うためトランスフォーマーと二部マッチングを使い物体検出を行うDETRについて説明しました。DETRは実装が簡単でセグメンテーション領域への拡張も可能です。さらにFaster R-CNNよりもラージオブジェクトに対しては高い性能が出ます。一方でスモールオブジェクトの精度等では課題がありますが、今後改善がされていくものと思いますので継続して「注視」していきます。
物体検出（SSDやFaster-RNN）や、Transformerについても別冊で執筆しておりますので興味のある方は、ぜひ参照ください。