MatConvNet卷积神经网络(三)【图像滑动窗】

来源:互联网 发布:linux 发送arp广播包 编辑:程序博客网 时间:2024/06/05 06:31

利用滑动窗搜索图像中的特定内容

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    endendend<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));endfor 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;    endend

最后,写脚本完成最终功能

%test_slide.m

% setup MatConvNetrun  matlab/vl_setupnn% load the pre-trained CNNnet = 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 imageim = imread(a);addpath test;[ out_image,n ] = var_slide( im, 100, 100, 100, 100, net  );figure;imshow(out_image);saveas(gcf,'myfig.jpg');

如果有什么问题,欢迎在下面留言。




1 0
原创粉丝点击