Tensorflowを用いて物体検出の実装を目指す-RCNN

前回に続いて今回はRCNNです。

まずは論文を頑張って読みました。個人的にまとめたスライドを上げておきます。
英語が苦手なので翻訳に頼ってしまった。。BB回帰のところの実装がわからなかったので探したがなかったので今回は無しで実装することに。

RCNNでは要約すると3つのモジュールが必要になるらしい。

  • 入力画像から物体っぽい領域を提案してくれるアルゴリズム
  • 各提案領域を一つずつ学習モデルにかけて特徴を抽出するためのCNN
  • 抽出した特徴から何のクラスであるか識別するためのクラス固有の線形SVM

一つ目の提案領域の生成には論文通りSelectiveSearchを使うことにした
SelectiveSearchを実装できるほどアルゴリズムに強いわけでもコーディングスキルがあるわけでもないのでアルパカさんのライブラリを利用することに。大変便利だ・・・

二つ目のCNNにはAlexNetと呼ばれるCNNを使用した。コードはこちら

流石に層が深すぎて学習に時間がとてもかかった。いいインスタンスを借りれる機会があって良かった。
AlexNetの論文を読んでいないので、実装はクラスキャットさんの記事やネットワークのイメージ図を見たりして構築した。
実装しててどうしてもわからなかったのはtf.nn.local_response_normalizationの部分だった。今度ゆっくり調べたい。

三つ目のSVMは、この論文でSVMの存在を知ったレベルで知識がないのでこの部分は二つ目のCNNに識別の部分も任せることにしてみた

モジュールの説明はここまでで、結果はこちらにおいておきます。

github.com

結果はこんな感じになった
f:id:Owatank:20170724175853p:plain
CNNのモデルが悪いのか変なところも囲んでしまっていてイマイチ。。。

論文ではNon-Maximum-Suppressionと呼ばれるアルゴリズムを導入してるよと書いてあり、このアルゴリズムによって各クラスの四角の重複をいい感じに抑制してくれる。アルゴリズムの内容についてはこちらのサイトを参考

まだ勉強不足のせいかBoundingBox回帰の実装ができなかった。訓練データにground-truth boxを付与してないからそれもあるのだが。
BoundingBox回帰について詳しい説明などがあるサイトあれば教えて欲しいです。

次はSPP-net?とやらを調べつつFast-RCNNを目指す。