2015/10/07

[ai]Caffeの画像分類を説明しているサイトをなぞる

インストールしたら、まずは動かしてみたいと思うのが人の常。
サンプルが用意してあり、日本語で使い方を書いてくださってる方も多いので、見ながらやってみる。

Caffeで手軽に画像分類 - Yahoo! JAPAN Tech Blog
こちらは、examples/imagenetにあるサンプルを動かすようだ。
が、今のバージョンでは(かどうかもわからんが)、get_caffe_reference_imagenet_model.shが無い。

  • create_imagenet.sh
  • make_imagenet_mean.sh
  • resume_training.sh
  • train_caffenet.sh

caffe/examples/imagenet at master · BVLC/caffe
上から順にやっていけばよさそうだ。
「Training ImageNet」の1番目のコマンド(caffeの次がtrain)になってるのが、train_caffenet.sh。
「Resume Training?」のコマンドがresume_training.shになっているようだ。


まず、データの準備。
caffeをビルドしたディレクトリに移動し、

$ ./data/ilsvrc12/get_ilsvrc_aux.sh

これで、何かダウンロードし始めた。
caffe_ilsvrc12.tar.gzをwgetで取得し、tarで解凍するだけのスクリプトだ。

「ilsvrc12」って、なんだろうね?
ImageNet Large Scale Visual Recognition Competition 2012 (ILSVRC2012)
なるほど、ImageNetというのがあり、規模の大きな(Large Scale)画像認識(Visual Recognition)チャレンジ(Challenge)の2012年版、ということかな。
Challengeがうまく解釈できないけど「この画像たちを見事認識してみよ」みたいな挑戦ってことかしら。
今は2015年版があるようだ。

解凍されると、ファイルが8つあった。
画像がいっぱい入っているのかと思ったけど、そうではない。

  • det_synset_words.txt
  • imagenet.bet.pickle
  • imagenet_mean.binaryproto
  • synsets.txt
  • synset_words.txt
  • test.txt
  • train.txt
  • val.txt

大きいのはtrain.txtとimagenet.bet.pickleで、train.txtは44MBちかくある。

そしてexamples/imagenet/create_imagenet.shを実行したのだが、JPEG画像がないないとずーーーっとエラーを吐き続けた。。
githubの方のImageNetサンプルの説明の最初の方に「あなたは既にImageNetトレーニングデータと検証データをダウンロードしてあるとします」とあり、JPEGファイルが置かれている想定になっているようだ。

256x256にサンプリングするときだけのような気もしたが、ilsvrc12_train_leveldbとilsvrc12_val_leveldbがコマンド実行前にあるとダメ、と書いてあるので、その両者がないとダメなのだろう。
make_imagenet_mean.shにもそのパスが書いてあるし。

 

Caffe+AlexNetでImageNet2012を学習してみた (1) - 下丸子のコネクショニスト
こちらを読むと、ImageNetに申請してデータを入手した、とあった。
でも、Yahoo!のブログでやってる手順を見ると、そんなのはなさそうだ。
もしかすると、get_caffe_reference_imagenet_model.shというスクリプトがそれをやっていたのかもしれない。
記事から1年経ってるから、いろいろ変わったのかもしれない。

CaffeのImageNetで特徴量抽出器を動かすまで - About connecting the dots.
非常にありがたい。
そうか、いろいろダウンロードがいるのですな。


どうも、imagenetのサンプルは、自分で画像を用意してトレーニングさせるサンプルのようだ。
そのサンプルデータとしてImageNetのデータを使うから、あれこれダウンロードがいるのだろう。

それより前に、既にあるものを使って動くのかどうかを見てみたい。
というわけで、またYahoo!ブログの内容に戻ろう。

こちらは、先ほどのリンク先からデータさえ取ってきておけば使えそうな気がする。
例がpythonなので、そこら辺もインストールしよう。

$ make pycaffe
$ cd python
$ for req in $(cat requirements.txt); do pip install $req; done

そしてコマンドを動かしたのだが、skimage.ioがないとか言われる。
Download — scikit-image
$ pip install -U scikit-image
インストール中に、scipyがないと言われる。
Installing the SciPy Stack — SciPy.org
けっこう時間がかかる・・・。ここで"Anaconda"という単語を見て、CaffeのインストールページにもAnacondaって書いてあったのを思いだした。
どうも、Anaconda Pythonというpythonが入っていると、あんまり大変じゃないらしい。
アナコンダっていわれても蛇くらいしか思いつかないよなあ、とも思ったが、そもそもパイソンも蛇か。

終わって、再びsckit-imageをpip。
scipyほどではないが、これも時間がかかる。。。あ、エラーだ。
sudoが・・・いるのね・・・。
これでコマンドを動かすと、今度はgoogle.protobuf.internalがない、と。
$ sudo pip install -U protobuf

