ATSS : Adaptive Training Sample Selection のまとめノート

もともとの論文
[Bidging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection](https://arxiv.org/abs/1912.02424)


web上にまだATSSのまとめみたいなのがあまりなかったので, 自分で書こうと思いました. 
自分が理解した程度の内容をかなりざっくりとまとめています. ノート代わりにQiitaを使ってみたって感じなので, 論文のちゃんとした解説とか, 日本語訳とかじゃないです. ご了承ください. 

#概要
物体検出では長い間(といっても数年ですが), Anchor-boxを使用した[Faster-RCNN](https://arxiv.org/abs/1506.01497)や[Your Only Look Once(YOLO)](https://arxiv.org/abs/1804.02767)(URLはYOLOv3), [Single Shot multibox Detector(SSD)](https://arxiv.org/abs/1512.02325)などのAnchor-baseというやつが主流でしたが, ここ最近Anchor-Boxを使わないAnchor-freeというやつが普及してきました. 
具体的にはICCV2019に出てきた[RepPoints](https://arxiv.org/abs/1904.11490)([解説記事](https://qiita.com/takoroy/items/6f4f2a5ffabc20479b66))や, [FCOS](https://arxiv.org/abs/1904.01355)([解説記事](https://medium.com/lsc-psd/fcos-%E3%82%A2%E3%83%B3%E3%82%AB%E3%83%BC%E3%83%95%E3%83%AA%E3%83%BC%E7%89%A9%E4%BD%93%E6%A4%9C%E5%87%BA%E6%B3%95-dd18147dc822))なんかがあります. (個人的にはRepPointsのほうが好きです. そのへんで修論書けたらいいなーって)

論文は, 同じ定義のpositiveとnegativeをtrainingに採用する場合, boxまたはpointからの回帰には関係なく, 最終的なperformanceは大きくは変わらない, という事実から<font color="red">Anchor-baseとAnchor-freeの本質的な違いは, 実際にどのように候補領域内のpositiveとnegativeを選択し, training sampleを定義するかであり, それがperformance gapにつながっている</font>, としています.
要するに, training sampleがまったく一緒ならAnchor-baseもAnchor-freeも性能差は大してないよっていうことでしょう(ここちょっと不安ですが, 大方合っていると思います). なので, いかにうまくpositiveとnegativeのサンプルを選択するかが現在のobject detectionには重要になってくる, ということなのでしょう. 

Adaptive Training Sample Selection(ATSS)は, 物体の統計的特性から物体候補領域がpositiveかnegativeかを自動的に選択するアルゴリズムです. 
##赤文字部分(anchor-baseとanchor-freeは大差ない)の補足
赤文字の部分が個人的に興味が湧いたんで, ATSSを理解する上ではあまり関係ないですが論文に書いてあったことをちょっとまとめます. (興味ない人は飛ばしてもらって結構です)
そもそもRetinaNet(かなり新しめのone-stage物体検出)からFCOSまでは, 正規化の方法や損失関数など, boxの表記方法以外に様々なところが改良されてます. そこを同じ条件にせずただ単に「精度がいいからanchor-freeのほうが優れている」とするのは違うでしょということで, boxの表記以外の方法を合わせてみたらあら不思議, 「精度ほとんど変わんないじゃん!!」ってことらしいです. 
具体的には以下の画像を見てください. 
![コメント 2020-04-09 180008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405288/870d531e-9b4e-cf01-48a4-8453735a9ee3.jpeg)
![コメント 2020-04-09 180008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405288/c2fcdbc0-6f03-0ce7-b53f-d40dccfa12e6.jpeg)

２枚目のboxがRetinaNet, pointがFCOSです. 
RetinaNetは最初こそAP32.5でしたが, FCOSが持っているのを色々盛り込んだらAP37.0で, FCOSのAP37.8とかなり差が縮まりました. 
また, 評価方法がRetinaNetはIoU, FCOSはSSCなので, そこも合わせてあげるとほぼ一緒になりました. すごい...

#ATSS
ここからATSSの具体的な説明にはいります. 
主に原著論文における4. Adaptive Training Sample Selectionの内容をかいつまんだものになっています. 
##データセット
データセットはMS COCOを使っています. 計135Kのimageの中から, 115Kはtraining用, 5Kをvalidationに, 残りをtestとして使っています. 
##ATSSの説明
従来のサンプル選択手法では, 例えばanchor-baseのIoUの閾値やanchor-freeの検出器の検出可能スケール範囲など, いくつか結果を大きく左右するハイパーパラメータがありました. こういったハイパーパラメータがあると, どうしても自動とは？？感が残っちゃいますよね. 
そこでATSSはハイパーパラメータをほとんど使用せず, objectの統計的特性(statistical characteristics)とやらを使って候補領域からpositiveとnegativeを自動的に分割するものになってます. 

では論文中にある具体的なアルゴリズムを見てみましょう. 
![コメント 2020-04-08 171706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405288/471e46c0-3a99-c5f1-bd7b-44397e796618.png)

順に行きましょう. 
grand-truth:$\mathcal{G}$の数だけ以下の処理を繰り返し実行. 

1. positive sample候補を入れる空のセット$\mathcal{C_g}$を作る. 
1. feature pyramid levelの数($\mathcal{L}$)だけ以下の処理を繰り返し実行. 
   * L2距離を参考にして, 中心がgrand-truth$\mathcal{g}$に最も近い$\mathcal{k}$個のanchorを$\mathcal{A_i}$($\mathcal{i}$層目にある全anchor-box)から選択し, $\mathcal{S_i}$に代入. 
   * $\mathcal{C_g}$に$\mathcal{S_i}$の要素を追加. 
1. $\mathcal{C_g}$と$\mathcal{g}$のIoUを計算($\mathcal{C_g}$の各要素に対するIoUを$\mathcal{D_g}$とします)
2. $\mathcal{D_g}$の平均$\mathcal{m_g}$を計算
3. $\mathcal{D_g}$の標準偏差$\mathcal{v_g}$を計算
4. IoUの閾値を$\mathcal{t_g = m_g + v_g}$とする. 
5. $\mathcal{C_g}$の各要素$\mathcal{c}$に対して以下の処理を繰り返し実行. 
    * もし$\mathcal{c}$と$\mathcal{g}$のIoUが$\mathcal{t_g}$以上かつ$\mathcal{c}$の中心が$\mathcal{g}$内にある時
        * $\mathcal{P = P \cup c}$ ($\mathcal{P}$はpositive samples)
8. $\mathcal{N = A - P}$ ($\mathcal{N}$はnegative samples)
9. $\mathcal{P , N}$をreturn

簡潔にまとめると, 各grand truthに対して最も近いいくつかのanchorを選択し, それらのIoUの平均と標準偏差を足し合わせて閾値にしてるって感じでしょうか. 

![コメント 2020-04-09 175447.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405288/305a09e3-d9d1-b3f7-32f4-749b201deb8f.jpeg)

上のグラフはIoUのしきい値設定の一例です. (a)はきれいに検出できた例で, (b)はあまりうまく行かなかった例です. 検出する物体によっては(b)みたいなのばっかりだったりします. 
(a)のような例だとしきい値は0.612と高くなり, (b)のような例だとしきい値は0.219と低くなります. 
ガウス分布で考えると(物体検出はガウス分布とは少し違いますが)平均+分散の値は上位約16%に限られ, かなりpositiveが絞られることになるでしょう. 

##検証
Anchor-baseのRetinaNetとanchor-freeのFCOSでそれぞれ実装しています. 
$\mathcal{k} = 9$の結果, 以下のようになりました. 
![コメント 2020-04-09 180008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405288/cd3ccb38-5dae-dc2e-e9b0-2d9eccfa8c41.jpeg)
(ここでのRetinaNetは補足にある通り改良されて, FCOSと同等の実力を持っています)
FCOSにあるcenter samplingはgrand-truth内にあるpointを全て候補領域としたときにATSSを適応した値です. 論文ではこれをlite versionとしています. 
lite versionにはboxのscare範囲といったハイパーパラメータが存在します. これすらも排除しようとしたのが一番下のFCOS + ATSSです. 
上のlite versionに対してfull versionとされています. full versionではFCOSのanchor-pointを$\mathcal{8S}$($\mathcal{S}$はストライド)スケールのanchor-boxとし,　boxのサイズを制限しています. 

全体的にATSSを追加したほうが精度がよくなっているのが分かります. 
##分析
ATSSのハイパーパメータ$\mathcal{k}$の値も$\mathcal{k}$=7~17の間では精度に対しては非常に堅牢であることが実験で示されています. 
![コメント 2020-04-09 180008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405288/8197c3db-a5c3-50d8-6291-5968ecc1f123.jpeg)
$\mathcal{k}$の値が小さすぎる(3など)と, 統計の値が不安定になり精度が著しく低下します. また, 大きすぎると精度の悪い候補が選択され, これでもまた精度が下がります. 

anchor-boxのscaleについても堅牢性が示されいてます. 
![コメント 2020-04-10 133827.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405288/be47b6d7-e092-4789-1f66-edf336525150.jpeg)
検証でのfull versionでは$\mathcal{8S}$としましたが, ここでは様々な$\mathcal{S}$の係数について検証がされています. 6~8ではあまり精度差はないですね. 
また, Aspect Rationについても堅牢であることが示されています. 

#まとめ
今回はCVPR2020に登場したATSSというのをご紹介させていただきました. 
ATSSはかつてのFocal lossなどと同様に簡単に導入できる上に精度を向上させるもの, という印象を受けました. 
読んでいてなかなか楽しい論文だったので, みなさんも一読することをおすすめします. 

また,　初めての長文記事だったので見にくい点などあるかと思いますが, 暖かく見守っていただけると幸いです. 質問やコメント, アドバイスなどはいつでも受け付けております. よければよろしくおねがいします.