PythonからCaffeを使う & ImageNetをリファレンスモデルとして使う(認識と特徴抽出)
はじめに
CaffeをPythonから使うための設定とImageNetと呼ばれる画像認識Deep Learning Neural NetworkをReferenceモデルとして使ってみた記録です.基本的に参考サイトのサンプルに基づいています
参考サイト
- IMAGENET;Large Scale Visual Recognition Challenge 2012
- Caffeで手軽に画像分類
- CaffeのImageNetで特徴量抽出器を動かすまで
- 『Caffeで手軽に画像分類』が手軽にできない
- リファレンスモデルで画像を分類
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