⾮极⼤值抑制(Non-Maximum Suppression)原理

⾮极⼤值抑制,顾名思义,找出极⼤值,抑制⾮极⼤值。这种思路和算法在各个领域中应⽤⼴泛,⽐如边缘检测算法canny算⼦中就使⽤了该⽅法。本⽂主要讨论nms在⽬标检测中的应⽤。⽬标检测过程中,模型在同⼀⽬标的位置上经常会产⽣⼤量的候选框,如下图是赫本的⼈脸检测结果。可以看出这些候选框之间的重叠度⾮常⾼,此时就需要利⽤nms找到最佳⽬标,消除冗余的边界框。

奥黛丽赫本-⼈脸检测示意图

nms的原理很简单,主要分为如下⼏步:

  1. 将候选框按照置信度进⾏排序
  2. 计算置信度最⾼的候选框与其它候选框的IoU(交并⽐)
  3. 删除IoU⼤于设定阈值的候选框
  4. 重复上述过程,直⾄候选框列表为空

这里的IoU指的是Intersection over Union,代表候选区域之间的交并比,计算如下图所示。

IOU计算示意图

python代码解析

nms的开源代码很多,初学者往往被各种复杂代码⾥花式的写法迷惑,但其实nms的代码很好写,完全不需要很复杂的数据结构及算法,这⾥笔者用numpy尽量写了⼀个最精简、最易读的版本,⼀共30⾏,供⼤家参考。

def nms_rect(box, iou):    keep_ = []    if len(box) > 1:        x1 = box[:, 0]        y1 = box[:, 1]        x2 = box[:, 2]        y2 = box[:, 3]        score = box[:, 4]        area = (y2 - y1 + 1) * (x2 - x1 + 1)        while len(score) > 1:            order = score.argsort()[::-1]            i = order[0]            xx1 = np.maximum(x1[i], x1[order[1:]])            yy1 = np.maximum(y1[i], y1[order[1:]])            xx2 = np.minimum(x2[i], x2[order[1:]])            yy2 = np.minimum(y2[i], y2[order[1:]])            w = np.maximum(0., xx2 - xx1)            h = np.maximum(0., yy2 - yy1)            inter = w * h            ovr = inter / (area[i] + area[order[1:]] - inter)            inds = np.where(ovr > iou) + np.array([1])            inds = np.append(inds, 0)            keep_.append([x1[i], y1[i], x2[i], y2[i], score[i]])            x1 = np.delete(x1, order[inds])            y1 = np.delete(y1, order[inds])            x2 = np.delete(x2, order[inds])            y2 = np.delete(y2, order[inds])            area = np.delete(area, order[inds])            score = np.delete(score, order[inds])    return keep_

结果展示

从左到右依次是原图、nms处理前、nms处理后,可以看出效果很明显。

nms效果图

写在最后

nms是算法研究⼈员⼗分常⽤的算法,笔者在⼯作⾯试中也经常会出这道题,因此还是很有必要掌握的,接下来的⽂章也会持续分享⼯作期间总结的论⽂、笔记和代码。欢迎关注与转发。