またコマンドを動かすと、今度はランタイムエラー。bvlc_reference_caffenet.caffemodelがない、と。
FPGAの部屋 2015年02月03日
やはり先人がおられるものだ。
githubで該当するmodelのフォルダに移動すると、ダウンロード先のURLが書いてあった。
こういうしくみですか。。。
ダウンロードしているが、これもかなり時間がかかりそう。

2時間くらいかかった。
今度実行すると、こういうエラーになった。

ValueError: Mean shape incompatible with input shape.

助けて、百太郎(もう疲れてきてる。。)!
OSX10.10でCaffeをインストール、リファレンスモデルで画像を分類 - Qiita
バージョンによっては、caffe/python/caffe/io.pyがそういうエラーを出すとのこと。
さて、なんのバージョンなのだろう。Caffe? それとも他のツール?

io.pyは400行もないファイルだ。
私が動かしたときは、これのL.255でエラーになっている。
pythonはわからんが、raiseがthrowかexit()みたいな役割なのかな。
ということは、ms != self.inputs[in_][1:]という条件を満たしたということだ。
msは、mean.shape。
ソースコメントによると、meanはndarrayのmean(平均?)、in_はこのmeanへの入力のようだ。
ndarrayはn次元配列?
len(ms)は3じゃないとダメらしい(2だと補正している?)。画像は縦×横×画素値、ということで3なのかなぁ。
それとも、画像が何枚もあるから3次元としているのか。。
で、今回出ているエラーはそれもくぐり抜け、self.inputs[in_][1:]と不一致だから発生している。
self.inputsは、そういうメンバ変数がいるのだろう(io.pyのコンストラクタで与えられているみたい)。
[1:]は、配列の1番目以降(0始まり)、という意味らしい。
ms[0]とself.inputs[in_][1]が一致するのはその前に確認しているから、全体として違う、ということか。

そもそも「違う」って、何が違うんだろう?
Cだとmemcmp()とかで比較しない限りはアドレスの一致だけしか見ないけど、stackoverflowのを読んだ感じでは画像のサイズが違うから一致してない、といっているような気がする。つまり、要素数の不一致。
エラー出力も「mean画像とinput画像に互換性がない」だし。

imagenetサンプルの説明でも、ImageMagickで256x256に変換してどうたらこうたらと書いてあったので、テスト画像を256x256にしてみたらどうだろう?
$ convert -resize 256x256\! ../examples/101_ObjectCategories/airplanes/image_0001.jpg ./image_0001_256x256.jpg
$ python classify.py --raw_scale 255 ./image_0001_256x256.jpg ../result.npy
・・・うん、同じエラーだった。

いや、説明に書いてあったconvertするのは、元画像の方だったはずだ。
256x256に正規化してからトレーニングするとか、そんな話だろう。
ということは、元画像のサイズはばらばらだから、それごとに画像サイズを合わせる、というのがstackoverflowに書いてあることなのか。

というのを理解して、OSX10.10でCaffeをインストール、リファレンスモデルで画像を分類 - Qiitaの修正内容を反映させた。

$ python classify.py --raw_scale 255 ../examples/101_ObjectCategories/airplanes/image_0001.jpg ../result.npy
・・・
Done in 2.06 s.
Saving results into ../result.npy

ようやく出力された。
長かった・・・。


できたresult.npyはテキストファイル化と思ったが、さらに加工しないと人間が見てわかりづらいらしい。
こちらは、Yahoo!ブログに書いてあるshow_result.pyを使うとよろしい。

$ python show_result.py ../data/ilsvrc12/synset_words.txt ../result.npy
#1 | n04552348 warplane, military plane | 84.8%
#2 | n04008634 projectile, missile |  5.5%
#3 | n02690373 airliner |  5.1%

お、ブログに書いてあるのと同じ結果だ。

というわけで、自力で解決できたところは何もなかったけど、「とりあえず動かす」ということだけはできた。
しかし、最後に変更したとこなんかはshapeと書いているだけに、画像認識が強そうに思う。
でも、Caffeだってフレームワークだし、入力と結果さえ定義すれば画像以外にも使えるはずだと思っている。
まあ、その場合にはトレーニングされたデータというのは使えなくなるが・・・。

 

本の「深層学習」は、ようやく4章に入った。
ええ、理解できているとは到底言えませんが。
とりあえず、今までは順伝播型ネットワークということで入力から出力までが一方向だったけど、誤差を逆方向に伝えるようにすることで計算量が減らせるよ、ということらしい。
なんか、こういう適当すぎる把握しかできなくて、著者に申し訳ない・・・。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。