1. 程式人生 > >MatConvNet卷積神經網路(三)【影象滑動窗】

MatConvNet卷積神經網路(三)【影象滑動窗】

利用滑動窗搜尋影象中的特定內容

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');

如果有什麼問題,歡迎在下面留言。