今回は、Caffenetで、画像分類をしてみる。Caffenetとは、ImageNet Large Scale Visual Recognition Challenge 2012で分類タスクで優勝したAlexNetに、normalizationとpoolingの順番を変えるなどの変更を加えたものである。
まず、ImageNet2012の訓練データで学習済みのCaffenetのモデルbvlc_reference_caffenet.caffemodelを、caffe/models/bvlc_reference_caffenet at master · BVLC/caffe · GitHubからダウンロードし、models/bvlc_reference_caffenetに保存する。
次に、./data/ilsvrc12/get_ilsvrc_aux.shを実行し、caffeで設定されているImgeNet2012の訓練、テストおよびバリデーションに用いられる画像ファイル名の一覧、ラベル一覧などを取得する。これらのファイルは、data/ilsvrc12に保存される。
>ls data/ilsvrc12/ -1 det_synset_words.txt get_ilsvrc_aux.sh imagenet.bet.pickle imagenet_mean.binaryproto synsets.txt synset_words.txt test.txt train.txt val.txt
次に、
http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/classification.ipynbを参考に、worksというフォルダを作り、下記からimagenet.pyというpythonスクリプトをダウンロードする。
https://drive.google.com/open?id=0B3uB4w2FEJbIV0ppTWFyTTJabEU
次に、分類対象の画像をダウンロードする。ImageNet2012の分類タスクは、1000種類のクラスがある。クラスの名前は、data/ilsvrc12/synset_words.txtに下記のように記載されている。
n01440764 tench, Tinca tinca n01443537 goldfish, Carassius auratus n01484850 great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias n01491361 tiger shark, Galeocerdo cuvieri n01494475 hammerhead, hammerhead shark n01496331 electric ray, crampfish, numbfish, torpedo n01498041 stingray n01514668 cock n01514859 hen n01518878 ostrich, Struthio camelus ....
今回は、このクラスの中から、185番目のクラスのIrishi terrier(アイリッシュ・テリア)を分類してみる。まず、アイリッシュ・テリアの画像を、Wikipediaからダウンロードし、works/images/irish_terrer.jpgとして保存する。そして、worksに移動し, 先ほど作成したpythonスクリプトimagenet.pyを実行する。
> cd works > python >>>execfile('imagenet.py') ... class= 185 , score= 0.560902 class= 190 , score= 0.192497 class= 192 , score= 0.0766723 class= 268 , score= 0.0446398 class= 263 , score= 0.0387854
上記のように、185番クラスのアイリッシュ・テリアがスコア0.56で予測できている。ちなみに、スコアが0.19と2番目に高い190番クラスは、Lakeland terrier(レイクランド・テリア)であった。また、トップ3位以降は、Airedale terrier、standard poodle、Brabancon griffonだった。
上記のスクリプトを実行すると、下記のように分類対象の画像と、クラス毎のスコアが表示される。
上記のスクリプトを関数化して整理し、さらに、スコアのグラフにクラス名を表示するように変更してみた。
以下のようにシェル上で画像ファイルを引数に、スクリプト(classify_caffenet.py)を実行する。
> python classify_caffenet.py images/irish_terrer.jpg label score synset_id 0 Irish terrier 6.657821e-01 n02093991 1 standard poodle 1.216341e-01 n02113799 2 Airedale 8.359165e-02 n02096051 3 Lakeland terrier 4.101080e-02 n02095570 4 wire-haired fox terrier 1.805066e-02 n02095314 5 Brabancon griffon 1.581621e-02 n02112706 ...
スクリプトcalssify_caffenet.pyは、以下からダウンロードできる。
https://drive.google.com/open?id=0B3uB4w2FEJbIV0ppTWFyTTJabEU