NMS(non maximum suppression),中文名非极大值抑制,在很多计算机视觉任务中都有广泛应用,如:边缘检测、目标检测等。

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

    人脸检测的一些概念

    (1) 绝大部分人脸检测器的核心是分类器,即给定一个尺寸固定图片,分类器判断是或者不是人脸;

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

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

    NMS——非极大值抑制 - 图1

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

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

    (1)将所有框的得分排序,选中最高分及其对应的框:

    NMS——非极大值抑制 - 图2

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

    NMS——非极大值抑制 - 图3

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

    NMS——非极大值抑制 - 图4

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

    1. function pick = nms(boxes,threshold,type)
    2. if isempty(boxes)
    3. pick = [];
    4. return;
    5. end
    6. x1 = boxes(:,1);
    7. y1 = boxes(:,2);
    8. x2 = boxes(:,3);
    9. y2 = boxes(:,4);
    10. s = boxes(:,5);
    11. area = (x2-x1+1) .* (y2-y1+1);
    12. [vals, I] = sort(s);
    13. pick = s*0;
    14. counter = 1;
    15. while ~isempty(I)
    16. last = length(I);
    17. i = I(last);
    18. pick(counter) = i;
    19. counter = counter + 1;
    20. xx1 = max(x1(i), x1(I(1:last-1)));
    21. yy1 = max(y1(i), y1(I(1:last-1)));
    22. xx2 = min(x2(i), x2(I(1:last-1)));
    23. yy2 = min(y2(i), y2(I(1:last-1)));
    24. w = max(0.0, xx2-xx1+1);
    25. h = max(0.0, yy2-yy1+1);
    26. inter = w.*h;
    27. if strcmp(type,'Min')
    28. o = inter ./ min(area(i),area(I(1:last-1)));
    29. else
    30. o = inter ./ (area(i) + area(I(1:last-1)) - inter);
    31. end
    32. I = I(find(o<=threshold));
    33. end
    34. pick = pick(1:(counter-1));
    35. end

    https://blog.csdn.net/shuzfan/article/details/52711706#commentsedit ```