Faster R-CNNのCaffe・Python実装で物体検出デモを試してみた

py-faster-rcnn-demo
Faster R-CNNのCaffeとPythonによる実装「py-faster-rcnn」で、物体検出デモを試してみました。

ベースとなるMATLAB実装の「faster-rcnn」に対して、Python実装なので、名前が「py-faster-rcnn」となっていますが、どちらの実装も改造Caffeを使用しています。

なお、以下の記事の「chainer-faster-rcnn」は、「py-faster-rcnn」をベースとしているようです。

Faster R-CNNのChainer実装で物体検出を試してみた
Faster R-CNN(Region-based Convolutional Neural Networks)のChainerによる実装「chainer-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行目に並べると、以下の画像のようになります。

py-faster-rcnn-demo-2

サンプル数が少ないのですが、ZFモデルは、小さなエリアから物体検出((2,2)の人、(6,2)のボトル)を行っている一方で、誤認識((1,4)の左側の犬を猫と誤認識)や検出漏れ((5,2)の右側の人、(4,4)の犬)が多い印象です。

気になる処理時間に関して、GTX 960の場合、VGGモデルは約0.3秒、ZFモデルは約0.1秒で処理できています。