[論文]You Only Look Once: Unified, Real-Time Object Detection

## Info
- タイトル：You Only Look Once: Unified, Real-Time Object Detection
- カンファ：CVPR2016
- 著者：Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi
- 論文：https://arxiv.org/abs/1506.02640
- プロジェクトページ：https://pjreddie.com/darknet/yolo/

## 概要
- 物体検出の新しいアプローチであるYOLOを提案。
- End to End でRGB画像からバウンディングボックスとクラス確率を予測する。
- 検出パイプライン全体が単一のネットワークで、高速に動作する(45fps)。

## 背景
- 現在の物体検出は、物体が存在する領域の案に対して分類を行うという、分類の哲学で検出を行っている。
- *Deformable parts models*（DPM）のようなシステムは、分類器を画像全体にわたって等間隔で実行するスライディングウィンドウアプローチを使用している。
- R-CNNのような最近のアプローチでは、*Region Proposal*を使用して、物体が存在する領域提案を生成し、それらに対して分類を実行する。個々のコンポーネントを別々に学習する必要があるため、時間がかかり、最適化するのが難しい。
- YOLOは、オブジェクト検出を単一の回帰問題として捉え直し、画像を入力として、バウンディングボックスの座標とクラス確率を直接出力する。YOLOは、1つの畳み込みネットワークが、複数のバウンディングボックスとそのボックスのクラス確率を同時に予測する。
- YOLOは従来の物体検出の手法と比較していくつかの利点がある。
    1. YOLOは非常に高速である。Titan X GPUでバッチ処理なしで毎秒45フレームで動作し、高速バージョンでは毎秒150フレーム以上で動作する。
    2. YOLOは予測を行う際、画像に対してグローバルな推論を行う。スライディングウィンドウや領域提案ベースの手法とは異なり、YOLOは学習時とテスト時に画像全体を見るので、見た目だけでなくクラスに関する文脈情報も暗黙のうちに取り込む。Fast R-CNN は、より大きなコンテクストを見ることができないため、画像中の背景パッチをオブジェクトと間違えてしまう。YOLOはFast R-CNNと比較して、背景の誤りを半分以下に抑えることができる。
    3. YOLOはオブジェクトの一般化可能な表現を学習する。自然画像で学習し、アートワークでテストしたところ、YOLOはDPMやR-CNNなどのトップクラスの検出方法を大きく上回った。YOLOは汎化性が高いため、新しいドメインや予期せぬ入力に適用しても破綻する可能性は低くなる。

YOLOは、精度の面ではまだ最先端の検出システムに遅れをとっています。YOLOは画像中の物体を素早く識別することができるが、一部の物体、特に小さな物体の正確な位置特定に苦労している。

## 手法

### ネットワーク

- 入力画像を$S\times S$のグリッドに分割する。物体の中心がグリッドセル内にある場合、そのグリッドセルがその物体の検出を担当する。

- 各グリッドセルは、$B$個のバウンディングボックスとその信頼度スコアを予測する。これらの信頼度スコアは、ボックスがオブジェクトを含むことをどれだけ確信しているか、また、予測したボックスがどれだけ正確だと考えているかを反映している。

- 信頼度はオジェクトがグリッド内に含まれる確率とIoUの積、$C=\mathrm{Pr(Object)}\cdot \mathrm{IOU^{truth}_{pred}}$と定義する。$\mathrm{Pr(Object)}$はオブジェクトの有無を表し、物体がなければ$0$で、物体があれば$1$となる。物体が確実にある、$\mathrm{Pr(Object)}=1$であれば、信頼度$C$はIoUに一致する。

- 各バウンディングボックスは、$(x, y, w, h)$ および$\mathrm{confidence}$の5つの予測値から構成される。$(x, y)$座標は、グリッドセルから相対的に見たバウンディングボックスの中心を表す。幅と高さは、画像全体に対する相対的な予測値である。

- また、各グリッドセルは条件付きクラス確率、$\mathrm{Pr(Class|Object)}$を予測する。これらの確率はオブジェクトを含むグリッドセルを条件とする。テスト時には、条件付きクラス確率と個々のボックスの信頼度予測を掛け合わせて、各ボックスに対するクラス固有の信頼度スコアが得られる。

