Help us understand the problem. What is going on with this article?

OSX10.10でCaffeをインストール、リファレンスモデルで画像を分類

More than 3 years have passed since last update.

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
スクリプトを実行,
モデルの関連データを入手します.

物体認識の画像

サンプルとして
Serengeti_Elefantenbulle.jpg
このアフリカ象の画像について分類をしてみます.

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%でインド象であると
判断されました

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした