ディープラーニングのフレームワークChainer使ってMac/Raspberry Piで画像認識

f:id:karaage:20160624004559j:plain:w640

2017/07/02 chainerのバージョン修正 1.6 -> 1.8.1 2016/12/15 chainerのバージョン固定に関して追記

趣味は人工知能です

 時代は人工知能だろう!ということで、新たな趣味として機械学習の分野を学習しています、やっぱり花形はディープラーニングですかね。一応入門書的な下記の本を参考書として読んでいるのですが、20ページ目あたりから偏微分方程式がずらずら出てきて、頭がおかしくなりそうになっています。

イラストで学ぶ ディープラーニング (KS情報科学専門書)

イラストで学ぶ ディープラーニング (KS情報科学専門書)

 ちょっと数式を追うのも限界を感じ始めているので、「理屈より実践派!」といういかにもダメないいわけをしつつ、色々すっ飛ばして面白そうなアプリケーションをとりあえず試しながら理解を深める作戦に変更しました。そしてディープラーニングといえばやっぱり画像認識だろうということで、今回は画像認識をやってみます。ちなみに上記の参考書をお手本にやったのですが、上級者向けに色々説明が割愛して書かれているのと、本のプログラムが微妙に省略されていたりでちょっとした地獄でした。そんなわけで、今回は参考書の補足も兼ねて、もう少し入門者向けのチュートリアルを書いてみます。

 この後は例によって宇宙語が続くので興味ある方のみ続きをご覧ください。

Mac + Chainerで画像認識

 まずはMacでの実施方法です。

環境

  • Mac Book Pro
  • OS X Yosemite 10.10.5

Chainerインストール

 これがないと始まりませんね。以下記事のChainerの箇所を参考にインストールしてください。

 pyenvとか面倒くさいわ!という人はとりあえず以下実行すればインストールできるかもしれません。

$ pip install chainer==1.8.1

 chainerのバージョンを固定しているのは、chainerのメジャーバージョンアップ(v2.0)で後方互換性が無くなったためです。

 また、画像処理のライブラリであるPILを使うプログラムがあるので、以下コマンドでPIL互換のpillowをインストールしておくとよいです。

$ pip install pillow

事前準備

 Homebrewがインストールされている前提です。Homebrewに関しては以下参照ください。

 色々ダウンロードするために、以下実行してダウンロードツールのwgetをインストール。

$ brew install wget

ImgeNet2012の画像ファイル名・ラベル一覧ダウンロード

 ImageNetという大量の画像サンプルが用意されているデータセットの情報をダウンロードするため、以下コマンドを実行します。

$ cd
$ git clone https://github.com/BVLC/caffe.git
$ cd caffe/data/ilsvrc12
$ ./get_ilsvrc_aux.sh 

 最後まで実行するとcaffe/data/ilsvrc12下に複数のファイルがダウンロードされます。その中の一つのファイルであるsynset_words.txtの中身をみると、969行目にcupと書かれていることがわかります。これはcupが969番目のクラスという意味らしいです。今回は教科書に習ってカップを認識しようと思うので、これを覚えておきます。

Caffeの学習済みモデルのインポート

 ChainerはCaffeというこれまた別のディープラーニングのフレームワークの学習モデルを使用できるのが特徴らしいです。以下でダウンロードできます。

$ cd
$ git clone https://github.com/pfnet/chainer.git
$ cd chainer/examples/modelzoo
$ python download_model.py caffenet
$ python download_mean_file.py

python download_model.pyで学習済みモデルをダウンロードしています。後ろのcaffenetはモデル名を表しています。選択できるモデル名はalexnet, caffenet, googlenet, resnetの4種類あります。200MB以上あるので、ダウンロードはかなり時間がかかりますが気長に待ちます。上記のコマンド打ち終わると同ディレクトリbvlc_reference_caffenet.caffemodelilsvrc_2012_mean.npyの2つのファイルが生成されます。

 今回はカップを認識させるので、カップの画像ファイルを用意します。家にある適当なカップの写真をiPhoneで撮影して、同じディレクトリ(~/chainer/examples/modelzoo)にcup.jpgを保存します。