上記から、ネットワークの出力は、$S\times S\times (5B+\\#\mathrm{Class})$になっていればよい。具体的に書くと、各グリッドに対し、

```math
(x_1, y_1, w_1, h_1, C_1, x_2, y_2, w_2, h_2, C_2, \cdots, x_B, y_B, w_B, h_B, C_B  , p_1, p_2, \cdots, p_{\#\mathrm{Class}})
```
をベクトルとして出力する。

論文ではPASCAL VOCでYOLOを評価する場合、$S = 7$、$B = 2$を使用する。PASCAL VOCには20のラベル付けされたクラスがあるので、$\\#\mathrm{Class}=20$である。最終的な予測値は$7\times7\times30$テンソルである。

ネットワークは下図の通り。

<img width="800px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/98f788e0-a769-be00-264f-e85077550e8f.png">

### 損失関数

損失関数は次のようにした（論文の記法とは異なるので注意）。

```math
\begin{align}
\mathrm{loss} &= \
\lambda_{\mathrm{coord}} \sum_{i=1}^{S^2}\sum_{j=1}^B \sum_{k\in \mathrm{GT}_i} \mathbb{1}^i_{jk} \left[ \left(x_{ij} - \hat x_{ik}\right)^2 + \left(y_{ij} - \hat y_{ik}\right)^2 \right] \\
&\quad + \lambda_{\mathrm{coord}} \sum_{i=1}^{S^2}\sum_{j=1}^B \sum_{k\in \mathrm{GT}_i} \mathbb{1}^i_{jk}\left[ \left(\sqrt w_{ij} - \sqrt{\hat w}_{ik}\right)^2 + \left(\sqrt h_{ij} - \sqrt{\hat h}_{ik}\right)^2 \right] \\
&\quad + \sum_{i=1}^{S^2}\sum_{j=1}^B (C_{ij}-1)^2 \sum_{k\in \mathrm{GT}_i} \mathbb{1}^i_{jk}  \\
&\quad + \lambda_{\mathrm{noobj}}\sum_{i=1}^{S^2}\sum_{j=1}^B (C_{ij}-0)^2 \prod_{k\in \mathrm{GT}_i} (1-\mathbb{1}^i_{jk})  \\
&\quad + \sum_{i=1}^{S^2}\mathbb{1}^i \sum_{c=1}^{\#\mathrm{Class}}(p_c - \hat p_c)^2
\end{align}
```

- YOLOはグリッドセルごとに複数のバウンディングボックスを予測する。学習時には、各グランドトゥルースオブジェクトに対して最もIoUが大きい1つの予測バウンディングボックスを割り当てる。

- $\mathbb{1}^i_{jk}$は、$i$番目のグリッドにグランドトゥルースオブジェクトが含まれ、かつ$i$番目のグリッドの$j$個目の予測バウンディングボックスが、$i$番目のグリッドの$k$番目のグランドトゥルースオブジェクトに割り当てられていた場合$1$で、それ以外のとき$0$となる。

- $\mathbb{1}^i$は、$i$番目のグリッドにグランドトゥルースオブジェクトが含まれる場合$1$で、それ以外のとき$0$となる。

- 多くのグリッドセルにはオブジェクトが含まれない。このため、これらのセルの「信頼度」スコアは0に近づき、オブジェクトを含むセルからの勾配を圧倒してしまうことが多い。これはモデルの不安定性を招き、早期に学習が発散する原因となる。

- バウンディングボックスの座標予測による損失を増やし、オブジェクトを含まないボックスの信頼度予測による損失を減らした。このために、$λ_{\mathrm{coord}}$と$λ_{\mathrm{noobj}}$という2つのパラメータを使用する。$λ_{\mathrm{coord}}=5$、$λ_{\mathrm{noobj}}=0.5$と設定した。

- また、二乗誤差の和は大きな箱と小さな箱の誤差を等しく重み付けする。この誤差の指標は、大きなボックスでの小さな偏差は小さなボックスのそれよりも重要ではないことを反映する必要がある。これを部分的に解決するために、幅と高さを直接予測するのではなく、バウンディングボックスの幅と高さの平方根を予測する。

- 損失関数は、オブジェクトがそのグリッド・セルに存在する場合にのみ、分類エラーにペナルティを与えることに注意すること（したがって、条件付きクラス確率に相当する）。また、予測がグランドトゥルースボックスに割り当てられている場合（すなわち、そのグリッドセル内のどの予測よりも高いIOUを持つ）、バウンディングボックス座標誤差にのみペナルティを課す。

### 学習戦略

- PASCAL VOC 2007と2012のトレーニングデータセットと検証データセットで、約$135$エポックの間、ネットワークをトレーニング。2012のテストでは、VOC2007のテストデータも学習用として使用する。学習時には、バッチサイズ$64$、モーメンタム$0.9$、学習率減衰は$0.0005$を使用した。

- 学習速度のスケジュールは以下の通りである。
    - 最初のエポックでは、学習速度を$10^{-3}$から$10^{-2}$までゆっくりと上げる。
    - $10^{-2}$で$75$エポック、$10^{-3}$で$30$エポック、そして最後に$10^{-4}$で$30$エポック学習を続ける。

- オーバーフィッティングを避けるために、ドロップアウトとデータ拡張を行う。最初の接続層の後にレート$0.5$のドロップアウト層を設けることで、層間の共適応を防ぐことができる。データ拡張のために、オリジナル画像サイズの20%までのランダムなスケーリングと平行移動を導入する。また、HSV色空間において、画像の露出と彩度を最大で1.5倍までランダムに調整する。

### テスト時の推論

- PASCAL VOCでは、1画像あたり98個のバウンディングボックスと各ボックスに対するクラス確率を予測する。

- 多くの場合、オブジェクトがどのグリッドセルに入るかは明らかであり、ネットワークは各オブジェクトに対して1つのボックスしか予測しない。しかし、大きな物体や複数のセルの境界付近にある物体は、複数のセルで検出されることがある。このような多重検出を修正するために、NMSを使用することができる。R-CNNやDPMのように性能にとって重要ではないが、NMSによってmAPで2-3%向上する。

### YOLOが持つ制限

- YOLOは、各グリッドセルで2つのボックスしか予測できず、1つのクラスしか持つことができないため、バウンディングボックスの予測に対して強い空間的制約を課している。この空間的制約は、我々のモデルが予測できる近傍のオブジェクトの数を制限する。我々のモデルは、鳥の群れのような集団で現れる小さな物体に対して苦戦する。

- このモデルはデータからバウンディングボックスを予測するよう学習するため、新しい、あるいは珍しい縦横比や配置の物体への汎化には苦労する。また、入力画像から複数のダウンサンプリングレイヤーを持つため、バウンディングボックスを予測するために比較的粗い特徴を使用する。

- 損失関数は小さなバウンディングボックスと大きなバウンディングボックスで同じようにエラーを扱う。大きなバウンディングボックスでの小さな誤差は影響が小さいが、小さなバウンディングボックスでの小さな誤差はIoUに大きな影響を与える。したがって、誤差の主原因は位置の誤検出になる。

## 評価

<img width="400px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/90dda87c-440e-c3f5-b8db-bbcb21010f7d.png">

- Fast YOLOはPASCALで最も高速な物体検出方式で、現存する最も高速な物体検出方式である。YOLOは52.7%のmAPを持ち、リアルタイム検出の先行研究より2倍以上の精度を誇る。YOLOはリアルタイム性能を維持したまま、mAPを63.4%まで押し上げる。

- また、VGG-16を用いてYOLOを学習させた。このモデルはより正確だが、YOLOより大幅に遅くなる。VGG-16に依存する他の検出システムとの比較には有用だが、リアルタイムより遅い。

※他にも検証しているが、省略。

## まとめ・感想
- 物体検出の基本となる構造で、以降の論文を読む手助けとなる。
- グリッドを増やす方向性でFCOSといったモデルへ発展したのかな。