Caffe+Matlab配置

来源:互联网 发布:scp linux tftp 编辑:程序博客网 时间:2024/05/22 13:06

一、caffe与matlab接口
首先是安装matlab,然后是进行caffe与matlab的接口;
1 安装好matlab——按照正常步骤进行安装即可
2 修改Makecaffe.config——编译matcaffe之前需要将Makefile.config,由于我的MATLAB的路径是/home/xaver/local/matlab(这个路径指的是包含/bin这个文件夹的那一层目录),所以Makefile.config修改如下,记得去掉#号
MATLAB_DIR:= /home/xaver/local/matlab
3 编译——然后就可以编译了,进到caffe的根目录,我的是/home/xaver/deeplearning/caffe-master
Make clean (注意sudo权限问题)
Make caffe –j4
Make matcaffe
编译时,我的有出现警告GCC版本太低,但是下面确实写了编译成功,因为之前试着降版本到4.7,但是后来在编译文件时出现了很多错误,主要报错地点在/examples和/tools中,不过网上有很多通过降级成功的,这条路不再详细叙述
这里写图片描述
4 然后编译mattest,测试下编译好的matcaffe是否能用——在这一步一般不会编译成功,这里需要修改两个领域共计四个库的链接。其原理是因为matlab与caffe通过接口进行编译的过程中,两者所引用的库应当指向同一个即可。
这些库包含有:第一类库,libstdc++.so.6;第二类库,libopencv_core.so.2.4,libopencv_highgui.so.2.4,libopencv_imgproc.so.2.4
具体的方法基本思想是找到matlab和caffe所依赖的这些库的位置,然后通过某种方式建立连接即可。
1 找到matlab中这些库的位置
libstdc++.so.6:它在matlab中的位置时 matlab/sys/os/glnxa64/中
libopencv_core.so.2.4,libopencv_highgui.so.2.4,libopencv_imgproc.so.2.4:matlab/bin/glnxa64中
而且通过ls libopencv_* -l 命令可以看到这些库通过链接的都是这个文件夹中自己的库。
2 找到caffe所依赖的这些库的位置
这四个库资源都是在:/usr/lib/x86_64-linux-gnu中
3 进行链接
1)首先需要备份或删除matlab中的那几个库的软链接,建议备份,命令如下:
Sudo mv /home/xaver/local/MATLAB/sys/os/glnxa64/ libstdc++.so.6 /home/xaver/local/MATLAB/sys/os/glnxa64/ libstdc++.so.6
注意以上路径并不一定就是你的路径,物理意义上表示的是你的matlab所安装的路径
2)然后是进行链接,使用如下命令
Sudo ln –s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 / /home/xaver/local/MATLAB/sys/os/glnxa64/ libstdc++.so.6
这条命令的前边的地址是需要链接的对象,俗称卖家,后面是需求链接那个对象的地址,俗称买方,买方从卖方那里获取库的使用。
对于其他三个库,照此方法进行链接,但是要注意按照步骤一和二来修改相应的地址
4 再次使用sudo make mattest进行测试
5 这里提供一个实例,来进行实际的matlab的操作
<1>下载bvlc_reference_caffenet.caffemodel
链接:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel
下载好之后放入文件夹/caffe-master/models/bvlc_reference_caffenet 这是因为一会运行的demo要使用这个模型。
<2>在终端输入命令“matlab”(打不开的自己去添加PATH)打开Matlab,切换到目录/caffe-master/matlab/demo/(这很重要)
<3>输入命令 run(‘classification_demo.m’) 或者双击打开classification_demo.m直接点击上面控制台上的“运行”即可,不需要输入参数。
<4>输出是一个1000×1的矩阵,因为ImageNet数据集有1000个类别。

参考文献:
[1]caffe与matlab接口:http://blog.csdn.net/fangbinwei93/article/details/52865461
[2]实例操作:http://www.cnblogs.com/laiqun/p/6031925.html

以下是经历过程