f:id:karaage:20160623013709j:plain:w640  こんなやつね。

 続いて、今回のテスト用のファイルtest.txtを作成します。

$ vim test.txt

 中身は以下とします。

cup.jpg 969

 cup.jpgはもちろん、先ほど保存したカップの写真のファイル名です。969はcupのクラス番号です。以下のコマンドを実行すると、cup.jpgが969番目のクラス、つまりcupとどれだけ一致しているかを評価することができます。

$ python evaluate_caffe_net.py test.txt caffenet bvlc_reference_caffenet.caffemodel -b ./ -B 1

 結果は以下。ちなみにLoading Caffe model fileの後、Loadedが表示されるまで2,3分かかりました。こんなに時間かかるものなの??

Loading Caffe model file bvlc_reference_caffenet.caffemodel...
Loaded
mean loss:     8.06329917908
mean accuracy: 0.0

 結果は…うん、よくわかりませんね。

プログラムの改良

 詳細な結果が表示されるように、プログラムを参考書の通り改造してみようと思ったのですが、バージョンの違いなのか本の誤記なのか、何箇所か自分で考えて修正しないといけませんでした(辛い)。あと、元のプログラムより使いやすくするために、コマンドの引数に画像のファイル名を入力すると認識するようにしました。プログラムはGitHubにあげました。

 READMEに記載してありますが、使い方は以下です。ちなみに「ImgeNet2012の画像ファイル名・ラベル一覧ダウンロード」と「Caffeの学習済みモデルのインポート」は完了している前提ですのでまだの人はこの記事を最初から読んでやっておいてください。

 まず、リポジトリをクローン

$ git clone https://github.com/karaage0703/deeplearning-learning
$ cd deeplearning-learning

 必要なファイルをコピー

$ cp ~/chainer/examples/modelzoo/ilsvrc_2012_mean.npy ./
$ cp ~/chainer/examples/modelzoo/bvlc_reference_caffenet.caffemodel ./
$ cp ~/caffe/data/ilsvrc12/synset_words.txt ./

 カップの認識実行

$ python evaluate_caffe_net_ranking.py cup.jpg caffenet bvlc_reference_caffenet.caffemodel -b ./
1 | n07930864 cup | 46.7%
2 | n03063599 coffee mug | 46.3%
3 | n03775546 mixing bowl |  2.4%
4 | n07920052 espresso |  2.4%
5 | n04263257 soup bowl |  1.6%

 ふむ、たしかにカップっぽいものとして認識されているようです。ついでに手元にあったバナナの写真でも試してみようと思います。

f:id:karaage:20160624004559j:plain:w640  こんなのね

 下記コマンド実行。引数のcup.jpgbanana.jpgに変更ています。

$ python evaluate_caffe_net_ranking.py banana.jpg caffenet bvlc_reference_caffenet.caffemodel -b ./
1 | n07753592 banana | 78.8%
2 | n07716358 zucchini, courgette |  8.9%
3 | n03476684 hair slide |  1.4%
4 | n07718472 cucumber, cuke |  1.2%
5 | n01694178 African chameleon, Chamaeleo chamaeleon |  1.1%

 バナナ78%!凄い!

 では、最後に恒例のフリー素材!ろんすた (id:lonestartx) さん

f:id:karaage:20151212110823j:plain:w640  もはやリファレンス!いつもありがとうございます。

1 | n04201297 shoji | 63.8%
2 | n04005630 prison, prison house | 29.1%
3 | n04239074 sliding door |  3.1%
4 | n04589890 window screen |  0.8%
5 | n03617480 kimono |  0.3%

 以前「Raspberry Pi + DeepBeliefSDK」で実施したときは50%障子(shoji)でしたが、今回はなんと60%以上障子!やはりろんすたさんは障子ですね。

モデルを変えてチャレンジ

 せっかくなのでgooglenetのモデルでも試してみました。モデルのダウンロードとコピーは以下。

$ cd ~/chainer/examples/modelzoo
$ python download_model.py googlenet
$ cp ~/chainer/examples/modelzoo/bvlc_googlenet.caffemodel ./

 あとは、以下で実行できます。

$ cd ~/deeplearning-learning
$ python evaluate_caffe_net_ranking.py cup.jpg googlenet bvlc_googlenet.caffemodel -b ./

 カップ、バナナ、ロンスタさんの実行結果は以下のような感じ。

