NMS总结
NMS总结
一. NMS
目标检测:同一个类别中,以置信度为首选,置信度高的,抑制(删除)周围交集大的置信度低的框。
这里直接以Soft-NMS论文中的一幅图为例子:
- 输入:
- 每次输入一个类,类内进行NMS
- \(B={b_1,...,b_N}\) :检测到的bounding box
- \(S={s_1,...,s_N}\) :置信度
- \(N_t\) :NMS的阈值
- 设置一个 \(D = \{\}\) 为空,用于存储最终的框BBOX
- 开始循环(直到 \(B\) 为空结束:
- \(m=argmax(S)\) :排序置信度,获得index
- \(M=B[m[0]]\) :这里原论文表述有点歧义,\(M\) 表示当前最大置信度的BBOX
- \(D=D\cup M, B=B-M,S=S-M[m[0]]\) :将 \(M\) 添加进 \(D\) 中,因为当前置信度最大值一定是最终BBOX。将 \(M\) 从 \(B\) 中移除,获得一个少一个。其实也应该将 \(S\) 进行同等 \(B\) 的操作。
- 对剩下的 \(B\) 进行循环:
- 获得当前 \(b_i\)
- 计算当前 \(IOU(M,b_i)\)
- 大于阈值:\(B=B-b_i,S=S-s_i\) 直接移除即可,肯定不是最终BBOX
- 获得 \(D\) 最终的BBOX,如果你想得到置信度,直接类似 \(D\) 操作建立一个空白数组即可。
部分代码修改,如有BUG请参考源码
# --------------------------------------------------------
# Fast R-CNN
# Copyright (c) 2015 Microsoft
# Licensed under The MIT License [see LICENSE for details]
# Written by Ross Girshick
# --------------------------------------------------------
#
import numpy as np
def py_cpu_nms(dets, thresh):
"""Pure Python NMS baseline."""
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
scores = dets[:, 4]
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
order = scores.argsort()[::-1]
keep = []
while order.size > 0:
i = order[0]
keep.append(i)
xx1 = np.maximum(x1[i], x1[order])
yy1 = np.maximum(y1[i], y1[order])
xx2 = np.minimum(x2[i], x2[order])
yy2 = np.minimum(y2[i], y2[order])
w = np.maximum(0.0, xx2 - xx1 + 1)
h = np.maximum(0.0, yy2 - yy1 + 1)
inter = w * h
ovr = inter / (areas[i] + areas[order] - inter + 1e-9)
inds = np.where(ovr <= thresh)[0]
order = order[inds]
pass
return keep
if __name__ == "__main__":
result = py_cpu_nms(np.array([[1,2,3,4,0.5],
[1,2,3,4,0.6],
[1,2,3,4,0.7],
[10,40,30,40,0.8]]), 0.8)
print(f'NMS Index: {result}')
二. Soft-NMS
NMS直接使用一个固定的阈值进行判断,Soft-NMS顾名思义是利用一个软化的判断条件:
一句话带过:使用一个函数代替 \(IOU\) 的结果,把结果当做置信度,最后进行集中判断。
三. IOU-Guided NMS
上面两种NMS、Soft-NMS都是使用 \(Score\) 作为最终指标,使用IOU作为抑制指标。
下面这幅图可以看出,\(Score\) 和 IOU 不成正比,进一步提出使用IOU作为最终指标,同时使用IOU也作为抑制指标
伪代码已注释,源代码未开源且需要IOU分支,无法直接剥离出来,所以使用的人基本没有。
四. Softer-NMS
思想和IOU-NMS差不多,都是解决 \(Score\) 作为最终指标的缺陷
论文主要分为两个部分;
- 分布估计
这部分可以参考:GFocal
根据上面参考,这篇论文的思路就很简单了。
论文假设Location属于高斯分布(类似Gaussian-YOLO),实际的值属于Delta分布(因为是单一值)
很明显的想到使用分布相似度估计(KL散度等),看下面的图,理想状态是方差为0高斯分布趋向于一条直线
考虑一下,当中心点偏差较大时,方差越大Loss就越大(带入几个数算一下),这里可以当做NMS中的计算,确定好最大置信度,旁边的框方差越大越好
中心点:预测的位置坐标,方差=标准差:高斯分布的参数。在Loss公式,这两个值不是正比例关系,当位置正好等于label时,方差越小越好。其它情况得看公式作图了。
具体公式参考原论文,建议先看懂GFocal,那对于这篇文章就很简单
结果是我们获得了位置和方差,同时Cls分支也得到了置信度
- NMS操作
NMS是直接将大于阈值的框置信度设置为0(对周围框处理)
Soft-NMS是降低大于阈值的框置信度(对周围框处理)
IOU-NMS是将置信度换成IOU,其它和NMS一样(对置信度处理)
Softer-NMS是给予周围框一定权重,影响置信度最大的框(对当前框进行处理)
伪代码如下图所示,最大值按照置信度排序,最终的值是根据周围IOU和方差进行计算的权值,加权到最大置信度框上。笔者未具体看源码
五. DIOU-NMS
这里涉及到目标检测的Loss函数,IOU、GIOU、CIOU、DIOU等,当前使用DIOU作为Loss,效果确实有提升。
该方法直接使用DIOU代替置信度,没什么好说的
六. 总结
下面对方法进行一下总结:
方法 | 置信度 | 最大值操作 | 邻居大于阈值 | 邻居丢弃情况 |
---|---|---|---|---|
NMS | 分类score | 直接使用 | 直接抑制为0 | 直接丢弃 |
Soft-NMS | 分类score | 直接使用 | 按IOU抑制 | 可能丢弃 |
IOU-NMS | IOU | 直接使用 | 直接抑制为0 | 直接丢弃 |
Softer-NMS | 分类score | 结合邻居使用 | 按iOU抑制 | 可能丢弃 |
DIOU-NMS | DIOU | 直接使用 | 直接抑制为0 | 直接丢弃 |
NMS总结的更多相关文章
- Apache.NMS.Stomp 下载
最近项目中有用到ActiveMQ, MQ服务器61613的端口是用的STOMP协议, 原来项目中有使用MQ, 但发现缺少Apache.NMS.Stomp.dll的引用,于是上官网上找,结果发现所有的A ...
- ActiveMQ NMS使用过程中的一点经验
最近,项目中使用到了ActiveMQ获取第三方推送过来的数据.具体背景是:公司需要监控全国各地车辆实时运行的GPS数据,但监控本身不是公司做的,而是交给第三方公司做,第三方采集GPS数据后推送给我们. ...
- 非极大值抑制(Non-Maximum Suppression,NMS)
概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二 ...
- 目标检测 非极大值抑制(Non-Maximum Suppression,NMS)
非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.也可以理解为只取置信度最高的一个识别结果. 举例:  如图所示,现在 ...
- 非极大值抑制(NMS)
转自:https://www.cnblogs.com/makefile/p/nms.html 概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的 ...
- object detection[NMS]
非极大抑制,是在对象检测中用的较为频繁的方法,当在一个对象区域,框出了很多框,那么如下图: 上图来自这里 目的就是为了在这些框中找到最适合的那个框.有以下几种方式: 1 nms 2 soft-nms ...
- 非极大值抑制(NMS)的几种实现
因为之前对比了RoI pooling的几种实现,发现python.pytorch的自带工具函数速度确实很慢,所以这里再对Faster-RCNN中另一个速度瓶颈NMS做一个简单对比试验. 这里做了四组对 ...
- NMS和soft-nms算法
非极大值抑制算法(nms) 1. 算法原理 非极大值抑制算法(Non-maximum suppression, NMS)的本质是搜索局部极大值,抑制非极大值元素. 2. 3邻域情况下NMS的实现 3邻 ...
- 【NMS与IOU代码】
# -*- coding: utf-8 -*- import numpy as np def IOU1(A,B): #左上右下坐标(x1,y1,x2,y2) w=max(0,min(A[2],B[2] ...
- 机器学习中,使用NMS对框取优
一.NMS实现代码 # http://www.pyimagesearch.com/2015/02/16/faster-non-maximum-suppression-python/ import nu ...
随机推荐
- 操作系统(AIX)双因素身份认证解决方案-中科恒伦CKEY DAS
一.场景分析 操作系统是管理计算机硬件与软件资源的计算机程序,用于工作中的进程管理.存储管理.设备管理.文件管理.作业管理等,十分重要,安全等级极高! 二.问题分析 1.密码设置简单,非常容易被撞 ...
- 使用DynamicExpresso实现表达式求值
之前写了一篇Z.Expressions表达式计算的博客,直到最近才发现Z.Expressions不是免费的.Z.Expressions从2.0开始支持了NetCore,使用一段时期后会提示许可证到期, ...
- 金蝶k/3 cloud 生产用料清单下推生成调拨单二开记录
系统默认的生产用料清单下推生成调拨单功能,是根据调拨选单数量来的,有库存和没有库存的都混在一起,导致业务人员审核调拨单的时候需要删除没有库存的分录行,严重影响工作效率. 现通过二开程序,根据生产用料清 ...
- 系统模块sys的常用方法
sys.argv参数 sys.argv 等价于是一个列表,argv[0] 代表当前脚本程序路径名,可以通过在外部获取多个参数传递给脚本程序执行,按照列表的取值方式第二个数据就是sys.argv[1] ...
- 测试工具-XPath使用
XML有两种MIME类型,即application/xml和text/xml,在HTTP中,MIME Type类型被定义在Content-Type header中.我们经常也会看到接口返回数据类型为X ...
- Python-用装饰器实现递归剪枝
求一个共有10个台阶的楼梯,从下走到上面,一次只能迈出1~3个台阶,并且不能后退,有多少中方法? 上台阶问题逻辑整理: 每次迈出都是 1~3 个台阶,剩下就是 7~9 个台阶 如果迈出1个台阶,需要求 ...
- SpringBoot整合SpringDataJPA,今天没啥事情就看了一下springboot整合springdataJPA,实在是香啊,SQL语句都不用写了
SpringBoot整合SpringDataJPA 1.JPA概念 JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映 ...
- ByPass Mode(略过模式或旁路模式)
参考: 1. https://baike.baidu.com/item/%E6%97%81%E8%B7%AF%E6%A8%A1%E5%BC%8F/3120563 2. https://zhidao.b ...
- 0xctf[No parameters readfile](魔改版[GXYCTF2019]禁止套娃)
阅读本文前建议先阅读本站中的另一篇文章:[GXYCTF2019]禁止套娃 重要参考链接:http://www.heetian.com/info/827 Leon师傅魔改了[GXYCTF2019]禁止套 ...
- maven下载依赖包下载失败
在家办公,遇到项目的maven包下载不了,刚开始以为是vpn的问题,折腾半天反复确认之后没有发现什么问题. 同时试过阿里巴巴的maven仓库,删除过以来,重新导过包发现都不行. 后来在idea的设置里 ...