原理

对于Bounding Box的列表B及其对应的置信度S,采用下面的计算方式.选择具有最大score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU大于阈值Nt的框从B中移除.重复这个过程,直到B为空。

实现步骤

(1)将所有框的得分排序,选中最高分及其对应的框
(2)遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除。
(3)从未处理的框中继续选一个得分最高的,重复上述过程。

实现代码

MATLAB

%% 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;%不同定义下的IOUif 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));endpick = pick(1:(counter-1));
end

Python

import numpy as np
cimport numpy as npcdef inline np.float32_t max(np.float32_t a, np.float32_t b):return a if a >= b else bcdef inline np.float32_t min(np.float32_t a, np.float32_t b):return a if a <= b else bdef cpu_soft_nms(np.ndarray[float, ndim=2] boxes, float sigma=0.5, float Nt=0.3, float threshold=0.001, unsigned int method=0):cdef unsigned int N = boxes.shape[0]cdef float iw, ih, box_areacdef float uacdef int pos = 0cdef float maxscore = 0cdef int maxpos = 0cdef float x1,x2,y1,y2,tx1,tx2,ty1,ty2,ts,area,weight,ovfor i in range(N):maxscore = boxes[i, 4]maxpos = itx1 = boxes[i,0]ty1 = boxes[i,1]tx2 = boxes[i,2]ty2 = boxes[i,3]ts = boxes[i,4]pos = i + 1# get max boxwhile pos < N:if maxscore < boxes[pos, 4]:maxscore = boxes[pos, 4]maxpos = pospos = pos + 1# add max box as a detection boxes[i,0] = boxes[maxpos,0]boxes[i,1] = boxes[maxpos,1]boxes[i,2] = boxes[maxpos,2]boxes[i,3] = boxes[maxpos,3]boxes[i,4] = boxes[maxpos,4]# swap ith box with position of max boxboxes[maxpos,0] = tx1boxes[maxpos,1] = ty1boxes[maxpos,2] = tx2boxes[maxpos,3] = ty2boxes[maxpos,4] = tstx1 = boxes[i,0]ty1 = boxes[i,1]tx2 = boxes[i,2]ty2 = boxes[i,3]ts = boxes[i,4]pos = i + 1# NMS iterations, note that N changes if detection boxes fall below thresholdwhile pos < N:x1 = boxes[pos, 0]y1 = boxes[pos, 1]x2 = boxes[pos, 2]y2 = boxes[pos, 3]s = boxes[pos, 4]area = (x2 - x1 + 1) * (y2 - y1 + 1)iw = (min(tx2, x2) - max(tx1, x1) + 1)if iw > 0:ih = (min(ty2, y2) - max(ty1, y1) + 1)if ih > 0:ua = float((tx2 - tx1 + 1) * (ty2 - ty1 + 1) + area - iw * ih)ov = iw * ih / ua #iou between max box and detection boxif method == 1: # linearif ov > Nt: weight = 1 - ovelse:weight = 1elif method == 2: # gaussianweight = np.exp(-(ov * ov)/sigma)else: # original NMSif ov > Nt: weight = 0else:weight = 1boxes[pos, 4] = weight*boxes[pos, 4]# if box score falls below threshold, discard the box by swapping with last box# update Nif boxes[pos, 4] < threshold:boxes[pos,0] = boxes[N-1, 0]boxes[pos,1] = boxes[N-1, 1]boxes[pos,2] = boxes[N-1, 2]boxes[pos,3] = boxes[N-1, 3]boxes[pos,4] = boxes[N-1, 4]N = N - 1pos = pos - 1pos = pos + 1keep = [i for i in range(N)]return keepdef cpu_nms(np.ndarray[np.float32_t, ndim=2] dets, np.float thresh):cdef np.ndarray[np.float32_t, ndim=1] x1 = dets[:, 0]cdef np.ndarray[np.float32_t, ndim=1] y1 = dets[:, 1]cdef np.ndarray[np.float32_t, ndim=1] x2 = dets[:, 2]cdef np.ndarray[np.float32_t, ndim=1] y2 = dets[:, 3]cdef np.ndarray[np.float32_t, ndim=1] scores = dets[:, 4]cdef np.ndarray[np.float32_t, ndim=1] areas = (x2 - x1 + 1) * (y2 - y1 + 1)cdef np.ndarray[np.int_t, ndim=1] order = scores.argsort()[::-1]cdef int ndets = dets.shape[0]cdef np.ndarray[np.int_t, ndim=1] suppressed = \np.zeros((ndets), dtype=np.int)# nominal indicescdef int _i, _j# sorted indicescdef int i, j# temp variables for box i's (the box currently under consideration)cdef np.float32_t ix1, iy1, ix2, iy2, iarea# variables for computing overlap with box j (lower scoring box)cdef np.float32_t xx1, yy1, xx2, yy2cdef np.float32_t w, hcdef np.float32_t inter, ovrkeep = []for _i in range(ndets):i = order[_i]if suppressed[i] == 1:continuekeep.append(i)ix1 = x1[i]iy1 = y1[i]ix2 = x2[i]iy2 = y2[i]iarea = areas[i]for _j in range(_i + 1, ndets):j = order[_j]if suppressed[j] == 1:continuexx1 = max(ix1, x1[j])yy1 = max(iy1, y1[j])xx2 = min(ix2, x2[j])yy2 = min(iy2, y2[j])w = max(0.0, xx2 - xx1 + 1)h = max(0.0, yy2 - yy1 + 1)inter = w * hovr = inter / (iarea + areas[j] - inter)if ovr >= thresh:suppressed[j] = 1return keep

参考博客:http://blog.csdn.net/shuzfan/article/details/52711706
     http://www.cnblogs.com/makefile/p/nms.html

NMS非极大值抑制的原理相关推荐

  1. Non-Maximum Suppression,NMS非极大值抑制

    Non-Maximum Suppression,NMS非极大值抑制 概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜 ...

  2. 深度学习自学(三):NMS非极大值抑制总结

    非极大值抑制(Non-Maximum Suppression,NMS) 顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域 ...

  3. 目标窗口检测算法-NMS非极大值抑制

    1. NMS(non maximum suppression)的定义和算法步骤 NMS(non maximum suppression),中文名非极大值抑制,在很多计算机视觉任务中都有广泛应用,如:边 ...

  4. 目标检测中的LOU(交并比)和NMS(非极大值抑制)代码实现

    1.LOU, 两个box框的交集比上并集,示意图如下所示: 代码如下所示: #假设box1的维度为[N,4] box2的维度为[M,4] def Lou(box1, box2):N = box1.si ...

  5. 【概念梳理】NMS 非极大值抑制

    写在最前 本文对网上关于 NMS 的解释整理了一下 一.原理 YOLO在最后的一个步骤就是对 SxSx(Bx5+C) 个向量进行非极大值抑制(Non-max suppression),一开始不是太明白 ...

  6. NMS 非极大值抑制

    非极大值抑制(non maximum suppression,NMS),顾名思义就是抑制不是极大值的元素,搜索局部的极大值. 定位一个车辆时,算法可能会找出一堆候选框,为了从中找出最佳候选框,非极大值 ...

  7. 目标检测的Tricks | 【Trick9】nms非极大值抑制处理(包括变体merge-nms、and-nms、soft-nms、diou-nms等介绍)

    如有错误,恳请指出. 用这篇博客记录一下nms,也就是非极大值抑制处理,算是目标检测后处理的一个难点. 在训练阶段是不需要nms处理的,只有在验证或者是测试阶段才需要将预测结果进行非极大值抑制处理,来 ...

  8. yolov3 NMS非极大值抑制

    基本原理:对于Bounding Box的列表B及其对应的置信度S,采用下面的计算方式.选择具有最大score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU ...

  9. NMS——非极大值抑制

    NMS(non maximum suppression),中文名非极大值抑制,在很多计算机视觉任务中都有广泛应用,如:边缘检测.目标检测等. 这里主要以人脸检测中的应用为例,来说明NMS,并给出Mat ...

最新文章

  1. svn的使用(转载)
  2. 阿里云专家手把手教你重塑 IT 架构!
  3. 前端拆分_如何在消费者驱动的合同测试的帮助下拆分前端和后端的部署
  4. OpenCV4每日一练day11:单目位姿估计
  5. 为什么莫名其妙的就被调用了
  6. app.use(express.static)设置静态文件目录小解
  7. 面试官:TCP和UDP两者的区别是什么?
  8. matlab三维作图知识点
  9. 计算机内存不足应该换什么,电脑内存不够用了怎么办
  10. Kbps、KBps是什么意思?网络下载速度单位换算
  11. 西瓜文案:水果西瓜的文案,水果文案西瓜
  12. 26、使用友善NanoPi NEO和外设硬件实现语音唤醒功能、目标检测功能、语音播报功能
  13. GPS定位系统及协议介绍
  14. 【Linux】ssh连接远程服务器
  15. uip协议栈分析(2)
  16. hihocoder1245 王胖浩与三角形
  17. qiankun微前端主子应用通信方案
  18. 在家也能办公之上网和远程控制服务器
  19. 防撤回神器,免ROOT查看撤回消息!再也不用担心错过劲爆消息!
  20. 电子工业版了解计算机教案,最新版电子工业出版社小学信息技术册教学计划及教案...

热门文章

  1. Coinlist要闻:即将到来的以太坊合并的风险有多大?
  2. C语言基础之输出m到n之间的素数
  3. live555 android,Android RTSP/UDP“RTSP/1.0 461 Unsupported transport”通过蜂窝网络(4G)
  4. Servlet重定向和转发
  5. 从蓝桥杯丢盔卸甲,来学一点javaScript
  6. macd金叉不涨又死叉准确率_MACD金叉周线选股公式怎么设置及计算
  7. 苹果小白笔记本_笔记本买win还是买Mac?谈一谈我选择Macbook的六大理由
  8. QStatusBar
  9. 两个div并排 左边div宽固定 右边自适应
  10. flutter刷新当前页面替换TabController