MatConvNet使用入門之基礎篇
阿新 • • 發佈:2019-01-09
深度學習在object tracking中的使用也越來越多,從去年的VOT結果來看,很多tracker都應用了convolution feature,整體效果都比之前的方法提高了一大截,所以學習deep learning需要提上日程了。看了HCF以及C-COT的原始碼,都運用到了matlab的深度學習工具---MatConvNet,所以關於它的使用瞭解了一番。
1、首先是下載,可以到http://www.vlfeat.org/matconvnet/去下載,不過C-COT的作者Martin大神的原始碼的說明文件readme中也提供了github的下載連結
2、通過執行 mex -setup 來設定matlab的C++編譯器(VS2010 or greater)
3、將MatConvNet的path加到matlab路徑中去
cd matconvnet-master
addpath matlab
4、需要Compile MatConvNet。
vl_compilenn
當然,最好是寫一個檔案,執行3.4步。
比如,CompileCPU.m
% Compiling for CPU
addpath matlab
vl_compilenn
如果想應用GPU計算,需要寫成CompileGPU.m
addpath matlab vl_compilenn('enableGpu', true,... 'cudaRoot', '/Developer/NVIDIA/CUDA-6.5', ...%自己安裝的CUDA的路徑 'cudaMethod', 'nvcc', ... 'enableCudnn', true, ... 'cudnnRoot', 'local/cudnn-rc2') ;
這裡需要注意,目前MatConvNet只支援英偉達的顯示卡,我看了一下我的桌上型電腦的顯示卡是intel的整合顯示卡,不能用,汗。所以,這裡還是先介紹在CPU下進行處理的方式。
5、載入預訓練的模型。
需要從官網下載一個network(也就是 a pre-trained CNN)
6、setup MatConvNet。
run matlab/vl_setupnn
7、 load the pre-trained CNN。
net = load('D:\MenghanZhou\matlab_work\ToolsBoxes\networks\imagenet-vgg-m-2048.mat');
這裡的net是一個預訓練模型,是一個線性鏈組成的網路。它是一個結構體的形式:
其中,layers有21層(不同的預訓練模型的卷積層數目不同)
meta包含3個結構體
classes是已經訓練好的模型對事物的1000種分類。
---------------------------我是分割線-----------------------------
來看一個例子,利用VGG已經訓練好的模型對這張圖片分類。
程式碼如下:
%將pepper.png這張圖按照模型,根據得分確定最應該屬於的類別
run matlab/vl_setupnn
net = load('D:\MenghanZhou\matlab_work\ToolsBoxes\networks\imagenet-vgg-m-2048.mat');
im = imread('peppers.png');
im_ = single(im);
im_ = imresize(im_,net.meta.normalization.imageSize(1:2));%縮放到224*224大小
im_ = im_ - net.meta.normalization.averageImage;%減去均值
res = vl_simplenn(net,im_);%res包含了計算結果,以及中間層的輸出 最後一層可以用來分類
y = res(end).x;%最後一層
x = gather(res(end).x);
score = squeeze(gather(res(end).x));%分屬於每個類別的分數
[bestScore, best] = max(score);
figure(1);
clf;
imshow(im);
title(sprintf('%s %d,%.3f',net.meta.classes.description{best},best,bestScore));%net.meta.classes.description裡存放的是很多種類別的名稱
這樣,我們就可以得到下面的結果:
這說明,這張圖片屬於1000中類別中的pepper,而且屬於這個類別的概率為0.979。