YOLOv3 論文訳

#YOLOv3論文訳
SSDの3倍速いことで今流行りのYOLOv3の実装にあたって論文を読むことがあると思いますので，基本的な部分を簡単な日本語訳でまとめました．詳しくは無心で元論文を読むことをお勧めします．

- 元論文(yolov3)：https://arxiv.org/abs/1804.02767
- YOLOの公式サイト（by Joseph Redmon）：https://pjreddie.com/darknet/yolo/

※著者は洋画吹き替えにインスパイヤされているため，一部訳がフランクな箇所があります．

<img width="500" alt="yolo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191313/ab60da05-3fb3-3b02-6e55-a610012a5c24.png">

百聞は一見に如かず．YOLOの凄さを感じて，この記事を読むモチベーションを少しでも上げるために，[**YOLOの作者Joseph RedmonがプレゼンするTED動画**][TED]を見ることを強くお勧めします！ちなみにJosephさんはYOLOで使われるベースネットに"Darknet"と名付けるなど，中二病でも有名なのです．．．
[TED]:https://www.ted.com/talks/joseph_redmon_how_a_computer_learns_to_recognize_objects_instantly?fbclid=IwAR2HCYVuuDAusOm96OdYFKCxN3beucObxD8c8sPSCPn1TgSj-ynETrPyJKM#t-78320

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">あーYOLOのJoseph Redmonこの人か<a href="https://t.co/MtGLXS8lYp">https://t.co/MtGLXS8lYp</a></p>&mdash; CarNavy (@ryosanworld) <a href="https://twitter.com/ryosanworld/status/1092789170832134146?ref_src=twsrc%5Etfw">February 5, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<img width="500" alt="スクリーンショット 2019-09-18 15.26.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191313/b5cfd8ac-fcd7-cada-a2fb-94616634186d.png">


早速以下論文訳になります．

###Abstract
　ネットワークは前より少し大きくなったけど，精度は良くなったので心配するんじゃ〜ない．320x320だと検出精度の同じでSSDの３倍早いんだ．

| YOLOv3 | SSD |
|:-----------:|:------------:|
| 22ms       | 61ms        | 
| 28.2mAP     | 28.0mAP      |


