NMS(non maximum suppression) ,中文名非极大值抑制,在很多计算机视觉 任务中都有广泛应用,如:边缘检测、目标检测等。
这里主要以人脸检测中的应用为例,来说明NMS,并给出Matlab和C++示例程序。
人脸检测的一些概念
(1) 绝大部分人脸检测器的核心是分类器,即给定一个尺寸固定图片,分类器判断是或者不是人脸;
(2) 将分类器进化为检测器的关键是:在原始图像上从多个尺度产生窗口,并resize到固定尺寸,然后送给分类器做判断。最常用的方法是滑动窗口。
以下图为例,由于滑动窗口,同一个人可能有好几个框(每一个框都带有一个分类器得分)
而我们的目标是一个人只保留一个最优的框:
于是我们就要用到非极大值抑制,来抑制那些冗余的框: 抑制的过程是一个迭代-遍历-消除的过程。
(1) 将所有框的得分降序排列,选中最高分及其对应的框:
(2) 遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除。
(3) 从未处理的框中继续选一个得分最高的,重复上述过程。
下面给出MATLAB下的快速NMS代码,并带有详细的注释:
function pick = nms (boxes,threshold,type)
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;
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