2017/07/02 chainerのバージョン修正 1.6 -> 1.8.1 2016/12/15 chainerのバージョン固定に関して追記
趣味は人工知能です
時代は人工知能だろう!ということで、新たな趣味として機械学習の分野を学習しています、やっぱり花形はディープラーニングですかね。一応入門書的な下記の本を参考書として読んでいるのですが、20ページ目あたりから偏微分方程式がずらずら出てきて、頭がおかしくなりそうになっています。
- 作者: 山下隆義
- 出版社/メーカー: 講談社
- 発売日: 2016/02/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
ちょっと数式を追うのも限界を感じ始めているので、「理屈より実践派!」といういかにもダメないいわけをしつつ、色々すっ飛ばして面白そうなアプリケーションをとりあえず試しながら理解を深める作戦に変更しました。そしてディープラーニングといえばやっぱり画像認識だろうということで、今回は画像認識をやってみます。ちなみに上記の参考書をお手本にやったのですが、上級者向けに色々説明が割愛して書かれているのと、本のプログラムが微妙に省略されていたりでちょっとした地獄でした。そんなわけで、今回は参考書の補足も兼ねて、もう少し入門者向けのチュートリアルを書いてみます。
この後は例によって宇宙語が続くので興味ある方のみ続きをご覧ください。
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.caffemodel
と ilsvrc_2012_mean.npy
の2つのファイルが生成されます。
今回はカップを認識させるので、カップの画像ファイルを用意します。家にある適当なカップの写真をiPhoneで撮影して、同じディレクトリ(~/chainer/examples/modelzoo
)にcup.jpg
を保存します。
こんなやつね。
続いて、今回のテスト用のファイル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%
ふむ、たしかにカップっぽいものとして認識されているようです。ついでに手元にあったバナナの写真でも試してみようと思います。
こんなのね
下記コマンド実行。引数のcup.jpg
をbanana.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) さん
もはやリファレンス!いつもありがとうございます。
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サーバとか使わないとダメかな。
Raspberry Pi3 Model B ボード&ケースセット 3ple Decker対応 (Element14版, Clear)-Physical Computing Lab
- 出版社/メーカー: TechShare
- メディア: エレクトロニクス
- この商品を含むブログ (4件) を見る
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使いたい場合は参考にしてみて下さい