【DeepLearning】 SSD: Single Shot MultiBox Detectorを動かしてみた


物体検出アルゴリズムがR-CNN → FAST R-CNN → FASTER R-CNN → SSDとすごい勢いで進化してるので試しにSSDのデモを動かしてみた。
本当にただただ動かしてみただけ。

環境

Ubuntu 14.04
Python 3.6
TensorFlow GPU 1.0.1
keras 1.2.2
OpenCV 3.1

動かしてみたデモはこちら
https://github.com/rykov8/ssd_keras

まずは環境構築からさらっと。

CUDAは大変なので別サイト参考にしてください。

1.pythonをanacondaでインストール

$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
$ git clone https://github.com/yyuu/pyenv-pip-rehash.git ~/.pyenv/plugins/pyenv-pip-rehash
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
$ pyenv install anaconda3-4.3.0
$ pyenv global  anaconda3-4.3.0
$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-4.3.0/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
$ python --version
$ conda create -n py36-gpu python=3.6 numpy=1.12.1
$ source activate py36-gpu
$ python --version
Python 3.5.2 :: Anaconda 4.3.1 (64-bit)

2.TensorFlowインストール

$ pip install --upgrade tensorflow-gpu==1.0.1

下記のように怒られてしまった。
‘file or directory not found /home/hoge/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg’
とりあえずデモの動作には問題なかったので無視。

3.OpenCVインストール

$ conda install -y -c vdbwrair imagemagick
$ conda install -y -c menpo opencv3

4.kerasインストール

version2だと下記のエラーで動かなかった

ValueError: "concat" mode can only merge layers with matching output shapes except for the concat axis. Layer shapes: [(None, 38, 38, 512), (None, 19, 19, 1024), (None, 10, 10, 512), (None, 5, 5, 256), (None, 3, 3, 256), (None, 1, 1, 256)]

なので1.2.2をインストール

$ conda install -c conda-forge keras=1.2.2 

5.その他libをインストール

$ conda install matplotlib 
$ conda install pillow
$ conda install h5py

6.ssd_keras

いよいよssdの実装です。
と言ってもcloneするだけ。

$ git clone https://github.com/rykov8/ssd_keras.git
$ cd ssd_keras

そしてweights_SSD300.hdf5をhttps://github.com/rykov8/ssd_keras
「Weights are ported from the original models and are available here.」のリンクからダウンロードしてssd_keras配下に配置する。
これがすでに学習済みのweights。

これで準備は完了。

試しにjupyter上で動かしてみる

$ jupyter notebook --ip=0.0.0.0

「–ip=0.0.0.0」はどこからでもアクセスできるようにするオプション。ローカルの場合は不要

jupyter起動時のログにURLが記載されているのでそこにアクセスする。
※IPとtokenは自分の環境に合わせる

http://XXX.XXX.XXX.XXX:8888/?token=XXXXXXXXXXXXXXXXXXXXXXXXX

サイトが表示されたら「SSD.ipynb」を開く。

んで、上から順番に実行していけばデモが動作して画像から物体を検出できるんじゃないかなと。
(実行はcontrol+enter)

これはpics配下の画像をテストしてるので、そこに自分のテストしたい画像をおいて
SSD.ipynbの「img_path」を修正すれば動くんじゃないかなと。これはまだテストしてないです。

お前らの募金待ってるぜ!

<追記>

なぜかOpenCVのimportでerrorになることがあった。
「ImportError: No module named cv2」
pythonとipythonのpathが違っていたためipythonでcv2を認識できなかったみたいだ。

SSD.ipynbに下記のように追記したら動いた。
※pathは自分の環境に合わせてください。

import sys
sys.path.append('/home/hoge/.pyenv/versions/anaconda3-4.3.0/envs/py36-gpu/lib/python36.zip')
sys.path.append('/home/hoge/.pyenv/versions/anaconda3-4.3.0/envs/py36-gpu/lib/python3.6')
sys.path.append('/home/hoge/.pyenv/versions/anaconda3-4.3.0/envs/py36-gpu/lib/python3.6/lib-dynload')
sys.path.append('/home/hoge/.pyenv/versions/anaconda3-4.3.0/envs/py36-gpu/lib/python3.6/site-packages')
sys.path.append('/home/hoge/.pyenv/versions/anaconda3-4.3.0/envs/py36-gpu/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg')

<さらに追記>

どうやらanacondaのenvをjupyter上で認識させないといけなかったようだ。
まずは下記コマンドでjupyterにanacondaのenvを登録する。

$ conda install ipykernel
$ python -m ipykernel install --name py36-gpu --user

あとはブラウザ上の「kernel」→「Change kernel」から先程登録した「py36-gpu」を選択すれば
anaconda環境に切り替えることができ、anacondaでインストールしたpackagesが使えるようになる。
いやぁ、凄いハマった。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です