R-CNN、Fast R-CNNに引き続きFaster R-CNNのアルゴリズムのお勉強。名前が似ていてややこしいですな。


しつこくこちらの系譜図を引用する↓
Faster R-CNNからEnd-to-Endのアプローチが始まります。
Faster R-CNN
NIPS 2015で発表された論文 Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networksで提案されたFaster R-CNNでは、従来Selective Searchで行っていた候補領域(region proposals)の検出処理をRPN (Region Proposal Network)というニューラルネットワークに置き換えてさらなる効率化を実現した。
Faster R-CNNのネットワークアーキテクチャ図でregion proposalと表記されているのがRPN↓
これで物体検出の全ての処理が1つのニューラルネットワークにつながった。End-to-Endアプローチということですね。
ZFNet
この論文で例示されている特徴抽出CNNは、Visualizing and understanding convolutional neural networksで提案されたZF(Zeiler and Fergus)Net。(AlexNetの改良版)
ZFNetの5つの畳み込み層を経て出力される特徴マップは256チャンネル(256-d)となる。
(特徴抽出に使うCNNはVGGでも良いらしく、その場合の特徴マップは512チャンネルとなる)
通常、一般物体検出の対象となる画像のサイズは1000×600程度で、CNNで特徴マップ化すると16分の1の程度のサイズ(60×40)に縮小される。
RPN (Region Proposal Network)
物体領域候補の検出を行うRPN (Region Proposal Network)は、画像全体からCNNで抽出した特徴マップに対して、候補領域のBounding Boxと、その領域の物体らしさ(Objectness)を表すスコアを出力する。
RPNは小さなニューラルネットワークで、特徴マップ上をn×nサイズのスライディングwindowで走査し、各々のn×nサイズの注目領域をネットワークの入力とする。
そして、各スライディングwindow位置に対してk個の候補領域を推定する。
k個の候補領域を推定するために、RPNは以下2つの全結合層へ分岐する。
- cls layer:物体かどうか(objectness)を分類する
- reg layer:Bounding Boxの回帰を行う
cls layerには、k個の各候補領域がオブジェクトか、背景かの確率を推定した2k個のスコアが出力される。
reg layerには、k個のBounding Boxの座標・サイズを表す4k個の出力がある。(x座標、y座標、幅、高さ)
この論文ではn=3とし、実際にはスライディングwindowではなく3×3サイズの畳み込み層と、それに続く2つに分岐した1×1サイズの畳み込み層(Fully Convolutional Networks)として実装している。
(これは3×3のスライディングwindowと等価)
Anchor
スライディングwindowに対して、写っている物体の形状が必ずしも正方形に収まらないことを考慮して、Anchorと呼ばれるk個の検出矩形パターンを用意する。
各スライディングwindowで検出する候補の数k個とはつまり、用意するAnchorの種類の数というわけ。
Anchorはスライディングwindowの中心を基準に設定される。
論文では、アスペクト比の違う3種類の矩形をさらにスケール違いで3種類用意し、k=9としている。
特徴マップのサイズをW×H(2,400以下)とすると、RPNは合計W×H×k個の領域について物体候補かどうかを判定することになる。
RPNでAnchorごとの判別を行い、物体である可能性が高いものは、Fast R-CNNと同様にRoIプーリング以降のネットワークへと進み、物体の分類が行われる。
特徴抽出の畳み込み層をRPNと共有する
ここまで、「RPNはCNNで抽出した特徴マップを入力とする」と説明してきたけど、正確には「特徴マップを抽出するCNNをRPNも共有している」と言う方が適切で、RPN自体も畳み込みニューラルネットワークの構造を持っている↓
単純に畳み込み層を共有するだけでは学習するパラメータが相互に依存してしまうため、段階的に学習する方法が採られている。
- ImageNetで学習済みの畳み込み層を使ってRPNを学習する
- 学習済みRPNが出力する矩形を使って畳み込み層のパラメータを更新する
- 畳み込み層をfixしてRPNを学習し直す
Faster R-CNNの実装
Learn OpenCVにPyTorch実装のチュートリアルがある↓
https://www.learnopencv.com/faster-r-cnn-object-detection-with-pytorch/
Faster R-CNNの特許
一時期話題になりましたが、MicrosoftからFaster R-CNNの特許が出願されています。
https://qiita.com/yu4u/items/6bc9571c19181c1600a7
権利化について結局どうなったのかオイラにはちょっと分からないのですが。。。
今更だけど、R-CNN, Fast R-CNN, Faster R-CNNについて詳細に解説している記事を見つけた↓
http://www.telesens.co/2018/03/11/object-detection-and-classification-using-r-cnns/
次はYOLO (You Only Look Once)についてまとめよう↓


関連記事
畳み込みニューラルネットワーク (CNN: Convolut...
html5のcanvasの可能性
Raspberry Piでセンサーの常時稼働を検討する
仮想関数
Netron:機械学習モデルを可視化するツール
Google XML Sitemap Generatorプラ...
ポリゴンジオメトリ処理ライブラリ『pmp-library (...
SDカードサイズのコンピューター『Intel Edison』
顔画像処理技術の過去の研究
Pylearn2:ディープラーニングに対応したPythonの...
Webスクレイピングの勉強会に行ってきた
OpenCV3.3.0でsfmモジュールのビルドに成功!
PyMC:Pythonのベイズ統計ライブラリ
タマムシっぽい質感
TensorSpace.js:ニューラルネットワークの構造を...
PeopleSansPeople:機械学習用の人物データをU...
CGAN (Conditional GAN):条件付き敵対的...
Seleniumを使ったFXや株の自動取引
WordPress on Google App Engine...
WordPressプラグインによるサイトマップの自動生成
3分の動画でプログラミングを学習できるサイト『ドットインスト...
MythTV:Linuxでテレビの視聴・録画ができるオープン...
SVM (Support Vector Machine)
OpenCVの三角測量関数『cv::triangulatep...
Raspberry PiのGPIOを操作するPythonライ...
openMVGをWindows10 Visual Studi...
フォトンの放射から格納までを可視化した動画
ポイントクラウドコンソーシアム
OpenCVで顔のランドマークを検出する『Facemark ...
Blendify:コンピュータービジョン向けBlenderラ...
Open3D:3Dデータ処理ライブラリ
PGGAN:段階的に解像度を上げて学習を進めるGAN
書籍『ゼロから作るDeep Learning』で自分なりに学...
Windows10でPyTorchをインストールしてVSCo...
画像認識による位置情報取得 - Semi-Direct Mo...
頭蓋骨からの顔復元と進化過程の可視化
iOSで使えるJetpac社の物体認識SDK『DeepBel...
Pythonのソースコードに特化した検索エンジン『Nulle...
Raspberry PiでIoTごっこ
OpenCV 3.1のsfmモジュールのビルド再び
Deep Fluids:流体シミュレーションをディープラーニ...
Quartus II






コメント