2015年4月22日現在の情報です
caffeは頻繁にアップデートを行うので今現在動くかは保証しかねます
インストールからリファレンスモデルを用いて画像判別をします.
リファレンスモデルbvlc_reference_caffenet.caffemodelとclassify.pyを使用した画像識別についてまでです.
#caffeとは
ディープラーニングフレームワーク
非常に高速かつ開発が活発で人気の高いフレームワークです
詳しくは公式を見ましょう
http://caffe.berkeleyvision.org/
少し性能を見たい方は
Caffe Demos
に分類したい画像のURLを貼ると
公式のリファレンスモデルで画像分類を行ってくれます
#MacOSX10.10.3(yosemite)にインストールする
以下の記事も参考になるかと思います
OS X 10.10(Yosemite)にCaffeをインストールする(libstdc++問題解決)
#インストール環境について
・iMac 27-inch, Late 2013
・CPU 3.5 GHz Intel Core i7
・16 GB 1600 MHz DDR3
・GPU NVIDIA GeForce GTX 775M 2048 MB
・OS MaxOSX10.10.3 yosemite
#依存ライブラリを導入する
##Python
公式でAnacondaを推奨されているのでAnaconda-2.1.0を使用
Anacondaとはpythonに数値計算環境を構築するためにいろんなパッケージを導入したディストリビューションです。これを使用します
pyenvによって管理する
pyenvを使ってMacにPythonの環境を構築する
を参考に導入してください
本稿ではbrewを使用せずにpyenvをホームディクトリに作成
python環境をAnacondaに変更しました
2系と3系がありますが2系がベターかと
pyenv install anaconda-2.1.0
pyenv global anaconda-2.1.0
pyenv local anaconda-2.1.0
anaconda-2.1.0にすでに導入されているはずですが、一応パッケージを確認しておきます.
pip install -r caffe/python/python/requirements.txt
で必要パッケージを導入しましょう
##CUDA7.0
NAVIDIAから7.0以上を導入
現在は正式にリリースされたので登録不要
7.0以上であればlibc++でのコンパイルが可能
NAVIDIA CUDA7 Downloads
##その他のライブラリ
Homebrewでインストールします
brew install --fresh -vd snappy leveldb gflags glog szip lmdb
##boost boost-pythonのインストール
ちまたではver1.55でないと動かないという情報がありましたが
boost1.57 と boost-python1.57で動いたのでそのまま
brew install --build-from-source --fresh -vd boost boost-python
##protobufのインストール
必ず--with-pythonオプションを忘れないようにしましょう
つけないと、ビルド時にPROTOCうんぬんと怒られます
brew install --build-from-source --with-python --fresh -vd protobuf
##openBLASのインストール
brew tap homebrew/science
brew install homebrew/science/openblas
##hdf5のインストール
おそらく、アップデートで改善されるので、問題なくruntestが行える場合はFormulaの変更の必要はありません
runtestを行う際
libhdf5_hl.8.dylib
が見つからない、とエラーが出る場合があります(2015/4/22現在)
どうやらhdf5-1.8.14では
libhdf5_hl.9.dylib
がインストールされてしまうもよう、そこでHomebrewのFormulaを変更して
hdf5-1.8.13を導入します
brew edit hdf5
urlとsha1を変更します
class Hdf5 < Formula
homepage "http://www.hdfgroup.org/HDF5"
--> url "http://www.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8.13/src/hdf5-1.8.13.tar.bz2"
--> sha1 "712955025f03db808f000d8f4976b8df0c0d37b5"
brew install --build-from-source --fresh -vd hdf5
ひとまずこれで依存ライブラリは導入完了です
##makefileとmakefile.configの修正
OS X 10.10(Yosemite)にCaffeをインストールする(libstdc++問題解決)
ここも参考にしてください
##Makefileの修正
Makefileを修正しましょう
#stdlib=libstdc++を-stdlib=libc++に変更
CXXFLAGS += -stdlib=libc++
LINKFLAGS += -stdlib=libc++
#BLAS_INCLUDEも通す(2行あるので一応両方通しておきましょう)
BLAS_INCLUDE ?= /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/Headers/
##Makefile.comfigの修正
#コンパイルをclangに変更
# To customize your choice of compiler, uncomment and set the following.
# N.B. the default for Linux is g++ and the default for OSX is clang++
CUSTOM_CXX := /usr/bin/clang++
#7以上なのでコメントアウト
# For CUDA < 6.0, comment the *_50 lines for compatibility.
CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_20,code=sm_21 \
-gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
#-gencode arch=compute_50,code=sm_50 \
#-gencode arch=compute_50,code=compute_50
#アナコンダまわり
# Anaconda Python distribution is quite popular. Include path:
# Verify anaconda location, sometimes it's in root.
# ANACONDA_HOME := $(HOME)/anaconda
#ややこしいのでANACONDA_HOMEは使わないで、↓にパスかいていく
PYTHON_INCLUDE := /Users/name/.pyenv/versions/anaconda-2.1.0/include /Users/name/.pyenv/versions/anaconda-2.1.0/include/python2.7 /Users/name/.pyenv/versions/anaconda-2.1.0/lib/python2.7/site-packages/numpy/core/include
# open for OpenBlas
BLAS := open
BLAS_INCLUDE := /usr/local/Cellar/openblas/0.2.14/include
BLAS_LIB := /usr/local/Cellar/openblas/0.2.14/lib
pythonのパスを通しておく
# We need to be able to find libpythonX.X.so or .dylib.
PYTHON_LIB := /Users/name/.pyenv/versions/anaconda-2.1.0/lib
libパス通しておく
# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /Developer/NVIDIA/CUDA-7.0/lib
#ビルドする
caffeの先頭のフォルダで
make all -j8
make test -j8
-j8はコンパイルを並列化するオプションです,数字は並列数ですので環境にあわせて変えてください、シングルでビルドするとかなり時間がかかると思います.
テストを行う
make runtest
しばらくいろんなテスト結果が出力された後
YOU HAVE 2 DISABLED TESTS
と表示されれば大丈夫です
##pythonでCaffeを使用するためビルド
caffeの先頭フォルダで
make pycaffe
を叩く!
今回はpython経由で動かすので忘れずに!
.bash_profileでパスをかけておく
PYTHONPATH=/Users/name/caffe/pythonを通す
ビルド中に下記のようなエラーが出た場合は
python/caffe/_caffe.cpp:1:10: fatal error: 'Python.h' file not found
#include <Python.h> // NOLINT(build/include_alpha)
以下のpathを.bash_profileに追加
CPLUS_INCLUDE_PATH=/Users/name/.pyenv/versions/anaconda-2.1.0/include/python2.7
##pythonでcaffeをimport
Protocが必要なので,pipでpythonに導入
pip install protobuf
pythonをインタラクティブモードで起動して
>>> import caffe
これで通ればok
こちらの環境では
caffe Fatal Python error: PyThreadState_Get: no current thread
とpythonが強制終了したので,以下のpathを.bash_profileで通した
export DYLD_FALLBACK_LIBRARY_PATH=/Users/name/.pyenv/versions/anaconda-2.1.0/lib:/usr/local/cuda/lib:/usr/local/lib:/usr/local/cuda/lib:/usr/local/lib
#リファレンスモデルで画像分類を行う
Caffeで手軽に画像分類
という記事がありますが,バージョンが変わっており,お手軽とはいかないです.
今回はこのページの最初の部分まで行います.
##リファレンスモデルのダウンロード
caffe/models/bvlc_reference_caffenet/readme.md
によると以下のURLに存在するらしいので
http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel
からダウンロード
caffe/models/bvlc_reference_caffenet/
以下に保存しておきます
##関連ファイルのダウンロード
caffe/data/ilsvrc12/get_ilsvrc_aux.sh
スクリプトを実行,
モデルの関連データを入手します.
##物体認識の画像
サンプルとして
このアフリカ象の画像について分類をしてみます.
caffe/python/Elefante.jpg
として保存しておきます.
##classify.pyを使用して画像分類
caffe/python/
で以下のコマンドを叩いて,分類を行います
python classify.py --raw_scale 255 ./Elefante.jpg ./result.npy
ここですんなりとクリアできればokですが
バージョンによって
File "classify.py", line 137, in <module>
main(sys.argv)
File "classify.py", line 109, in main
channel_swap=channel_swap)
File "/Users/name/caffe/python/caffe/classifier.py", line 34, in __init__
self.transformer.set_mean(in_, mean)
File "/Users/name/caffe/python/caffe/io.py", line 255, in set_mean
raise ValueError('Mean shape incompatible with input shape.')
ValueError: Mean shape incompatible with input shape.
といったエラーがかえってくることがあります.
入力した'caffe/imagenet/ilsvrc_2012_mean.npy'をうまく扱えないようです.
原因はclassify.pyが使用している
caffe/python/caffe/io.py
の253-254行目
if ms != self.inputs[in_][1:]:
raise ValueError('Mean shape incompatible with input shape.')
にあるようです.
どうやら,新しく作られた部分がうまく機能していないようなので,古いCaffeで書かれていた書き方で書き直します
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.')
以下のURLにも同じ問題があげられています
http://stackoverflow.com/questions/28692209/using-gpu-despite-setting-cpu-only-yielding-unexpected-keyword-argument
変更後もう一度,classify.pyを使用し
##実行結果
Loading file: ./Elefante.jpg
Classifying 1 inputs.
Done in 0.90 s.
Saving results into ./result.npy
と出ればokです.
判別結果がresult.pnyに保存されています.
result.npyの内容については
Caffeで手軽に画像分類
で公開されている
show_result.py
を使用すると結果を数値で見ることができます.
$ python show_result.sh ../data/ilsvrc12/synset_words.txt result.npy
1 | n02504458 African elephant, Loxodonta africana | 81.2%
2 | n01871265 tusker | 14.9%
3 | n02504013 Indian elephant, Elephas maximus | 3.3%
81%の確率でアフリカ象
14%で牙の生えた大きな生き物
3%でインド象であると
判断されました