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
  • 相关阅读:
    springmvc log4j 配置
    intellij idea maven springmvc 环境搭建
    spring,property not found on type
    intellij idea maven 工程生成可执行的jar
    device eth0 does not seem to be present, delaying initialization
    macos ssh host配置及免密登陆
    centos7 搭建 docker 环境
    通过rest接口获取自增id (twitter snowflake算法)
    微信小程序开发体验
    gitbook 制作 beego 参考手册
  • 原文地址:https://www.cnblogs.com/byteHuang/p/7732837.html
Copyright © 2011-2022 走看看