Caffe实战(四):pycaffe和matcaffe接口编译
1. pycaffe接口编译
Caffe提供了python的接口(pycaffe),详见caffe/python文件夹。在python代码中import caffe,可以load models(导入模型),forward and backward(前向、反向迭代), handle IO(数据输入输出),visualize networks(net可视化),instrument model solving(自定义优化方法)。所有的模型数据、计算参数都是可供读写的。
本文介绍在linux平台和windows平台下分别编译pycaffe的接口的使用方法。
1.1 Linux平台编译pycaffe接口
说明:目前还没有在Linux平台上进行相应的操作,这里仅仅介绍网络上一些操作方法(ubuntu上的安装操作),还要结合具体的实际环境。在linux平台上编译pycaffe接口相对比较简单,主要困难是需要安装各种依赖库比较麻烦,如果libcaffe库能够编译成功,则基本上需要的依赖库都已经安装完全了。另外,不要忘记把pycaffe接口路径添加到python环境变量中,不然在python环境中无法找到pycaffe。
【 第一步:安装依赖库】(具体的依赖库可以参考python/requirements.txt介绍;如果不确定需要哪些依赖库可以先进行编译,提示缺少某些库再安装也可以)
$ sudo apt-get install python-numpy python-scipy python-matplotlib python-sklearn python-skimage python-h5py python-protobuf python-leveldb python-networkx python-nose python-pandas python-gflags Cython ipython $ sudo apt-get install protobuf-c-compiler protobuf-compiler
# 可以直接从文件中读取依赖包名称,并依次按照
$ pip install -r requirements.txt
【第二步:编译pycaffe】切换到caffe根目录
$ cd ~/caffe $ make pycaffe
【第三步:添加python环境变量】添加~/caffe/python到$PYTHONPATH:
$ sudo gedit /etc/profile # 添加: export PYTHONPATH=/path/to/caffe/python:$PYTHONPATH $ source /etc/profile # 使之生效 # 或者每次使用的时候手动添加pycaffe路径 import sys sys.path.append('/path/to/pycaffe')
【第四步:测试是否成功】
$ python Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import caffe >>>
1.2 Windows平台编译pycaffe接口
windows平台下的操作比较复杂,而且还有很多的坑,尤其是版本不一致时,遇到各种问题。我也是花了快一天的时间才逐渐理清他们之间的关系。
微软提供了caffe的winows版本,可以在vs2013上编译pycaffe模块。
【第一步:安装Python环境】
推荐安装Python2.7版本,是因为从微软下载的caffe版本引用的是Python2.7的包,为了避免不必要的麻烦,与源代码中版本中保持一致,如下图所
boost-python:boost 中的 Python 库支持在 Python 和 C++ 之间的自由转换,包括 C++ 到 Python 的类型转换,默认参数,关键字参数,引用,指针等等。boost.python 库可以让 Python 轻易地调用 C++ 编写的模块,也可以很容易地在 C++ 中调用 Python 。
从上图可以看出在编译pycaffe时,需要用到boost提供的python库,而最初设置的是boost_python2.7的版本,因此生成的python模块是支持python2.7调用的。尤其目前python3和python2不兼容,如果电脑中安装的是python3版本,那么是无法调用这个生成的pycaffe模块的。这里最关键的还是版本的问题,pycaffe接口支持的python版本,以及运行环境的python版本一定要一致。
整个逻辑关系是这样的:我们需要编译支持Python调用的caffe接口,需要用到boot_python库;而这个boot_python库是有版本区别的,采用哪些版本,只能支持这些版本的python调用。
于是,编译pycaffe有两种思路:
- 思路一:采用pycaffe默认配置的版本,如果电脑没有就安装这个版本;
- 思路二:如果电脑安装的不是这个版本(例如python3.6),可以修改boot_python的版本,这需要修改依赖包的内容,置于是否对其他的模块产生影响不太清楚,还不知道具体怎么操作。
从上面分析来看,采用思路一的方法比较简单,直接在电脑安装python2.7版本即可。如果电脑中已经安装了其他版本,再安装2.7版本,就会出现多个版本共存的情况。这就特别注意链接,调用的时候是否指向的pthon2.7版本。(关于多个pyton版本共存的情况,如果自由切换还需要查看资料,自己还不了解python)
这里介绍一种简单的方法,安装Anaconda。Anaconda就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。(个人理解它就是自带python版本和一些软件包的集成环境,更好的是可以创建多个python环境并进行管理切换;可以简单的认为它安装它就相当于安装一个python环境)
Anaconda官方网址: https://www.anaconda.com/distribution/#macos
Anaconda其它历史版本: https://repo.continuum.io/archive/
关于Anaconda安装,使用可以参考: https://zhuanlan.zhihu.com/p/32925500
Anaconda与python版本对应关系: https://blog.csdn.net/yuejisuo1948/article/details/81043823
【第二步:修改CommonSettings.props配置文件】
打开caffe/windows/CommonSettings.props文件,修改<PythonSupport>true</PythonSupport>为true,然后修改PythonDir的路径为你安装的Anaconda路径,如下图所示:
如果电脑中安装了python2.7版本,则这里填入你安装的python2.7路径。
【第三步:编译pycaffe】
整个编译过程完成后,在release文件下生成了pycaff文件夹及其对应文件,如下图所示。
可以看到有classify.py、detect.py、draw_net.py三个文件,分别对应的是分类、检测、绘制网络模型的功能接口。
【第四步:添加PYTHONPATH路径】
有两种调用方法
方式一:手动添加pycaffe路径
import sys sys.path.append('/path/to/pycaffe')
方式二:在系统环境中添加PYTHONPATH变量,并增加pycaffe路径,这样python可以搜索到pycaffe。
2. matcaffe接口编译
Caffe提供了matlab的接口(matcaffe),详见caffe/matlab文件夹。
2.1 Linux平台编译matcaffe接口
【第一步】安装Matlab后,将Matlab目录更新至caffe的Makefile.config:
# This is required only if you will compile the matlab interface. # MATLAB dirctory should contain the mex binary in /bin MATALB_DIR := /your/Path/To/MATLAB/R2015b
【第二步】编译
# caffe根目录 make matcaffe
2.2 Windows平台编译matcaffe接口
【第一步:修改CommonSettings.props配置文件】
打开caffe/windows/CommonSettings.props文件,修改<MatlabSupport>true</MatlabSupport>为true,然后修改MatlabDir的路径为你安装的Matlab路径。参考1.2小节。
【第二步:编译matcaffe工程】
整个编译过程完成后,在release文件下生成了matcaff文件夹及其对应文件,在matcaffe/+caffe/private目录下生成caffe_.mexw64文件,则说明编译成功。
【第三步:添加路径】
添加系统路径(path):路径深度到Release目录为止,比如,我这里是E:\Learning\caffe\Microsoft\caffe\Build\x64\Release
添加matlab默认搜索路径:打开matlab2018a, 添加路径,路径深度到matcaffe目录为止,比如,我这里是E:\Learning\caffe\Microsoft\caffe\Build\x64\Release\matcaffe
保存后,重启matlab,不然测试时会报找不到caffe_.mexw64模块的错误。
整个接口调用的过程貌似是这样的:当调用caffe时,matalb会在默认搜索路径下搜索caffe_.mexw64文件,因此需要将.....\matcaffe路径添加到matalb搜索路径;而caffe_.mexw64文件会调用编译好的libcaffe.lib库文件,于是需要将该路径添加到系统环境变量中。
【问题1】编译时提示找不到"gpu/mxGPUArray.h"头文件?
解决思路:这是由于matlab版本过新,该文件不在$(MatlabDir)\extern\include目录中,而是移到$(MatlabDir)\toolbox\distcomp\gpu\\extern\include中。所以,需要在caffe/windows/CommonSettings.props配置文件中添加该路径,如下所示:
【问题2】运行caffe下matlab里面的demo,提示“caffe_.mexw64”找不到指定的模块,或者找不到依赖的库“.....”之类的问题
解决思路:
(1)\Build\x64\Release\matcaffe\+caffe\private这个文件夹里面的东西全都拷贝到\matlab\+caffe\private覆盖;
(2)将..\Release下的所有动态链接文件(.dll)拷贝到..\matlab\+caffe\private目录下;
参考资料