风机桨叶故障诊断(七) 滑动窗与非极大值抑制NMS

风机桨叶故障诊断(七)滑动窗与非极大值一直NMS


     到目前为止,我已经利用自编码神经网络提取特征后训练得到了BP神经网络(参见:点击打开链接),且在测试样本集上表现不错。下面我们就要应用到实际中来检验算法的好坏了。

     在目标检测的问题中,当我们有了一个算法来判断一幅图像是否为目标物体时,在一幅大图像中寻找目标物体,通常且比较简单的方法是使用滑动窗(Sliding windows)。

     滑动窗很好理解,首先使用一个指定大小的检测窗口,从图像左上角开始,进行等间距的滑动,每次滑动的间距根据实际情况人为确定,每到一个位置,将窗口中对应的图像(窗口的大小很可能与算法的输入不同,这时我们需要缩放到统一的尺寸)输入我们的算法中,算法会给出这个窗口中的图像是否为我们的目标物体。直至滑动窗沿图像的横竖两个方向遍历了一遍后,我们就完成了某一个尺度窗口的滑动,如下图所示:

  

     然后我们要做的是,变换滑动窗口的尺度,也就是滑动窗的大小。然后使用不同的尺度重复上面的工作。这里尺度大小的范围,变化的比例,滑动窗滑动的间距都是根据实际情况人为设定的。

     我们的滑动窗每到一个位置,算法都会给出对于这个窗口是否属于目标物体的一个打分,我们的输出神经元使用的是sigmoid传递函数,所以神经网络给出了我们一个0~1之间的打分。当这个分数高于我们之前设定的某个阈值比如0.7时,我们认为这个图像就是我们寻找的目标物体,我们需要记录下当前窗口的位置信息和对应的分数,以便后面进行非极大值抑制时使用。

     所以,当我们的滑动窗算法运行完毕后,我们应该得到的就是关于所有计算机认为包含所寻找的目标物体的窗口的信息,以一个矩阵来记录,那么每行所要包含的信息是:[左上顶点x坐标,左上顶点y坐标,右下x坐标,右下y坐标,得分]

     下面是针对我的问题的matlab滑动窗实现代码,大家如果使用需要根据实际情况修改部分代码。函数需要提供一幅待检测的完整图像,和我们预测算法所需的信息,对于我们的神经网络也就是权值矩阵了。

     滑动窗算法函数:

function [ location ] = ValidateImage( Theta1, Theta2,  Theta3,image )
%验证一幅灰度图像中所有桨叶的可能位置
%返回描述所有桨叶位置的矩阵。每一行记录 横坐标 纵坐标 分数imageWid=size(image,2);
imageHigh=size(image,1);location=[];
for width=250:75:400for i=1:35:imageHigh-widthfor j=1:35:imageWid-widthtempImage=image(i:i+width-1,j:j+width-1);%灰度矩阵转列向量(逐列扫描)tempImage=Resize(tempImage, 25,25 );X=reshape(tempImage,625,1);result=PredictPaddle( Theta1, Theta2,  Theta3,X' );if result>=0.6location=[location;i,j,i+width,j+width,result];endendend
endend

     神经网络的预测函数:

function [ p ] = PredictPaddle( Theta1, Theta2,  Theta3,X )
%判断一幅图片是否为桨叶(以向量或矩阵的形式输入图像,请归一化到25×25灰度图后展开成行向量输入)m = size(X, 1);
p = zeros(size(X, 1), 1);h1 = sigmoid([ones(m, 1) X] * Theta1');
h2 = sigmoid([ones(m, 1) h1] * Theta2');
h3 = sigmoid([ones(m, 1) h2] * Theta3');p=h3;end

     运行我们的滑动窗算法,可以得到类似于下图的识别图像:


     可以看到,我们的算法很好的找到了目标的位置,但是对于同一目标,有很多相似且重叠的窗口覆盖在一起。我们选出所有的窗口进行下一步的识别是没有意义的,显然前辈们也可肯定不是这么做的。在一个研究生学长的指点下,我了解到了一个叫做“非极大值抑制(Non-maximun suppression)”的算法,是专门来解决这类问题的。然后我搜到了下面两篇blog进行学习,后面我给出的实现代码也是直接在原作者给出的代码上进行的修改和注释。

http://blog.csdn.net/h2008066215019910120/article/details/25917609

http://blog.csdn.net/pb09013037/article/details/45477591

     我来描述一下我对与“非极大值抑制”的个人理解。首先无论面对什么物体的识别问题,我们现在得到的都是很多个被认为包含目标物体的窗口,并且我们记录了它们的位置信息和分数信息。非极大值抑制中的这个“值”指的就是窗口的得分,因为我们的处于0~1之间的得分也可以理解为我们的算法认为这个窗口内包含目标物体的概率,或者自信程度。得分0.99自然比得分0.7更有可能是更好的包含目标物体的窗口,所以非极大值抑制就是想在窗口相互重叠的局部区域内选出得分的极大值代表的窗口,而抑制不是局部极大值的窗口。这样最后剩下的都是每个局部区域内得分最高的窗口,不会出现过多的重叠情况。

     算法需要两个输入参数,一个参数boxs是记录窗口位置和得分信息的,boxs的每一行的格式为[左上顶点x坐标,左上顶点y坐标,右下x坐标,右下y坐标,得分],所以到这里我们明白,上面滑窗时这样格式化输出就是为了与这里进行对应。还有要注意的是,上面的博客中对于这个参数的描述[x,y,width,height ,score ]对应于他给的代码是错误的。

     另一个参数overlap是人为选定的覆盖率。这是什么意思?我们上面对于非极大值抑制算法的描述有一个概念一直是模糊的,什么是局部?在这里我们定义:两个窗口重叠

分的面积除以两个窗口中较小的面积=覆盖率overlap。那么覆盖率其实就可以用来描

述这个局部的概念。我们可以认为覆盖率大于某一个阈值后,两个窗口处于同一个局部

个人感觉这个overlap的选取和实际问题是有关系的,在我们的问题中,不同的桨叶的

窗口是不可能相互挨着的,所以我把overlap取的较小数0.1。


    matlab实现代码如下:

function pick = nms(boxes, overlap)
% pick = nms(boxes,overlap)% boxs 用来记录所有潜在目标窗口的信息,每一行对应[x,y,x+width,y+height ,score ],
% 即左上角,右下角两定点坐标+系统对于当前窗口是目标物体可能性的打分0~1% overlap是介于0~1的实数% Non-maximumsuppression. 非极大值抑制
% Greedily selecthigh-scoring detections and skip detections
% that are significantlycovered by a previously selected detection.
% 贪婪选择:得分检测和跳跃检测(被十分重要的包含于预先选择检测的步骤中)% boxes = boxes';if isempty(boxes)pick = [];
elsex1 = boxes(:,1);y1 = boxes(:,2);x2 = boxes(:,3);y2 = boxes(:,4);%得分s = boxes(:,end);area = (x2-x1+1) .* (y2-y1+1);%结果为一列向量,记录每一个窗口面积%将分数按从小到大排序% vals:重拍后的分数% I:重排后每个位置对应的原位置的索引[vals, I] = sort(s);pick = [];while ~isempty(I)last = length(I);%分数最高窗口的索引i = I(last);pick = [pick; i];suppress = [last];for pos = 1:last-1j = I(pos);%求当前窗口与分数最高窗口重叠部分对应矩形的信息xx1 = max(x1(i), x1(j));yy1 = max(y1(i), y1(j));xx2 = min(x2(i), x2(j));yy2 = min(y2(i), y2(j));w = xx2-xx1+1;h = yy2-yy1+1;if w > 0 && h > 0%说明存在重叠部分% compute overlap 计算重叠比例(重叠面积/当前两个窗口面积较小的那个的面积)o = w * h / min(area(i),area(j));
%                 o = w/area(j);if o > overlap%覆盖率超过设定值,加入抑制窗口列表suppress = [suppress; pos];endendend%将被抑制的窗口清空I(suppress) = [];end
end
 

    我们来看一下使用非极大值抑制后,桨叶识别的效果。



  

    我们可以看到,“非极大值抑制”的效果还是不错的。到目前为止,我们已经基本完

成了对桨叶识别的目标,对于每一幅图,都能保证定位到1-2个桨叶,当然客观的说,

还是存在一些问题,比如我们框出的目标物体不能保证包含整个桨叶,只能说是大部分

区域,如果有可能,后期还会继续完善我们的系统。

    今天又学到不少,继续加油微笑


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Distinctive Image Features from Scale-Invariant Keypoints-SIFT算法译文

本文全篇转载自如下博客,感谢博主的无私分享 http://www.cnblogs.com/cuteshongshong/archive/2012/05/25/2506374.html ------------------------------------------------------------------------------------------------------ 从尺度不变的关键点选择可区分的…

将图像绘制成3维立体散点图

matlab源代码: Iimread(F:\绝缘子识别\绝缘子红外test图片\test (50).jpg); Irgb2gray(I); [wd,len]size(I); interval10; %设置绘制散点图的间隔,全部绘出会很卡 x[]; y[]; z[]; numfloor((len-1)/interval)1;%计算在当前间隔下图像的每一行…

二叉树的非递归遍历|前中后序遍历

二叉树的非递归遍历 文章目录 二叉树的非递归遍历前序遍历-栈层序遍历-队列中序遍历-栈后序遍历-栈 前序遍历-栈 首先我们应该创建一个Stack 用来存放节点,首先我们想要打印根节点的数据,此时Stack里面的内容为空,所以我们优先将头结点加入S…

C#灰度图转伪彩色图

/// <summary>/// 伪彩色图像构造器/// </summary>public class PseudoColorImageBuilder{/// <summary>/// 铁红色带映射表/// 每一行代表一个彩色分类&#xff0c;存放顺序是RGB/// </summary>public static byte[,] ironTable new byte[128, 3] {{…

砥志研思SVM(二) 拉格朗日乘子法与KKT条件

[1]最优化问题中的对偶性理论 [2]拉格朗日乘子法(上) [3]拉格朗日乘子法(下)

VS2015上配置opencv2.4.11

VS2015上配置opencv2.4.11版方法总结 最近给电脑重装了系统&#xff0c;需要的软件各种装。今天阅读了很多网上的博客&#xff0c;几经波折完成了opencv的配置。配置opencv与其他函数包或者软件相比算是麻烦的了&#xff0c;可能出现的问题也是五花八门&#xff0c;所以针对我的…

热传导方程的差分格式原理与matlab实现

function [ ] ParabolicEquation( h,k ) %求解抛物型方程中的一种&#xff1a;热传导方程 %h:x轴步长 %k:t轴步长rk/(h*h);%网格比 Mxfloor(1.0/h)1;%网格在x轴上的节点个数&#xff08;算上0&#xff09; Ntfloor(1.0/k)1;%网格在t轴上的节点个数&#xff08;算上0&#xff…

如何开发一个扫雷小游戏?

如何用C#开发一个扫雷小游戏&#xff1f; 十分自豪的说&#xff0c;计算机编程就是变魔术&#xff0c;每一个coder都是一个魔术师。 初学C#的时候&#xff0c;我相信很多人都和我一样&#xff0c;学会了基本语法&#xff0c;掌握了基本的数据结构&#xff0c;也见过了不少微软…

在emIDE中创建STM32项目

&#xfeff;emIDE是一个开源的嵌入式集成开发环境&#xff0c;基于Code::Blocks开发&#xff0c;能够支持多个平台和多个厂家的嵌入式硬件&#xff0c;继承了Code::Blocks的优点。 下载emIDE并安装&#xff0c;也可选择绿色版。若需要调试则需安装J-Link GDB Server。 1、打…

“Hello,Github!——如何配置并上传一个已有项目到Git上

“Hello&#xff0c;Github!"——如何配置并上传一个已有项目到Git上注意&#xff01;前言十分简短&#xff01;如今&#xff0c;Github已经成为了管理软件开发以及发现别人优秀代码的首选方法。所以还在等什么&#xff01;快点跟上脚步&#xff01;今天初次注册了Github账…

使用EmBitz开发STM32项目开发环境配置

&#xfeff;&#xfeff; 一、EmBitz软件获取与安装 1、EmBitz软件的获取 EmBitz原名Em::Blocks&#xff0c;是基于Code::Blocks开发的&#xff0c;面向嵌入式的C/C集成开发环境。支持J-Link和ST-Link调试器。使用J-Link仿真器时需安装J-Link GDB Server。 EmBitz下载地址&…

Python格式化输出方法

Python格式化输出 本文转自&#xff1a;Python格式化输出 今天写程序又记不清格式化输出细节了…… 索性整理一下。 python print格式化输出。 1. 打印字符串 print ("His name is %s"%("Aviad")) 效果&#xff1a; 2.打印整数 print ("He is %d yea…

基于STM32和W5500的Modbus TCP通讯

&#xfeff;&#xfeff; 在最近的一个项目中需要实现Modbus TCP通讯&#xff0c;而选用的硬件平台则是STM32F103和W5500&#xff0c;软件平台则选用IAR EWAR6.4来实现。 1、移植前的准备工作 为了实现Modbus TCP通讯首先需要下载W5500的驱动源码&#xff0c;可以到WIZnet的…

Python小练习1:.txt文件常用读写操作

.txt文件常用读写操作 本文通过一个实例来介绍读写txt文件的各种常用操作&#xff0c;问题修改自coursera上南京大学的课程&#xff1a;用Python玩转数据。 直接进入正题&#xff0c;考虑下面为练习读写txt文件的各种操作而设计的一个具体问题 问题如下&#xff1a; (1) 在任意…