Faster R-CNNのCaffeとPythonによる実装「py-faster-rcnn」で、物体検出デモを試してみました。
ベースとなるMATLAB実装の「faster-rcnn」に対して、Python実装なので、名前が「py-faster-rcnn」となっていますが、どちらの実装も改造Caffeを使用しています。
なお、以下の記事の「chainer-faster-rcnn」は、「py-faster-rcnn」をベースとしているようです。
py-faster-rcnn
準備
GitHubのpy-faster-rcnn(https://github.com/rbgirshick/py-faster-rcnn)のREADME.mdを参照して、準備を行います。
あらかじめ作成しておいたgithubディレクトリに移動し、--recursive
を付けて、GitHubのpy-fast-neuralstyleをcloneします。
$ cd ~/github $ git clone --recursive https://github.com/rbgirshick/py-faster-rcnn
次に、py-faster-rcnn/libディレクトリに移動し、Cythonモジュールをビルドします。
$ cd py-faster-rcnn/lib $ make
次が、難関の改造Caffeのビルドです(なお、Caffeのインストールが初めての場合、依存関係のあるソフトウェアをインストールする必要があります。NVIDIA DIGITSをインストールすると、依存関係のあるソフトウェアが一括インストールされるので、楽できます)。
py-faster-rcnn/caffe-fast-rcnnディレクトリに移動し、Makefile.config.exampleをコピーして、編集を行います。
$ cd ../caffe-fast-rcnn $ cp Makefile.config.example Makefile.config $ gedit Makefile.config
ここでは、Makefile.configの
# USE_CUDNN := 1 # WITH_PYTHON_LAYER := 1
を
USE_CUDNN := 1 WITH_PYTHON_LAYER := 1
に変更します。
また、OpenCV 3.1(とPKG_CONFIG)を使用するため
# OPENCV_VERSION := 3 # USE_PKG_CONFIG := 1
を
OPENCV_VERSION := 3 USE_PKG_CONFIG := 1
に変更して、Makefile.configを保存します。
以下のコマンドで、改造Caffeをビルドします。
$ make -j$(nproc)
また、以下のコマンドで、pycaffeをビルドします。
$ make pycaffe
最後に、py-faster-rcnnディレクトリに移動し、物体検出デモに使用する学習済のモデルを準備します。
$ cd .. $ ./data/scripts/fetch_faster_rcnn_models.sh
fetch_faster_rcnn_models.shを実行すると、faster_rcnn_models.tgzがダウンロードされ、faster_rcnn_modelsディレクトリにVGGモデルとZFモデルが解凍されます。
また、fetch_faster_rcnn_models.shを再実行して、ダウンロードしたファイルのチェックサムを確認しておきます。
物体検出デモ(VGGモデル)
py-faster-rcnnディレクトリに移動し、以下のコマンドを実行します。
$ cd ~/github/py-faster-rcnn $ ./tools/demo.py
すると、複数の画像ウインドウがポップアップしてフリーズしました。
処理する画像数を減らすか、ファイルに保存するように変更した方が良いと思います。
なお、demo.pyの使い方は、--gpu
オプションでgpu_idの指定(デフォルトは、gpu_id 0のGPUモード)、--cpu
オプションでCPUモードへの切り替え、--net
オプションでvgg16とzfの切り替え(デフォルトは、vgg16)となっています。
結果をファイルに保存するように変更したdemo2.pyで、処理時間を見てみると、
$ ./tools/demo2.py ... Loaded network /home/sora/github/py-faster-rcnn/data/faster_rcnn_models/VGG16_faster_rcnn_final.caffemodel ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/000456.jpg Detection took 0.309s for 300 object proposals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/000542.jpg Detection took 0.281s for 161 object proposals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/001150.jpg Detection took 0.306s for 194 object proposals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/001763.jpg Detection took 0.313s for 196 object proposals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/004545.jpg Detection took 0.303s for 300 object proposals
処理時間は、平均すると約0.3秒です。
物体検出した結果は、この記事の最初の画像です。
物体検出デモ(ZFモデル)
(py-faster-rcnnディレクトリに移動した後、)以下のコマンドを実行します。
$ ./tools/demo2.py --net zf ... Loaded network /home/sora/github/py-faster-rcnn/data/faster_rcnn_models/ZF_faster_rcnn_final.caffemodel ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/000456.jpg Detection took 0.107s for 300 object proposals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/000542.jpg Detection took 0.079s for 135 object proposals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/001150.jpg Detection took 0.121s for 231 object proposals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/001763.jpg Detection took 0.109s for 200 object proposals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/004545.jpg Detection took 0.106s for 300 object proposals
処理時間は、平均すると約0.1秒です。
また、CPUモードで実行すると、
$ ./tools/demo2.py --net zf --cpu ... Demo for data/demo/000456.jpg Detection took 6.780s for 300 object proposals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/000542.jpg Detection took 5.424s for 135 object proposals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/001150.jpg Detection took 6.164s for 231 object proposals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/001763.jpg Detection took 5.815s for 200 object proposals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demo for data/demo/004545.jpg Detection took 6.779s for 300 object proposals
処理時間は、平均すると約6.2秒です。
まとめ
Faster R-CNNのCaffeとPythonによる実装「py-faster-rcnn」で、物体検出デモを試してみました。
物体検出デモ(VGGモデル)の結果を1行目と3行目、物体検出デモ(ZFモデル)の結果を2行目と4行目に並べると、以下の画像のようになります。
サンプル数が少ないのですが、ZFモデルは、小さなエリアから物体検出((2,2)の人、(6,2)のボトル)を行っている一方で、誤認識((1,4)の左側の犬を猫と誤認識)や検出漏れ((5,2)の右側の人、(4,4)の犬)が多い印象です。
気になる処理時間に関して、GTX 960の場合、VGGモデルは約0.3秒、ZFモデルは約0.1秒で処理できています。