物体検出関連リンク集

物体検出のリンクと簡単なまとめ。正直、記事としてたいしたことなくリンク集として考えてください。

画像認識は以下に分類されます。

- 物体認識(Object Recognition)：入力画像に写る物体を理解して適切なラベルを付与
	- インスタンス認識(Instance Recognition)：インスタンスそのもの(個体名称)の認識
	- クラス認識(Class Recognition)：画像内の属する概念を予測
- シーン認識(Scene Recognition)：画像の状況を表現

また、関連する単語として以下も重要です。

- 物体検出(Object Detection)：画像から物体のインスタンスやクラスだけを予測するのではなく、物体が存在する領域も推定すること
- セマンティックセグメンテーション(Semantic Segmentation)：物体と背景との境界を切り分けて認識する

それぞれの内容は、[「知能情報論 画像認識とは」](http://www.mi.t.u-tokyo.ac.jp/harada/lectures/IIT/internal/03_image_recognition_20160427.pdf)にわかりやすく整理されています。
今回は、上記の中の「物体検知(Object Detection)」に焦点をあてて解説します。

手前味噌ですが、私の関連する記事集です。
- [Object Detection APIを使って堀川君を検知](https://qiita.com/FukuharaYohei/items/fcad2d74f2b753191548)
- [TensorFlow Object Detection APIをUbuntuにインストール](https://qiita.com/FukuharaYohei/items/5e4081ba8f7f9255a8f6)
- [Object Detectionのためのアノテーション(ラベリング)](https://qiita.com/FukuharaYohei/items/9bd1be8ba04430c1ebea)
- [Object Detection APIのsaved_model出力](https://qiita.com/FukuharaYohei/items/d404bacd45afbf0f068e)
- [Access Tokenを取得してGoogle Cloud MLでオンライン予測](https://qiita.com/FukuharaYohei/items/5face08fa7d07bbe11fe)

# 比較
物体検知には様々なアルゴリズムがあります。それらがわかりやすくまとめられているのは、以下の情報源です。

- [最新に更新してくれているアルゴリズム一覧](https://github.com/hoya012/deep_learning_object_detection)
- [Deep Learningによる一般物体検出アルゴリズムの紹介](http://tech-blog.abeja.asia/entry/object-detection-summary)
- [CNNを用いた物体検出アルゴリズムの性能比較](https://qiita.com/tokkuman/items/3fabd04a1a524843bea5)
- [Deepに理解する深層学習による物体検出 by Keras](https://qiita.com/GushiSnow/items/8c946208de0d6a4e31e7)
- [Speed/accuracy trade-offs for modern convolutional object detectors
](https://arxiv.org/abs/1611.10012)

#物体検知の大きなプロセス
物体検知処理はおおまかに以下の2プロセスに分けられます。1と2と同時に学習・推論するのがFaster-RCNN以降の物体検知モデルです。
1.物体領域候補の提案
2.物体領域候補の物体認識

##1. 物体領域候補の提案
物体領域候補の提案としていくつかの方法があります。

###スライディングウィンドウ法 Sliding window method
ピクセルを動かして提案していくだけ。
BING(Binarized normed gradients)が領域の物体らしさを高速に判定して物体領域候補を絞り込む

- [CNNの前処理としてOpenCVでBINGを使ってみた](https://qiita.com/Almond/items/ad56ce29112d6397a704)
- [南開大學 BING: Binarized Normed Gradients for Objectness Estimation at 300fps](http://mmcheng.net/bing/)
- [Slideshare [CVPR読み会]BING:Binarized normed gradients for objectness estimation at 300fps](https://www.slideshare.net/takmin/cvprbing)

###選択的検索法 Selective search method
選択的検索法は以下の処理ステップで物体領域候補提案をします。
1. 画像を小さい領域郡に分割
2. 隣り合う領域間の類似度を計算
3. 最も類似度の高い領域を統合
2と3を領域が1つになるまで繰り返す

- [R-CNNとしてSelective search を使ってみた](https://qiita.com/Almond/items/7850cf81903fbe2a2c6c)
- [一歩進んだ物体認識を行うためのSelective SearchのPython版オープンソースの提供とLabellioを組み合わせた活用方法](http://blog-jp.alpaca.ai/entry/2015/08/05/235408)
- [Selective Searchを使った映像からの物体検出にチャレンジ](https://ai-coordinator.jp/selective-search)

###分枝限定法 Branch and bound
各種最適化問題（特に離散最適化と組合せ最適化）の最適解を求める汎用アルゴリズムである。分枝操作（英: branching operation）と限定操作（英: bounding operation）から構成される。全ての解候補を体系的に列挙するもので、最適化された量の上限と下限の概算を使って、最適でない候補は「ひとまとめに」捨てられる。

- [組合せ最適化問題と分枝限定法](http://www.dais.is.tohoku.ac.jp/~shioura/teaching/mp13/mp13-06.pdf)
- [「大きなナップサック」問題の解説](https://codeiq.jp/magazine/2014/01/5278/)

#CNNを使用した物体検知の処理モデル
## R-CNN
regions with CNN featuares
原論文では物体領域候補の提案にSelective Searchを使って、そのあとCNNで特徴量を算出。最後にSVMで分類。

- [R-CNNの原理とここ数年の流れ](https://www.slideshare.net/KazukiMotohashi2/rcnn)

##Fast R-CNN
R-CNN + ROI pooling + Multi-task Loss
ROI Pooling(Region of Interest): 異なる候補領域を固定サイズにプーリングする処理。逆伝播可能。R-CNNは単純なリサイズをしているだけっぽい。
Multi-task Loss:分類誤差と矩形回帰誤差の2つの誤差を使用。矩形回帰誤差は真のBounding Boxとの差。

##Faster R-CNN
物体領域候補提案にもCNNを使う。物体領域候補提案はRPN(Region Proposal Network)。RPNはFeature Map上で3*3の検出窓を使ってSliding Windowを行う。Objectness & 矩形回帰。Anchorを使ってwindowひとつから複数領域のObjectnessを求める。Anchorごとに分類誤差と(背景以外)矩形回帰誤差。->背景以外矩形回帰誤差ってなんだ？
RPNの256次元ってなんだ？->おそらく、蜜結合層の次元数じゃないか？
IoU(Intersection-over-Union)：物体領域候補と正解ボックスの重なり？
Feature Map ROI poolingとRPNの2方向に線が出ている図はどういう意味？->多分、並列ではあるが、先行するのはRPN。RPNの結果をROIPoolingして分類回帰(とLocalization回帰も？)しているのではないか。

- [論文紹介: Fast R-CNN&Faster R-CNN](https://www.slideshare.net/takashiabe338/fast-rcnnfaster-rcnn)
- [Faster R-CNNの紹介](http://kivantium.hateblo.jp/entry/2015/12/25/112145)
- [Tutorial on Object Detection (Faster R-CNN)](https://www.slideshare.net/hpkim0512/tutorial-of-faster-rcnn):SlideShareで**すごくわかりやすい**

##YOLO
画像全体をグリッド分割してクラスとBounding Boxを求める。

##SSD
SSDを何度か試しましたが、やはり小さい物体を検知するのは苦手なようです。そういう場合は違うアルゴリズムを使いましょう。

- [物体検出アルゴリズムSSDを読解する part1](https://qiita.com/hiroqik/items/39ea69213626bb4b7d84)
- [情報の少ないSSD(Single Shot MultiBox Detector)を出来るだけ細かく解説してみる ~ VGG編 ~](https://qiita.com/arabian9ts/items/fcf4abd7849e11995968)

#物体検知の実装
応用範囲が広く、手軽に実装できるのが[TensorFlow Object Detection API](https://github.com/tensorflow/models/tree/master/research/object_detection)です。手軽にと書きましたが、バグがあったりして使うのに非常に苦労しました・・・ですが、その反面拡張性が高くて非常に強力です。

以下の2つのサイトは参考にして実装しました。

- [TensorFlow Object Detection APIを使ったロゴ検出](https://qiita.com/ozw/items/363a947971966c42642f)
- [Tensorflow Object Detection APIで寿司検出モデルを学習するまで](https://qiita.com/watanabe0621/items/0b1cfa2d89c8321767e2)