基于anchor的目标检测算法中,会产生很多候选矩形框冗余。会出现多个矩形框指向同一个目标的情况,为了将最能代表位置的矩形框留下,将其他矩形框剔除,提出了非极大值抑制算法。

非极大值抑制(Non-Maximum Suppression)算法简称NMS算法。

原理
IoU(Intersection over Union)为交并比,如图1所示,IoU相当于两个区域交叉的部分除以两个区域的并集部分得出的结果。图2是IoU为各个取值时的情况展示,一般来说,这个score > 0.5 就可以被认为一个不错的结果了。

经典NMS最初第一次应用到目标检测中是在RCNN算法中,其实现严格按照搜索局部极大值,抑制非极大值元素的思想来实现的,具体的实现步骤如下:
中文:
(1)设定目标框的置信度阈值,常用的阈值是0.5左右
(2)根据置信度降序排列候选框列表
(3)选取置信度最高的框A添加到输出列表,并将其从候选框列表中删除
(4)计算A与候选框列表中的所有框的IoU值,删除大于阈值的候选框
(5)重复上述过程,直到候选框列表为空,返回输出列表
英文:
1. choose the highest score element a_1 in set B, add a_1 to the keep set C
2. compute the IOU between the chosen element(such as a_1) and others elements in set B
3. only keep the nums at set B whose IOU value is less than thresholds (can be set as >=0.5), delete the nums similiar
to a_1(the higher IOU it is , the more interseciton between a_1 and it will have)
4. choose the highest score value a_2 left at set B and add a_2 to set C
5. repeat the 2-4 until there is nothing in set B, while set C is the NMS value set

相关代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
NMS function(Non-Maximum Suppression,  抑制不是极大值的元素)psedocode:1. choose the highest score element  a_1  in set B, add a_1 to the keep set C2. compute the IOU between the chosen element(such as a_1) and others elements in set B3. only keep the nums  at set B whose IOU value is less than thresholds (can be set as >=0.5), delete the nums similiarto a_1(the higher IOU it is , the more interseciton between a_1 and it will have)4. choose the highest score value a_2 left at set B  and add a_2 to set C5. repeat the 2-4 until  there is nothing in set B, while set C is the NMS value set"""
import numpy as np
# boxes表示人脸框的xywh4点坐标+相关置信度
boxes = np.array([[100, 100, 210, 210, 0.72],[250, 250, 420, 420, 0.8],[220, 220, 320, 330, 0.92],[100, 100, 210, 210, 0.72],[230, 240, 325, 330, 0.81],[220, 230, 315, 340, 0.9]])def py_cpu_nms(dets, thresh):# dets:(m,5)  thresh:scalerx1 = dets[:, 0]y1 = dets[:, 1]x2 = dets[:, 2]y2 = dets[:, 3]areas = (y2 - y1 + 1) * (x2 - x1 + 1)scores = dets[:, 4]keep = []# index表示按照scores从高到底的相关box的序列号index = scores.argsort()[::-1]while index.size > 0:print("sorted index of boxes according to scores", index)# 选择得分最高的score直接加入keep列表中i = index[0]keep.append(i)# 计算score最高的box和其他box分别的相关交集坐标x11 = np.maximum(x1[i], x1[index[1:]])y11 = np.maximum(y1[i], y1[index[1:]])x22 = np.minimum(x2[i], x2[index[1:]])y22 = np.minimum(y2[i], y2[index[1:]])print("x1 values by original order:", x1)print("x1 value by scores:", x1[index[:]])print("x11 value means  replacing the less value compared"\" with the value by the largest score :" , x11)# 计算交集面积w = np.maximum(0, x22 - x11 + 1)  # the weights of overlaph = np.maximum(0, y22 - y11 + 1)  # the height of overlapoverlaps = w * h# 计算相关IOU值(交集面积/并集面积,表示边框重合程度,越大表示越相似,越该删除)ious = overlaps / (areas[i] + areas[index[1:]] - overlaps)# 只保留iou小于阈值的索引号,重复上步idx = np.where(ious <= thresh)[0]# 因为第一步index[0]已经被划走,所以需要原来的索引号需要多加一index = index[idx + 1]return keepimport matplotlib.pyplot as pltdef plot_bbox(dets, c='k', title_name="title"):x1 = dets[:, 0]y1 = dets[:, 1]x2 = dets[:, 2]y2 = dets[:, 3]plt.plot([x1, x2], [y1, y1], c)plt.plot([x1, x1], [y1, y2], c)plt.plot([x1, x2], [y2, y2], c)plt.plot([x2, x2], [y1, y2], c)plt.title(title_name)if __name__ == '__main__':plot_bbox(boxes, 'k', title_name="before nms")  # before nmsplt.show()keep = py_cpu_nms(boxes, thresh=0.7)plot_bbox(boxes[keep], 'r', title_name="after_nme")  # after nmsplt.show()

运行结果:

NMS非极大值抑制原理——目标检测相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. NMS——非极大值抑制

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

  8. yolov3 NMS非极大值抑制

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

  9. NMS 非极大值抑制

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

  10. 【算法】非极大值抑制原理、流程和代码

    代码如下: # -------------------------------------------------------- # Fast R-CNN # Copyright (c) 2015 M ...

最新文章

  1. ARM汇编:加载和存储指令集(六大类)---LDR(ADR)、LDRB、LDRH、STR、STRB、STRH
  2. C++ 容器及选用总结
  3. mySql 注入攻击
  4. Linux 之四 Ubuntu 20.04 WiFi 无法使用、设置无法显示、远程桌面、SSH、Git、PPA、FFmpeg 等各问题记录
  5. 监管升级,央行变相加息,贷款难还在继续
  6. linux路由内核实现分析(四)---路由缓存机制(2)
  7. MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效
  8. android 音效,音效  |  Android 开源项目  |  Android Open Source Project
  9. 小爱音箱mini系统故障怎么办_Win7蓝牙连接小爱音箱mini的详细教程
  10. SAP中检验计划创建晚于检验批导致无法质检的问题分析处理
  11. TwinCAT 3 使用XML-server
  12. 单片机一键开关机电路
  13. jvm学习——jvm内存区域
  14. 【转】Coherence Step by Step
  15. 大多数程序员都懂的java虚拟机:C1编译器从字节码到HIR
  16. 如何正确安装PARSEC。
  17. 鲁大师电动车智能化测评报告第八期
  18. 计算个人所得税,北大青鸟S2 上机第二阶段第一题
  19. 初探Log4j2-yaml配置坑
  20. 魔方三阶玩法[图解]

热门文章

  1. 软件开发流程:需求评审流程
  2. 工商管理专业知识与实务(中级)【4】
  3. 牛拉法潮流计算 matlab,牛拉法潮流计算原理
  4. 生成pdf设置中文字体出错 \simsun.ttc' with 'Identity-H' is not recognized或者type of font{0} is not recognized
  5. JDBC在jsp中的使用
  6. 机器学习——BP神经网络
  7. 刺客信条3重制版修改器|刺客信条3重制版十项修改器风灵月影版下载
  8. 使用梦网云通讯平台解决手机验证码问题
  9. Gradle 下载失败的问题解决
  10. WBS工作分解结构法