Non-Maximum Suppression

NMS

• ## 非极大值抑制

千次阅读 2015-10-22 09:42:22
用于滑动窗口后处理： 优先选择得分高的候选位置，排除与已选窗口重叠的窗口 求两个矩形框相交： 分别求最大左上角点和最小右下角点，后者大于前者，两点确定的矩形框即为相交部分。 function top = nms_face...
用于滑动窗口后处理：
优先选择得分高的候选位置，排除与已选窗口重叠的窗口
求两个矩形框相交：
分别求最大左上角点和最小右下角点，后者大于前者，两点确定的矩形框即为相交部分。
function top = nms_face(boxes,overlap)
% Non-maximum suppression.
% Greedily select high-scoring detections and skip detections
% that are significantly covered by a previously selected detection.

if nargin < 2
overlap = 0.5;
end

N = length(boxes);

if isempty(boxes)
top = [];
else
numpart = size(boxes(1).xy,1);

% throw away boxes with low score if there are too many candidates
if N > 30000
s = [boxes.s];
[vals, I] = sort(s);
boxes = boxes(I(end-29999:end));
end
N = min(30000,N);

x1 = zeros(N,1);
y1 = zeros(N,1);
x2 = zeros(N,1);
y2 = zeros(N,1);
area = zeros(N,1);
for nb = 1:N
if numpart==1
x1(nb) = boxes(nb).xy(1);
y1(nb) = boxes(nb).xy(2);
x2(nb) = boxes(nb).xy(3);
y2(nb) = boxes(nb).xy(4);
else
x1(nb) = min(boxes(nb).xy(:,1));
y1(nb) = min(boxes(nb).xy(:,2));
x2(nb) = max(boxes(nb).xy(:,3));
y2(nb) = max(boxes(nb).xy(:,4));
end
area(nb) = (x2(nb)-x1(nb)+1) * (y2(nb)-y1(nb)+1);
end

s = [boxes.s];
[vals, I] = sort(s);
pick = [];
while ~isempty(I)
last = length(I);
i = I(last);
pick = [pick; i];
suppress = [last];

j = I(1:last-1);
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;
w(w<0) = 0;
h = yy2-yy1+1;
h(h<0) = 0;

inter = w.*h;
o1 = inter ./ area(j);
o2 = inter / area(i);
idx =  (find((o1 > overlap) | (o2 > overlap)));
suppress = [suppress ; idx];

I(suppress) = [];
end
top = boxes(pick);
end

展开全文
• ## 非极大值抑制 NMS

千次阅读 2017-04-06 10:22:14
极大值抑制算法（Non-maximum suppression, NMS）的本质是搜索局部极大值，抑制非极大值元素。非极大值抑制（NMS）主要在图像处理中的应用主要是是为了更精确的定位某种特征。举一个简单的例子：用梯度变化表征...
概念：
非极大值抑制算法（Non-maximum suppression, NMS）的本质是搜索局部极大值，抑制非极大值元素。

非极大值抑制（NMS）主要在图像处理中的应用主要是是为了更精确的定位某种特征。

举一个简单的例子：用梯度变化表征边缘时，梯度变化较大的区域通常比较宽，所以利用x和y方向的梯度确定一个法向arctan(y/x)，然后在法向上判断当前梯度测量是否是一个峰值（或局部极大值），如果是就保留，不是极大值就抑制（如设置为0）。

目标检测中的应用：
如图所示：物体检测中应用NMS算法的主要目的是消除多余（交叉重复）的窗口，找到最佳物体检测位置。
人脸检测中，虽然每个窗口均检测到人脸，但仅需给出一个最有可能表征人脸的窗口。
算法流程：

function pickLocate = nms(boxes, overlap)

% Non-maximum suppression.
% In object detect algorithm, select high score detections and skip windows
% covered by a previously selected detection.
%
% input - boxes : object detect windows.
%                 xMin yMin xMax yMax score.
%         overlap : suppression threshold.
% output - pickLocate : number of local maximum score.

boxes = double(boxes);

if isempty(boxes)
pickLocate = [];
else
xMin = boxes(:, 1);
yMin = boxes(:, 2);
xMax = boxes(:, 3);
yMax = boxes(:, 4);

s = boxes(:, end);

