RefineDetとは
Single-Shot Refinement Neural Network for Object Detection ⇒ RefineDet
(Shifeng Zhang, Longyin Wen, Xiao Bian, Zhen Lei, Stan Z. Li:2017/11/18)
ソースはこちらから。
物体検出アルゴリズムのひとつで、SSDよりやや速度は劣るが、認識精度が高い。
Two-Step Cascaded Regressionという仕組みで、
より小さな物体に対しての認識が可能なようです。
※以下の記事で日本語でも解説されているので、是非ご一読ください。
リアルタイム物体検出向けニューラルネット、SSD(Single Shot Multi Detector)及びその派生モデルの解説
その他のアルゴリズムと比べるとこんな感じ。
System | VOC2007 test mAP | FPS (Titan X) |
---|---|---|
Faster R-CNN(VGG16) | 73.2 | 7 |
YOLO(GoogLeNet) | 63.4 | 45 |
YOLOv2(Darknet-19) | 78.6 | 40 |
SSD300(VGG16) | 77.2 | 46 |
SSD512(VGG16) | 79.8 | 19 |
RefineDet320(VGG16) | 80.0 | 40 |
RefineDet512(VGG16) | 81.8 | 24 |
システム名に続く数字は入力サイズです。
実行環境
OS:Ubuntu16.04
GPU:GeForce GTX 1080
Docker:18.06.1-ce
実行手順
- RefineDetリポジトリをクローンする。
Terminal
$ git clone https://github.com/sfzhang15/RefineDet.git
- Dockerイメージを作成する。
※CPU版は通常のdocker build
でOKです。
その場合、dockerfileディレクトリもCPU版のものを指定してください。Terminal$ nvidia-docker build -t [任意のイメージ名] [RefineDetのGPU版dockerfileディレクトリ]
- Dockerコンテナを作成する。
※CPU版は--runtime=nvidia
は不要です。
また2~4行目ではX Window Systemの設定を行っています。(画像表示のため)Terminal$ docker run -it --runtime=nvidia \ --net host \ -e DISPLAY=$DISPLAY \ -v $HOME/.Xauthority:/root/.Xauthority \ --name [任意のコンテナ名] [作成したイメージ名]
- 学習モデルをDLする。
学習モデルはGitHubのREADME下部、ModelsよりDLできます。
今回はPASCAL VOC models (VGG-16) の 07+12 : RefineDet320を使用します。DLしたファイルを解凍し、Dockerコンテナの
/opt/caffe/
にコピーします。
docker cp
でホスト⇔コンテナ間のコピーが可能です。Terminal$ docker cp [Modelsディレクトリ] [コンテナ名]:/opt/caffe/
- Dockerコンテナに入り、必要なライブラリをインストールする。
docker start [コンテナ名]
⇒docker attach [コンテナ名]
でDockerコンテナに入れます。Dockerコンテナに入ったら、カレントディレクトリを
/opt/caffe/
に変更してください。
またインストール前にapt-get
を更新してください。Terminal$ pip install matplotlib $ apt-get install python-tk $ pip install scikit-image
- RefineDetを実行する。
Terminal
$ python ./test/refinedet_demo.py
画像が表示されれば成功です。
バスの運転手や後方の馬、人物など、
画像サイズに対して小さな物体も検出できていることがわかります。まとめ
普段は物体検出アルゴリズムにSSDを使用していますが、
小さな物体の認識精度が上がらず、試験的にRefineDetを使用しました。今回はデモの実行のみですが、今後に期待が持てそうな結果となりました。
引き続き調査を続けていきたいと思います。参考文献
以下の記事がたいへん参考になりました。