MacにCaffeをインストールする
HOME

概要
2021年5月4日

MacBook Air (Mac OS 10.14.6 Mojave)に CPU only (GPUは使用しない) で
Deep Learning フレームワークの Caffe をインストールして、
python からも Caffe が使える環境を作る。
MacBook Air は、ディスク容量が足りないので、外付けUSBディスクにインストール。

依存ライブラリについて

ソースをすべてかき集めてインストールするのは大変なので、
パッケージマネージャーの Homebrew を使って
依存ライブラリーをインストールする。
Caffe公式ページの OS X installationは情報が古い。
Macに Caffe をインストールする記事は、2016年頃の記事しかないようなので
とりあえずそれらを参考に。

参考にしたWeb記事でいくつか、--build-from-source でインストールしているものがあったが、
最終的には、普通にインストールした。
protobufは、シリアライズなど深いところでpythonのインターフェース機能が
埋め込まれているような感じ。
brew 以外で python3-protobuf も見つけたが、
これは、Visual Studioでビルドするための改造品で内容的には、
protobuf と同じだったので、protobuf をbrewで普通にインストールすることにした。

brew tap homebrew/science
は、hdf5, opencv が homebrew/science に含まれていた頃の話で
今では、標準パッケージ(Formula)に登録されているようなので不要。

boost は、線形代数や正規表現やスレッドなどのライブラリで、C,C++のライブラリを
pythonモジーュールとして使うときのインターフェースとして使われる。
brew では、boost-pythonが使えなくて、boost-python3 を使うしかない。

pythonに関しては、色々悩ましい。
成功例は、Macに元々入っているものとは違う python2.7を入れている。
anaconda を使うのが、モジュールの豊富さでは良いらしい。
Web記事では、みんな pyenv でpythonをインストールしている。
ざっと調べると、pythonが関係しているのは、protobuf, boost-python, opencv。
brew のパッケージでは、opencvが、python3.9 に依存しているので
pyenv で anaconda を入れてみたが、うまく行かない。
pycaffe の動作条件として、python2.7 か python3.3以降なので
今なら、python3だけでいいだろう。
python は、brew の python3.9 だけを使うことにした。

ビルドの指針

python関係は別にして、ubuntu などでは、比較的簡単にインストール出来ているので、
INCLUDE_PATH, LD_PATH 関係と、依存ライブラリのバージョン違いが
問題になるくらいだろう。

【その他方針】
・cmake は使用しない
・make のデバッグは、-pオプションを使用。エラーが出た行番号、内部変数などが分かる。
・極力、ビルドを通す為の修正は Makefile から include される Makefile.config の変更で済ませる
・ダメだったら Makefile を修正
・ライブラリのバージョンに関わる部分では、ソースのヘッダ include 部分は修正する。

依存ライブラリのインストール

外付けUSBディスク
/Volumes/PortableHD1T/Software/Homebrew
に Homebrew をインストール。(手順は省略)
/Volumes/PortableHD1T/Software/Homebrew/bin に PATH を通しておく。

後は、これだけ
$ brew install -vd snappy leveldb gflags glog szip lmdb protobuf hdf5 opencv boost-python3

Caffeのダウンロード

$ cd /Volumes/PortableHD1T/Software
$ git clone https://github.com/BVLC/caffe.git
(#6878 Feb 13, 2020)

Makefile.config の変更

Makefile.config.example を Makefile.config にコピーして使用。

------
# GPUを使用しない
CPU_ONLY := 1
------
# opencvは、4.5.2 なのだが
OPENCV_VERSION := 3
------
BLAS := open
BLAS_INCLUDE := $(shell brew --prefix openblas)/include
BLAS_LIB := $(shell brew --prefix openblas)/lib
------
PYTHON_INCLUDE := /Volumes/PortableHD1T/Software/Homebrew/opt/python@3.9/Frameworks/Python.framework/Versions/Current/include/python3.9 \
/Volumes/PortableHD1T/Software/Homebrew/opt/boost-python3/include \
/Volumes/PortableHD1T/Software/Homebrew/opt/numpy/lib/python3.9/site-packages/numpy/core/include
------
PYTHON_LIBRARIES := boost_python39 python3.9
------
PYTHON_LIB := /Volumes/PortableHD1T/Software/Homebrew/opt/python@3.9/Frameworks/Python.framework/Versions/3.9/lib \
/Volumes/PortableHD1T/Software/Homebrew/opt/boost-python3/lib
------
# opencv の include path が普通でないので、ここで追加しておく
INCLUDE_DIRS := $(PYTHON_INCLUDE) /Volumes/PortableHD1T/Software/Homebrew/opt/opencv/include/opencv4
------
# Homebrew の デフォルトのインストール先は、/usr/local だが、
# Homebrew を外付けディスクにインストールしているので
INCLUDE_DIRS += $(shell brew --prefix)/include
LIBRARY_DIRS += $(shell brew --prefix)/lib

Makefile の変更

Makefile を Makefile.org とバックアップを取っておく
以下、青文字部分を追加

------
Protobuf requires at least C++11. のエラーが出るので
ifeq ($(OSX), 1)
の範囲に
CXXFLAGS += -std=c++11
を挿入
------
PYTHON_LDFLAGS := $(LDFLAGS) $(foreach library,$(PYTHON_LIBRARIES),-l$(library)) $(foreach librarydir,$(PYTHON_LIB),-L$(librarydir))
------
$(Q)$(CXX) -shared -o $@ $(PY$(PROJECT)_SRC) $(CXXFLAGS) \
-o $@ $(LINKFLAGS) -l$(LIBRARY_NAME) $(PYTHON_LDFLAGS) $(LDFLAGS) \
------
# ターゲット $(TEST_ALL_BIN): のコマンド
$(Q)$(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(CXXFLAGS) \
------
# ターゲット $(TEST_CXX_BINS): のコマンド
$(Q)$(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(CXXFLAGS) \
------

ソースの修正

opencv に関して新バージョンに合わせるため
caffe/src/caffe/data_transformer.cpp
caffe/src/caffe/layers/window_data_layer.cpp
caffe/src/caffe/util/io.cpp

#include "opencv2/imgcodecs/legacy/constants_c.h"
を追加

Caffe本体のビルド

$ make clean
$ make all
$ make test
$ make runtest

[ PASSED ] 1162 tests.
が表示されたらOK

python 関係

$ make pycaffe

環境変数 PYTHONPATH に
/Volumes/PortableHD1T/Software/caffe/python
を設定(追加)

ModuleNotFoundError: No module named 'skimage'
が出るので、その新バージョンの
scikit-image をインストールする。
$ python3 -m pip install scikit-image

skimage のスペルミスが scikit-image で修正されているのでそれに合わせて
caffe/python/caffe/io.py
を修正
img = skimage.img_as_float(skimage.io.imread(filename, as_gray=not color)).astype(np.float32)

$ python3
>> import caffe
>>
そのままプロンプトが返れば、成功。