% area of every detected windows.
area = (xMax - xMin + 1) .* (yMax - yMin + 1);

% sort detected windows based on the score.
[vals, I] = sort(s);

pickLocate = [];
while ~isempty(I)
last = length(I);
i = I(last);

pickLocate = [pickLocate; i];
suppress = [last];

for pos = 1 : last - 1
j = I(pos);

% covered area.
xx1 = max(xMin(i), xMin(j));
yy1 = max(yMin(i), yMin(j));
xx2 = min(xMax(i), xMax(j));
yy2 = min(yMax(i), yMax(j));

w = xx2 - xx1 + 1;
h = yy2 - yy1 + 1;

if ((w > 0) && (h > 0))
% compute overlap.
o = w * h / min(area(i), area(j));

if (o > overlap)
suppress = [suppress; pos];
end
end

% 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;
% o = inter ./ (area(i) + area(I(1:last-1)) - inter);

% saving the windows which o less than threshold.
% I = I(o <= overlap);
end
I(suppress) = [];
end
end
展开全文
• ## NMS——非极大值抑制

万次阅读 多人点赞 2016-09-30 15:38:32
NMS（non maximum suppression），中文名非极大值抑制，在很多计算机视觉任务中都有广泛应用，如：边缘检测、目标检测等。这里主要以人脸检测中的应用为例，来说明NMS，并给出Matlab和C++示例程序。 人脸检测的一些...
NMS（non maximum suppression），中文名非极大值抑制，在很多计算机视觉任务中都有广泛应用，如：边缘检测、目标检测等。

这里主要以人脸检测中的应用为例，来说明NMS，并给出Matlab和C++示例程序。

人脸检测的一些概念

（1） 绝大部分人脸检测器的核心是分类器，即给定一个尺寸固定图片，分类器判断是或者不是人脸；

（2）将分类器进化为检测器的关键是：在原始图像上从多个尺度产生窗口，并resize到固定尺寸，然后送给分类器做判断。最常用的方法是滑动窗口。

以下图为例，由于滑动窗口，同一个人可能有好几个框(每一个框都带有一个分类器得分)

而我们的目标是一个人只保留一个最优的框：

于是我们就要用到非极大值抑制，来抑制那些冗余的框： 抑制的过程是一个迭代-遍历-消除的过程。

（1）将所有框的得分排序，选中最高分及其对应的框：

（2）遍历其余的框，如果和当前最高分框的重叠面积(IOU)大于一定阈值，我们就将框删除。

（3）从未处理的框中继续选一个得分最高的，重复上述过程。

下面给出MATLAB下的快速NMS代码，并带有详细的注释：

%% NMS:non maximum suppression
function pick = nms(boxes,threshold,type)
% boxes: m x 5,表示有m个框，5列分别是[x1 y1 x2 y2 score]
% threshold: IOU阈值
% type：IOU阈值的定义类型

% 输入为空，则直接返回
if isempty(boxes)
pick = [];
return;
end

% 依次取出左上角和右下角坐标以及分类器得分(置信度)
x1 = boxes(:,1);
y1 = boxes(:,2);
x2 = boxes(:,3);
y2 = boxes(:,4);
s = boxes(:,5);

% 计算每一个框的面积
area = (x2-x1+1) .* (y2-y1+1);

%将得分升序排列
[vals, I] = sort(s);

%初始化
pick = s*0;
counter = 1;

% 循环直至所有框处理完成
while ~isempty(I)
last = length(I); %当前剩余框的数量
i = I(last);%选中最后一个，即得分最高的框
pick(counter) = i;
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;

%不同定义下的IOU
if strcmp(type,'Min')
%重叠面积与最小框面积的比值
o = inter ./ min(area(i),area(I(1:last-1)));
else
%交集/并集
o = inter ./ (area(i) + area(I(1:last-1)) - inter);
end

%保留所有重叠面积小于阈值的框，留作下次处理
I = I(find(o<=threshold));
end
pick = pick(1:(counter-1));
end
展开全文
• 对同一个对象做出多次检测问题、非极大值抑制、独立性
深度学习笔记（38） 非极大值抑制1. 对象多次检测问题2. 非极大值抑制3. 独立性

