1. 程式人生 > >【caffe-Windows】微軟官方caffe之 matlab介面配置

【caffe-Windows】微軟官方caffe之 matlab介面配置

前言

按照微軟的官方地址配置可能會出現一個問題caffe_.mexw64找不到引用模組問題,或者在matlab裡面壓根找不到caffe_這個函式,下面會提到這兩個問題。還是按照步驟來吧

【PS1】有GPU同樣按照下述步驟,進行即可

【PS2】文章在matlab2013a、matlab2014a、matlab2015b、matlab2016a中配置成功,但是在高版本或者更低版本情況下可能會出現問題

matlab2015b下載地址:連結:http://pan.baidu.com/s/1hsmlNeO 密碼:o1fu

【注】比較建議安裝matlab2015b和VS2013,因為如果涉及到混合程式設計,MATLAB2012之類的可能無法選擇VS2013的編譯器。

第一步

修改配置檔案,使之支援matlab介面,修改兩個地方,第一個是matlabsupport,第二個是matlabdir也就是你的matlab安裝目錄(對matlab桌面圖示右鍵屬性檢視):




【PS】最近Microsoft 的github貌似更新了matcaffe中的caffe_.cpp檔案,第十六行添加了對gpu/mxGPUArray.h的引用,可以在此步驟的IncludePath中新增MatlabDir,如下所示:

    <PropertyGroup Condition="'$(MatlabSupport)'=='true'">
        <MatlabDir>C:\Program Files\MATLAB\R2013a</MatlabDir>
        <LibraryPath>$(MatlabDir)\extern\lib\win64\microsoft;$(LibraryPath)</LibraryPath>
        <IncludePath>$(MatlabDir);$(MatlabDir)\extern\include;$(IncludePath)</IncludePath>
    </PropertyGroup>

然後修改matcaffe中的第十六行#include"gpu/mxGPUArray.h"中修改為

#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,結果還是出現了

Invalid MEX-file 'E:\caffe-2015b\caffe-windows\matlab\+caffe\private\caffe_.mexw64': 找不到指
定的程式。

出錯 caffe.set_mode_cpu (line 5)
caffe_('set_mode_cpu');

出錯 classification_demo (line 70)
  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的配置完畢以後,會出現

錯誤使用 CHECK (line 4)
invalid Net handle

出錯 caffe.Net (line 38)
CHECK(is_valid_handle(hNet_net), 'invalid Net handle');

出錯 caffe.get_net (line 28)
net = caffe.Net(hNet);

出錯 caffe.Net (line 33)
self = caffe.get_net(varargin{:});

出錯 classification_demo (line 84)
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地址:

連結:https://pan.baidu.com/s/1_cciKtw_a7Njyyn4Dm127g 密碼:zzzg

測試一下效果,建立一個test.m測試檔案,路徑如下【忽視readlabel,我自己寫的讀檔案,最後放到test.m裡面了】

【最好在matlab裡面加一下路徑】



程式碼如下:

%參考http://www.aichengxu.com/view/2422137
clear
clc

im = imread('../../examples/images/cat.jpg');%讀取圖片
figure;imshow(im);%顯示圖片
[scores, maxlabel] = classification_demo(im, 0);%獲取得分第二個引數0為CPU,1為GPU
maxlabel %檢視最大標籤是誰
figure;plot(scores);%畫出得分情況
axis([0, 999, -0.1, 0.5]);%座標軸範圍
grid on %有網格

fid = fopen('synset_words.txt', 'r');
i=0;
while ~feof(fid)
    i=i+1;
    lin = fgetl(fid);
    lin = strtrim(lin);
    if(i==maxlabel)
        fprintf('the label of %d is %s\n',i,lin)
        break
    end
end

執行之,效果