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については、以下の記事をご覧ください。
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秒)で動作しています。
以下の記事「py-faster-rcnn」による物体検出の処理時間は、VGG16モデルが約0.3秒、ZFモデルが約0.1秒だったので、(画像サイズや物体検出以外の条件が同一ではありませんが)caffe-ssdでは、より高速に物体検出していることが分かります。
ssd_detect.ipynb
PASCAL VOC2007の画像ファイルから物体検出するために、caffeディレクトリで、以下のコマンドを実行します。
$ ipython notebook examples/ssd_detect.ipynb
得られた物体検出の結果が、以下の図です。
環境構築
あらかじめ作成しておいた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なので、環境構築に苦労しましたが、その高速性は確認できました。