YOLO(v3)論文の要約

# YOLOv3: An Incremental Improvement

* Joseph Redmon, Ali Farhadi, 2018
* https://arxiv.org/abs/1804.02767
    * この記事で読んでいるのはv1
* https://pjreddie.com/darknet/yolo/


![スクリーンショット 2020-04-24 1.32.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/7dc7166e-a9dd-b291-62ef-0c5dbc74f3af.png)


## Abst

* yoloの設計に変更を加え訓練した．
    * ネットワークが大きくなり，精度が上がった
    * 320x320 YOLOv3は28.2mAPで22ms．
        * SSDと同じくらい正確で3倍速い
    * 古い.5 IOU mAPの場合(VOC2007のこと?)，57.9AP_50 で51ms．TitanX使用．
        * 57.5 AP_50で51msのRetinaNetと比べて同じくらいの精度で3.8倍速い



## 5. what this all means

* yolov3は正確で高速．
    * IOU 0.5 - 0.95 を使ったCOCO average AP ではそれほど良くない
    * 古い.5 IOUならとても良い
* なぜ彼らは評価手法を変えたのだろうか?
    * COCOの論文は「評価サーバが完成したら新しい評価方法の議論を追加する」と言っている
    * RussakovskyらはIOU .3と.5を区別するのは人間にとって難しいと報告している
        * 人間にとって区別できないなら必要ないのではないだろうか．(評価手法を変えなくてよかったのでは，という意味だと思われる)
* もっと良い質問は「これらの新しいdetectorで何をするのか」である
    * GoogleやFacebookの人たちが大勢研究している
        * 彼らはこの技術を良いことに使い，ユーザの個人情報を取得したり売ったりするために使うことはまさかないだろうと思うが
            * まさにそれをやろうとしているって？なんと．
    * それ以外にコンピュータビジョンに投資しているのは軍だが，彼らはこの技術で大勢の人を殺したりなんて恐ろしいことはしていない，いや，待て．．．
* コンピュータビジョンを使う人が良いこと，楽しいことに使っていることを願う
    * 例えば国立公園でシマウマの数を数える[13]とか，飼い猫のトラッキング[19]とか
        * しかしコンピュータビジョンがすでに疑問のある使い方をされている以上，研究者は少なくとも自分の仕事が起こしうる害と，それを緩和する方法について考える責任がある
            * それほどまでに世界に対して責任がある



## 1. intro

* yoloに小さな変更をいくつか施して改善した．
    * この論文は技術報告．introがない．
        * YOLOv3の詳細，その実現方法，うまく行かなかったこと，結論を述べる


## 2. the deal

* classifier networkを変えた
    * システム全体を最初から概観する


### 2.1 Bounding Box Prediction

* YOLO9000同様，anchor boxとしてdimension clusterを使って，bounding boxを予測する．(クラスタリングで事前bboxの形状を決める方法がYOLO9000ですでに導入されていた)
    * ネットワークは各bounding boxについて，4つの座標，t_x, t_y, t_w, t_hを予測する
    * 画像のtop, leftの角からのオフセットが(c_x, c_y)で表されるセルにおいて，bounding box priorがp_w, p_hの幅と高さを持っているなら，予測は次のようになる
        * (yoloは当初から画像を格子に分割してそれぞれのセルについてセルからのオフセットを推定する手法を用いていた．v2で直接推定からパラメタ推定に変更された)

``` math

b_x = \sigma(t_x) + c_x \\
b_y = \sigma(t_y) + c_y \\
b_w = p_w e^{t_w} \\
b_h = p_h e^{t_h} 

```
* 
    * 訓練にはsquared error 誤差を使う
        * ground truthが$\hat{t_{\*}} $ だとすると，勾配は$ \hat{t_\*} - t_{\*} $ になる(squared errorを微分するため)
            * ground truthの値は上式をinvertすることで簡単に計算できる
* YOLOv3はlogistic regressionを使って，各bounding boxについてobjectness scoreを予測する
    * あるbounding box prior が他のどのpriorよりもground truthと重なっていれば１になる(v2までこのスコアはIOUで計算されていたので，ここでも同じだろうか)
        * もしそのpriorの重なりがある閾値以上であるがbestではない(最も重なりが大きいpriorではない)なら，[17]に従いその予測は無視する
        しきい値は0.5を用い，[17]とは違い各ground truthに対して一つのbounding box priorしか割り当てない
            * priorがground truthに割り当てられていないなら，座標とclassについてはlossを割り当てず，objectnessのみlossを課す(最も近いpriorだけをground truthとの差の計算に使うということか．v2ではpriorの形は学習で変形できるとしていたので，ここでもそうだろうか)


