微软官方caffe之 matlab接口配置

版权声明:欢迎你们一块儿交流,有错误谢谢指正~~~多句嘴,CSDN会在每一行代码后面加两个空格,复制博客代码时请手动去掉,尤为是bat里面的代码html

目录(?)[+]git

前言

按照微软的官方地址配置可能会出现一个问题caffe_.mexw64找不到引用模块问题,或者在matlab里面压根找不到caffe_这个函数,下面会提到这两个问题。仍是按照步骤来吧github

【PS1】有GPU一样按照下述步骤,进行便可windows

【PS2】文章在matlab2013a、matlab2014a、matlab2015b、matlab2016a中配置成功,可是在高版本或者更低版本状况下可能会出现问题app

 

第一步

修改配置文件,使之支持matlab接口,修改两个地方,第一个是matlabsupport,第二个是matlabdir也就是你的matlab安装目录(对matlab桌面图标右键属性查看):函数

【PS】最近Microsoft 的github貌似更新了matcaffe中的caffe_.cpp文件,第十六行添加了对gpu/mxGPUArray.h的引用,能够在此步骤的IncludePath中添加MatlabDir,以下所示:测试

 

[cpp] view plain copyui

print?在CODE上查看代码片派生到个人代码片spa

  1. <PropertyGroup Condition="'$(MatlabSupport)'=='true'">  
  2.     <MatlabDir>C:\Program Files\MATLAB\R2013a</MatlabDir>  
  3.     <LibraryPath>$(MatlabDir)\extern\lib\win64\microsoft;$(LibraryPath)</LibraryPath>  
  4.     <IncludePath>$(MatlabDir)\extern\include;<strong><span style="color:#ff0000;">$(MatlabDir)</span></strong>;$(IncludePath)</IncludePath>  
  5. </PropertyGroup>  

 

而后修改matcaffe中的第十六行#include"gpu/mxGPUArray.h"中修改成.net

 

[cpp] view plain copy

print?在CODE上查看代码片派生到个人代码片

  1. #include<toolbox\distcomp\gpu\extern\include\gpu\mxGPUArray.h>  

 

第二步

编译caffe文件夹里面的Windows里面的caffe.sln工程里面的matcaffe一项

【注】此时先选择release选项吧,别用debug了

第三步

使用release编译之后,在\Build\x64\Release下会生成一个matcaffe文件夹,重点要有下面画框的文件。

第四步

【此步是按照微软官方配置方法】这一步不会安装成功,不想看到这种出错状况不要直接跳入第五步,先通读一下第四步,而后除了路径和环境变量不用加,其他的该拷贝仍是得拷贝~~~

首先将上一步生成的matcaffe加入matlab的路径中,直接在setpath里面设置

而后将release(若是你的caffe.sln是在Debug下生成的,就把Release换成Debug)加入系统变量path【手动copy进去就好了,我这里没加,由于我测试了一下貌似没啥效果,大家能够试试能够成功不】

【更新日志】在2016.10.18编译matlab2015b的接口,发现这一步仍是必须的,详细看第六步。

最后运行这个demo

遇到的就是我说的找不到caffe_的问题了

接下来我把这个\Build\x64\Release\matcaffe\+caffe\private这个文件夹里面的东西全都拷贝到\matlab\+caffe\private覆盖,而后遇到下面问题

第五步

暴力解决它,把\Build\x64\Debug下的全部的连接文件也就是dll文件也拷贝到这个文件夹去,原文件在这里

拷贝到\matlab\+caffe\private之后是这样

【更新日志】在2016.10.18试了一下matlab 2015b,结果仍是出现了

 

[plain] view plain copy

print?在CODE上查看代码片派生到个人代码片

  1. Invalid MEX-file 'E:\caffe-2015b\caffe-windows\matlab\+caffe\private\caffe_.mexw64': 找不到指  
  2. 定的程序。  
  3.   
  4. 出错 caffe.set_mode_cpu (line 5)  
  5. caffe_('set_mode_cpu');  
  6.   
  7. 出错 classification_demo (line 70)  
  8.   caffe.set_mode_cpu();  

而后试了许久才发现,仍是须要在第四步中加入对应的matcaffe根目录,好比我在编译matlab2015b的caffe接口的时候使用了Debug模式(即生成的matcaffe存在于Debug目录下),那么我在环境变量中仍是得添加E:\caffe-2015b\caffe-windows\Build\x64\Debug;,而后才解决了这个问题,比较奇怪的是,居然在matlab2013a和matlab2015b下都能使用matlab/demo/classification.m了。不过解决了就是好事嘛~~

【更新日志】在2016.12.26网友测试了matlab2016a,加上已知评论区的朋友,已知在matlab2016下配置成功了三台机器

按照matlab2015b的配置完毕之后,会出现

[plain] view plain copy

print?在CODE上查看代码片派生到个人代码片

  1. 错误使用 CHECK (line 4)  
  2. invalid Net handle  
  3.   
  4. 出错 caffe.Net (line 38)  
  5. CHECK(is_valid_handle(hNet_net), 'invalid Net handle');  
  6.   
  7. 出错 caffe.get_net (line 28)  
  8. net = caffe.Net(hNet);  
  9.   
  10. 出错 caffe.Net (line 33)  
  11. self = caffe.get_net(varargin{:});  
  12.   
  13. 出错 classification_demo (line 84)  
  14. net = caffe.Net(net_model, net_weights, phase);  

按照评论区网友@ zhaocaoou1435 的方法“这个问题能够经过在matlab里,把\caffe-master\matlab\+caffe\private文件夹点开,再从新运行就能够了”。

 

哈哈,感受这种解决办法好奇怪,原理暂时未知。

第六步

下载一下model文件放到caffe-master\models\bvlc_reference_caffenet文件夹下

下载地址  连接:http://pan.baidu.com/s/1geUv01l 密码:yp9p

标签文件以下

synset_words.txt地址:

连接:http://pan.baidu.com/s/1c24ty6W 密码:3z7y

测试一下效果,创建一个test.m测试文件,路径以下【忽视readlabel,我本身写的读文件,最后放到test.m里面了】

【最好在matlab里面加一下路径】

 

代码以下:

 

[html] view plain copy

print?在CODE上查看代码片派生到个人代码片

  1. %参考http://www.aichengxu.com/view/2422137  
  2. clear  
  3. clc  
  4.   
  5. im = imread('../../examples/images/cat.jpg');%读取图片  
  6. figure;imshow(im);%显示图片  
  7. [scores, maxlabel] = classification_demo(im, 0);%获取得分第二个参数0为CPU,1为GPU  
  8. maxlabel %查看最大标签是谁  
  9. figure;plot(scores);%画出得分状况  
  10. axis([0, 999, -0.1, 0.5]);%坐标轴范围  
  11. grid on %有网格  
  12.   
  13. fid = fopen('synset_words.txt', 'r');  
  14. i=0;  
  15. while ~feof(fid)  
  16.     i=i+1;  
  17.     lin = fgetl(fid);  
  18.     lin = strtrim(lin);  
  19.     if(i==maxlabel)  
  20.         fprintf('the label of %d is %s\n',i,lin)  
  21.         break  
  22.     end  
  23. end  


运行之,效果

 

相关文章
相关标签/搜索