http://blog.csdn.net/fangbinwei93/article/details/52865461
我成功啦 成功地完成了调试matlab!
在没有更改g++的情况下,实现了matlab与caffe的接口,其本质原因是基于matlab所使用的libstdc以及libopencv等文件与caffe使用的不是用一个,使用
Ldd ~/deepLearning/caffe/matlab/+caffe/private/caffe_mexa64 中所连接的lib文件是指向系统的/usr/lib/x86_64-linux-gnu中,而在matlab命令框中输入!Ldd ~/deepLearning/caffe/matlab/+caffe/private/caffe_mexa64,其指向的是matlab本身的库,然后我进到matlab本身的库里面,如matlab。Sys/os/glnx64/libstdc++.so.6这个软链接指向的是matlab本身自带的libstdc++.so.6
修改好之后,再次在编译caffe_,mexa64上出错,观察这里的提示:提示_ZN2cv8imencodeERKNSt 很长一串的东西,经过一番google,找到点眉目,我再次对比了终端下和MATLAB下所引用的库,感觉应该是opencv那几个库的问题(并不能保证所有人都是这几个库出问题),我像上面一样,改了下面3个库的软链接,对于matlab来说,opencv位于/matlab/bin/glnx64下,对于系统而言,与之前一样,在/usr/lib/x86_64-linux-gnu中,使用删除原始链接,在添加新的软链接的方式即可,主要针对的三个库分别为:libopencv_core.so.2.4 libopencv_highgui.so.2.4 libopencv_imgproc.so.2.4这三个库,然后就可以了编译成功make mattest了,主要参考的文章是这个
http://blog.csdn.net/fangbinwei93/article/details/52865461

然后使用这个上面的一个例子进行编译
http://www.cnblogs.com/laiqun/p/6031925.html

http://blog.csdn.net/fangbinwei93/article/details/52865461
这里面有一句有意思的代码
在matlab命令窗口输入system(‘exho LDLIBRARYPATH)/usr/local/MATLAB/R2014a/sys/os/glnxa64/usr/local/MATLAB/R2014a/bin/glnxa64libstdc++.so.6GLIBCXX3.4.20MATLABlibstdc++.so.6exportLDLIBRARYPATH=LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu/libstdc++.so.6

发现了一个问题,在终端和matlab中输出的 echo $LD_LIBRARY_PATH的结果是不一样的,在matlab中,压根就没有libstdc++这个东西

这是一个问题,目前看到有什么GCC库不兼容,caffe和matlab所支持的gcc版本不同等问题
首先是自己在网上找到一些资料信息,然后是结合老师的文档进行阅读,这里预计五篇文献
1 http://blog.csdn.net/ws_20100/article/details/50525879
Caffe的matlab接口的使用方法
包含两个内容,一是编译MatCaffe,二是使用MatCaffe
1)使用如下命令编译Matcaffe,之后可以用如下命令测试MatCaffe:
Make all matcaffe
Make mattes
其中提到了出现错误的解决方法:libstdc++.so.6 version ‘GLIBCXX_3.4.15’ not found
2)使用MatCaffe
这一点就等到以后再看,这篇文章使用了一个例子来解释matcaffe的具体使用方法,前提是假设已经下载了BLVC CaffeNet,并且在caffe根目录启动matlab
2 http://blog.csdn.net/u012746763/article/details/50419153
Matlab下对caffe接口的调用
Gcc降级+编译matlab+运行demo,文章写于2015年12月
1)gcc降级:他说的是matlab2013a支持gcc较低版本gcc4.4.x,而ubuntu支持gcc4.8,所以要先将gcc降级,大概逻辑是先安装gcc4.4,然后降级
文章的底部说这是针对于matlab2013a版本,对于2014a版本无需降级gcc,需要在Makefile第410行添加
CXXFLAGS+=-STD=C++11

