使用matlab版卷及神经网络 MatconvNe和预训练的imageNet进行图像检Image retrieval using MatconvNet and pre-trained imageNet
代碼:CNN-for-Image-Retrieval。
2015/12/31更新:添加對MatConvNet最新版version 1.0-beta17的支持,預(yù)訓(xùn)練的模型請到Matconvnet官網(wǎng)下載最新的模型。
2015/10/20更新:Web演示部分代碼公開CNN-Web-Demo-for-Image-Retrieval。
2015/09/24更新:添加對MatConvNet最新版version 1.0-beta14的支持。
2015/06/29更新:添加對MatConvNet最新版version 1.0-beta12的支持。
注意:其中文件夾matconvnet-1.0-beta17是已經(jīng)編譯好了的,鑒于MatConvNet只能在Matlab 2014及其以上以及系統(tǒng)必須是64位,所以在使用此工具箱之前得滿足這兩個條件。如果是Pythoner,推薦使用flask-keras-cnn-image-retrieval,純Python,非常易于寫成在線圖像搜索應(yīng)用。
MatConvNet is a MATLAB toolbox implementing Convolutional Neural Networks (CNNs) for computer vision applications. It is simple, efficient, and can run and learn state-of-the-art CNNs. Several example CNNs are included to classify and encode images.
MatConvNet是Andrea Vedaldi用Matlab開發(fā)的一個卷積網(wǎng)絡(luò)工具包,相比于Caffe,這個工具包配置比較簡單,而且最近這兩年,vgg小組在深度學(xué)習(xí)領(lǐng)域也是成績斐然。關(guān)于MatConvNet的文檔,可以查看MatConvNet Convolutional Neural Networks for MATLAB以及在線文檔。這里我們主要講講怎么配置MatConvNet以及怎樣利用在imageNet上已經(jīng)訓(xùn)練好的模型抽取特征并進行圖像檢索。
MatConvnet配置
首先,下載MatConvNet,怎么下載這個自己看著辦,如果你有g(shù)ithub的賬號,推薦你star一下它,既然都用它了,不給個star好意思么(哈哈~)。下載完后,解壓,移到某處,本小子自己將它放在D:\matlabTools\目錄下,打開matlab,進入到D:\matlabTools\matconvnet-1.0-beta10目錄下,然后在matlab命令窗下輸入以下命令進行mex編譯:
addpath matlab vl_compilenn如果沒出什么問題的話,會在你的matconvnet-1.0-beta10\matlab文件夾下多出幾個文件夾,其中最重要的是mex,mex文件夾里有編譯完成的mex文件vl_imreadjpeg.mexw64,vl_nnconv.mexw64,vl_nnnormalize.mexw64,vl_nnpool.mexw64說明編譯成功。
注意:如果編譯失敗,可能的原因是你的matlab版本有點低(我在matlab2012b上沒有編譯成功),這個我查看了一下github上得issures,發(fā)覺也有人碰到這樣的問題。另外根據(jù)Andrea Vedaldi在error in compiling CPU version with windows 7 + matlab 2014a說的:
Hi, we never tested a 32-bit build. Is there a particular reason why you are not running MATLAB 64 bit? Note that MATLAB 32 bit will be phased out by Mathwork in one of the upcoming releases. There does not seem much incentive in creating a 32 bit version of the code, although I am sure it could be done with relatively little effort. Also, in most applications of deep learning 4GB of addressable memory seem a little too little.
所以建議使用64位的matlab,此外在編譯的時候,確認mex是否在matlab命令窗里可用,不行的話就setup吧,我用的是vs2010的編譯器。
上面這一步完成了,基本就配置完了,下面就測試一下MatConvNet吧。測試的腳本見http://www.vlfeat.org/matconvnet/pretrained/給出的腳本例子,即:
% install and compile MatConvNet (needed once) untar('http://www.vlfeat.org/matconvnet/download/matconvnet-1.0-beta17.tar.gz') ; cd matconvnet-1.0-beta17 run matlab/vl_compilenn% download a pre-trained CNN from the web (needed once) urlwrite(...'http://www.vlfeat.org/matconvnet/models/imagenet-vgg-f.mat', ...'imagenet-vgg-f.mat') ;% setup MatConvNet run matlab/vl_setupnn% load the pre-trained CNN net = load('imagenet-vgg-f.mat') ;% load and preprocess an image im = imread('peppers.png') ; im_ = single(im) ; % note: 0-255 range im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ; im_ = im_ - net.meta.normalization.averageImage ;% run the CNN res = vl_simplenn(net, im_) ;% show the classification result scores = squeeze(gather(res(end).x)) ; [bestScore, best] = max(scores) ; figure(1) ; clf ; imagesc(im) ; title(sprintf('%s (%d), score %.3f',... net.meta.classes.description{best}, best, bestScore)) ;上面用的是urlwrite來下載imagenet-vgg-f.mat的,這里強烈推薦你單獨下載,然后把urlwrite下載的那一行去掉,load時指向你放置的imagenet-vgg-f.mat具體位置即可。測試如果順利的話,就可以進入下一節(jié)我們真正關(guān)心的圖像減速話題了。
用已訓(xùn)練模型抽取特征
在抽取特征之前,有必要稍微先來了解一下imagenet-vgg-f這個模型。這里稍微啰嗦一下上面的那個測試腳本,im_ = imresize(im_, net.normalization.imageSize(1:2))將圖像縮放到統(tǒng)一尺寸,即224*224的大小,這點你可以看看net中normalization.imageSize,而且還必須為彩色圖像。res有22個struct,從第17到20的struct分別是4096位,最后第21到22個struct是1000維的,是4096維經(jīng)過softmax后的結(jié)果,這里我們要用的是第20個struct的數(shù)據(jù)(自己測過第19個struct,檢索效果比采用第20個struct的特征差)。這個網(wǎng)絡(luò)有8層構(gòu)成,從第6層到第8層都是全連接層。關(guān)于這個網(wǎng)絡(luò)的結(jié)構(gòu),暫時到這里。
大致了解了這個網(wǎng)絡(luò)結(jié)構(gòu)后,我們便可以使用該網(wǎng)絡(luò)抽取圖像的特征了,抽取特征的代碼(完整的圖像檢索代碼見文末最后給出的鏈接)如下:
% Author: Yong Yuan % Homepage: yongyuan.nameclear all;close all;clc;% version: matconvnet-1.0-beta17 %run ./matconvnet-1.0-beta17/matlab/vl_compilenn run ./matconvnet-1.0-beta17/matlab/vl_setupnn%% Step 1 lOADING PATHS path_imgDB = './database/'; addpath(path_imgDB); addpath tools;% viesion: matconvnet-1.0-beta17 net = load('imagenet-vgg-f.mat') ;%% Step 2 LOADING IMAGE AND EXTRACTING FEATURE imgFiles = dir(path_imgDB); imgNamList = {imgFiles(~[imgFiles.isdir]).name}; clear imgFiles; imgNamList = imgNamList';numImg = length(imgNamList); feat = []; rgbImgList = {};%parpool;%parfor i = 1:numImg for i = 1:numImgoriImg = imread(imgNamList{i, 1});if size(oriImg, 3) == 3im_ = single(oriImg) ; % note: 255 rangeim_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;im_ = im_ - net.meta.normalization.averageImage ;res = vl_simplenn(net, im_) ;% viesion: matconvnet-1.0-beta17featVec = res(20).x;featVec = featVec(:);feat = [feat; featVec'];fprintf('extract %d image\n\n', i);elseim_ = single(repmat(oriImg,[1 1 3])) ; % note: 255 rangeim_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;im_ = im_ - net.meta.normalization.averageImage ;res = vl_simplenn(net, im_) ;% viesion: matconvnet-1.0-beta17featVec = res(20).x;featVec = featVec(:);feat = [feat; featVec'];fprintf('extract %d image\n\n', i);end endfeat_norm = normalize1(feat); save('feat4096Norml.mat','feat_norm', 'imgNamList', '-v7.3');在倒數(shù)第二行,對特征進行了L2歸一化,方便后面用余弦距離度量,L2歸一化方法如下:
function [X] = normalize1(X) % X:n*dfor i=1:size(X,1)if(norm(X(i,:))==0)elseX(i,:) = X(i,:)./norm(X(i,:));end end上面便是特征抽取的代碼,特征抽取完后,我們便可以采用進行檢索了。匹配時采用的是余弦距離度量方式,至于后面的檢索部分的代碼,相比于前面特征抽取的過程,更顯靈活,怎么處理可以隨自己的喜歡了,所以這里就不再對代碼進行列舉了。下面是我在corel1k外加上Caltech256抽取幾類構(gòu)成1333張圖像庫做的一個飛機檢索結(jié)果,時間所限,就不測大的圖像庫了。
示例:Caltech-256圖像數(shù)據(jù)庫
Caltech-256圖像數(shù)據(jù)庫上搜索結(jié)果最后,整個圖像檢索的代碼已放在github上了,感興趣的同學(xué)可以去CNN-for-Image-Retrieval,有g(shù)ithub的同學(xué)不要吝嗇你的star哦,這個代碼我會隨時完善更新,比如添加計算mAP的代碼。
from: http://yongyuan.name/blog/image-retrieval-using-MatconvNet-and-pre-trained-imageNet.html
總結(jié)
以上是生活随笔為你收集整理的使用matlab版卷及神经网络 MatconvNe和预训练的imageNet进行图像检Image retrieval using MatconvNet and pre-trained imageNet的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开源图像检索项目PicSearch is
- 下一篇: 梯度方向直方图和物体检测Histogra