写在开头:目前python3版本的pycaffe仍然属于不稳定版本,有很多未知因素,所以还是非常建议使用python2.7编译pycaffe。
1.python3
Centos默认不自带python3,在此处安装python3环节中强烈建议使用http://conda.pydata.org/miniconda.html,因为据google结果显示,其他版本最后编译pycaffe时无法正确导入,会提示protobuf错误,详情参考caffe的issue(https://github.com/BVLC/caffe/issues/2464)和protobuf的issue(https://github.com/google/protobuf/issues/1276)。同时安装miniconda3时注意请务必将lib文件夹路径配置在LD_LIBRARY_PATH
环境变量或者~/.bash_profile中,加入/etc/ld.so.config可能导致开机无法启动。
2.编译opencv3.1.0
2.1 删除cmake对python2版本的检测(可选)
在cmake/OpenCVDetectPython.cmake
文件的如下一段话:
find_python(2.7 "${MIN_VER_PYTHON2}" PYTHON2_LIBRARY PYTHON2_INCLUDE_DIR
PYTHON2INTERP_FOUND PYTHON2_EXECUTABLE PYTHON2_VERSION_STRING
PYTHON2_VERSION_MAJOR PYTHON2_VERSION_MINOR PYTHON2LIBS_FOUND
PYTHON2LIBS_VERSION_STRING PYTHON2_LIBRARIES PYTHON2_LIBRARY
PYTHON2_DEBUG_LIBRARIES PYTHON2_LIBRARY_DEBUG PYTHON2_INCLUDE_PATH
PYTHON2_INCLUDE_DIR PYTHON2_INCLUDE_DIR2 PYTHON2_PACKAGES_PATH
PYTHON2_NUMPY_INCLUDE_DIRS PYTHON2_NUMPY_VERSION)
其实对本段的删除并不是必须的,但是在我编译时如果不删除就不能正确的检测到python3.5的相关信息。
2.2 编译
cmake -DWITH_CUDA=OFF -DPYTHON_EXECUTABLE=/usr/local/miniconda3/bin/python -D PYTHON_LIBRARY=/usr/local/miniconda3/lib/libpython3.5m.so -D PYTHON_NUMPY_INCLUDE_DIRS=/usr/local/miniconda3/lib/python3.5/site-packages/numpy/core/include -D PYTHON_INCLUDE_DIR=/usr/local/miniconda3/include/python3.5m -D BUILD_TESTS=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_DOCS=OFF -DPYTHON_PACKAGES_PATH=/usr/lib/miniconda3/site-packages .
make && sudo make install
注意点1:在执行cmake命令时一定要注意,python3一定要出现在OpenCV modules– To be built一栏中。并注意检查Python 3的Interpreter,Libraries,numpy等信息。
注意点2:然后经过make之后就可以在lib文件夹下面发现python3文件夹,里面有一个可以被import的so文件。如果make install不能将该so正确的放入到python3的site-package目录中时就自行放入就好了。
3. 编译boost-python3
之前在Ubuntu编译时都不需要这个步骤的,但是在Centos上编译到pycaffe最后一步时总是提示-lboost-python3.so不存在,而且没有找到现成的rpm可以直接装,就自己编吧,反正很快。
wget http://downloads.sourceforge.net/boost/boost_1_61_0.tar.bz2
tar -jxvf boost_1_61_0.tar.bz2 && cd boost_1_61_0
./bootstrap.sh --with-python=/usr/local/python3.5/bin/python3 --prefix=/usr/local/boost
./b2 stage threading=multi link=shared
sudo ./b2 install threading=multi link=shared
然后可以看到 libboost-python3.so出现在了/usr/local/boost/lib目录,记得加到ld.so.conf中就ok了。
4.编译protobuf
参照https://github.com/google/protobuf/issues/1276
在下面的评论中有提到一种解决方案:下载并编译安装protobuf的c++和python版本。
5.编译caffe
注意调整MakeFile.config中的参数:我调整后的核心参数如下:
CPU_ONLY := 1
OPENCV_VERSION := 3
BLAS := open #这里我自己编译的openblas,编译特别简单就不说了
BLAS_INCLUDE := /usr/lib64/openblas/include
BLAS_LIB := /usr/lib64/openblas/lib
#如果没有之前编译的boost库,则最后会提示missing -lboost_python3
PYTHON_LIBRARIES := boost_python3 python3.5m
PYTHON_INCLUDE := /usr/local/miniconda3/include/python3.5m \
/usr/local/miniconda3/lib/python3.5/site-packages/numpy/core/include
PYTHON_LIB := /usr/local/miniconda3/lib
WITH_PYTHON_LAYER := 1
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/lib64/openblas/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib64/openblas/lib /usr/local/boost/lib /usr/local/lib
最后执行make all && make pycaffe 即可。
总结:
本篇文章写于2016年9月29日,采用master分支最近release candidate 3代码编译完成,最后能成功import caffe.但是当使用predict函数时遇到以下问题未解决:
File "/usr/local/miniconda3/lib/python3.5/site-packages/caffe/classifier.py", line 89, in predict
out = self.forward_all(**{self.inputs[0]: caffe_in})
File "/usr/local/miniconda3/lib/python3.5/site-packages/caffe/pycaffe.py", line 175, in _Net_forward_all
for batch in self._batch(kwargs):
File "/usr/local/miniconda3/lib/python3.5/site-packages/caffe/pycaffe.py", line 259, in _Net_batch
num = len(blobs.itervalues().next())
AttributeError: 'dict' object has no attribute 'itervalues'
因为dict的itervalues方法在python3中被移除,尽管caffe官方一直在努力保持python3的兼容,但暂时不够完美,期待完美兼容python3的代码。