Caffe是一個清晰而高效的深度學習框架,其作者是博士畢業於UC Berkeley的賈揚清。Caffe是純粹的C++/CUDA架構,支持命令行、Python和MATLAB接口;可以在CPU和GPU直接無縫切換。我在MacbookPro(無NVIDIA顯卡)上大費周章地配置了Caffe的環境,並花了許多時間配置其python接口。
一、下載Caffe
github上的下載地址:https://github.com/BVLC/caffe
進入到下載后的路徑,並復制 Makefile.config.example 重命名為 Makefile.config (我電腦的用戶名是cuiqi,注意修改)
git clone https://github.com/BVLC/caffe.git cd /Users/cuiqi/Downloads/caffe-master && cp Makefile.config.example Makefile.config
二、安裝相關依賴
對於需要python接口的情況,需要以下依賴
1. CUDA
由於我的Mac沒有NVIDIA的GPU,所以只能使用CPU_ONLY模式,需要在 Makefile.config 中修改 CPU_ONLY := 1
2. BLAS via ATLAS, MKL, or OpenBLAS. # Basic Linear Algebra Subprograms,基礎線性代數程序集 3. Boost >= 1.55 # Deepdream是用Python接Caffe,因此還需要 boost.python 支持
brew install boost --with-python
brew install boost-python
4. OpenCV >= 2.4 including 3.0 5. protobuf, glog, gflags
brew install protobuf
brew install glog
brew install gflags
6. IO libraries hdf5, leveldb, snappy, lmdb
brew install leveldb
brew install lmdb
brew tap homebrew/science
brew install homebrew/science/hdf5
# python driver for hdf5
pip install h5py
7. numpy for python
brew install numpy
三、修改Makefile.config中相應的路徑
如果要使用Anaconda的python環境可以在Makefile.config中取消相應的注釋,我試過這樣做,可是在CMAKE的時候並不奏效:
Python:
Interpreter : /usr/bin/python2.7 (ver. 2.7.10)
Libraries : /usr/lib/libpython2.7.dylib (ver 2.7.10)
NumPy : /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/core/include (ver 1.8.0rc1)
所以我放棄了使用Anaconda,改使用系統自帶的python。
PYTHON_INCLUDE := /usr/include/python2.7
由於我使用了Homebrew安裝了numpy,所以我在makefile.config中修改相應的numpy路徑
PYTHON_INCLUDE := /usr/include/python2.7 \
/usr/local/Cellar/numpy/1.11.2/lib/python2.7/site-packages/numpy/core/include/numpy/core/include
我的Makefile.config文件:

## Refer to http://caffe.berkeleyvision.org/installation.html # Contributions simplifying and improving our build system are welcome! # cuDNN acceleration switch (uncomment to build with cuDNN). # USE_CUDNN := 1 # CPU-only switch (uncomment to build without GPU support). CPU_ONLY := 1 # uncomment to disable IO dependencies and corresponding data layers # USE_OPENCV := 0 # USE_LEVELDB := 0 # USE_LMDB := 0 # uncomment to allow MDB_NOLOCK when reading LMDB files (only if necessary) # You should not set this flag if you will be reading LMDBs with any # possibility of simultaneous read and write # ALLOW_LMDB_NOLOCK := 1 # Uncomment if you're using OpenCV 3 # OPENCV_VERSION := 3 # 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 := g++ # CUDA directory contains bin/ and lib/ directories that we need. CUDA_DIR := /usr/local/cuda # On Ubuntu 14.04, if cuda tools are installed via # "sudo apt-get install nvidia-cuda-toolkit" then use this instead: # CUDA_DIR := /usr # CUDA architecture setting: going with all of them. # 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 # BLAS choice: # atlas for ATLAS (default) # mkl for MKL # open for OpenBlas BLAS := atlas # Custom (MKL/ATLAS/OpenBLAS) include and lib directories. # Leave commented to accept the defaults for your choice of BLAS # (which should work)! # BLAS_INCLUDE := /path/to/your/blas # BLAS_LIB := /path/to/your/blas # Homebrew puts openblas in a directory that is not on the standard search path # BLAS_INCLUDE := $(shell brew --prefix openblas)/include # BLAS_LIB := $(shell brew --prefix openblas)/lib # This is required only if you will compile the matlab interface. # MATLAB directory should contain the mex binary in /bin. # MATLAB_DIR := /usr/local # MATLAB_DIR := /Applications/MATLAB_R2012b.app # 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/local/Cellar/numpy/1.11.2/lib/python2.7/site-packages/numpy/core/include/numpy/core/include # Anaconda Python distribution is quite popular. Include path: # Verify anaconda location, sometimes it's in root. # ANACONDA_HOME := $(HOME)/anaconda # PYTHON_INCLUDE := $(ANACONDA_HOME)/include \ # $(ANACONDA_HOME)/include/python2.7 \ # $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \ # Uncomment to use Python 3 (default is Python 2) # PYTHON_LIBRARIES := boost_python3 python3.5m # PYTHON_INCLUDE := /usr/include/python3.5m \ # /usr/lib/python3.5/dist-packages/numpy/core/include # We need to be able to find libpythonX.X.so or .dylib. PYTHON_LIB := /usr/lib # PYTHON_LIB := $(ANACONDA_HOME)/lib # Homebrew installs numpy in a non standard path (keg only) # PYTHON_INCLUDE += $(dir $(shell python -c 'import numpy.core; print(numpy.core.__file__)'))/include # PYTHON_LIB += $(shell brew --prefix numpy)/lib # Uncomment to support layers written in Python (will link against Python libs) # WITH_PYTHON_LAYER := 1 # Whatever else you find you need goes here. INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib # If Homebrew is installed at a non standard location (for example your home directory) and you use it for general dependencies # INCLUDE_DIRS += $(shell brew --prefix)/include # LIBRARY_DIRS += $(shell brew --prefix)/lib # Uncomment to use `pkg-config` to specify OpenCV library paths. # (Usually not necessary -- OpenCV libraries are normally installed in one of the above $LIBRARY_DIRS.) # USE_PKG_CONFIG := 1 # N.B. both build and distribute dirs are cleared on `make clean` BUILD_DIR := build DISTRIBUTE_DIR := distribute # Uncomment for debugging. Does not work on OSX due to https://github.com/BVLC/caffe/issues/171 # DEBUG := 1 # The ID of the GPU that 'make runtest' will use to run unit tests. TEST_GPUID := 0 # enable pretty build (comment to see full commands) Q ?= @
四、編譯
使用cmake工具,將cmake的sourcecode設為caffe的路徑,在caffe目錄下建立build文件夾,並將cmake的build路徑設為該build的路徑,configure,generate。
此時打開終端工具進入build目錄下,make。
make all
make test
make runtest
make pycaffe
如果沒有出現錯誤,並全部通過后,此時make告一段落,但是並不能確定可以在python中import。
在終端上:
vi etc/profile
或
sudo vi /etc/profile
進入修改系統的環境變量,將 caffe/python/
添加到Python系統路徑:
export PYTHONPATH=path to caffe/python:$PYTHONPATH
例如:
export PYTHONPATH=/Users/cuiqi/Downloads/caffe-master/python:$PYTHONPATH
終端輸入python,確認這個python環境是剛剛在makefile.config中設定的那個,可以 which python 確認。由於我沒有使用Anaconda,我的是
/usr/local/bin/python ,確認為剛剛在makefile.config中設定的路徑。
>>> import caffe
# 可能的錯誤
ImportError: No module named skimage.io
# 解決
pip install scikit-image
參考:https://github.com/rainyear/lolita/issues/10?utm_source=tuicool&utm_medium=referral
16.12.22更新:
還可能出現的錯誤:segment fault:11
在 ITNOSE 上一作者認為此錯誤很有可能是系統里也有多個版本的Python,並且編譯和運行的時候不是一個版本。
解決辦法:
當然就是要統一編譯與運行的python版本。終端鍵入 which python ,反饋給我/usr/local/bin/python,而CMAKE工具反饋給我的是系統自帶的python路徑。
1.對於我而言,我准備使用系統自帶的python。使用Homebrew工具brew install python后,python環境路徑為/usr/local/bin/python,而caffe編譯時使用了系統自帶的python路徑 /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python。這個路徑可以使用otool反編譯工具檢出,例如:otool -L python/caffe/_caffe.so (_caffe.so在下載好的caffe的python/caffe下)。
2.修改bash_profile配置文件以在啟動系統時使用自帶python,打開終端,鍵入 vi ~/.bash_profile ,輸入:
# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
PATH="/System/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH
完成后輸入:wq(保存退出),終端鍵入 source ~/.bash_profile 或者注銷及重啟使修改生效。
3.再次終端鍵入 which python,返回 /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python,說明修改生效。鍵入python,
>>> import caffe
無報錯,成功。
參考:
http://www.itnose.net/detail/6522348.html
https://www.zhihu.com/question/30941329
16.12.29更新:
可能出現的錯誤:TypeError: __init__() got an unexpected keyword argument 'syntax';
參考dupuleng的解決方法,這是由於protobuf版本的問題造成的。
查看protobuf版本:
pip show protobuf
protobuf信息:
Name: protobuf
Version: 2.6.1
Summary: Protocol Buffers
Home-page: https://developers.google.com/protocol-buffers/
Author: protobuf@googlegroups.com
Author-email: protobuf@googlegroups.com
License: New BSD License
Location: /Users/cuiqi/anaconda/lib/python2.7/site-packages
Requires: setuptools
此版本(2.6.1)需要變更:
pip uninstall protobuf
pip install 'protobuf>=3.0.0a3'
pip show numpy protobuf
protobuf信息:
Name: protobuf
Version: 3.1.0.post1
Summary: Protocol Buffers
Home-page: https://developers.google.com/protocol-buffers/
Author: protobuf@googlegroups.com
Author-email: protobuf@googlegroups.com
License: New BSD License
Location: /Users/cuiqi/anaconda/lib/python2.7/site-packages
Requires: six, setuptools
完成
關於cmake:
經過我的測試發現修改makefile.config后,cmake的 configure之前還要手動修改python的相關路徑,否則cmake會使用mac的系統python環境,造成上述segment fault 11的情況。關鍵在於要勾選Advanced選項:
不勾選Advanced:
更改好之后再configure,generate,cmake就會選擇相應的環境路徑了。