MatConvNet卷積神經網路(三)【影象滑動窗】
阿新 • • 發佈:2018-12-30
利用滑動窗搜尋影象中的特定內容
Matconvnet官方給出的神經網路分類器imagenet-googleNet-dag.mat已經具備了較強的識別能力,能識別1000種標籤。利用它再編寫一個滑動窗函式,即可實現對大影象的內容搜尋(如在一棵果樹上尋找果子)。
分析:
由於影象中目標物件的大小往往不同,所以採用多個不同尺寸的滑動視窗對影象進行處理。處理時,視窗由左向右,由上向下依照一定的步長逐次移動,每次移動,將框內的影象輸入神經網路進行處理,然後通過得到的結果做出相應。
在本例中,若分類得到的標籤號大於900(考慮到干擾,只需分類結果滿足為水果),且置信度大於0.90,則記錄該視窗的位置,在原圖上用黑框將這個位置標出。
首先先來編寫視窗尺寸不變的滑動窗函式:(MATLAB)
%slide.m
function [ out_image,n ] = slide( image, rows, cols, step,net ) %視窗尺寸不變的滑動窗函式 % 引數:影象變數矩陣,視窗行數,列數,步長,神經網路物件 輸出為符合要求的視窗的左上角的位置和個數 win = zeros(rows, cols, 3); out_image = zeros(1,2); n = 0; for i = 1:step:(size(image,1)-rows) %垂直滑動 for j = 1:step:(size(image,2)-cols) %水平滑動 win = image(i:i+rows-1,j:j+cols-1,:); %提取視窗 %imshow(win); im_ = single(win) ; % note: 0-255 range im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ; im_ = bsxfun(@minus, im_, net.meta.normalization.averageImage) ; % run the CNN net.eval({'data', im_}) ; % obtain the CNN otuput scores = net.vars(net.getVarIndex('prob')).value ; scores = squeeze(gather(scores)) ; % show the classification results [bestScore, best] = max(scores) ; if(best>940 && bestScore>0.80) %識別並判斷 n=n+1; out_image(n,:)=[i,j]; %儲存位置 [行數,列數] %pause; end end end end<u> </u>
接下來利用上面的函式,完成多尺寸視窗,並返回帶有黑框標記的影象,及黑框數量。
%var_slide.m
function [ out_image,sum ] = var_slide( image, mrows, mcols, lrows, lcols,net ) %返回具有黑框標記的影象,及黑框個數 % 輸入引數:影象矩陣,滑動窗的最小行數,最小列數,最大行數,最大列數,神經網路 out_image = image; sum = 0; winn = 1; if(winn==1) dr=0;dc=0; else dr = round((lrows-mrows)/(winn-1)); dc = round((lcols-mcols)/(winn-1)); end for i = 0:winn-1; [ locat, n ] = slide( image, mrows+dr*i, mcols+dc*i, round((mrows+dr*i)/2) ,net); sum = sum + n ; for k=1:n out_image(locat(k,1):(locat(k,1)-1+mrows+dr*i),locat(k,2),:)=0; out_image(locat(k,1):(locat(k,1)-1+mrows+dr*i),(locat(k,2)-1+mcols+dc*i),:)=0; out_image(locat(k,1),locat(k,2):(locat(k,2)-1+mcols+dc*i),:)=0; out_image((locat(k,1)-1+mrows+dr*i),locat(k,2):(locat(k,2)-1+mcols+dc*i),:)=0; end end
最後,寫指令碼完成最終功能
%test_slide.m
% setup MatConvNet
run matlab/vl_setupnn
% load the pre-trained CNN
net = dagnn.DagNN.loadobj(load('imagenet-googlenet-dag.mat')) ;
net.mode = 'test' ;
a = zeros(1,1);
a = input('Please input the pngs name.\n','s');
a = ['photos/',a];
% load and preprocess an image
im = imread(a);
addpath test;
[ out_image,n ] = var_slide( im, 100, 100, 100, 100, net );figure;imshow(out_image);
saveas(gcf,'myfig.jpg');
如果有什麼問題,歡迎在下面留言。