Single Shot MultiBox DetectorのCaffe実装で物体検出デモを試してみた

caffe-ssd-demo
Single Shot MultiBox Detector (SSD)のCaffe実装「caffe-ssd」で物体検出デモを試してみました。

なお、SSDのMXNet実装に「mxnet-ssd」という名前がついているので、ここでは、Caffeのssdブランチを「caffe-ssd」と呼ぶことにします。

スポンサーリンク

物体検出デモ

後述の方法で環境構築を行ったcaffe-ssdには、以下の物体検出デモが用意されています。

  • webcamの画像から物体検出する ssd_pascal_webcam.py
  • 動画ファイルから物体検出する ssd_pascal_video.py
  • Jupyter (IPython) Notebook上で画像ファイルから物体検出する ssd_detect.ipynb
  • 画像ファイル、または動画ファイルから物体検出するコマンドラインツール ssd_detect.bin

この記事では、ssd_pascal_webcam.pyとssd_detect.ipynbについて紹介します。

なお、ssd_pascal_video.pyとssd_detect.binについては、以下の記事をご覧ください。

Single Shot MultiBox DetectorのCaffe実装で物体検出デモを試してみた(2)
Single Shot MultiBox Detector (SSD)のCaffe実装「caffe-ssd」で物体検出デモを試してみました。この記事では、前回の記事で紹介できなかった2つの物体検出デモを紹介します。

ssd_pascal_webcam.py

Pythonスクリプトを実行する場合、caffe-ssdのcaffe/pythonディレクトリを環境変数PYTHONPATHに設定しておきます。

$ export PYTHONPATH=~/github/caffe/python

webcamの画像から物体検出するために、caffeディレクトリで、以下のコマンドを実行します。

$ python examples/ssd/ssd_pascal_webcam.py

GTX 960では、下のスクリーン・ショットのように、VGG16モデルが約16FPS(1フレーム当たり約0.063秒)で動作しています。

caffe-ssd-demo-2

以下の記事「py-faster-rcnn」による物体検出の処理時間は、VGG16モデルが約0.3秒、ZFモデルが約0.1秒だったので、(画像サイズや物体検出以外の条件が同一ではありませんが)caffe-ssdでは、より高速に物体検出していることが分かります。

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

ssd_detect.ipynb

PASCAL VOC2007の画像ファイルから物体検出するために、caffeディレクトリで、以下のコマンドを実行します。

$ ipython notebook examples/ssd_detect.ipynb

得られた物体検出の結果が、以下の図です。

caffe-ssd-demo-3

環境構築

あらかじめ作成しておいたgithubディレクトリに移動して、GitHubのリポジトリ(https://github.com/weiliu89/caffe.git)をcloneし、ssdブランチに切り替えます。

$ cd ~/github
$ git clone https://github.com/weiliu89/caffe.git
$ cd caffe
$ git checkout ssd

次に、Makefile.config.exampleをコピーして、必要な編集を行います。

$ cp Makefile.config.example Makefile.config
$ gedit Makefile.config

ここでは、cuDNNとOpenCV 3.1を使用するため、Makefile.configの

# USE_CUDNN := 1
# OPENCV_VERSION := 3

USE_CUDNN := 1
OPENCV_VERSION := 3

に変更します。

調子に乗って、/usr/local/cuda-8.0が/usr/local/cudaにシンボリック・リンクされた状態で、すなわちCUDA 8.0に対応したCaffeをmakeするために、make -j$(nproc)に相当する以下のコマンドを実行してみましたが、

$ make -j8

boost関係のエラーが発生して止まりました。

調べてみると、CUDA 8.0をCUDA 7.5に変更するか、CUDA 8.0が必須であればg++を5.4にアップグレードする必要があるようです。

今回はシンプルに、CUDA 8.0をCUDA 7.5に変更することにし、Makefile.configの

CUDA_DIR := /usr/local/cuda

CUDA_DIR := /usr/local/cuda-7.5

に変更します。

make -j8は正常終了しましたが、lddでリンクされているライブラリを確認したところ、cuDNNが5.1ではなく、4.0にリンクされていました。libcudnnの設定を調整してmake -j8すると、CUDA 7.5とcuDNN 5.1に対応したCaffeがmakeできました。

次に、pycaffe、test、runtestをmakeします。

$ make py
$ make test -j8
$ make runtest -j8

runtestの途中で、今度はコアダンプ。

やはりCaffe、簡単には環境構築できません。

環境変数を設定してmake runtest -j8すると、やっと正常終了。

ここ(https://github.com/weiliu89/caffe/tree/ssd)の一番下のModelsからトレーニング済みのモデルを、以下のコマンド等でダウンロード・解凍して、環境構築終了です。

$ wget http://www.cs.unc.edu/~wliu/projects/SSD/models_VGGNet_VOC0712_SSD_300x300.tar.gz
$ tar xf models_VGGNet_VOC0712_SSD_300x300.tar.gz
$ rm models_VGGNet_VOC0712_SSD_300x300.tar.gz

記事にすると短いのですが、なんだかんだで、環境構築に1週間掛かりました。

(2016/11/23追記)
パッケージでインストールしたOpenCV 2.4と、ソースコードからビルドしたOpenCV 3.1をシステムに共存させていたのですが、OpenCV 3.1のトラブルが多いので、システムからOpenCV 3.1をアンインストールしました。

OpenCV 2.4を使用するため、Makefile.configの

OPENCV_VERSION := 3

# OPENCV_VERSION := 3

に変更して、Caffeとpycaffeをmakeしなおしました。

まとめ

Single Shot MultiBox Detector (SSD)のCaffe実装「caffe-ssd」で物体検出デモを試してみました。

やはりCaffeなので、環境構築に苦労しましたが、その高速性は確認できました。