物体検出のリンクと簡単なまとめ。正直、記事としてたいしたことなくリンク集として考えてください。
画像認識は以下に分類されます。
- 物体認識(Object Recognition):入力画像に写る物体を理解して適切なラベルを付与
- インスタンス認識(Instance Recognition):インスタンスそのもの(個体名称)の認識
- クラス認識(Class Recognition):画像内の属する概念を予測
- シーン認識(Scene Recognition):画像の状況を表現
また、関連する単語として以下も重要です。
- 物体検出(Object Detection):画像から物体のインスタンスやクラスだけを予測するのではなく、物体が存在する領域も推定すること
- セマンティックセグメンテーション(Semantic Segmentation):物体と背景との境界を切り分けて認識する
それぞれの内容は、「知能情報論 画像認識とは」にわかりやすく整理されています。
今回は、上記の中の「物体検知(Object Detection)」に焦点をあてて解説します。
手前味噌ですが、私の関連する記事集です。
- Object Detection APIを使って堀川君を検知
- TensorFlow Object Detection APIをUbuntuにインストール
- Object Detectionのためのアノテーション(ラベリング)
- Object Detection APIのsaved_model出力
- Access Tokenを取得してGoogle Cloud MLでオンライン予測
比較
物体検知には様々なアルゴリズムがあります。それらがわかりやすくまとめられているのは、以下の情報源です。
- 最新に更新してくれているアルゴリズム一覧
- Deep Learningによる一般物体検出アルゴリズムの紹介
- CNNを用いた物体検出アルゴリズムの性能比較
- Deepに理解する深層学習による物体検出 by Keras
- Speed/accuracy trade-offs for modern convolutional object detectors
物体検知の大きなプロセス
物体検知処理はおおまかに以下の2プロセスに分けられます。1と2と同時に学習・推論するのがFaster-RCNN以降の物体検知モデルです。
1.物体領域候補の提案
2.物体領域候補の物体認識
1. 物体領域候補の提案
物体領域候補の提案としていくつかの方法があります。
スライディングウィンドウ法 Sliding window method
ピクセルを動かして提案していくだけ。
BING(Binarized normed gradients)が領域の物体らしさを高速に判定して物体領域候補を絞り込む
- CNNの前処理としてOpenCVでBINGを使ってみた
- 南開大學 BING: Binarized Normed Gradients for Objectness Estimation at 300fps
- Slideshare [CVPR読み会]BING:Binarized normed gradients for objectness estimation at 300fps
選択的検索法 Selective search method
選択的検索法は以下の処理ステップで物体領域候補提案をします。
- 画像を小さい領域郡に分割
- 隣り合う領域間の類似度を計算
- 最も類似度の高い領域を統合
2と3を領域が1つになるまで繰り返す
- R-CNNとしてSelective search を使ってみた
- 一歩進んだ物体認識を行うためのSelective SearchのPython版オープンソースの提供とLabellioを組み合わせた活用方法
- Selective Searchを使った映像からの物体検出にチャレンジ
分枝限定法 Branch and bound
各種最適化問題(特に離散最適化と組合せ最適化)の最適解を求める汎用アルゴリズムである。分枝操作(英: branching operation)と限定操作(英: bounding operation)から構成される。全ての解候補を体系的に列挙するもので、最適化された量の上限と下限の概算を使って、最適でない候補は「ひとまとめに」捨てられる。
CNNを使用した物体検知の処理モデル
R-CNN
regions with CNN featuares
原論文では物体領域候補の提案にSelective Searchを使って、そのあとCNNで特徴量を算出。最後にSVMで分類。
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
- Faster R-CNNの紹介
- Tutorial on Object Detection (Faster R-CNN):SlideShareですごくわかりやすい
YOLO
画像全体をグリッド分割してクラスとBounding Boxを求める。
SSD
SSDを何度か試しましたが、やはり小さい物体を検知するのは苦手なようです。そういう場合は違うアルゴリズムを使いましょう。
物体検知の実装
応用範囲が広く、手軽に実装できるのがTensorFlow Object Detection APIです。手軽にと書きましたが、バグがあったりして使うのに非常に苦労しました・・・ですが、その反面拡張性が高くて非常に強力です。
以下の2つのサイトは参考にして実装しました。