DeepLearning
TensorFlow

TensorflowのFaster RCNN実装を試す

More than 1 year has passed since last update.


この記事は


  • ちょっと前まで最速とされていた物体検出のディープニューラルネットであるFaster RCNNのTensorflow実装Faster-RCNN_TFを使ってみたのでメモです

  • 時代はSingle Shot Multibox Detector (SSD)らしいですが、Tensorflow実装はこんな開発中のしかないので一週遅れ感は否めませんが。


セットアップ


前提


  • TITAN X (Pascal)

  • ubuntu14.04.5 LTS

  • python2.7

  • Tensorflow v0.12

  • その他cython, python-opencv, easydictなど適当にインストール


インストール


  • README通りにセットアップしました。

# git clone --recursive https://github.com/smallcorgi/Faster-RCNN_TF.git

# cd ./Faster-RCNN_TF/lib
# make


デモが動かない


  • 画像の物体検出をして、赤枠で囲って表示するというデモが準備されています


  • ここにデモを動かす手順があります

  • しかし、この通りにやっても、訓練済みモデルファイルとソースのネットワーク構成がずれているようなエラーが出ます

  • なんらかのバージョン問題なんだと思いますが、よくわからないのであきらめました


    • そもそもこのFaster RCNN実装が想定しているTensorflowのバージョンがいくつなのか不明だし・・・




自分でモデルをトレーニングする


  • 仕方がないので自力でモデルをトレーニングして、それでデモを動かすことにしました。


画像データのダウンロード


  • README通りに入手&解凍&配置

# wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar

# wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
# wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar

# tar xvf VOCtrainval_06-Nov-2007.tar
# tar xvf VOCtest_06-Nov-2007.tar
# tar xvf VOCdevkit_08-Jun-2007.tar

# cd ~//data
# ln -s $VOCdevkit VOCdevkit2007

# wget https://www.dropbox.com/s/po2kzdhdgl4ix55/VGG_imagenet.npy?dl=1
# mv VGG_imagenet.npy $FRCN_ROOT/data/pretrain_model/VGG_imagenet.npy


学習回数の変更


  • 学習回数がデフォルトで70000ステップに固定されています。

  • 今回は何となくもっと回したかったので修正しました。

--- a/experiments/scripts/faster_rcnn_end2end.sh

+++ b/experiments/scripts/faster_rcnn_end2end.sh
@@ -27,7 +27,7 @@ case $DATASET in
TRAIN_IMDB="voc_2007_trainval"
TEST_IMDB="voc_2007_test"
PT_DIR="pascal_voc"
- ITERS=70000
+ ITERS=300000
;;
coco)
# This is a very long and slow training schedule


学習開始


  • 下記のコマンドで学習開始です

# ./experiments/scripts/faster_rcnn_end2end.sh gpu 0 VGG16 pascal_voc

...(なんかいろいろ起動ログが出る)

iter: 10 / 300000, total loss: 2.1978, rpn_loss_cls: 0.3894, rpn_loss_box: 0.7754, loss_cls: 0.5617, loss_box: 0.4713, lr: 0.001000
speed: 0.448s / iter
iter: 20 / 300000, total loss: 2.7391, rpn_loss_cls: 0.3400, rpn_loss_box: 0.2858, loss_cls: 1.1327, loss_box: 0.9805, lr: 0.001000
speed: 0.441s / iter
iter: 30 / 300000, total loss: 1.5654, rpn_loss_cls: 0.3556, rpn_loss_box: 0.6474, loss_cls: 0.3408, loss_box: 0.2216, lr: 0.001000
speed: 0.464s / iter


  • iterがだんだん増えて行きます

  • 300000step回ると下記のファイルが出力されます

/root/Faster-RCNN_TF/output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_300000.ckpt


今一度デモを動かす


  • 訓練済みモデルの自作ができたので、今度こそデモを動かしてみます


ちょっとソース修正


  • デモは入力画像の物体認識をして、結果画像をXWindow上に表示するというものですが、今回はそもそもX入ってなくてエラーが出たので対処しました

  • ついでにファイル出力するようにいじりました

--- a/tools/demo.py

+++ b/tools/demo.py
@@ -1,3 +1,6 @@
+import matplotlib
+matplotlib.use('Agg')
+
import _init_paths
import tensorflow as tf
from fast_rcnn.config import cfg
@@ -83,6 +86,7 @@ def demo(sess, net, image_name):
keep = nms(dets, NMS_THRESH)
dets = dets[keep, :]
vis_detections(im, cls, dets, ax, thresh=CONF_THRESH)
+ plt.savefig('/tmp/' + image_name)


実行


  • 実行してみます

# python ./tools/demo.py --model /root/Faster-RCNN_TF/output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_300000.ckpt

...(なんかいろいろ起動ログが出る)
Loaded network /root/Faster-RCNN_TF/output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_300000.ckpt

Demo for data/demo/000456.jpg
Detection took 0.621s for 300 object proposals

Demo for data/demo/000542.jpg
Detection took 0.055s for 233 object proposals

Demo for data/demo/001150.jpg
Detection took 0.058s for 212 object proposals

Demo for data/demo/001763.jpg
Detection took 0.066s for 261 object proposals

Demo for data/demo/004545.jpg
Detection took 0.059s for 300 object proposals


  • おお!なんか画像を読み込んでます


    • ちなみに入力画像はdata/demo/の下にもともと格納されています



  • 上記ソース改修で/tmpの下に画像ファイルが出力されてます


結果


  • ↓こんな画像が出力されていました

000456.jpg

000542.jpg

001150.jpg

001763.jpg

004545.jpg


終わりに


  • だいたい1枚あたり0.06秒くらいで認識できてます

  • 精度も申し分なさそうです

  • SSDの実装が出てくるまでは、とりあえずTensorflowで物体検出にはこれ使うのがよさそうですね