NMS 非极大值抑制
Reference:
NMS(Non-maximum Suppression),即非极大值抑制,用以获取局部最大值,在很多计算机视觉任务中都有广泛应用,如:边缘检测、目标检测等。
对于目标在图像中具体位置定位,不管是使用 滑动窗口(Sliding Window)
还是 选择性搜索(Slective Search)
方法,都会产生好多的候选区域。实际看到的情形就是好多区域的交叉重叠,难以满足实际的应用:
针对这种问题有
3
3
3 种传统解决思路:
- 选取好多矩形框的交集,即公共区域作为最后的目标区域,如热图(Heat-map);
- 选取好多矩形框的并集,即所有矩形框的最小外截矩作为目标区域。当然这里也不是只要相交就直接取并集,需要相交的框满足交集占最小框的面积达到一定比例(也就是阈值)才合并;
- 也就是本文介绍的 NMS,简单的说,对于有相交的就选取其中置信度最高的一个作为最后结果,对于没相交的就直接保留下来,作为最后结果。
以下图人脸为例,同一个人可能会有好几个框,每一个框都带有一个分类器得分,这个得分通常是由检测框架得到的,比如 YOLO 的最终得分为分类得分和检测框得分的乘积。
我们的目标是一个人只保留一个最优的框,于是就要用到非极大值抑制,来抑制那些冗余的框:
- 将所有框的得分排序,选中最高分及其对应的框:
- 遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除:
- 从未处理的框中继续选一个得分最高的,重复上述过程:
下面给出 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