Keep In Mind

織りのやわらかい混じりけのないアイルランド麻のハンカチーフ(手ふき)

PythonからCaffeを使う & ImageNetをリファレンスモデルとして使う(認識と特徴抽出)

はじめに

CaffeをPythonから使うための設定とImageNetと呼ばれる画像認識Deep Learning Neural NetworkをReferenceモデルとして使ってみた記録です.基本的に参考サイトのサンプルに基づいています

 

 

参考サイト

  1. IMAGENET;Large Scale Visual Recognition Challenge 2012
  2. Caffeで手軽に画像分類
  3. CaffeのImageNetで特徴量抽出器を動かすまで
  4. 『Caffeで手軽に画像分類』が手軽にできない
  5. リファレンスモデルで画像を分類

 

 

PythonからCaffeを使う設定

行うことは,パスの追加,コンパイル,Protobufの追加 の3つです.
#.bash_profileにパスを通す
PYTHONPATH=/Users/name/caffe/pythonを通す

#pipでProtocをpythonに導入
pip install protobuf

#pythonでcaffeをimportして確認
ipythonを起動して,import caffeが通ればok

 

memo
ビルド中に下記のようなエラーが出た場合は,
======
python/caffe/_caffe.cpp:1:10: fatal error: 'Python.h' file not found
#include <Python.h> // NOLINT(build/include_alpha)
======
.bash_profileにCPLUS_INCLUDE_PATHを追加
======
CPLUS_INCLUDE_PATH=/Users/name/.pyenv/versions/anaconda-2.1.0/include/python2.7
======

 

 

ImageNetの関連ファイルをダウンロード

#wgetのインストール
brew install wget

#caffe/data/ilsvrc12ディレクトリで,ILSVRC2012データのauxファイル群を取得
cd ~/caffe/data/ilsvrc12/
./get_ilsvrc_aux.sh

#作業ディレクトリとしてimagenet2ディレクトリを作る(やんなくてもいい)
cd ~/caffe/examples
makedir imagenet2
cd imagenet2

#imagenetのリファレンスモデルデータを取得
wget https://raw.githubusercontent.com/sguada/caffe-public/master/models/get_caffe_reference_imagenet_model.sh
chmod u+x get_caffe_reference_imagenet_model.sh
./get_caffe_reference_imagenet_model.sh

#面倒なので,参照するスクリプトやファイルをコピーしておく
cp ~/caffe/python/caffe/imagenet/ilsvrc_2012_mean.npy ~/caffe/examples/imagenet2/ilsvrc_2012_mean.npy
cp ~/caffe/python/classify.py ~/caffe/examples/imagenet2/classify.py
cp ~/caffe/data/ilsvrc12/synset_words.txt ~/caffe/examples/imagenet2/synset_words.txt

 

memo
ImageNetとは,参考サイト1のデータを対象に作成されたDeep Learning Neural Networkです.1000カテゴリの画像認識ができるように作成されています.Caffeには,この学習済みのモデルが含まれて(実際はいくつかのファイルを別途ダウンロードする必要がありますが)おり,ImageNetを画像認識器や画像の特徴抽出器として用いる(Referenceモデルとして用いる)ことができます.

 

 

CaffeとリンクしているPythonを使うようにaliasを作る(やんなくてもいい)

.bash_profileにaliasを追加&反映
======
alias cpython='$HOME/.pyenv/shims/python'
======

 

 

ImageNetを画像認識器として使う

#猫画像cat.jpgを用意して,結果をresult.npyに出力
cpython classify.py --model_def imagenet_deploy.prototxt --pretrained_model caffe_reference_imagenet_model --mean_file ilsvrc_2012_mean.npy --raw_scale 255 cat.jpg result.npy

#result.npyを読み込んで,認識結果を出力(結果出力スクリプトshow_result.pyは,参考サイト2のものを利用)
cpython show_result.py synset_words.txt result.npy

 

 

ImageNetを画像の特徴抽出器として使う

#imagenet_deploy.prototxtをimagenet_feature.prototxtとしてコピー
cp imagenet_deploy.prototxt imagenet_feature.prototxt

#imagenet_feature.prototxtを修正
============
(Line 174) top: "fc6wi"
(Line 186) bottom: "fc6wi"
============

#feature.pyを変更箇所
# 1. カレントディレクトリにコピーしたファイルの参照
# 2. 仕様変更に伴うコメントアウトと関数呼び出し方法の修正
============
MEAN_FILE = 'ilsvrc_2012_mean.npy'
MODEL_FILE = 'imagenet_feature.prototxt'
PRETRAINED = 'caffe_reference_imagenet_model'
#net.set_phase_test()
caffe.set_mode_cpu()
net.transformer.set_mean('data', numpy.load(MEAN_FILE))
net.transformer.set_raw_scale('data', 255)
net.transformer.set_channel_swap('data', (2,1,0))
============

#Pythonスクリプトを使って特徴抽出
#cat_feature.txtに特徴ベクトルが出力されます
cpython feature.py cat.jpg > cat_feature.txt

memo
classify.pyで呼び出されるcaffe/python/caffe/io.pyでエラーが出る場合は,caffe/python/caffe/io.pyの253-254行目を修正する.ilsvrc_2012_mean.npyを処理できないコードになっていることが原因らしい.
==========

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.')


===========

 

 

その他

#.npyファイル(バイナリ)の内容確認
ipython
In [1]: import numpy as np
In [2]: data = np.load('result.npy')
In [3]: data

#Caltech101データのダウンロード
wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
tar xzvf 101_ObjectCategories.tar.gz