【Caffe】物体認識のサンプルを動かす
以下のサイトを元に物体識別のモデルを使ってみる
(単純には行かなかったのでメモ)
Caffeで手軽に画像分類 - Yahoo! JAPAN Tech Blog
※以下、caffeフォルダは$CAFFE_HOMEとする(これまで~/work/dl_tools/としていたところ)
1.Caltech101をダウンロード&解凍
$ cd $CAFFE_HOME/data/ $ wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz $ tar -xzvf 101_ObjectCategories.tar.gz $ cd $CAFFE_HOME/data/ilsvrc12 $ sh get_ilsvrc_aux.sh
2.モデルファイルをダウンロード
$CAFFE_HOME/models/bvlc_reference_caffenet/readme.md の最初の方にモデルファイルのダウンロード元が記述されているので確認
readme.md
--- name: BVLC CaffeNet Model caffemodel: bvlc_reference_caffenet.caffemodel caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel license: unrestricted sha1: 4c8d77deb20ea792f84eb5e6d0a11ca0a8660a46 caffe_commit: 709dc15af4a06bebda027c1eb2b3f3e3375d5077 ---
wgetでモデルファイルをダウンロード
$ cd $CAFFE_HOME/models/bvlc_reference_caffenet $ wget http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel
3.識別実行
参考元ページ(Caffeで手軽に画像分類 - Yahoo! JAPAN Tech Blog)のclassify.pyを実行
$ cd $CAFFE_HOME/python $ python classify.py --raw_scale 255 ../data/101_ObjectCategories/airplanes/image_0001.jpg ../result.npy
最初実行したら以下のエラーが出た
- "ImportError: No module named google.protobuf.internal"
protobufが入ってないということなのでインストール。apt-getとpipを実行したが、pipだけでも動くかもしれない
$ sudo apt-get install python-protobuf $ pip install protobuf
さらに、再度classify.pyを実行すると以下のエラーに変わった
- "ValueError: Mean shape incompatible with input shape"
ilsvrc_2012_mean.npyがCaffeのバージョンによっては正しく動作しないらしいので、下記サイトを参考にio.pyを編集
http://qiita.com/Bonnnou_108/items/41e6dadeff1310b4eb5d
変更前↓
… if ms != self.inputs[in_][1:]: raise ValueError('Mean shape incompatible with input shape.') …
変更後↓
… if ms != self.inputs[in_][1:]: print(self.inputs[in_]) in_shape = self.inputs[in_][1:] m_min, m_max = mean.min(), mean.max() normal_mean = (mean - m_min) / (m_max - m_min) mean = resize_image(normal_mean.transpose((1,2,0)),in_shape[1:]).transpose((2,0,1)) * (m_max - m_min) + m_min #raise ValueError('Mean shape incompatible with input shape.') …
classify.pyを実行すると、今回は正しく動作しresult.npyが生成された
4.識別プログラムを作成
元サイトと同様の内容で$CAFFE_HOME下にshow_result.pyを作成
show_result.py↓
#! /usr/bin/env python # -*- coding: utf-8 -*- import sys, numpy categories = numpy.loadtxt(sys.argv[1], str, delimiter="\t") scores = numpy.load(sys.argv[2]) top_k = 3 prediction = zip(scores[0].tolist(), categories) prediction.sort(cmp=lambda x, y: cmp(x[0], y[0]), reverse=True) for rank, (score, name) in enumerate(prediction[:top_k], start=1): print('#%d | %s | %4.1f%%' % (rank, name, score * 100))
5.識別実行とクラス名の表示
識別の実行と、識別結果に基づいたクラス名の表示は以下のコマンドでできる
$ cd $CAFFE_HOME $ python ./python/classify.py --raw_scale 255 data/101_ObjectCategories/airplanes/image_0001.jpg result.npy $ python show_result.py data/ilsvrc12/synset_words.txt result.npy
元サイトと同様に、軍用機が最大スコアで出力された
今回使ったネットワークを可視化する方法は以下のページ
【Caffe】ネットワークを可視化する - いつもの作業の備忘録
※参考
http://techblog.yahoo.co.jp/programming/caffe-intro/
http://hogehuga.com/caffe_is_tough/
http://qiita.com/Bonnnou_108/items/41e6dadeff1310b4eb5d
http://iamrobotandproud.hatenablog.com/entry/2015/02/22/191731
http://blog.livedoor.jp/tak_tak0/archives/52215253.html
http://qiita.com/uchihashi_k/items/8333f80529bb3498e32f