非极大抑制(Non-Maximum Suppression)

最近在看RCNN和微软的SPP-net,其中涉及到Non-Maximum Suppression,论文中没具体展开,我就研究下了代码,这里做一个简单的总结,听这个名字感觉是一个很高深的算法,其实很简单,就是把找出score比较region,其中需要考虑不同region的一个重叠问题。

假设从一个图像中得到了2000region proposals,通过在RCNN和SPP-net之后我们会得到2000*4096的一个特征矩阵,然后通过N的SVM来判断每一个region属于N的类的scores。其中,SVM的权重矩阵大小为4096*N,最后得到2000*N的一个score矩阵(其中,N为类别的数量)。

Non-Maximum Suppression就是需要根据score矩阵和region的坐标信息,从中找到置信度比较高的bounding box。首先,NMS计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为队列中。接下来,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box。然后重复上面的过程,直至候选bounding box为空。最终,检测了bounding box的过程中有两个阈值,一个就是IoU,另一个是在过程之后,从候选的bounding
box中剔除score小于阈值的bounding box。需要注意的是:Non-Maximum Suppression一次处理一个类别,如果有N个类别,Non-Maximum Suppression就需要执行N次。

源代码:

function pick = nms(boxes, overlap)
% top = nms(boxes, overlap)
% Non-maximum suppression. (FAST VERSION)
% Greedily select high-scoring detections and skip detections
% that are significantly covered by a previously selected
% detection.
%
% NOTE: This is adapted from Pedro Felzenszwalb's version (nms.m),
% but an inner loop has been eliminated to significantly speed it
% up in the case of a large number of boxes

% Copyright (C) 2011-12 by Tomasz Malisiewicz
% All rights reserved.
%
% This file is part of the Exemplar-SVM library and is made
% available under the terms of the MIT license (see COPYING file).
% Project homepage: https://github.com/quantombone/exemplarsvm

if isempty(boxes)
  pick = [];
  return;
end

x1 = boxes(:,1);
y1 = boxes(:,2);
x2 = boxes(:,3);
y2 = boxes(:,4);
s = boxes(:,end);

area = (x2-x1+1) .* (y2-y1+1);    %计算出每一个bounding box的面积
[vals, I] = sort(s);				%根据score递增排序

pick = s*0;
counter = 1;
while ~isempty(I)
  last = length(I);
  i = I(last);
  pick(counter) = i;			%选择score最大bounding box加入到候选队列
  counter = counter + 1;

  xx1 = max(x1(i), x1(I(1:last-1)));
  yy1 = max(y1(i), y1(I(1:last-1)));
  xx2 = min(x2(i), x2(I(1:last-1)));
  yy2 = min(y2(i), y2(I(1:last-1)));

  w = max(0.0, xx2-xx1+1);
  h = max(0.0, yy2-yy1+1);

  inter = w.*h;		%计算出每一bounding box与当前score最大的box的交集面积
  o = inter ./ (area(i) + area(I(1:last-1)) - inter);  %IoU(intersection-over-union)

  I = I(find(o<=overlap));  %找出IoU小于overlap阈值的index
end

pick = pick(1:(counter-1));

时间: 2024-10-14 12:57:10

非极大抑制(Non-Maximum Suppression)的相关文章

非极大抑制(Non-maximum suppression)在物体检测领域的应用

最近在一个项目,需要用到非极大值抑制,找了很长时间没有找到非极大抑制在物体检测方面的的详细解释,最后只有翻阅相关的代码来理解. 一.Nms主要目的 在物体检测非极大抑制应用十分广泛,主要目的是为了消除多余的框,找到最佳的物体检测的位置. 如上图中:虽然几个框都检测到了人脸,但是我不需要这么多的框,我需要找到一个最能表达人脸的框.下图汽车检测也是同样的原理. 二.原理 非极大抑制,顾名思义就是把非极大值过滤掉(抑制).下面我就R-CNN或者SPP_net中的matlab源码来进行解释. funct

非极大抑制睔PYTHON实现

