微軟官方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  


運行之,效果

 

相關文章
相關標籤/搜索