关于matconvnet的几个小程序(1)用滑动窗口框出树上的苹果

参考链接
考虑:matconvnet官方给出的神经网络分类器imagenet-googleNet-dag.mat已经具备了较强的识别能力,能识别1000种标签。利用它再编写一个滑动窗口函数,即可实现对大图像的内容搜索。(如现在我们想在一颗果树上寻找果子)

分析:
图像中目标对象的大小往往不同,所以采用多个不同尺寸的滑动窗口对图像进行处理。处理时,窗口由左向右,由上到下按照一定的步长逐次移动。每次移动,将框内的图像输入神经网络进行处理,然后通过得到的结果做出相应的处理。
在这里,若分类的标签号大于900(考虑到干扰,只需要分类结果满足为水果),且置信度大于0.9,则记录该窗口的位置,在原图上用黑框将这个位置标出。

首先是编写窗口尺寸不变的滑动窗函数: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 

接下来利用上面的函数,完成多尺度窗口,并且返回带有黑框标记的图像,以及黑框的数量。

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

效果图:
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用滑动窗口算法实现两个字符串的快速匹配的小程序示例: ```python def sliding_window(s1, s2): n = len(s1) m = len(s2) # 如果 s2 的长度大于 s1 的长度,则无法匹配 if m > n: return -1 # 统计 s2 中每个字符现的次数 s2_count = {} for c in s2: if c in s2_count: s2_count[c] += 1 else: s2_count[c] = 1 # 初始化滑动窗口和计数器 left = 0 right = 0 count = m # 遍历 s1 中的字符 for i in range(n): if s1[i] in s2_count: if s2_count[s1[i]] > 0: count -= 1 s2_count[s1[i]] -= 1 # 如果 count 为 0,则说明 s1 中存在 s2 的一个排列 if count == 0: while True: if s1[left] in s2_count: if s2_count[s1[left]] == 0: break s2_count[s1[left]] += 1 left += 1 if i - left + 1 == m: return left s2_count[s1[left]] += 1 left += 1 count += 1 return -1 ``` 在这个示例中,我们定义了一个 `sliding_window` 函数,它接受两个字符串 `s1` 和 `s2` 作为输入,并返回 `s2` 在 `s1` 中第一次现的位置。如果 `s2` 不是 `s1` 的子串,则返回 -1。 在函数中,我们首先比较 `s1` 和 `s2` 的长度,如果 `s2` 的长度大于 `s1` 的长度,则无法匹配,直接返回 -1。然后,我们统计 `s2` 中每个字符现的次数,并初始化滑动窗口和计数器。我们遍历 `s1` 中的字符,并检查每个字符是否现在 `s2` 中。如果现,我们将相应的计数器减少,并检查计数器是否为 0。如果计数器为 0,则说明 `s1` 中存在 `s2` 的一个排列,我们开始移动左指针,缩小窗口大小,直到计数器不为 0。如果窗口大小等于 `s2` 的长度,则说明我们找到了一个匹配,返回窗口的左侧位置。如果我们遍历完 `s1` 后仍然没有找到匹配,则返回 -1。 可以使用以下代码测试 `sliding_window` 函数: ```python s1 = 'abcbadef' s2 = 'abc' print(sliding_window(s1, s2)) # 输 0 s1 = 'abcbadef' s2 = 'bca' print(sliding_window(s1, s2)) # 输 -1 s1 = 'abcbadef' s2 = 'dfe' print(sliding_window(s1, s2)) # 输 5 ``` 希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值