※使用しているGPUはPascal TitanX，データセットはCOCO test-dev　
[参照サイト： https://pjreddie.com/darknet/yolo/]
※mAP = Mean Average Precision
[参照サイト：https://petitviolet.hatenablog.com/entry/20110901/1314853107]


古いけどIoU(Intersection-over-Union)ratioが0.5では，YOLOv3はかなりいいんだ．
RetinaNetにおける$198ms$で$57.5AP_{50}$という速度・精度に対して，Titan Xを用いて比較すると，なんと$51ms$で$57.9AP_{50}$を達成したんだよ．このようにYOLOv3は3.8倍も速いんだ．
※IoUは報酬関数の一種で検出精度を表す指標
[参考サイト：https://arxiv.org/pdf/1512.04412.pdf]

###1.Introduction
　誰だって気が乗らなくて１年くらい手を引くってことあるじゃん？まじで今年全然研究してなかったんだよね．そんでたくさんの時間をTwitterに使ってた．(←本当に書いてあるので気になる方は原文の[__arXiv__](https://arxiv.org/abs/1804.02767)を読んでみてください)まぁ少しGANsってやつで遊んだかな．
昨年の論文[12][1]から少し進捗があって，YOLOを少しうまく変えたんだ．しかし正直なところ，超おもしれー!!みたいなことは全くなくて，YOLOをもっと良くする変更をすこーしだけ行ったんだ．あと他の人の研究の手伝いもしてたかな．
実際，それが今回ここに書いてるものなんだ．僕たちはcamera-ready（最終版投稿)の締め切り[4]がある．そして僕がYOLOに行なったいくつかのランダムなアップデートを引用する必要があるけどソースが無い．だからTECH REPORT（技術報告書）の準備をさせてね!

<img width="479" alt="スクリーンショット 2019-03-20 0.33.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/191313/6d7b741e-112e-5b48-33b2-936b80858fb3.png">
図１:
僕たちは損失関数の論文[9]からこの図を採用した．見ての通りYOLOv3はかなり速いことがわかる．実行時間はM40またはTitanXで，基本的に同程度の性能を持つGPUだよ.

###2. The Deal
　YOLOv3の取り扱い：僕たちは他よりも良い新しい識別ネットワークを学習した．システム全体を最初から見直すだけで、すべてを理解できるようになるよ．(end to endのネットワークということ)

###2.1. Bounding Box Prediction
　YOLO9000(YOLOv2のこと)に続いて僕たちのシステムは，次元クラスタをアンカーボックスとして使用するバウンディングボックスを予測する[15]．
そんでそのネットワークはバウンディングボックスの4つの座標である$t_x, t_y, t_w, t_h$を予測する.
セルが画像の左上隅から（$c_x, c_y$）だけオフセットされていて，バウンディングボックスpriorが幅と高さ$p_w$, $p_h$を持つ場合，予測は次のように対応するよ．

```math
b_x =σ(t_x)+cx\\
b_y =σ(t_y)+cy\\
b_w =p_we^{t_w}\\
b_h = p_he^{t_h}
```
　学習している間，自乗誤差損失（squared error loss ）の合計を使うんだ．もしいくつかの座標予測へのground truthが$\hat{t_✳︎}$ならば，僕たちのgradientは(ground truth value)-(予測)，つまり， $\hat{t_✳︎}−t$となる．
このground truth valueは上式を逆転させることによって簡単に計算することができる．
　YOLOv3は，ロジスティック回帰を使って，それぞれのバウンディングボックスのためのobjectness scoreを予測する．バウンディングボックスprior（幅と高さ）が他のどのバウンディングボックスのpriorよりもground truth objectと重なる場合，これは1になるよ．

<img width="463" alt="スクリーンショット 2019-03-20 0.33.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/191313/6bb76e88-fef6-d487-99fe-e41401fc99a2.png">
図2 dimension priorsを用いたバウンディングボックスと位置予測:
僕たちはボックスの幅と高さをクラスタ重心からのオフセットとして予測する．僕たちはシグモイド関数を用いたフィルタアプリケーションのロケーションに関連してボックスの中心座標を予測する．この図は紛れもなく[15]から剽窃したものだよ．

もしバウンディングボックスpriorが最良ではないが、ground truth objectとある閾値以上重なっている場合、僕たちは[17]に従って予測を無視する．僕たちは0.5の閾値を用いる．[17]とは異なり，僕たちのシステムは1つのバウンディングボックスがそれぞれのground truthに対して事前に割り当てられるだけだ．もしバウンディングボックスがground truth objectに事前に割り当てられないならば，それは物体らしさ（objectiveness）だけでなく座標損失がないかもしくはクラス予測がないことを意味する．

###2.2. Class Prediction
　それぞれのボックスはバウンディングボックスが含んでいるかもしれないクラスをmultilabel classificationを用いて予測する．僕たちはsoftmaxが良いパフォーマンスの役に立たないと分かったので使わない．代わりに，independent logistic classifierを単に使うんだ．また学習の間，クラス予測のためのbinary cross-entropy lossを使うよ．
　 
　このformulation(公式化)は，Open Images Dataset[7]のような複雑なドメインへ移行した時に助けてくれる．
このデータセットではたくさんの重なったlabels（例えばWoman and Person）があるんだ．Soft maxを使うのは，それぞれのボックスが一つのクラスを持つケースばかりでは無いという仮定によるものなんだ．Multilabel approachはデータをより良くモデリングするよ．

###2.3. Predictions Across Scales
　YOLOv3は3つのことなるスケールでボックスを予測する．僕たちのシステムはピラミッドネットワーク特徴に類似のコンセプト[8]を用いて，それらのスケールから特徴を抽出する．僕たちの基本の特徴抽出器からいくつかのconvolutional layersを加える．それらの最後はバウンディングボックスやobjectnessやclass predictionsをencodingしている3-d tensor を予測する．COCO[10]を用いた僕たちの実験では，3つのboxをそれそれのスケールで予測するので，4つのバウンディングボックスオフセットと１つのobjectness予測と，80class予測のためのtensorはNxNx[3*(4+1+80)]になるよ．
　次に2レイヤー前から特徴マップをとってそれを2xによってupsampleする．また，より早くネットワークの中から特徴マップを取得し，それをconcatenationを用いて，upsampleした特徴と合わせる．この手法はより有意義なセマンティック情報をupsampleした特徴から得ることを許し， finer-grained（きめ細かい）情報をより早く特徴マップから得ることを許す．それからさらにいくつかconvolutuonal layerをこれの組み合わさった特徴マッププロセスに加えて，今はtwice the sizeだけれども．最終的に類似のtensorを予測する．
　僕たちは同じデザインをもう一度最終スケールのためのボックスを予測するために行う．したがって、第3スケールの予測は、ネットワークの初期段階からのすべての事前計算および細かいフィーチャから利益を得ることができる．
　僕たちはバウンディングボックスproprsを決めるためにまたk-means clusteringを使う．私たちは、9つのクラスターと3つのスケールを任意に選んでクラスターをスケール全体に均等に分割する．COCOdatasetでは9クラスタは(10×13),(16×30),(33×23),(30×61),(62×45),(59× 119), (116 × 90), (156 × 198), (373 × 326).

###2.4. Feature Extractor
僕たちは特徴抽出をするための新しいネットワークを使う．新しいネットワークはYOLOv2で登場したDarknet-19とnewfangled residual network stuffとのハイブリットアプローチだよ． ネットワークは連続的な3x3と1x1のconvolutional layersを使う， だが今やいくつかのショートカットコネクションを使っていて，ネットワークは著しく大きくなった． このネットワークは53個のconvolutional layersを持つのでDarknet-53と呼ぶんだ．

<img width="371" alt="スクリーンショット 2019-03-20 0.33.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/191313/5523a59a-6765-a4b9-517b-6e3d45addf5d.png">
表１ Darknet-53

<img width="468" alt="スクリーンショット 2019-03-20 0.33.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/191313/cfc44cc3-7462-a275-40f8-80a55b81ee33.png">
表2 バックボーンの比較：
かなり多くのoperations, floating point operations per second, FPS for various networksなど様々なネットワークの精度．
　この新しいネットワークはDarknet-19よりもっとパワフルなだけでなく，ResNet-101やResNet-152より効率的だよ．ここでいくつかのImageNetの結果を示す．



　それぞれのネットワークは全く同じセッティングで学習され，256x256のsingle crop accuracyでテストされた．Run timesは256x256でのTItan Xにおいて測定された．したがって，Darknet-53は，state-of-the-artのclassifierと同等のパフォーマンスを発揮するが，浮動小数点演算が少なく高速なんだ．Darknet-53はResNet-101よりも良く，1.5倍速い．Darknet-53はResNet-152と似たパフォーマンスを持ち，2倍速い．
　DarkNet-53は１秒あたり最も高い浮動小数点operationsを記録した．これはネットワーク構造がよりGPUを使うことを意味しており，それをより効率的に評価するため速い．それはほとんどResNetsが多すぎるlayersを持ち，全く効率的ではないからね．


###2.5. Training
僕たちはhard negative miningやそのstaffを全く使うことなくfull imagesにおいても学習する．僕たちはmulti-scake学習，大量のデータ増大，batch normalization, すべてのstandard stuffを使う．僕たちは学習とテストのためにDarknet neural network framework[14]を使う．

###3. How We Do
これ以降は手法の基本的な部分の説明でないため省略しています．

YOLOv3を理解するに当たって時間がある人はYOLOv2, SSD, YOLO, Faster RCNN, Fast RCNN, RCNNなどの手法も見てみると理解しやすいかもしれません．

DeepLearningベースの物体検出手法は歴史が深いですねぇ〜．



###P.S.
機械学習，画像処理，自動運転の情報を発信していくのでQiitaと [twitter](https://twitter.com/cv_carnavi)のフォローお待ちしています！お仕事はQiita JobsまたはTwitterのDMからお願いします．