caffe python接口配置总结

一直以来都是用的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 bypython/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<caffe::Net<float> > 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<caffe::Blob<float> > 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<caffe::Solver<float> > 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版本,问题解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值