-
2020-07-30 09:12:32
Soft NMS
论文《Improving Object Detection With One Line of Code》
源码1、Soft-NMS原理及实现
1.动机
非最大抑制(Non-maximum suppression, NMS)是物体检测流程中重要的组成部分(如下图划线部分)。NMS算法首先按照得分从高到低对建议框进行排序,然后分数最高的检测框M被选中,其他框与被选中建议框有明显重叠的框被抑制。该过程被不断递归的应用于其余检测框。根据算法的设计,如果一个物体处于预设的重叠阈值之内,可能会导致检测不到该待检测物体。即当两个目标框接近时,分数更低的框就会因为与之重叠面积过大而被删掉。
2.Soft-NMS的优势
它仅需要对传统的NMS算法进行简单的改动且不增额外的参数。该Soft-NMS算法在标准数据集PASCAL VOC2007(较R-FCN和Faster-RCNN提升1.7%)和MS-COCO(较R-FCN提升1.3%,较Faster-RCNN提升1.1%)上均有提升。
Soft-NMS具有与传统NMS相同的算法复杂度,使用高效。
Soft-NMS不需要额外的训练,并易于实现,它可以轻松的被集成到任何物体检测流程中。3.Soft-NMS原理
见下图伪代码,整个改进只需要使用绿色虚线表示的Soft-NMS替换红色虚线表示的NMS。
B集合是检测到的所有建议框,S集合是各个建议框得分(分数是指建议框包含物体的可能性大小),Nt是指手动设置的阈值。M为当前得分最高框,bi 为待处理框。
综上,soft-nms的核心就是降低置信度。案例:
比如一张人脸上有3个重叠的bounding box, 置信度分别为0.9, 0.7, 0.85 。选择得分最高的建议框,经过第一次处理过后,得分变成了0.9, 065, 0.55(此时将得分最高的保存在D中)。这时候再选择第二个bounding box作为得分最高的,处理后置信度分别为0.65, 0.45(这时候3个框也都还在),最后选择第三个,处理后得分不改变。最终经过soft-nms抑制后的三个框的置信度分别为0.9, 0.65, 0.45。最后设置阈值,将得分si小于阈值的去掉。
缺点:但是,这里也有一个问题就是置信度的阈值如何选择,作者在这里依然使用手工设置的值,依然存在很大的局限性,所以该算法依然存在改进的空间。
4、f(iou(M,bi))权重函数的形式
原来的NMS可以描述如下:将IoU大于阈值的窗口的得分全部置为0。
Soft-NMS的改进有两种形式,一种是线性加权的:
更多相关内容 -
NMS技术总结(NMS原理、多类别NMS、NMS的缺陷、NMS的改进思路、各种NMS方法).doc
2022-07-09 22:04:39NMS技术总结(NMS原理、多类别NMS、NMS的缺陷、NMS的改进思路、各种NMS方法).doc -
LDPC_NMS_decode_LDPC译码NMS译码_LDPC_
2021-09-30 00:27:33LDPC_NMS译码函数,输入变量为待译码数据和校验矩阵,对于校验矩阵H大小无要求,可直接使用。 -
activemq-nms-api:Apache ActiveMQ NMS API的镜像
2021-02-05 15:36:59Apache.NMS:.NET消息服务客户端API 有关更多信息,请参见建造需要Visual Studio 2017或更高版本才能构建Apache.NMS。 要进行构建,请使用nms.sln文件启动Visual Studio并构建解决方案。测验测试使用NUnit Framework... -
locality_aware_nms_east:用于EAST OCR检测的可识别位置的NMS
2021-04-18 00:08:15locality_aware_nms_east CUDA实施用于EAST OCR检测的可识别位置的NMS。 高效运行GPU NMS以获得IOU。 然后,基于IOU,将BBox分为不同的组。 最后,将每个组中的BBox合并为不重叠的BBox。 合并过程是使用CUDA线程... -
Soft-NMS-master.zip
2019-12-22 12:58:40非最大抑制算法:作为FASTER RCNN中的一部分,主要用于去除掉与得分最高的物体框的IOU值大于threadd其他物体框;soft-nms原代码,包括python版、pytorch版, -
NMS算法简单优化
2019-03-19 11:19:21修改了NMS的算法的一些内容,优化了IOU的运算速度,提供了简单的思路 -
Apache.NMS.Stomp-1.5.4-src.zip
2021-03-02 16:07:20ActiveMQ是一个快速而强大的Message Broker,它支持许多跨语言客户端和协议以及许多高级功能,同时完全支持JMS 1.1和J2EE 1.4。activemq/apache-nms/1.5.0 -
cpu_nms.py
2019-03-05 10:07:28重写覆盖原模型中使用的 cpu_nms.pyx, 解决碰到的 ModuleNotFoundError: No module named 'utils.nms.cpu_nms' 报错 -
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020-12-16 18:57:25NMS 算法在目标检测,目标定位领域有较广泛的应用。 算法原理 非极大值抑制算法(Non-maximum suppression, NMS)的本质是搜索局部极大值,抑制非极大值元素。 算法的作用 当算法对一个目标产生了多个候选框的时候,... -
ssd pytorch转 libtorch c++实现 (nms采用cuda并行实现),下载请看描述,
2020-12-15 17:19:25注意里面只有代码,因为本人已转移动端xr方向,所以没来得及写详细的注释,对应博文:ssd pytorch转 libtorch c++实现,谨慎下载,只是因为要的博友有点多,一个个发送实在麻烦,所以放在这里,不能下载可以发邮箱 -
activemq-nms-amqp:Apache ActiveMQ NMS.AMQP客户端的镜像
2021-02-05 20:45:36阿帕奇-NMS-AMQP 建立状态 操作系统 状态 Linux 视窗 安装Apache NMS AMQP 您可以安装 : Install-Package Apache.NMS.AMQP 或通过.NET Core命令行界面: dotnet add package Apache.NMS.AMQP 从程序包管理器... -
【提供操作视频】vivado2019.2平台中纯verilog开发的NMS归一化最小和LDPC译码实现,含testbench
2022-06-23 19:13:441.领域:FPGA,NMS归一化最小和LDPC译码算法 2.内容:【提供操作视频】vivado2019.2平台中纯verilog开发的NMS归一化最小和LDPC译码实现,含testbench 码长为9216 3.用处:用于NMS归一化最小和LDPC译码算法编程学习 ... -
nms-aware-onos:支持NMS的ONOS实施
2021-02-05 23:14:30ONOS:开放网络操作系统 什么是ONOS? ONOS是一种新的SDN网络操作系统,旨在实现高可用性,高性能和横向扩展。 顶级功能 通过集群和分布式状态管理实现高可用性。 通过群集和网络设备控制分片的可伸缩性。... -
cython_nms.cpython-37m-x86_64-linux-gnu.so
2020-04-05 08:58:38Faster-RCNN在linux tensorflow python3.7下运行时需要的make生成文件cython_nms -
YoLov5-TensorRT-NMS:使用Tensorrt C ++ API实现yolov5,并集成批处理的NMSPlugin。 还提供了Python包装器
2021-05-28 12:56:06约洛夫5 来自原始代码。 我修改了yololayer并集成了批处理的NMSPlugin。 提供了yolov5s.wts可以进行快速演示。 如何生成.wts可以参考 。如何运行,以yolov5s为例建立并运行 mkdir buildcd buildcmake ..makesudo ./... -
SVM-classification-localization:HoG,PCA,PSO,硬负开采,滑动窗口,边箱,NMS
2021-05-11 14:10:27HoG,PCA,PSO,硬负开采,滑动窗口,NMS 最好的检测方法是: HoG(功能)-> PCA(较少功能)+ PSO(最佳C&gamma)->原点SVM-> HNM(更多功能)->更好的SVM-> SW-> NMS(bbox回归) 对不起,我很懒惰。 我认为... -
PedestrianDetection-NohNMS:ACM MM 2020 论文“NOH-NMS”代码
2021-05-29 01:03:41NOH-NMS:通过附近物体的幻觉改善行人检测 在ACM MM 2020 上发布的的官方实现。 我们提出了附近物体幻觉器(NOH),该物体以高斯分布与NOH-NMS一起精确定位每个提议附近的物体,从而动态地简化了对可能包含其他... -
activemq-nms-openwire:Apache ActiveMQ NMS OpenWire客户端库的镜像
2021-02-05 16:04:28Apache.NMS:.NET消息服务客户端API 有关更多信息,请参见建造需要Visual Studio 2017或更高版本才能构建Apache.NMS。 要进行构建,请使用nms.sln文件启动Visual Studio并构建解决方案。测验测试使用NUnit Framework... -
NMS技术总结(NMS原理、多类别NMS、NMS的缺陷、NMS的改进思路、各种NMS方法)
2022-05-10 01:08:52点击上方“计算机视觉工坊”,选择“星标”干货第一时间送达作者丨仿佛若有光157来源丨CV技术指南前言本文介绍了NMS的应用场合、基本原理、多类别NMS方法和实践代码、NMS的缺陷和改进思路、介绍了改进NMS的几种常用...点击上方“计算机视觉工坊”,选择“星标”
干货第一时间送达
作者丨仿佛若有光157
来源丨CV技术指南
前言 本文介绍了NMS的应用场合、基本原理、多类别NMS方法和实践代码、NMS的缺陷和改进思路、介绍了改进NMS的几种常用方法、提供了其它不常用的方法的链接。
本文很早以前发过,有个读者评论说没有介绍多类别NMS让他不满意,因此特来补充。顺便补充了NMS的缺点和改进思路。
Non-Maximum Suppression(NMS)非极大值抑制。从字面意思理解,抑制那些非极大值的元素,保留极大值元素。其主要用于目标检测,目标跟踪,3D重建,数据挖掘等。
目前NMS常用的有标准NMS, Soft NMS, DIOU NMS等。后续出现了新的Softer NMS,Weighted NMS等改进版。
原始NMS
以目标检测为例,目标检测推理过程中会产生很多检测框(A,B,C,D,E,F等),其中很多检测框都是检测同一个目标,但最终每个目标只需要一个检测框,NMS选择那个得分最高的检测框(假设是C),再将C与剩余框计算相应的IOU值,当IOU值超过所设定的阈值(普遍设置为0.5,目标检测中常设置为0.7,仅供参考),即对超过阈值的框进行抑制,抑制的做法是将检测框的得分设置为0,如此一轮过后,在剩下检测框中继续寻找得分最高的,再抑制与之IOU超过阈值的框,直到最后会保留几乎没有重叠的框。这样基本可以做到每个目标只剩下一个检测框。
原始NMS(左图1维,右图2维)算法伪代码如下:
实现代码:(以pytorch为例)
def NMS(boxes,scores, thresholds): x1 = boxes[:,0] y1 = boxes[:,1] x2 = boxes[:,2] y2 = boxes[:,3] areas = (x2-x1)*(y2-y1) _,order = scores.sort(0,descending=True) keep = [] while order.numel() > 0: i = order[0] keep.append(i) if order.numel() == 1: break xx1 = x1[order[1:]].clamp(min=x1[i]) yy1 = y1[order[1:]].clamp(min=y1[i]) xx2 = x2[order[1:]].clamp(max=x2[i]) yy2 = y2[order[1:]].clamp(max=y2[i]) w = (xx2-xx1).clamp(min=0) h = (yy2-yy1).clamp(min=0) inter = w*h ovr = inter/(areas[i] + areas[order[1:]] - inter) ids = (ovr<=thresholds).nonzero().squeeze() if ids.numel() == 0: break order = order[ids+1] return torch.LongTensor(keep)
除了自己实现以外,也可以直接使用torchvision.ops.nms来实现。
torchvision.ops.nms(boxes, scores, iou_threshold)
上面这种做法是把所有boxes放在一起做NMS,没有考虑类别。即某一类的boxes不应该因为它与另一类最大得分boxes的iou值超过阈值而被筛掉。
对于多类别NMS来说,它的思想比较简单:每个类别内部做NMS就可以了。
实现方法:把每个box的坐标添加一个偏移量,偏移量由类别索引来决定。
下面是torchvision.ops.batched_nms的实现源码以及使用方法
#实现源码 max_coordinate = boxes.max() offsets = idxs.to(boxes) * (max_coordinate + torch.tensor(1).to(boxes)) boxes_for_nms = boxes + offsets[:, None] keep = nms(boxes_for_nms, scores, iou_threshold) return keep #使用方法 torchvision.ops.boxes.batched_nms(boxes, scores, classes, nms_thresh)
这里偏移量用boxes中最大的那个作为偏移基准,然后每个类别索引乘以这个基准即得到每个类的box对应的偏移量。这样就把所有的boxes按类别分开了。
在YOLO_v5中,它自己写了个实现的代码。
c = x[:, 5:6] * (0 if agnostic else max_wh) # classes boxes, scores = x[:, :4] + c, x[:, 4] # boxes (offset by class), scores i = torchvision.ops.nms(boxes, scores, iou_thres)
这里的max_wh相当于前面的boxes.max(),YOLO_v5中取的定值4096。这里的agnostic用来控制是否用于多类别NMS还是普通NMS。
NMS的缺点
1. 需要手动设置阈值,阈值的设置会直接影响重叠目标的检测,太大造成误检,太小达不到理想情况。
2. 低于阈值的直接设置score为0,做法太hard。
3. 只能在CPU上运行,成为影响速度的重要因素。
4. 通过IoU来评估,IoU的做法对目标框尺度和距离的影响不同。
NMS的改进思路
1. 根据手动设置阈值的缺陷,通过自适应的方法在目标系数时使用小阈值,目标稠密时使用大阈值。例如Adaptive NMS
2. 将低于阈值的直接置为0的做法太hard,通过将其根据IoU大小来进行惩罚衰减,则变得更加soft。例如Soft NMS,Softer NMS。
3. 只能在CPU上运行,速度太慢的改进思路有三个,一个是设计在GPU上的NMS,如CUDA NMS,一个是设计更快的NMS,如Fast NMS,最后一个是掀桌子,设计一个神经网络来实现NMS,如ConvNMS。
4. IoU的做法存在一定缺陷,改进思路是将目标尺度、距离引进IoU的考虑中。如DIoU。
下面稍微介绍一下这些方法中常用的一部分,另一部分仅提供链接。
Soft NMS
根据前面对目标检测中NMS的算法描述,易得出标准NMS容易出现的几个问题:当阈值过小时,如下图所示,绿色框容易被抑制;当过大时,容易造成误检,即抑制效果不明显。因此,出现升级版soft NMS。
Soft NMS算法伪代码如下:
标准的NMS的抑制函数如下:
IOU超过阈值的检测框的得分直接设置为0,而soft NMS主张将其得分进行惩罚衰减,有两种衰减方式,第一种惩罚函数如下:
这种方式使用1-Iou与得分的乘积作为衰减后的值,但这种方式在略低于阈值和略高于阈值的部分,经过惩罚衰减函数后,很容易导致得分排序的顺序打乱,合理的惩罚函数应该是具有高iou的有高的惩罚,低iou的有低的惩罚,它们中间应该是逐渐过渡的。因此提出第二种高斯惩罚函数,具体如下:
这样soft NMS可以避免阈值设置大小的问题。
Soft NMS还有后续改进版Softer-NMS,其主要解决的问题是:当所有候选框都不够精确时该如何选择,当得分高的候选框并不更精确,更精确的候选框得分并不是最高时怎么选择 。论文值得一看,本文不作更多的详解。
此外,针对这一阈值设置问题而提出的方式还有Weighted NMS和Adaptive NMS。
Weighted NMS主要是对坐标进行加权平均,实现函数如下:
其中Wi = Si *IoU(M,Bi),表示得分与IoU的乘积。
Adaptive NMS在目标分布稀疏时使用小阈值,保证尽可能多地去除冗余框,在目标分布密集时采用大阈值,避免漏检。
Softer NMS论文链接:
https://arxiv.org/abs/1809.08545
Softer NMS论文代码:
https://github.com/yihui-he/softer-NMS
Weighted NMS论文链接:
https://ieeexplore.ieee.org/document/8026312/
Adaptive NMS论文链接:
https://arxiv.org/abs/1904.03629
DIoU NMS
当IoU相同时,如上图所示,当相邻框的中心点越靠近当前最大得分框的中心点,则可认为其更有可能是冗余框。第一种相比于第三种更不太可能是冗余框。因此,研究者使用所提出的DIoU替代IoU作为NMS的评判准则,公式如下:
DIoU定义为DIoU=IoU-d²/c²,其中c和d的定义如下图所示
在DIoU实际应用中还引入了参数β,用于控制对距离的惩罚程度。
当 β趋向于无穷大时,DIoU退化为IoU,此时的DIoU-NMS与标准NMS效果相当。
当 β趋向于0时,此时几乎所有中心点与得分最大的框的中心点不重合的框都被保留了。
注:除了DIoU外,还有GIoU,CIoU,但这两个都没有用于NMS,而是用于坐标回归函数,DIoU虽然本身也是用于坐标回归,但有用于NMS的。
GIoU
GIoU的主要思想是引入将两个框的距离。寻找能完全包围两个框的最小框(计算它的面积Ac)。
计算公式如下:
当两个框完全不相交时,没有抑制的必要。
当两个框存在一个大框完全包围一个小框时或大框与小框有些重合时,GIoU的大小在(-1,1)之间,不太好用来作为NMS的阈值。
GIoU的提出主要还是用于坐标回归的loss,个人感觉用于NMS不合适,CIoU也是如此,这里之所以提这个,是因为它与DIoU、CIoU一般都是放一起讲的。
其它相关NMS
为了避免阈值设置大小、目标太密集等问题,还有一些其他方法使用神经网络去实现NMS,但并不常用,这里只提一笔,感兴趣的读者请自行了解。如:
ConvNMS:A Convnet for Non-maximum Suppression
Pure NMS Network:Learning non-maximum suppression
Yes-Net: An effective Detector Based on Global Information
Fast NMS:
https://github.com/dbolya/yolact
Cluster NMS:
https://github.com/Zzh-tju/CIoU
Matrix NMS:
https://github.com/WXinlong/SOLO
Torchvision封装的免编译CUDA NMS
此处参考:
https://zhuanlan.zhihu.com/p/157900024
本文仅做学术分享,如有侵权,请联系删文。
干货下载与学习
后台回复:巴塞罗那自治大学课件,即可下载国外大学沉淀数年3D Vison精品课件
后台回复:计算机视觉书籍,即可下载3D视觉领域经典书籍pdf
后台回复:3D视觉课程,即可学习3D视觉领域精品课程
计算机视觉工坊精品课程官网:3dcver.com
2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
4.国内首个面向工业级实战的点云处理课程
5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)重磅!计算机视觉工坊-学习交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。
同时也可申请加入我们的细分方向交流群,目前主要有ORB-SLAM系列源码学习、3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、深度估计、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。
▲长按加微信群或投稿
▲长按关注公众号
3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、激光/视觉SLAM、自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、答疑解惑、助你高效解决问题
觉得有用,麻烦给个赞和在看~
-
NMS_MODS
2021-03-29 13:21:24NMS_MODS -
WebNMS_SNMPUtilities
2017-03-20 08:59:57找不到资源的可以下载的用下 -
Umbrella NMS-开源
2021-05-15 06:51:04使用平面文件存储其数据库的模块化CMS。 -
NMS通用算法_论文《Efficient Non-Maximum Suppression》(中文)
2018-04-09 20:34:54NMS(non maximum suppression),中文名非极大值抑制,在很多计算机视觉任务中都有广泛应用,如:边缘检测、目标检测等。 -
AdventNet_WebNMS_Professional 4.7- 5.2 SHOCK
2018-01-22 01:11:42webnms 专业的网络环境模拟工具;可以开发网络设备的管理系统! 5.2可用 -
NMS算法介绍
2019-01-03 17:13:52NMS算法的介绍,用于IOU比较。MTCNN中使用了这个算法。 -
activemq-nms-stomp:Apache ActiveMQ NMS.Stomp客户端的镜像
2021-02-05 18:19:43activemq-nms-stomp:Apache ActiveMQ NMS.Stomp客户端的镜像 -
Apache.NMS.2.0.0.nupkg
2021-03-02 16:06:07ActiveMQ是一个快速而强大的Message Broker,它支持许多跨语言客户端和协议以及许多高级功能,同时完全支持JMS 1.1和J2EE 1.4。activemq/apache-nms-api/2.0.0 -
win10 vs2015 编译nms和gpunms
2018-02-07 20:35:04rcnn r-fcn tiny-face 需要用, win10 vs2015 编译nms和gpunms,亲测成功,推荐下载 -
E+H NMS 5/7系列高精度智能伺服液位计说明书.pdf
2019-10-19 21:59:13E+H NMS 5/7系列高精度智能伺服液位计说明书pdf,E+H NMS 5/7系列高精度智能伺服液位计说明书