インターネットで公開されている情報を見ると簡単そうだったので手を出してみたけど、意外にハマったので、とりあえず、うまくいったパターンを書き残しました。
OS選び
当初、Ubuntu Linux16を使ってましたが、動画の物体検出の時に、python-opencvでMP4やAVI等の動画フォーマットを扱う術にたどり着けず、紆余曲折の末、Windows10になりました。OpenCVをソースからコンパイルしてインストールするところまではいけたのですが、pythonからの利用方法が分からなかった...orz
インストール方法
Anacondaインストーラのダウンロード
Download Anaconda Now! | Continuumからanacondaのインストーラをダウンロードします。
インストーラを実行
「Install for:」はrecommendedの通り「Just Me」が無難です。「All Users」でインストールすると、コマンドによっては管理者権限で実行しないと、いろいろと面倒なことになったりすることが、たまに、あります。
python3.5環境の作成
2017年6月現在、WindowsでTensorflowを動かすためにはPython3.5である必要があるそうです。なので、スタートメニューから「Anaconda Prompt」を起動し、下記のコマンドを実行し、Python3.5環境を作成します。
> conda create --name=python35 python=3.5 jupyter
Jupyter notebookへの登録
コマンドプロンプトでいろいろする場合は必要ないですが、Jupyter notebookを使う場合は必要です。
> activate python35
> ipython kernel install --user --name=python35 --display-name=python35
Tensorflowのインストール
> pip install --upgrade tensorflow
Kerasのインストール
Numpyの更新
Python Extension Packages for Windows - Christoph GohlkeからNumpy+MKLのwhlファイルをダウンロードし、それをインストールします。
> pip install --upgrade "numpy-1.13.0+mkl-cp35-cp35m-win_amd64.whl"
Scipyの更新
Python Extension Packages for Windows - Christoph Gohlkeから最新のScipyのwhlファイルをダウンロードし、それをインストールします。
> pip install --upgrade scipy-0.19.0-cp35-cp35m-win_amd64.whl
Kerasのインストール
> pip install --upgrade keras==1.2.2
バージョンを指定しないと2系のKerasがインストールされますが、実行時にいろいろエラーが吐かれ、その道の人じゃないと対応でき無さそうなので、バージョン1.2.2のKerasをインストールします。
その他のライブラリのインストール
> pip install --upgrade opencv-python pillow matplotlib h5py
- opencv-python
OpenCVのpythonライブラリ - pillow
画像処理ライブラリ - matplotlib
グラフ描画ライブラリ。画像認識結果の出力に使用される。 - h5py
HDF5ファイルを扱うためのライブラリ。Kerasのweightsファイルを読み込むときに使用する(らしい)。
SSD_Keras
GITリポジトリの取得
SSDをKerasで実装したソース一式がGitHubで公開されているので、それを使用させてもらいます。
> git clone https://github.com/rykov8/ssd_keras.git
> cd ssd_keras
学習済みモデルのダウンロード
rykov8/ssd_kerasのREADME.mdに書かれていますが、MEGAからweights_SSD300.hdf5をダウンロードして、ssd_kerasのホームディレクトリにコピーします。
SSD_Kerasの動作確認
画像のSSD
Jupyter notebookでSSD.ipynbを読込み、実行します。SSD.ipynbの下記のブロックを変更したり、追加したりすると、自前の画像を認識対象にすることができます。
img_path = '自前の画像ファイルパス'
img = image.load_img(img_path, target_size=(300, 300))
img = image.img_to_array(img)
images.append(imread(img_path))
inputs.append(img.copy())
動画のSSD
ssd_keras/testing_utilsに動画SSD用のスクリプトが格納されています。
videotest_example.pyの下記のところに対象の動画ファイルのパスを指定します。
vid_test.run('ここに動画ファイルのパスを記述する')
実行時のエラー対策
OpenCVのバージョンの影響なのか、下記の変更をしないとエラー終了します。
diff --git a/testing_utils/videotest.py b/testing_utils/videotest.py
index 0cbae3c..06e6f4d 100644
--- a/testing_utils/videotest.py
+++ b/testing_utils/videotest.py
@@ -84,8 +84,8 @@ class VideoTest(object):
"trying to open a webcam, make sure you video_path is an integer!"))
# Compute aspect ratio of video
- vidw = vid.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)
- vidh = vid.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)
+ vidw = vid.get(cv2.CAP_PROP_FRAME_WIDTH)
+ vidh = vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
vidar = vidw/vidh
# Skip frames until reaching start_frame