参考链接:http://blog.csdn.net/shuzfan/article/details/52711706
http://blog.csdn.net/pandav5/article/details/50997272
非极大值抑制算法(Non-maximum suppression, NMS)的本质是搜索局部极大值,抑制非极大值元素。其在计算机视觉中应用广泛,用来消除多个候选框。
在目标识别中,滑动窗口经提取特征,经分类器分类识别后,会有很多个窗口,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最
高,并且抑制那些分数低的窗口。
以下图为例,由于滑动窗口,同一个人可能有好几个框(每一个框都带有一个分类器得分)
而我们的目标是一个人只保留一个最优的框:
于是我们就要用到非极大值抑制,来抑制那些冗余的框: 抑制的过程是一个迭代-遍历-消除的过程。
(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