非极大抑制(Non-maximum suppression)python代码实现原创Butertfly 发布于2018-11-20 18:48:57 阅读数 293 收藏展开定位一个物体,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的.非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从大到小分别属于物体的概率分别为A.B.C.D.E.F. (1)从最大概率矩形框F开始,分别判断B~F与A的重叠度IOU是否大于某个设定的阈值; (2)假设B.D与F的重叠度超过阈值,那么

canny中的非极大抑制

canny边缘检测首先对图像做高斯滤波和生成梯度图,得到的梯度图中,边缘的宽度可能大于一个象素,nonmaxima suppression的过程是沿着边缘的梯度方向进行检测,把不是局部最大值的象素置0,这样得到了只有一个象素宽度的边缘. 所以nonmaxima suppression的作用是将梯度图中的边缘细化成一个象素宽度. canny中的非极大抑制,布布扣,bubuko.com

第二十七节,IOU和非极大值抑制

你如何判断对象检测算法运作良好呢?在这一节中,你将了解到并交比函数,可以用来评价对象检测算法. 一 并交比(Intersection over union ) 在对象检测任务中,你希望能够同时定位对象,所以如果实际边界框是这样的,你的算法给出这个紫色的边界框,那么这个结果是好还是坏?所以交并比(loU)函数做的是计算两个边界框交集和并集之比.两个边界框的并集是这个区域,就是属于包含两个边界框区域(绿色阴影表示区域),而交集就是这个比较小的区域(橙色阴影表示区域),那么交并比就是交集的大小,这个橙

IOU和非极大值抑制(转)

IOU和非极大值抑制(转) 原文链接:http://www.cnblogs.com/zyly/p/9245451.html 你如何判断对象检测算法运作良好呢?在这一节中,你将了解到并交比函数,可以用来评价对象检测算法. 一 并交比(Intersection over union ) 在对象检测任务中,你希望能够同时定位对象,所以如果实际边界框是这样的,你的算法给出这个紫色的边界框,那么这个结果是好还是坏?所以交并比(loU)函数做的是计算两个边界框交集和并集之比.两个边界框的并集是这个区域,就是

非极大值抑制(NMS)的几种实现

因为之前对比了RoI pooling的几种实现,发现python.pytorch的自带工具函数速度确实很慢,所以这里再对Faster-RCNN中另一个速度瓶颈NMS做一个简单对比试验. 这里做了四组对比试验,来简单验证不同方法对NMS速度的影响. 方法1:纯python语言实现:简介方便.速度慢 方法2:直接利用Cython模块编译 方法3:先将全部变量定义为静态类型,再利用Cython模块编译 方法4:在方法3的基础上再加入cuda加速模块, 再利用Cython模块编译,即利用gpu加速 一.

高效的非极大值抑制

http://blog.sina.com.cn/s/blog_679e1329010141x3.html 本文参考论文 ICPR2006-<Efficient Non-Maximum Suppression> 一.简介     非极大值抑制(NMS)可以看做是局部最大值的搜索问题,NMS是许多计算机视觉算法的部分.如何设计高效的NMS算法对许多应用是十分关键的,例如视频跟踪.数据挖掘.3D重建.物体识别以及纹理分析等. 本文只列出算法的具体流程,对算法的复杂性分析具体参考论文. 二.1维情况下

非极大值抑制(NMS)

一. 引入NMS 在R-CNN中对于2000多个region proposals得到特征向量(4096维)后,输入到SVM中进行打分(score).除了背景以外VOC数据集共有20类.那么2000*4096维特征矩阵与20个SVM组成的权重矩阵4096*20相乘得到结果为2000*20维矩阵.这个矩阵2000行表示有2000个框.20列为每一个框属于这20个类的score(置信度).也就是说每一列即每一类有2000个不同的分值.那么每一类有这么多候选框肯定大多冗余.所以需要利用非极大值抑制方法进

非极大值抑制(NMS)

非极大值抑制顾名思义就是抑制不是极大值的元素,搜索局部的极大值.这个局部代表的是一个邻域,邻域有两个参数可变,一个是邻域的维数,二是邻域的大小.这里不讨论通用的NMS算法,而是用于在目标检测中提取分数最高的窗口的.例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数.但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况.这时就需要用到NMS来选取那些邻域里分数最高,并且抑制那些分数低的窗口. # import the necessary packages