1 | n07930864 cup | 70.8%
2 | n03063599 coffee mug |  8.6%
3 | n04263257 soup bowl |  7.9%
4 | n03775546 mixing bowl |  7.3%
5 | n03733805 measuring cup |  2.6%
1 | n07753592 banana | 100.0%
2 | n07716358 zucchini, courgette |  0.0%
3 | n01945685 slug |  0.0%
4 | n13054560 bolete |  0.0%
5 | n04332243 strainer |  0.0%
1 | n04201297 shoji | 99.5%
2 | n04239074 sliding door |  0.2%
3 | n04589890 window screen |  0.1%
4 | n04005630 prison, prison house |  0.1%
5 | n04590129 window shade |  0.0%

 バナナ100%! 障子 99.5%! googlenetの方がファイルサイズも小さいし、性能も良さそう。流石google先生??

リアルタイムの認識

 id:shi3z さんが下記記事で解説しているような、カメラでリアルタイムに認識するようなデモも非常に面白いです。

 MITライセンスで公開されていたので、私のリポジトリにも私の環境に合わせて少しだけ修正したものを取り込まさせていただきました。今までのセットアップが完了していたら、以下のコマンド実行するだけでデモが起動するはずです。カメラの画像を瞬時に認識していく様はかなり楽しいです。

$ python inspect_camera.py caffenet bvlc_reference_caffenet.caffemodel 

Raspberry Pi 3 + Chainerで画像認識

 Raspberry Pi 3にもChainerをインストールして試してみました。

 Raspberry Pi 3自体の基本的なセットアップは以下参照下さい。

 Raspberry PiへのChainerのインストールは以下コマンド実行下さい。

$ sudo apt-get update
$ sudo apt-get install python-pip python-dev
$ sudo pip install cython
$ sudo apt-get install libhdf5-dev
$ sudo pip install chainer==1.8.1

 あとの要領はMacと同じです。まずはcaffenetで試してみたのですが、以下の通りモデルをロードできずに落ちてしまいました。やはりRaspberry Piには荷が重すぎたか…

Load file=cup.jpg
Loading Caffe model file bvlc_reference_caffenet.caffemodel...
強制終了

 あきらめきれず次はgooglenetで試してみると…

Load file=cup.jpg
Loading Caffe model file bvlc_googlenet.caffemodel...
Loaded
1 | n07930864 cup | 70.5%
2 | n03063599 coffee mug |  8.4%
3 | n04263257 soup bowl |  8.0%
4 | n03775546 mixing bowl |  7.6%
5 | n03733805 measuring cup |  2.7%

 できた!モデルのロードと認識、Macと比べてかなり時間かかったけどできたよ!

 しかしこれを思うと、Raspberry Pi 2でも実時間で使えた「DeepBeliefSDK」は凄いなと改めて思いました。

まとめ

 とりあえず実践から入って画像認識するところまではできました。参考書の方も頑張って読み進めて理屈の方もキャッチアップしたいこところです。今回は、学習データは完全にありものを使ったので、次は学習からやってみたいところです。以下サイトが自分にもできそうなレベルで学習の仕方が分かりやすく書かれていてよさそうでした(正確には昔読んだときは良くわからなかったけど、ようやく少し理解できるようになった)。

 ただ、家のMacだとどれだけ学習に時間かかるのだろうか…AWSサーバとか使わないとダメかな。

2016/08/04追記:  Caffeモデルの読み込みが遅かったので、爆速にしました。といってもRaspberry Piだとそれでも認識に30秒かかってしまいますが…

参考リンク

ChainerのNINで自分の画像セットを深層学習させて認識させる - shi3zの長文日記

CUDAなしMacで、Chainer使ってCaffeモデルをインポートして画像認識させてみる - shi3zの長文日記

【ディープラーニング】10時間でChainerの基本を身につける - あれもPython,これもPython

リバストのブログ Deep Learningの開発環境(Caffeの動作確認)

関連記事

 Raspberry PiとTensorFlowの組み合わせでディープラーニングをしてみました。TensorFlow使いたい場合は参考にしてみて下さい