写在最前

本文对网上关于 NMS 的解释整理了一下

一、原理

YOLO在最后的一个步骤就是对 SxSx(Bx5+C) 个向量进行非极大值抑制(Non-max suppression),一开始不是太明白非极大值抑制是如何操作的,也就是不太清楚YOLO最后做完卷积后如何对求得向量进行预测,求得目标框位置。

对YOLO代码分析完之后对其他步骤操作有了一个大致的认识之后,回顾最后一步非极大值抑制,发现非极大值抑制在R-CNN、Fast-RCNN都有用到的同样的概念,因此YOLO的论文并没有提到如何进行非极大值抑制。

其实在物体检测领域当中,非极大值抑制应用十分广泛,目的是为了消除多余的框,找到最佳的物体检测的位置。那么具体如何操作呢?如下图所示,有三个boundingbox,其中第一个绿色boundingbox的置信度是0.7,第二个绿色boundingbox的置信度是0.6,第三个绿色boundingbox的置信度是0.7。非极大值抑制就是在这三个框当中选出置信度最高,且最有可能代表是目标的boundingbox。

为了研究透NMS到底是如何操作的,我来随机定义了4个窗口,置信度分别是[0.5, 0.7, 0.6, 0.7],对应上图的多了一个方框。算法的核心:

  • 1、把置信度最高的一个boundingbox(bbox)作为目标,然后对比剩下bbox与目标bbox之间的交叉区域
  • 2、如果交叉区域大于设定的阈值,那么在剩下的bbox中去除该bbox(即使该bbox的置信度与目标bbox的置信度一样)—-这个操作就是抑制最大重叠区域
  • 3、把第二置信度高的bbox作为目标,重复1、2

二、代码

import numpy as np
dets = np.array([[204, 102, 358, 250, 0.5],[257, 118, 380, 250, 0.7],[280, 135, 400, 250, 0.6],[255, 118, 360, 235, 0.7]])
thresh = 0.3
def nms(dets, thresh):x1 = dets[:, 0]y1 = dets[:, 1]x2 = dets[:, 2]y2 = dets[:, 3]scores = dets[:, 4]areas = (x2 - x1 + 1) * (y2 - y1 + 1) # 每个boundingbox的面积order = scores.argsort()[::-1] # boundingbox的置信度排序keep = [] # 用来保存最后留下来的boundingboxwhile order.size > 0:     i = order[0] # 置信度最高的boundingbox的indexkeep.append(i) # 添加本次置信度最高的boundingbox的index# 当前bbox和剩下bbox之间的交叉区域# 选择大于x1,y1和小于x2,y2的区域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:]])# 当前bbox和其他剩下bbox之间交叉区域的面积w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * h# 交叉区域面积 / (bbox + 某区域面积 - 交叉区域面积)ovr = inter / (areas[i] + areas[order[1:]] - inter)#保留交集小于一定阈值的boundingboxinds = np.where(ovr <= thresh)[0]order = order[inds + 1]return keep
print nms(dets, thresh)

最后的效果就是得到开始定义的4个bbox中的第4个(3):

祝您浏览愉快!

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

  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. R-CNN-减少region proposals的数量:NMS(非极大值抑制)

    在R-CNN算法第一阶段中,selective search会产生2000个region proposals.经过svm打分后,一个物体可能就有多个框.如下图: 但是我们需要一个物体只有一个最优框(相 ...

最新文章

  1. 04:sqlalchemy操作数据库 不错
  2. python怎么new对象_Python使用__new__()方法为对象分配内存及返回对象的引用示例
  3. Struts2漏洞和Struts Scan工具实战
  4. 如何在 ASP.NET Core 中为 gRPC 服务添加全局异常处理 ?
  5. linux中下载的服务压缩包存放在,linux 下tomcat6 配置为服务
  6. 微信公众开放平台开发07---java servlet 实现微信开发第一步:微信服务器验证
  7. VirtualBox 桥接模式
  8. 第一章 微服务网关 - 入门
  9. Kafka 学习笔记之 架构
  10. linux第五单元作业,第五单元《微型计算机系统》教案
  11. java封装的注意事项_新手学习Java之对象---封装
  12. 计算机网络原理 谢希仁(第8版)第一章习题答案
  13. linux limbo镜像文件下载,limbo 2000镜像下载
  14. CCF CSP认证JAVA(一)
  15. Markdown实用小技巧: 个个用着都很爽
  16. 苹果id退出后数据还在吗_答疑你的手机连接WiFi后,会关闭移动数据吗?
  17. 二、Eureka之server端集群节点发现,数据同步
  18. Docker 搭建 LNMP + Wordpress
  19. 图书馆管理系统 13-架构设计
  20. 室内设计优美语句_关于装修设计唯美的句子

热门文章

  1. R语言读取 xlsx 和xls 文件
  2. 二级计算机vfp知识,全国计算机等级考试二级VFP考试大纲
  3. 数理统计与统计软件测试卷,《数理统计》测验卷(一)答案
  4. STM32H743I-EVAL2_RTC_Tamper
  5. linux win10自带浏览器,win10系统下如何安装opera浏览器
  6. zepto的使用方法
  7. sirius java_sirius
  8. 关于Recycle.exe病毒的分析
  9. jcr多久更新一次_最新!2019年中科院分区表更新!!(附查询方法)
  10. ubuntu 18.04安装adb和fastboot调试工具