3 我在Makefile.config中添加了matlab的路径,使用make all matcaffe之后,发现不能运行成功,报的错误如下,读取之后,大概意思是caffe支持的版本是4.7.x,而我正使用的版本是5.4.0,版本不兼容
这里写图片描述
那么怎么解决这个问题呢?张敬老师之前给的文档里面也碰到了相同的问题,给出了两个博客,细读以下
http://www.cnblogs.com/loveyakamoz/archive/2012/12/26/2833967.html
更改Ubuntu gcc、g++默认编译器版本
方法一:首先看一下你的Ubuntu都装了哪些版本的gcc:ls/usr/bin/gcc* -l
我的显示的是其默认安装和指向是gcc-5,现在来改成gcc-4.7
删除gcc-5的软连接文件/usr/bin/gcc(只是删除软连接)
Sudo rm /usr/bin/gcc
然后建里一个软链接,指向gcc-4.7
Sudo ln –s /usr/bin/gcc-4.7 /usr/bin/gcc
好了,现在用命令 gcc –v 看是什么
http://blog.csdn.net/hduxiejun/article/details/53514466
Caffe中使用matlab接口的第一步是对GCC进行降级
先安装gcc4.7,在终端执行命令
sudo apt-get install gcc-4.7 g++-4.7 g++-4.7-multilib gcc-4.7-multilib
然后再终端执行以下系统gcc降级命令
http://blog.csdn.net/ture_dream/article/details/52651746
这个上面在下载gcc时,是直接进行安装安装的
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-4.7
sudo apt-get install g++-4.7

方法总结:1)下载gcc4.7;2)删除软链接;3)gcc –v查看
Ls /usr/bin/gcc* -l
sudo apt-get install gcc-4.7 g++-4.7 g++-4.7-multilib gcc-4.7-multilib
Sudo rm -rf /usr/bin/gcc
Sudo rm -rf /usr/bin/g++
Sudo ln –s /usr/bin/gcc-4.7 /usr/bin/gcc
Sudo ln –s /usr/bin/g++-4.7 /usr/bin/gcc
Gcc –v
Sudo make matcaffe
Sudo make mattest

4 遇到的问题
在编译make matcaffe过程中,遇到了下面的问题,首先把问题描述清楚,
这里写图片描述
Undefined reference to ‘google::protobuf::internal::empty_string_’
Undefined reference to ‘google::base::CheckOpMessageBuilder::NewString()’
https://stackoverflow.com/questions/30124264/undefined-reference-to-googleprotobufinternalempty-string-abicxx11
这个上面出现了我的第一种问题——怀疑是一个C++ABI问题。在GCC5中更改了std::string的ABI。
如果libprotobuf是用的gcc4.x或者更早版本,而该app是用gcc5构造的,你将会看到问题,因为libprotobuf使用了std::string在它的接口中。有两个选择:一是使用gcc5来重构libprotobuf,另一种是使用-D_GLIBCXX_USE_CXX11_ABI=0构造应用程序,这将强制GCC使用旧的ABI版本
http://blog.csdn.net/quincuntial/article/details/50593268
这个上面说采用的google的protobuf版本是最新的版本与caffe不兼容。
http://wenda.chinahadoop.cn/question/3956
这个上面说重装一遍protobuf
Sudo apt-getl update
Sudo apt-get install libprotobuf-dev

再次运行了一遍,在原来提示的基础上,又发现
Undefined reference to ‘leveldb::Status::ToString() const’
我要看下日志,这些未被定义的文件,是在哪里没有被定义的?是不是函数库不匹配,或者没有下载,或者没有连接上?
内容如下,
这里写图片描述
恍惚间,看到这句话,z在问题的结尾有
“Makefile:517:recipe for target ‘matlab/+caffe/private/caffe_.mexa64’ failed
Make:*[matlab/+caffe/private/caffe_.mexa64]error 255
这点不是跟张敬老师里面写的这条相似吗?
根据对老师所言的理解,是matlab下面的库与系统的库不一致或者确实存在问题,因此需要将所有的系统的对应库,接到matlab对应目录下即可
我首先分别在/home/xaver/local/MATLAB/R2015a/sys/os/glnxa64和/usr/lib/x86_64-linux-gnu/下分别查看了”libstdc++.so.6“的状态,前者有,但是后缀名是.bak,记得在安装matlab时,安装sudo install matlab-support时,将相关的不兼容文件保存为.bak,不知道这个文件是不是?
操作如下:进入MATLAB目录:/usr/local/MATLAB/R2015a/sys/os/glnxa64;sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 libstdc++.so.6