1. 对象多次检测问题
到目前为止学到的对象检测中的一个问题是，算法可能对同一个对象做出多次检测
所以算法不是对某个对象检测出一次，而是检测出多次
非极大值抑制（Non-max suppression）这个方法可以确保算法对每个对象只检测一次

2. 非极大值抑制

设需要在这张图片里检测行人和汽车，可能会在上面放个19×19网格
理论上这辆车只有一个中点
所以它应该只被分配到一个格子里，左边的车子也只有一个中点
所以理论上应该只有一个格子做出有车的预测

实践中当运行对象分类和定位算法时，对于每个格子都运行一次
所以这个格子（编号1）可能会认为这辆车中点应该在格子内部
这几个格子（编号2、3）也会这么认为
对于左边的车子也一样
不仅这个格（编号4）子会认为它里面有车
也许这个格子（编号5）和（编号6）也会
因为要在361个格子上都运行一次图像检测和定位算法
那么可能很多格子都会说自身有车的概率pc很高
所以当运行算法的时候，最后可能会对同一个对象做出多次检测
所以非极大值抑制做的就是清理这些检测结果

所以这个算法做的是，首先看看每次报告每个检测结果相关的概率pc
看概率最大的那个，最可靠的检测，这个例子（右边车辆）中是0.9
所以就用高亮标记，就说这里找到了一辆车
这么做之后，非极大值抑制就会逐一审视剩下的矩形
所有和这个最大的边框有很高交并比，高度重叠的其他边界框，那么这些输出就会被抑制
所以这两个矩形pc分别是0.6和0.7，这两个矩形和淡蓝色矩形重叠程度很高
所以会被抑制，变暗，表示它们被抑制了

接下来左边车辆，逐一审视剩下的矩形，找出概率最高，pc最高的一个，在这种情况下是0.8，
就认为这里检测出一辆车（左边车辆），然后非极大值抑制算法就会去掉其他loU值很高的矩形
所以现在每个矩形都会被高亮显示或者变暗
如果直接抛弃变暗的矩形，那就剩下高亮显示的那些
这就是最后得到的两个预测结果，所以这就是非极大值抑制
非最大值意味着只输出概率最大的分类结果，抑制不是极大值的元素

3. 独立性
只做汽车检测，就去掉c1、c2和c3的类别输出
然后假设这条线对于19×19的每一个输出，对于361个格子的每个输出
会得到这样的输出预测，就是格子中有对象的概率（pc），然后是边界框参数（bx、by、bh和bw）
如果尝试同时检测三个对象，比如说行人、汽车、摩托
那么输出向量就会有三个额外的分量（c1、c2和c3）
事实证明，正确的做法是独立进行三次非极大值抑制，对每个输出类别都做一次

参考：
《神经网络和深度学习》视频课程

相关推荐：
深度学习笔记（37） 交并比
深度学习笔记（36） 边界框预测
深度学习笔记（35） 滑动窗口的卷积实现
深度学习笔记（34） 目标检测
深度学习笔记（33） 特征点检测

谢谢！


展开全文
• 图像处理13：非极大值抑制 （1）非极大值抑制的含义： 非极大值抑制,就是抑制不是极大值的元素,可以理解为局部最大搜索，这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。 非极大...
• ## 非极大值抑制算法

