风机桨叶故障诊断(七)滑动窗与非极大值一直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个桨叶,当然客观的说,

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

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

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

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

  1. MTCNN中的重叠度IOU和非极大值抑制NMS原理及Python实现

    MTCNN中的重叠度IOU和非极大值抑制NMS原理及Python实现 一.重叠度iou 从在一张照片上框人脸时,因为图像金字塔的原因可能会把人脸框两次以上,每个框的坐标为[X1,Y1X2,Y2,C], ...

  2. PyTorch实现非极大值抑制(NMS)

    NMS即non maximum suppression即非极大抑制,顾名思义就是抑制不是极大值的元素,搜索局部的极大值.在最近几年常见的物体检测算法(包括rcnn.sppnet.fast-rcnn.f ...

  3. 【目标检测系列】非极大值抑制(NMS)的各类变体汇总

    关注上方"深度学习技术前沿",选择"星标公众号", 技术干货,第一时间送达! [导读]前面已经先后为大家详细介绍过了目标检测领域的基础知识:[目标检测基础积累] ...

  4. 交并比 (IoU), mAP (mean Average Precision), 非极大值抑制 (NMS, Soft NMS, Softer NMS, IoU-Net)

    目录 目标检测的评价指标 交并比 (Intersection of Union, IoU) mAP (mean Average Precision) 其他指标 非极大值抑制 (Non-Maximum ...

  5. Opencv学习笔记(二十六)文本检测mser+非极大值抑制nms

    文章目录 mser检测 nms非极大值抑制 代码 mser检测 nms非极大值抑制 代码 import cv2 import matplotlib.pyplot as plt import numpy ...

  6. 非极大值抑制(nms)算法详解[python]

    一.起源 目标检测在使用了基于深度学习的端到端模型后效果斐然.目前,常用的目标检测算法,无论是One-stage的SSD系列算法.YOLO系列算法还是Two-stage的基于RCNN系列的算法,非极大 ...

  7. YOLOv5改进之八:非极大值抑制NMS算法改进Soft-nms

    ​前 言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法.此后的系列文章,将重点对YOLOv5 ...

  8. yolo极大抑制_pytorch实现yolov3(4) 非极大值抑制nms

    在上一篇里我们实现了forward函数.得到了prediction.此时预测出了特别多的box以及各种class probability,现在我们要从中过滤出我们最终的预测box. 理解了yolov3 ...

  9. 非极大值抑制NMS的python实现

    NMS的python实现 原文http://blog.csdn.net/ei1990/article/details/78203476 1.NMS(Non-Maximum Suppression)  ...

最新文章

  1. linux 进入单用户模式修改root密码
  2. gcc中extra qualification错误
  3. jmeter 正则获取参数集合和ForEach控制器结合使用(转)
  4. hdu 2988 Strange fuction【模拟退火】
  5. applicationSettings设置和appsttings
  6. 深入了解Kubernetes CRD开发工具kubebuilder
  7. fprintf函数的用法_MATLAB的21种特殊符号,总有一种你不知道的用法
  8. JQuery中的ID选择器
  9. uitest_您在Swift中的第一个UITest
  10. cron linux_如何在Linux中使用cron
  11. jetbrains IDEA/pycharm修改代码提示框配色
  12. OGRE源代码resource分析
  13. java 内存 静态_java中内存分配以及static的用法(转)
  14. l298n电机哪一端为正_L298N控制直流电机正反转
  15. 使用Gpu恢复7z密码
  16. 测试固态硬盘寿命软件,SSD能用多久在哪看 检测固态硬盘寿命方法
  17. dwz导出excel java_完美解决dataset导出excel问题
  18. Classic Shell:找回 Windows 8 / Windows Server 2012 的经典的开始按钮和开始菜单
  19. Linux(Centos 7)使用tcpdump抓取流量包
  20. 加密解密验签概念理解

热门文章

  1. 谈谈C#反射(Reflection)
  2. axios请求本地的json文件在打包部署到子目录域名下,路径找不到
  3. Ubuntu 中Mysql 操作
  4. c语言,递归翻转一个单链表,c实现单链表
  5. [置顶] 删除:大数据取舍之道读书笔记
  6. linux的系统移植——交叉编译器
  7. 对10亿个数据去重java_20 亿个数字在 4G 内存中如何去重排序:快来试一试 BitMap...
  8. html如何让框架的边框消失,css如何让边框透明?
  9. python封装exe如何返回上一步_如何将python脚本封装成exe程序?
  10. 判断随机抽取代码_问卷调查:定量研究中的抽样问题(2)- 非随机抽样介绍