SSD-TensorFlowをWindows10で試してみる
前書き
そろそろ物体検出のアルゴリズムを試してみないと、と思い立った。*1
使ってみるのはSSDと呼ばれるもの。ぶっちゃけ内容は理解していない。
SlideShareにも参考になりそうなスライドがある。
環境
- Windows10 Home x64
- Miniconda 4.3.21
- CUDA 8.0
- PyCharm 171.4424.42
Pythonのパッケージは下記のとおり。
実験用のPython仮想環境を用意
今までと同様、Minicondaを用いてpython3.5環境を用意した。
とりあえず導入したパッケージとバージョンなどは次のとおり。
numpy | 1.13.0 | py35_0 |
scipy | 0.19.0 | np113py35_0 |
scikit-learn | 0.18.1 | np113py35_1 |
matplotlib | 2.0.2 | np113py35_0 |
pandas | 0.20.2 | np113py35_0 |
ここらへんはすべて、conda install で叩き込める。
後になって必要になったパッケージとバージョンは次のとおり。
opencv-python | 3.2.0.7 | <pip> |
pillow | 4.1.1 | py35_0 |
jupyter | 1.0.0 | py35_3 |
OpenCVはpip*2、それ以外はcondaでインストールできる。
これに加えて、TensorFlowも当然導入する。
公式サイトに従うと、導入コマンドは次のとおり(GPU版)*3。
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.1.0-cp35-cp35m-win_amd64.whl
とりあえず動かそうとしてドツボにはまる
見出しから落ちは見えているが、とりあえず失敗談 (=大事な経験) をば。
今回動かしてみる実装は以下のとおり。
READMEによると、ダウンロード後にssd_300_vgg.ckpt.zipを解凍すれば、
notebookディレクトリのssd_notebook.ipynbで動作確認できるらしい。
PythonもDNNもろくにいじったことがなく、これらが何か調べる必要があった。
ssd_300_vgg.ckpt
TensorFlowで学習済みのパラメータのことらしい。
解凍すると .index と .data-00000-of-00001 が出てきた。
ssd_notebook.ipynb
Jupyter notebookで用いるファイル形式らしい。
Pythonのコードの中でMarkDownコメントを使えて便利。
...結果的にはこいつにはめられた。
READMEに従って.ckptを解凍し、PyCharmでプロジェクトファイルを開く。
[TerminalIPythonApp] WARNING | Subcommand `ipython notebook` is deprecated and will be removed in future versions.
[TerminalIPythonApp] WARNING | You likely want to use `jupyter notebook` in the future
いきなり怒られた。
ipythonから改名したんだよ!と主張しているだけなので、これは無視する。
In[6]で怒涛のワーニング & Tracebackが発生した。以下抜粋。
2017-06-09 19:05:48.187022: W c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\framework\op_kernel.cc:1152] Invalid argument: Unsuccessful Tenso[IPKernelApp] ERROR | Exception in message handler:
tensorflow.python.framework.errors_impl.InvalidArgumentError: Unsuccessful TensorSliceReader constructor: Failed to get matching files on ../checkpoints/ssd_300_vgg.ckpt: Not found: FindFirstFile failed for: ../checkpoints : \udc8ew\udc92\u80b3\udc82\ua0bd\udc83p\udc83X\udc82\udcaa\udc8c\udca9\udc82\x82\udca9\udc82\udce8\udc82\u0702\udcb9\udc82\udcf1\udc81B
tensorflow.python.framework.errors_impl.InvalidArgumentError: Unsuccessful TensorSliceReader constructor: Failed to get matching files on ../checkpoints/ssd_300_vgg.ckpt: Not found: FindFirstFile failed for: ../checkpoints : \udc8ew\udc92\u80b3\udc82\ua0bd\udc83p\udc83X\udc82\udcaa\udc8c\udca9\udc82\x82\udca9\udc82\udce8\udc82\u0702\udcb9\udc82\udcf1\udc81B
InvalidArgumentError (see above for traceback): Unsuccessful TensorSliceReader constructor: Failed to get matching files on ../checkpoints/ssd_300_vgg.ckpt: Not found: FindFirstFile failed for: ../checkpoints : \udc8ew\udc92\u80b3\udc82\ua0bd\udc83p\udc83X\udc82\udcaa\udc8c\udca9\udc82\x82\udca9\udc82\udce8\udc82\u0702\udcb9\udc82\udcf1\udc81B
UnicodeEncodeError: 'utf-8' codec can't encode character '\udc8e' in position 174: surrogates not allowed
UnicodeEncodeError: 'utf-8' codec can't encode character '\udc8e' in position 3281: surrogates not allowed
どうやら、一番最初のWarningに全てのエラーが引きずられているようだ。
Jupyter Notebookをブラウザで開いてみると...
さっき解凍した.index と .data-00000-of-00001がアップロードされていない!
ここでの解決篇: .ipynbを.pyに変換する
もっとスマートな方法がある気もするが、ここでは.ipynbに別れを告げる。
.ipynbのmd形式*4で書かれている部分を消してやれば.pyと同じだ。
ただ、%matplotlib inline を消してやる必要がある。
実は相対パスをすべて絶対パスに置き換えればなんとでもなるっちゃなる。
しかし、新たな非常に厄介な問題に遭遇したのでここでは避ける。
実行結果(の代わり)
実行結果を撮って置くのを忘れ、しかしまたリポジトリを落とす気にもなれず。
ネットから持ってきた画像を貼る。(当たり前だが)同じ結果だった。
もしかして
上記のサイトによると、もっとスマートに.ipynbを.pyに変換できるようだ。
> jupyter nbconvert --to python ssd_notebook.ipynb
でももうjupyterなんてシラネ。