1. 程式人生 > >caffe python介面配置總結

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版本,問題解決