千次阅读 2016-09-24 22:01:07
非极大值抑制算法（Non-maximum suppression, NMS）的本质是搜索局部极大值，抑制非极大值元素。 2. 3邻域情况下NMS的实现  3邻域情况下的NMS即判断一维数组I[W]的元素I[i](2    a. 算法流程3-5...
• 目录非极大值抑制算法详解简介非极大值抑制算法符号介绍NMS的基本思路torch版本的NMS代码实现补充---numpy版本的NMS实现细节 简介  先简单介绍下非极大值抑制(NMS)，其目的是用来去除冗余的检测框。举个例子：以voc...
• ## NMS(非极大值抑制)

万次阅读 多人点赞 2018-07-02 17:02:55
翻译为“非极大值抑制”，为什么不翻译成最大值抑制呢？maximum可以翻译为“最大值”，也可以翻译成“极大值”，所以翻译成极大值或者最大值一定要看这个值的含义。极大值和最大值的区别就是，极大值时局部最大值。 ...
• 非极大值抑制(Non-Maximum Suppression)
• NMS（非极大值抑制） 作用 MATLAB实现 1、作用 在物体检测非极大值抑制应用十分广泛，主要目的是为了消除多余的框，找到最佳的物体检测的位置。在物体检测过程中，图片中的同一个物体，可能识别出来多个选框。这时...
• ## NMS非极大值抑制

千次阅读 2016-09-12 11:00:05
非极大值抑制算法 Non-Maximum Suppression for Object Detection in Python 非极大值抑制算法
• 1、非极大值抑制算法提出的目的  在目标检测中，为了消除多余的检测框，找到最佳的物体检测的位置。   2、 非极大值抑制（Non-Maximum Suppresion， NMS） 什么是非极大值抑制  非极大值抑制（Non-...
• ## 非极大值抑制（NMS）讲解

万次阅读 多人点赞 2018-04-17 10:48:08
非极大值抑制（Non-maximum suppression，NMS）是一种去除极大值的算法，常用于计算机视觉中的边缘检测、物体识别等。算法流程：给出一张图片和上面许多物体检测的候选框（即每个框可能都代表某种物体），但是这些...
• 在常见的边缘检测算子或轮廓检测相关算法中都有非极大值抑制这一步，然而对与非极大值抑制在这些边缘检测算子中应用，在理解可能有点似懂非懂。本文将介绍Canny算法中的非极大值抑制，Canny算子中的非极大值抑制是指...
• 在物体检测领域当中，非极大值抑制应用十分广泛，目的是为了消除多余的框，找到最佳的物体检测的位置。那么具体如何操作呢？如下图所示，有三个boundingbox，其中第一个绿色boundingbox的置信度是0.7，第二个绿色...
• ## matlab 非极大值抑制

千次阅读 2016-05-06 16:07:41
matlab 非极大值抑制
• ## nms--非极大值抑制

千次阅读 2018-07-31 17:16:42
nms（non maximum suppression） 非极大值抑制算法在检测任务中非常常用，常常会出现在同一个目标位置处产生多个候选框；因此nms的作用是剔除掉检测结果中重合率（IOU）大于给定阈值（threshold）的候选框，最终期望...
• 非极大值抑制(Non-Maximum Suppression)   目录 1. 什么是非极大值抑制 2. 为什么要用非极大值抑制 3. 如何使用非极大值抑制 4. 参考资料 1. 什么是非极大值抑制 非极大值抑制，简称为NMS算法，英文为Non-...
• ﻿﻿ non-maximum suppression：非极大值抑制
• 非极大值抑制（NMS） 非极大值抑制顾名思义就是抑制不是极大值的元素，搜索局部的极大值。这个局部代表的是一个邻域，邻域有两个参数可变，一是邻域的维数，二是邻域的大小。这里不讨论通用的NMS算法，而是用于在...
• YOLO在最后的一个步骤就是对 SxSx(Bx5+C) 个向量进行非极大值抑制（Non-max suppression），一开始不是太明白非极大值抑制是如何操作的，也就是不太清楚YOLO最后做完卷积后如何对求得向量进行预测，求得目标框位置。...
• 文中代码是我从 matlab edge函数中 canny_old 部分中粘贴出来的部分代码，只是用来配合理解非极大值抑制的原理，不能直接使用。 Canny 非极大值抑制分成 3 部分： 确定像素的梯度方向 对像素线性插值，找出极大值点...
• 简介 非极大值抑制NMS算法c++版本 源码
• 非极大值抑制（Non-max suppression） 选出置信度最高的框，计算其他框与它的IOU，超过阈值将其他候选框删除。 比如阈值设置成0.5. 总的来说，去除多余的候选框 IOU 又称交并比，是“预测的边框” 和 “真实的边框...
• NMS（非极大值抑制非极大值抑制（Non-Maximum Suppression，NMS），顾名思义就是抑制不是极大值的元素，可以理解为局部最大搜索。由下图可见，同一个物体可能有好几个框，我们的目标是一个物体只须保留一个最优...
• 文章目录1-交并比2-非极大值抑制 1-交并比 在目标检测中，如何评价目标检测结果的质量，可以采用交并比的大小进行衡量。 图中： 紫色表示实际边界框； 红色表示算法检测出的边界框； 绿色表示两者的并集； 黄色...

...