zoukankan      html  css  js  c++  java
  • NMS_非极大值抑制(转)

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

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

    人脸检测的一些概念

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

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

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

    这里写图片描述

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

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

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

    这里写图片描述

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

    这里写图片描述

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

    这里写图片描述

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

     1 %% NMS:non maximum suppression
     2 function pick = nms(boxes,threshold,type)
     3 % boxes: m x 5,表示有m个框,5列分别是[x1 y1 x2 y2 score]
     4 % threshold: IOU阈值
     5 % type:IOU阈值的定义类型
     6 
     7     % 输入为空,则直接返回
     8     if isempty(boxes)
     9       pick = [];
    10       return;
    11     end
    12 
    13     % 依次取出左上角和右下角坐标以及分类器得分(置信度)
    14     x1 = boxes(:,1);
    15     y1 = boxes(:,2);
    16     x2 = boxes(:,3);
    17     y2 = boxes(:,4);
    18     s = boxes(:,5);
    19 
    20     % 计算每一个框的面积
    21     area = (x2-x1+1) .* (y2-y1+1);
    22 
    23     %将得分升序排列
    24     [vals, I] = sort(s);
    25 
    26     %初始化
    27     pick = s*0;
    28     counter = 1;
    29 
    30     % 循环直至所有框处理完成
    31     while ~isempty(I)
    32         last = length(I); %当前剩余框的数量
    33         i = I(last);%选中最后一个,即得分最高的框
    34         pick(counter) = i;
    35         counter = counter + 1;  
    36 
    37         %计算相交面积
    38         xx1 = max(x1(i), x1(I(1:last-1)));
    39         yy1 = max(y1(i), y1(I(1:last-1)));
    40         xx2 = min(x2(i), x2(I(1:last-1)));
    41         yy2 = min(y2(i), y2(I(1:last-1)));  
    42         w = max(0.0, xx2-xx1+1);
    43         h = max(0.0, yy2-yy1+1); 
    44         inter = w.*h;
    45 
    46         %不同定义下的IOU
    47         if strcmp(type,'Min')
    48             %重叠面积与最小框面积的比值
    49             o = inter ./ min(area(i),area(I(1:last-1)));
    50         else
    51             %交集/并集
    52             o = inter ./ (area(i) + area(I(1:last-1)) - inter);
    53         end
    54 
    55         %保留所有重叠面积小于阈值的框,留作下次处理
    56         I = I(find(o<=threshold));
    57     end
    58     pick = pick(1:(counter-1));
    59 end
  • 相关阅读:
    第一篇博客
    【面试大系】PHP程序员的知识盘点
    【PHP资源】PHP 资源大全
    【前端经纬】将页面元素定位
    大爱卡农三百年
    【夯实PHP基础】PHP标准库 SPL
    【http抓包】记录一次抓手机app的接口
    【算法】PHP实现冒泡排序和快速排序--防遗忘
    Apache的初中级面试题
    【生活感悟系列】感悟在一瞬间(不断完善中)
  • 原文地址:https://www.cnblogs.com/byteHuang/p/7732837.html
Copyright © 2011-2022 走看看