Chainerのcaffeモデルの読み込みを爆速にした

Chainerのcaffeモデルの読み込みが遅い

 下記記事で、Chainer使った画像認識をしたのですが、一つ問題があってモデルの読み込みが遅い。遅過ぎる!

 で、色々調べたらどうもcaffeの学習モデルのChainerのモデルへの変換に時間がかかっていることがわかりました。で、更に調べたら id:shi3z さんがまさにそこらへんのこと書いてくれているじゃないですか。

 ただ、例によってあまりにあっさり書いてあるのと、汎用的でないので少し使いやすい形にして下記リポジトリにアップしました。

 convert_caffe_to_chainer.pyがcaffeモデルからChainerモデルに変換するスクリプトです。以下のように変換したいモデルと変換後のモデルのファイル名を引数にして実行することで変換できます。

$ python convert_caffe_to_chainer.py bvlc_googlenet.caffemodel chainer.pkl

時間計測

 モデルの変換でどれだけ早くなったか測定してみました。とれたてほやほやのフリー素材を使用します。ロンスタさん(id:lonestartx)いつもありがとうございます。 f:id:karaage:20160709132426j:plain:w640

Mac Book Pro

 スペックは以下です。

Model:MacBook Pro (Retina, Mid 2012)
CPU: 2.3 GHz Intel Core i7
Memory: 8 GB 1600 MHz DDR3
$ python evaluate_caffe_net_ranking.py megane.jpg googlenet bvlc_googlenet.caffemodel -b ./
1 | n04356056 sunglasses, dark glasses, shades | 45.4%
2 | n04355933 sunglass | 20.7%
3 | n02841315 binoculars, field glasses, opera glasses | 18.4%
4 | n04235860 sleeping bag |  5.7%
5 | n03476991 hair spray |  1.3%
time:31.9829010963s
$ python evaluate_caffe_net_ranking.py megane.jpg googlenet chainer.pkl -b ./
1 | n04356056 sunglasses, dark glasses, shades | 45.4%
2 | n04355933 sunglass | 20.7%
3 | n02841315 binoculars, field glasses, opera glasses | 18.4%
4 | n04235860 sleeping bag |  5.7%
5 | n03476991 hair spray |  1.3%
time:0.435350894928s

 30秒以上かかっていたのが、変換することで1秒以下!!爆速!!どうでもいいけど、1.3%でヘアスプレーとして認識されているのは何故でしょうねw

Raspberry Pi

 スペックは以下です。

Model:Raspberry Pi 3 Model B
CPU:1.2 GHz Cortex-A53 ARMv8
Memory:1GB 450MHz DDR2

 これはRaspberry Piでも期待が持てると実行!

$ python evaluate_caffe_net_ranking.py megane.jpg googlenet bvlc_googlenet.caffemodel -b ./
1 | n04356056 sunglasses, dark glasses, shades | 45.4%
2 | n04355933 sunglass | 20.7%
3 | n02841315 binoculars, field glasses, opera glasses | 18.4%
4 | n04235860 sleeping bag |  5.7%
5 | n03476991 hair spray |  1.3%
time:203.423058033s
$ python evaluate_caffe_net_ranking.py megane.jpg googlenet chainer.pkl -b ./
Load file=megane.jpg
1 | n04356056 sunglasses, dark glasses, shades | 45.4%
2 | n04355933 sunglass | 20.7%
3 | n02841315 binoculars, field glasses, opera glasses | 18.4%
4 | n04235860 sleeping bag |  5.7%
5 | n03476991 hair spray |  1.3%
time:32.5437700748s

 なんと認識に30秒以上…これは実用には辛いですね。

まとめ

 Chainerで使用するモデル、caffeモデルをChainerモデルに変換して保存することで、Macなら実時間で認識できるまで早く動作できるようになりました。ただ、Raspberry Piではかなり重い結果に。Raspberry Pi上でChainerで画像認識はそのままでは難しそうですね。Raspberry Pi上でChainer使って色々面白いことできるかなと思っていたので残念です。

参考

Chainerでファインチューニングするときの個人的ベストプラクティス - Qiita

ファイルの拡張子を取得する - Python Tips

3.7 Standard Module pickle