覚え書きブログ

Deep Learning覚え書き(Caffenetによる画像分類編)

今回は、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だった。

上記のスクリプトを実行すると、下記のように分類対象の画像と、クラス毎のスコアが表示される。
f:id:hirotaka_hachiya:20150215080248p:plain

上記のスクリプトを関数化して整理し、さらに、スコアのグラフにクラス名を表示するように変更してみた。
以下のようにシェル上で画像ファイルを引数に、スクリプト(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
...

f:id:hirotaka_hachiya:20160310083828p:plain

スクリプトcalssify_caffenet.pyは、以下からダウンロードできる。
https://drive.google.com/open?id=0B3uB4w2FEJbIV0ppTWFyTTJabEU