4、关于mex错误中的libstd++.so.6、libcudart.so.8.0
原来关于libstdc++.so.6的处理方法能够保证make mattest能过。但是运行具体m文件时还是会出错。这是因为MATLAB下面的库与系统的库不一致或者确实问题。除了上述的opencv(在/bin/glnxa64/下)之外,还有libstd++.so.6和libcu*.8.0等等
处理方法有也简单,根据提示,将所有的系统的对应库,软件接到MATLAB对应的目录下即可。
问题:Invalid MEX-file ‘/home/user/zhangjing/caffe-YangWANG/matlab/+caffe/private/caffe_.mexa64’: /usr/local/MATLAB/R2015a/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6: version
`GLIBCXX_3.4.20’ not found (required by /home/user/zhangjing/caffe-YangWANG/matlab/+caffe/private/caffe_.mexa64)
1、进入MATLAB目录:/usr/local/MATLAB/R2015a/sys/os/glnxa64
2、把系统目录 /usr/local/cuda/lib64/中的cuda相关的库(;libcu*.so.*)全部软连接到当前目录
sudo ln -s /usr/local/cuda/lib64/libcublas.so.8.0 libcublas.so.8.0
sudo ln -s /usr/local/cuda/lib64/libcudnn.so.5 libcudnn.so.5
sudo ln -s /usr/local/cuda/lib64/libcufft.so.8.0 libcufft.so.8.0
sudo ln -s /usr/local/cuda/lib64/libcufftw.so.8.0 libcufftw.so.8.0
sudo ln -s /usr/local/cuda/lib64/libcuinj64.so.8.0 libcuinj64.so.8.0
sudo ln -s /usr/local/cuda/lib64/libcurand.so.8.0 libcurand.so.8.0
sudo ln -s /usr/local/cuda/lib64/libcusolver.so.8.0 libcusolver.so.8.0
sudo ln -s /usr/local/cuda/lib64/libcusparse.so.8.0 libcusparse.so.8.0
sudo ln -s /usr/local/cuda/lib64/libcudart.so.8.0 libcudart.so.8.0
3、把系统目录/usr/lib/x86_64-linux-gnu/下的libstd++.so.6软连接到当前目录
sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 libstdc++.so.6

http://blog.csdn.net/shaoxiaohu1/article/details/51411301
Invalid MEX-file “caffe_.mexa” 的解决方法
我觉得这个说的挺有道理的,matlab找不到caffe的部分动态链接库文件,
http://blog.csdn.net/qq_17278169/article/details/64128525
这篇文章的情况跟我的类似,编译caffe的一个protobuf问题,也是因为在系统中安装了anaconda,导致里面安装的protobuf版本和系统安装的版本有冲突
我分别在/etc/environment和xaver/.bashrc中进行了查看,在./bashrc中找到了anaconda的路径进行了删除,在使用echo $PATH,source ./bashrc没有了这个路径
再次在caffe中运行make all 再次是protobuf相关的问题,我猜测是不是因为没有protobuf的包,我在安装一次看行不行
但是又报这样的错误,unable to locate package libprotobuf
http://www.cppblog.com/colorful/archive/2012/04/29/173122.aspx
这个文章说 sudo apt-get update下,结果。。。还是不行
https://jingyan.baidu.com/article/1876c85270b4c6890b137692.html
这个说的也不行
http://blog.csdn.net/u012999651/article/details/51781691
这个上面说sudo apt-get upgrade,更进了一步,不知道行不行,upgrade是什么意思?
http://www.baiyuxiong.com/?p=529
update是更新软件列表,upgrade是更新软件,我怎么有种不好的预感,我的gcc就是要4.7版本的?!

http://blog.csdn.net/rt5rte54654/article/details/54742981
这个版本出现的问题跟我的一样(22:54)
http://www.cnblogs.com/laiqun/p/6031925.html
这个博客之前看过,但是没有深入理解,因为心中倾向于改得少的,然后这篇文章说得理由不是很清晰
http://caffecn.cn/?/question/41
我结合上面两个博客,可是测试仍出现问题
Invalid MEX-file ‘/usr/local/caffe/matlab/+caffe/private/caffe_.mexa64’: /usr/local/caffe/matlab/+caffe/private/caffe_.mexa64: undefined symbol:
然后这个里面有人说:那你在用matcaffe做training和testing的时候有没有错误?
如果能train和test的话就忽略这个错把。
http://www.cnblogs.com/laiqun/p/6031925.html
这个博客里面提示了测试的案例,我准备尝试下
尝试了,到最后一步,还是失手了,同样的错误
闪了 十二点二十了 得回家了

原创粉丝点击