热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深度学习之非极大值抑制NMS、softNMS、DIoUNMS

1、NMS(非极大值抑制)非极大值抑制(Non-MaximumSuppression,NMS),

1、NMS(非极大值抑制)

非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索。由下图可见,同一个物体可能有好几个框,我们的目标是一个物体只须保留一个最优的框:于是我们就要用到非极大值抑制,来抑制那些冗余的框: 抑制的过程是一个迭代-遍历-消除的过程。
在这里插入图片描述
NMS python实现代码:

def cpu_nums(dets, thresh=0.7):x1 = dets[:,0]y1 = dets[:,1]x2 = dets[:,2]y2 = dets[:,3]scores = dets[:,4]areas = (x2 - x1 + 1)*(y2 - y1 + 1) # 检测框box的面积index = scores.argsort()[::-1] #将每个box的置信度由高到低排序,并返回其在原列表中的索引keep = [] # 保留经nms后的box的索引while index.size > 0: i = index[0]keep.append(i)# 求检测框之间的交集的面积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:]])w = np.maximum(0, x22-x11+1)h = np.maximum(0, y22-y11+1)overlaps = w*hious = overlaps/(areas[i] + areas[index[1:]] - overlaps) # 检测框的交并比idx = np.where(ious

2、Soft-NMS

论文:http://cn.arxiv.org/abs/1704.04503

github:https://github.com/bharatsingh430/soft-nms

问题探究:
在这里插入图片描述
该图像有两个马的检测的置信度(红色和绿色显示),其得分分别为0.95和0.8。绿色检测框与红色检测框有明显的重叠。最好是完全压制绿色框,并将其赋值为0,还是稍低一点,为0.4比较好?

绝大部分目标检测方法,最后都要用到 NMS-非极大值抑制进行后处理。 通常的做法是将检测框按得分排序,然后保留得分最高的框,同时删除与该框重叠面积大于一定比例的其它框。

这种贪心式方法存在如上图所示的问题: 红色框和绿色框是当前的检测结果,二者的得分分别是0.95和0.80。如果按照传统的NMS进行处理,首先选中得分最高的红色框,然后绿色框就会因为与之重叠面积过大而被删掉。

另一方面,NMS的阈值也不太容易确定,设小了会出现下图的情况(绿色框因为和红色框重叠面积较大而被删掉),设置过高又容易增大误检。

解决方法:不要粗鲁地删除所有IOU大于阈值的框,而是降低其置信度。
在这里插入图片描述
传统NMS:
在这里插入图片描述

改进的NMS(soft-NMS):

线性函数
在这里插入图片描述

高斯函数
在这里插入图片描述

分析上面的两种改进形式,思想都是:M为当前得分最高框,b i 为待处理框,b i 和M的IOU越大,b i 的得分s i 就下降的越厉害。
soft-NMS python 实现代码:

def cpu_soft_nms(dets, sigma = 0.5, Nt = 0.7, method = 0, weight = 0, thresh = 0.2 ):box_len = len(dets) # box的个数for i in range(box_len):max_scores = dets[i, 4]tmpx1 = dets[i,0]tmpy1 = dets[i,1]tmpx2 = dets[i,2]tmpy2 = dets[i,3]ts = dets[i,4]max_pos = ipos = i+1while pos 0 and ih >0:overlaps = iw * ihious = overlaps/((tmpx2 - tmpx1 + 1) * (tmpy2 - tmpy1 + 1) + area - overlaps)if method==1: # 线性if ious > Nt:weight = 1 - iouselse:weight = 1elif method==2: # gaussianweight = np.exp(-(ious**2)/sigma)else: # original NMSif ious > Nt:weight = 0else:weight = 1# 赋予该box新的置信度dets[pos, 4] = weight*dets[pos, 4]# print(dets[pos, 4])# 如果box得分低于阈值thresh,则通过与最后一个框交换来丢弃该框if dets[pos,4]

3、DIoUNMS

NMSDIoUloss一文中提出,在nms过程中采用DIoU的计算方式替换了IoU,由于DIoU的计算考虑到了两框中心点位置的信息,故使用DIoU进行评判的nms效果更符合实际,效果更优。
在这里插入图片描述


推荐阅读
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • LeetCode 实战:寻找三数之和为零的组合
    给定一个包含 n 个整数的数组,判断该数组中是否存在三个元素 a、b、c,使得 a + b + c = 0。找出所有满足条件且不重复的三元组。 ... [详细]
  • PHP-Casbin v3.20.0 已经发布,这是一个使用 PHP 语言开发的轻量级开源访问控制框架,支持多种访问控制模型,包括 ACL、RBAC 和 ABAC。新版本在性能上有了显著的提升。 ... [详细]
  • 本文详细介绍了如何使用Python的多进程技术来高效地分块读取超大文件,并将其输出为多个文件。通过这种方式,可以显著提高读取速度和处理效率。 ... [详细]
  • Python函数的高级用法[python基础]
    Python的函数也是一种值:所有函数都是function对象,这意味着可以把函数本身赋值给变量,就像把整数、浮点数、列表、元组赋值给变量一样;同样可以使用函数作为函数的形参,也可 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 机器学习算法:SVM(支持向量机)
    SVM算法(SupportVectorMachine,支持向量机)的核心思想有2点:1、如果数据线性可分,那么基于最大间隔的方式来确定超平面,以确保全局最优, ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 本题主要考察二维数组的遍历和重塑。通过将二维数组降为一维,再根据新的行数和列数重新构建矩阵。 ... [详细]
author-avatar
pS看云梦山水Tn
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有