macos10.12 + caffe + matlab

Intro.

本篇blog紀錄在macOS10.12上,部署Caffe

build with Anaconda python2.7 , opencv3 and Matlab 2016b .

Install Dependency

至官網安裝anaconda
使用Homebrew 安裝library

brew install -vd snappy leveldb gflags glog szip lmdb
brew tap homebrew/science
brew install opencv3 hdf5
brew link opencv3 --force

可以使用anaconda的 hdf5,不用brew install hdf5
更新:使用brew install hdf5 比較不會有link不到的問題

「坑」opencv3 是keg only,記得要link

brew search boost
boost boost@1.55
boost-bcp boost@1.57
boost-build boost@1.59 ✔
boost-mpi boost@1.60
boost-python homebrew/science/boost-compute
boost-python@1.59 ✔
brew install --build-from-source -vd boost@1.59 boost-python@1.59
brew link --force boost@1.59

「坑」建議安裝1.59版本的boost,才能正常編譯

Caffe中把某些依賴庫所在的文件夾名字限定為boost,可以將/usr/local/opt/boost@1.59,改名為/usr/local/opt/boost。

brew install --build-from-source --with-python -vd protobuf


Install Caffe

cd (安裝目的地)
git clone https://github.com/BVLC/caffe.git
cd caffe
cp Makefile.config.example Makefile.config

修改Makefile.config

此步驟很重要,要很細心地去依照自己安裝的依賴,去更改內容!
注意這邊要修改的是Makefile.config,不是Makefile.config.example
打開 Makefile.config 客製化編譯環境

由於macbook沒有GPU,只用CPU跑,故要去掉cpu only的註解

# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1

「坑」註解掉USE LEVELDB := 0 才不會在最後編譯matlab接口的時候出錯

# uncomment to disable IO dependencies and corresponding data layers
# USE_OPENCV := 0
USE_LEVELDB := 0
# USE_LMDB := 0

使用opencv3,故要註解掉此行

# Uncomment if you're using OpenCV 3
OPENCV_VERSION := 3

有些教學會推薦使用openblas,或是用intel的MKL,但我這邊就用預設的,若有改變記得將BLAS:=改為自己使用的BLAS

# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := atlas

去掉matlab註解,並修改matlab路徑,我是2016b

MATLAB_DIR := /Applications/MATLAB_R2016b.app

因為要使用anaconda的python,所以這邊要去掉anaconda註解,並修改anaconda的正確安裝位置,並把原本的PYTHON INCLUDE註解掉,避免路徑衝突。

# NOTE: this is required only if you will compile the python interface.
# We need to be able to find Python.h and numpy/arrayobject.h.
# PYTHON_INCLUDE := /usr/include/python2.7 \
# /usr/lib/python2.7/dist-packages/numpy/core/include
ANACONDA_HOME := $(HOME)/anaconda
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
$(ANACONDA_HOME)/include/python2.7 \
$(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include

使用 anaconda python 的library

# We need to be able to find libpythonX.X.so or .dylib.
# PYTHON_LIB := /usr/lib
PYTHON_LIB := $(ANACONDA_HOME)/lib

如果要編譯Matlab的接口,要在LIBRARY DIR這邊加入maci64的路徑,
尤其各個路徑排列順序要對,如下所示。

由於編譯會有找不到opencv的問題,故在INCLUDE DIR & LIBRARY DIR 後面加上opencv3的路徑

# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/local/Cellar/opencv3/3.2.0/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /Applications/MATLAB_R2016b.app/bin/maci64 /usr/lib /usr/local/Cellar/opencv3/3.2.0/lib

編譯caffe

修改完成後

make all -j4
make test -j4
make runtest -j4
make matcaffe
make mattest


FAQ

由於caffe 的dependency很多,建議找一個月內的教程來安裝,避免某一個dependency版本與caffe編譯衝突,小編依照半年前自己紀錄的教程來安裝,發現一堆坑,後來將boost版本改為1.59,用opencv2,才順利解決。
以下就稍微紀錄一些我遇到的問題。

編譯期間會有很多問題,只能慢慢google,並解決。

Runtest 可能會報錯:

error:make runtest
.build_release/tools/caffe
dyld: Library not loaded: @rpath/libhdf5_hl.10.dylib
Referenced from: /Users/work/gitclone/caffe/.build_release/tools/caffe
Reason: image not found
make: *** [runtest] Abort trap: 6

原因是Library not loaded,需要手動加入,如下(需改為自己的路徑)

install_name_tool -add_rpath '/Users/junhao/anaconda/lib' /Users/junhao/gitclone/caffe/.build_release/tools/caffe

繼續出錯:

dyld: Library not loaded: @rpath/libhdf5_hl.10.dylib
Referenced from: /Users/work/gitclone/caffe/.build_release/test/test_all.testbin
Reason: image not found
make: *** [runtest] Abort trap: 6

一樣的問題,再度手動加入

install_name_tool -add_rpath '/Users/junhao/anaconda/lib' /Users/work/gitclone/caffe/.build_release/test/test_all.testbin

出錯:

MATLAB is exiting because of fatal error
/bin/sh: line 1: 14220 Killed: 9 /Applications/MATLAB_R2016b.app/bin/matlab -nodisplay -r 'caffe.run_tests(), exit()'
make: *** [mattest] Error 137

Makefile.conig中的leveldb=0註解掉即可mattest成功


最後再次
make runtest
make matcaffe
make mattest
就成功了。