### 2.2. class prediction

* 各boxはそれが含んでいるもののクラスをマルチラベル分類で予測する
    * softmaxは使わず，独立なlogistic 分類器を使う
        * 訓練にはbinary cross-entropyを使う
            * この方法はOpen Image Dataset[7]のような複雑なドメインで有用．
                * このデータセットではWomanとPersonのように(意味が)重複するラベルが存在する
                * softmaxを使うと各boxが１個のクラスだけを持っていることを仮定するので当てはまらない
                    * マルチラベルのほうがデータを良くモデリングできる


### 2.3. Predictions Across Scales

* YOLOv3は３つのスケールでboxを予測する
    * これらのスケールから，feature pyramid network[8]と同じconceptで特徴抽出する
        * base extractorにいくつかconv layerを追加した
            * これらの最後のレイヤでbounding box, objectness, class predictionをエンコードした3次元テンソルを予測する
                * COCOの実験では各スケールで3つのboxを予測したので，NxNx(3*(4 +1+80))になる
                    * 4がbounding box offset, 1がobjectness, 80がクラス
    * 次に2レイヤ前からfeature mapを取ってきて2xにupsampleする
        * feature mapはもっと前のlayerからも持ってきて，先程upsampleしたものにconcatenationする
            * これにより，semanticで細かい情報が利用できる
    * さらにconv layerをいくつか経由して，最終的に(最初に言及したfeature mapの?)２倍のサイズのtensorを得る
    * 最後のscaleについてboxを予測するために同じ工程をもう一度行う
    * bounding box priorを決めるのにはk-meansを使う
        * 9クラスタと3スケールを任意に選ぶ
            * クラスタをスケールに関して平等に分割する（？）
                * COCOについては次の９個のクラスタになった
                    * (10x 13), (16x 30), (33x 23), (30x 61), (62x 45), (59x 119), (116x 90), (156x 198), (373x 326)



### 2.4. Featrue Extractor

* 新しいnetworkはYOLOv2のDarknet19と新しいresidualを使ったもののハイブリッド
    * 3x3と1x1の連続するconvとshortcutを使っており，とても大きい．Darknet-53と呼ぶ．

![スクリーンショット 2020-03-12 18.43.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/7571a6c7-c91f-96f2-9092-1ec77f456466.png)


* darknet19より強力でresnet-101, 152より効率的
![スクリーンショット 2020-03-12 22.21.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/d75637c8-1220-4628-bb94-8f3ef2fa8e33.png)
  

* FLOPS/秒が多いことから，darknetはresnetよりGPUをうまく活用することで高速に処理できるといえる


### 2.5 training

* hard negative miningなしのfull imageで訓練
    * multi-scale training(v2で導入済み), データ拡張，batch norm等を使う



## 3. How We Do

* COCOのmAPではSSDと同等で3倍速い
    * RetinaNet等には少し劣る
* 古いIOU=.5のmAPではRetinaNetと同等でSSDの変種よりずっと高い
    * YOLOv3はIOU thresholdが上がると性能が大きく落ちる
        * つまりboxを完璧に一致させるのが苦手
            * (付録で著者は，振れ幅がありうるboxの位置より，分類のほうが重要と述べている)
* 以前，YOLOは小さい物体が苦手だったが，今は克服した
    * multi scale predictionによりAP_S が高い
        * しかし，比較的，中と大のサイズの物体で悪い結果
        * .5 mAPではYOLOv3が優れている

![スクリーンショット 2020-03-12 22.44.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/c1d8f666-7a09-bb8c-97e0-fc88cdd34dee.png)




## 4. Things We Tried That Did'nt Work

### Anchor box x,y predictions

* 線形activationでboxのwidthやheightの積として直接x,yを推定しようとしたが，安定性が悪くなった

### Linear x,y predictions instead of logistic

* logisticではなく直接線形activationでx,yのoffsetを予測しようとしたがmAPが下がる

### Focal loss
 
* mAPが2ポイント下がった
    * YOLOv3はすでにfocal lossが対処する問題には頑健．
        * 条件付きクラス予測とobjectness予測が独立しているから
            * だからほとんどのexampleでクラス予測のlossがなくなる(?)

### Dual IOU threholds and truth assignment

* Faster RCNNは２つのIOU thresholdを使う．これと似た戦略を使ったが良くなかった
    * 予測がIOU .7以上あれば，positive example, 
        * .3 - .7なら無視する
            * すべてのground truthに対して.3以下ならnegative example

* 現在のyoloのformulationは望ましいものである
    * 少なくともlocal optimaには落ち着く
    * ここに上げた方法も良い結果をもたらすかもしれないが，訓練安定化のためにチューニングが必要だろう