在MATLAB下除錯Caffe
阿新 • • 發佈:2019-01-06
MATLAB則是非常適合演算法設計、快速迭代的利器,只需要做少量工作就能編寫出複雜的演算法,除錯非常方便,位於workspace中的變數隨時都能列印,無論是一維、二維還是三維資料,都能直觀顯示,從而有利於定位演算法設計問題,減少除錯時間。
Caffe中有兩種Wrapper:Python和MATLAB。Python是開源工具,使用者無需付費即可使用,缺點是語法不夠靈活,尤其演算法描述,與商業軟體不能比。MATLAB支援幾乎你所知道的所有矩陣變換、數值計算、隨機過程、概率論、最優化、自適應濾波、影象處理、神經網路等演算法。
下面介紹如何用MATLAB除錯Caffe。本文假設作業系統為Ubuntu 14.04.1 64bit .
1. 安裝MATLAB R2014A
可以到這裡下載(http://yunpan.taobao.com/s/ZFLGQjNABU,提取碼:dxBxMJ)
安裝步驟類似Windows,不表。安裝到~/MATLAB/,~/.bashrc中新增 export PATH=~/MATLAB/bin:$PATH
2. 安裝Caffe
參考步驟: http://caffe.berkeleyvision.org/install_apt.html。其他OS請參考http://caffe.berkeleyvision.org/installation.html。
如果你希望自己編譯依賴,可以到這裡下載Caffe所有依賴包(http://yunpan.taobao.com/s/1I1TXcPYsk3,提取碼:yuqZm1)
3. 編譯 MatCaffe
修改Makefile.config,加上這一句:
MATLAB_DIR := ~/MATLAB
之後
make matcaffe
生成了 matlab/+caffe/private/caffe_.mex64,可以直接被MATLAB呼叫。
4. 執行MATLAB例子
在命令列中,配置好Caffe執行所需要的環境變數後(否則matcaffe會執行失敗),輸入matlab&,這樣就啟動了MATLAB視窗。
在MATLAB命令視窗中進行以下步驟。
>> cd Caffe_root_directory/
切換到了Caffe根目錄。
>> addpath('./matlab/+caffe/private');
新增matcaffe模組所在路徑到MATLAB搜尋路徑,便於載入。
>> cd matlab/demo/
切到demo目錄。
>> im = imread('../../examples/images/cat.jpg');
讀取一張測試圖片。
>> figure;imshow(im);
彈出一個視窗,顯示貓的測試圖片如下:
>> [scores, maxlabel] = classification_demo(im, 1);
Elapsed time is 0.533388 seconds.
Elapsed time is 0.511420 seconds.
Cleared 0 solvers and 1 stand-alone nets
執行分類demo程式。分類的結果返回到scores,maxlabel兩個工作空間變數中。
>> maxlabel
maxlabel =
282
說明最大分類概率的標籤號為282,查詢ImageNet標籤,對應的是n02123045 tabby, tabby cat(data/ilsvrc2012/synset_words.txt)
>> figure;plot(scores);
>> axis([0, 999, -0.1, 0.5]);
>> grid on
列印scores,一維影象如下:
說明這張圖片被分到第282類的概率為0.2985。
到這裡我們只是運行了簡單的demo,接下來分析classification_demo.m這個檔案內容。
Caffe中有兩種Wrapper:Python和MATLAB。Python是開源工具,使用者無需付費即可使用,缺點是語法不夠靈活,尤其演算法描述,與商業軟體不能比。MATLAB支援幾乎你所知道的所有矩陣變換、數值計算、隨機過程、概率論、最優化、自適應濾波、影象處理、神經網路等演算法。
下面介紹如何用MATLAB除錯Caffe。本文假設作業系統為Ubuntu 14.04.1 64bit .
1. 安裝MATLAB R2014A
可以到這裡下載(http://yunpan.taobao.com/s/ZFLGQjNABU,提取碼:dxBxMJ)
安裝步驟類似Windows,不表。安裝到~/MATLAB/,~/.bashrc中新增 export PATH=~/MATLAB/bin:$PATH
2. 安裝Caffe
參考步驟:
如果你希望自己編譯依賴,可以到這裡下載Caffe所有依賴包(http://yunpan.taobao.com/s/1I1TXcPYsk3,提取碼:yuqZm1)
3. 編譯 MatCaffe
修改Makefile.config,加上這一句:
MATLAB_DIR := ~/MATLAB
之後
make matcaffe
生成了 matlab/+caffe/private/caffe_.mex64,可以直接被MATLAB呼叫。
4. 執行MATLAB例子
在命令列中,配置好Caffe執行所需要的環境變數後(否則matcaffe會執行失敗),輸入matlab&,這樣就啟動了MATLAB視窗。
在MATLAB命令視窗中進行以下步驟。
>> cd Caffe_root_directory/
切換到了Caffe根目錄。
>> addpath('./matlab/+caffe/private');
新增matcaffe模組所在路徑到MATLAB搜尋路徑,便於載入。
>> cd matlab/demo/
切到demo目錄。
>> im = imread('../../examples/images/cat.jpg');
讀取一張測試圖片。
>> figure;imshow(im);
彈出一個視窗,顯示貓的測試圖片如下:
>> [scores, maxlabel] = classification_demo(im, 1);
Elapsed time is 0.533388 seconds.
Elapsed time is 0.511420 seconds.
Cleared 0 solvers and 1 stand-alone nets
執行分類demo程式。分類的結果返回到scores,maxlabel兩個工作空間變數中。
>> maxlabel
maxlabel =
282
說明最大分類概率的標籤號為282,查詢ImageNet標籤,對應的是n02123045 tabby, tabby cat(data/ilsvrc2012/synset_words.txt)
>> figure;plot(scores);
>> axis([0, 999, -0.1, 0.5]);
>> grid on
列印scores,一維影象如下:
說明這張圖片被分到第282類的概率為0.2985。
到這裡我們只是運行了簡單的demo,接下來分析classification_demo.m這個檔案內容。
function [scores, maxlabel] = classification_demo(im, use_gpu)
% [scores, maxlabel] = classification_demo(im, use_gpu)
% 使用BVLC CaffeNet進行影象分類的示例
% 重要:執行前,應首先從Model Zoo(http://caffe.berkeleyvision.org/model_zoo.html) 下載BVLC CaffeNet訓練好的權值
%
% ****************************************************************************
% For detailed documentation and usage on Caffe's Matlab interface, please
% refer to Caffe Interface Tutorial at
% http://caffe.berkeleyvision.org/tutorial/interfaces.html#matlab % ****************************************************************************
%
% input
% im color image as uint8 HxWx3
% use_gpu 1 to use the GPU, 0 to use the CPU
%
% output
% scores 1000-dimensional ILSVRC score vector
% maxlabel the label of the highest score
%
% You may need to do the following before you start matlab:
% $ export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/usr/local/cuda-5.5/lib64
% $ export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
% Or the equivalent based on where things are installed on your system
%
% Usage:
% im = imread('../../examples/images/cat.jpg');
% scores = classification_demo(im, 1);
% [score, class] = max(scores);
% Five things to be aware of:
% caffe uses row-major order
% matlab uses column-major order
% caffe uses BGR color channel order
% matlab uses RGB color channel order
% images need to have the data mean subtracted
% Data coming in from matlab needs to be in the order
% [width, height, channels, images]
% where width is the fastest dimension.
% Here is the rough matlab for putting image data into the correct
% format in W x H x C with BGR channels:
% % permute channels from RGB to BGR
% im_data = im(:, :, [3, 2, 1]);
% % flip width and height to make width the fastest dimension
% im_data = permute(im_data, [2, 1, 3]);
% % convert from uint8 to single
% im_data = single(im_data);
% % reshape to a fixed size (e.g., 227x227).
% im_data = imresize(im_data, [IMAGE_DIM IMAGE_DIM], 'bilinear');
% % subtract mean_data (already in W x H x C with BGR channels)
% im_data = im_data - mean_data;
% If you have multiple images, cat them with cat(4, ...)
% Add caffe/matlab to you Matlab search PATH to use matcaffe
if exist('../+caffe', 'dir')
addpath('..');
else
error('Please run this demo from caffe/matlab/demo');
end
% Set caffe mode
if exist('use_gpu', 'var') && use_gpu
caffe.set_mode_gpu();
gpu_id = 0; % we will use the first gpu in this demo
caffe.set_device(gpu_id);
else
caffe.set_mode_cpu();
end
% Initialize the network using BVLC CaffeNet for image classification
% Weights (parameter) file needs to be downloaded from Model Zoo.
model_dir = '../../models/bvlc_reference_caffenet/'; % 模型所在目錄
net_model = [model_dir 'deploy.prototxt']; % 模型描述檔案,注意是deploy.prototxt,不包含data layers
net_weights = [model_dir 'bvlc_reference_caffenet.caffemodel']; % 模型權值檔案,需要預先下載到這裡
phase = 'test'; % run with phase test (so that dropout isn't applied) % 只進行分類,不做訓練
if ~exist(net_weights, 'file')
error('Please download CaffeNet from Model Zoo before you run this demo');
end
% Initialize a network
net = caffe.Net(net_model, net_weights, phase); % 初始化網路
if nargin < 1
% For demo purposes we will use the cat image
fprintf('using caffe/examples/images/cat.jpg as input image\n');
im = imread('../../examples/images/cat.jpg'); % 獲取輸入影象
end
% prepare oversampled input
% input_data is Height x Width x Channel x Num
tic;
input_data = {prepare_image(im)}; % 影象冗餘處理
toc;
% do forward pass to get scores
% scores are now Channels x Num, where Channels == 1000
tic;
% The net forward function. It takes in a cell array of N-D arrays
% (where N == 4 here) containing data of input blob(s) and outputs a cell
% array containing data from output blob(s)
scores = net.forward(input_data); % 分類,得到scores
toc;
scores = scores{1};
scores = mean(scores, 2); % 取所有分類結果的平均值
[~, maxlabel] = max(scores); % 找到最大概率對應的標籤號
% call caffe.reset_all() to reset caffe
caffe.reset_all();
% ------------------------------------------------------------------------
function crops_data = prepare_image(im)
% ------------------------------------------------------------------------
% caffe/matlab/+caffe/imagenet/ilsvrc_2012_mean.mat contains mean_data that
% is already in W x H x C with BGR channels
d = load('../+caffe/imagenet/ilsvrc_2012_mean.mat');
mean_data = d.mean_data;
IMAGE_DIM = 256;
CROPPED_DIM = 227;
% Convert an image returned by Matlab's imread to im_data in caffe's data
% format: W x H x C with BGR channels
im_data = im(:, :, [3, 2, 1]); % permute channels from RGB to BGR
im_data = permute(im_data, [2, 1, 3]); % flip width and height
im_data = single(im_data); % convert from uint8 to single
im_data = imresize(im_data, [IMAGE_DIM IMAGE_DIM], 'bilinear'); % resize im_data
im_data = im_data - mean_data; % subtract mean_data (already in W x H x C, BGR)
% oversample (4 corners, center, and their x-axis flips)
crops_data = zeros(CROPPED_DIM, CROPPED_DIM, 3, 10, 'single');
indices = [0 IMAGE_DIM-CROPPED_DIM] + 1;
n = 1;
for i = indices
for j = indices
crops_data(:, :, :, n) = im_data(i:i+CROPPED_DIM-1, j:j+CROPPED_DIM-1, :);
crops_data(:, :, :, n+5) = crops_data(end:-1:1, :, :, n);
n = n + 1;
end
end
center = floor(indices(2) / 2) + 1;
crops_data(:,:,:,5) = ...
im_data(center:center+CROPPED_DIM-1,center:center+CROPPED_DIM-1,:);
crops_data(:,:,:,10) = crops_data(end:-1:1, :, :, 5);