一直以来都是用的caffe的c++接口,今天需要用到caffe的python接口将一个numpy的.npy文件转成.binaryproto文件,故学习了下配置python接口,现将遇到的问题总结如下:
1.依赖库在Makefile.config中已经配置好,故直接执行如下命令
make pycaffe > error.log 2>&1
出现如下错误
* No rule to make target include/caffe/layers/python_layer.hpp', needed by
python/caffe/_caffe.so’. Stop
原来是python_layer.hpp文件不存在,因为我使用的caffe版本并非原始的github上下载的,是经过同事裁剪过的,因此将所需的原始文件加入
2.继续编译后,出现如下错误
pyconfig.h: No such file or directory
如果正确安装python,python相关的头文件均在安装目录下的include(如果是anaconda,在anaconda_dir/include/python2.x下,但是我已经在Makefile.config中配置了(PYTHON_INCLUDE),仔细看了下Makefile文件,发现,并没有使用config文件定义的包含目录,所以在编译的时候找不到头文件,故直接在自己的环境变量中设置。
另外,编译python接口还需要numpy头文件,所以,添加环境变量如下
export CPLUS_INCLUDE_PATH=/xxx/software/anaconda2/include/python2.7:/xxx/software/anaconda2/lib/python2.7/site-packages/numpy/core/include:$CPLU_INCLUDE_PATH
3.添加完头文件后,还需设置所需的静态库libpython2.7.a所在目录
export LIBRARY_PATH=/xxx/software/anaconda2/lib/python2.7/config:$LIBRARY_PATH
4.在编译的过程中,可能会出现某个依赖的动态库文件.so找不到头文件pyconfig.h等,这是因为我在写环境变量文件时,先引入了动态库目录,才引入了附加包含目录,即如下顺序
export PATH
export LD_LIBRARY_PATH
export CPLUS_INCLUDE_PATH
export LIBRARY_PATH
export PKG_CONFIG_PATH
export PYTHONPATH
调整包含头文件目录和静态库目录顺序到动态库目录之前即可
export PATH
export CPLUS_INCLUDE_PATH export LIBRARY_PATH
export LD_LIBRARY_PATH
export PKG_CONFIG_PATH
export PYTHONPATH
5.修正以上错误后,编译无错误,配置完成,可以看到在python/caffe目录下生成了_caffe.so文件。
进入python交互命令行,输入import caffe 进行测试,但出现如下错误:
ImportError: /xxx/software/boost_1_58_0/lib/libboost_python.so.1.58.0: undefined symbol: PyUnicodeUCS2_FromEncodedObject
网上搜索后,官网文档https://docs.python.org/2/faq/extending.html#can-i-create-an-object-class-with-some-methods-implemented-in-c-and-others-in-python-e-g-through-inheritance给了很好的解释:
因为引入的依赖库libboost编译时使用了2-byte Unicode字符版本的python,而当前系统使用的python是4-byte Unicode字符,该文档也给出了如何查看自己的python字符版本:
>>> import sys
>>> if sys.maxunicode > 65535:
... print 'UCS4 build'
... else:
... print 'UCS2 build'
解决办法就是使用和当前系统Unicode字符版本一致的python编译依赖库。
6.最后解决以上问题后,在python中引入caffe模块输出以下信息:
/xxx/caffe/python/caffe/pycaffe.py:13: RuntimeWarning: to-Python converter for boost::shared_ptr > already registered; second conversion method ignored.
from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, \
/xxx/caffe/python/caffe/pycaffe.py:13: RuntimeWarning: to-Python converter for boost::shared_ptr > already registered; second conversion method ignored.
from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, \
/xxx/caffe/python/caffe/pycaffe.py:13: RuntimeWarning: to-Python converter for boost::shared_ptr > already registered; second conversion method ignored.
from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, \
stackoverflow上有人给出解释说是可能是因为Boost版本的不一致,但是不影响正常使用,可忽略,至此,caffe的python接口正式配置完。
总结:
1.配置所需的头文件和库文件的目录
2.网上有人说要将Makefile.config中的WITH_PYTHON_LAYER注释去掉,但我研究了下,发现可以不用去掉注释,因为如果只是使用python接口而不是用python去写层的话,是不需要的。
3.注意依赖库的版本一致问题
补充:
在使用protobuf-3.0.0版本时,import caffe时出现类似错误:
参考网上解答,用protobuf-2.6.1版本替换了3.0版本,问题解决