密码算法中iv值是什么_?标检测中的?极?值抑制算法(nms):python代码解析相关推荐

  1. nms python代码_?标检测中的?极?值抑制算法(nms):python代码解析

    ⾮极⼤值抑制(Non-Maximum Suppression)原理 ⾮极⼤值抑制,顾名思义,找出极⼤值,抑制⾮极⼤值.这种思路和算法在各个领域中应⽤⼴泛,⽐如边缘检测算法canny算⼦中就使⽤了该⽅法 ...

  2. 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中进行断点调试 | ELFFile 实例对象分析 )

    文章目录 一.PyCharm 中进行断点调试 二.ELFFile 实例对象分析 一.PyCharm 中进行断点调试 在上一篇博客 [Android 逆向]使用 Python 代码解析 ELF 文件 ( ...

  3. 假定在使用CSMA/CD协议的10Mb/s以太网中某个站在发送数据时检测到碰撞,执行退避算法时选择了随机数r=100。试问这个站需要等待多长时间后才能再次发送数据?如果是100Mb

    假定在使用CSMA/CD协议的10Mb/s以太网中某个站在发送数据时检测到碰撞,执行退避算法时选择了随机数r=100.试问这个站需要等待多长时间后才能再次发送数据?如果是100Mb/s的以太网呢? 以 ...

  4. otsu自适应阈值分割的算法描述和opencv实现,及其在肤色检测中的应用

    from:http://blog.csdn.net/onezeros/article/details/6136770 otsu算法选择使类间方差最大的灰度值为阈值,具有很好的效果 算法具体描述见ots ...

  5. 刷网课会被检测出来吗_目标检测中的Precision和Recall

    目标检测中常用的性能评价指标有Precision,Recall和F1 score. 当面对不同的任务时,该如何提高recall和precision? 思考:对于Precision值,其代表的是你所预测 ...

  6. excel中显示隐藏的行_在Excel中显示或隐藏用户提示

    excel中显示隐藏的行 When you set up a worksheet for other people to use, data validation messages can help ...

  7. java中随机数怎么定义类_浅析Java中的随机数类

    Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试. 1.测试一: 使用不带参数的Random()构造函数 * @author Carl ...

  8. mfc 静态框接收tab焦点_目标检测中焦点损失的入门指南

    介绍 对象检测是计算机视觉社区中研究最广泛的主题之一.它已经进入了各个行业,涉及从图像安全,监视,自动车辆系统到机器检查的用例. 当前,基于深度学习的对象检测可以大致分为两类: 两级检测器,例如基于区 ...

  9. vue判断列表中包含某一项_判断字符串中是否包含某个字符串

    String对象的方法 1. indexOf() indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 如果要检索的 字符串值没有出现,则该方法返回 -1. var str='你 ...

最新文章

  1. myeclipse安装svn插件
  2. Dynamics CRM 同一实体多个Form显示不同的Ribbon按钮
  3. 【坐在马桶上看算法】算法4:队列——解密QQ号
  4. phpstudy页面不存在_网站的404页面对于SEO的重要作用
  5. Java8系列之重新认识HashMap
  6. HTTP状态码:400\500 错误代码
  7. Object C语法快速入门
  8. Play framework 2.0 -应用程序全局设置(转)
  9. 数据实验室:让您的数据获得真正的价值
  10. 成功解决 AttributeError: module ‘neat’ has no attribute ‘Config’解决方式
  11. 若变量已正确定义并赋值,不符合c语言语法的表达式是____.,若变量已正确定义并赋值,表达式______不符合C语言语法.A、a*b/c; B、3.14%2 C、2,b D、a/b/...
  12. USB3014-应用程序开发(2)
  13. python抠图教程视频_3行Python代码实现8秒抠图的AI神器,根本无需PS(附视频教程)...
  14. 接口请求 Provisional headers are shown
  15. python爬虫读后感-学习爬虫的感想和心得
  16. steam linux 安装目录,如何在Ubuntu中安装Steam | MOS86
  17. 【全文翻译】Membership Inference Attacks Against Machine Learning Models
  18. 拥塞窗口cwnd的理解
  19. SD卡pin引脚说明及PCB layout指导
  20. hook:实现简单的键盘记录器

热门文章

  1. SD-WAN技术三大优势将成为SD-WAN方案成功的关键—Vecloud
  2. 提取稳定前景的两种方法
  3. 电力电子技术学习笔记
  4. Windows socket c++ TCP UDP 简单客户端 vs2013
  5. 一些安全相关的HTTP响应头
  6. PE格式详细讲解1 - 系统篇01|解密系列
  7. SQL Server开发人员应聘常见问题妙解
  8. Java集合框架图(学习)
  9. 99.两个时钟不同步的设备怎么通信?
  10. 学Python10大理由:功能多、资源多、挣钱多!