深度学习之 soft-NMS

  • 论文:《Improving Object DetectionWith One Line of Code》
  • soft-NMS 英文论文链接:https://arxiv.org/pdf/1704.04503.pdf
  • soft-NMS github 链接:https://github.com/bharatsingh430/soft-nms

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

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

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

思路:不要粗鲁地删除所有IOU大于阈值的框,而是降低其置信度。

soft NMS算法的大致思路为:M为当前得分最高框,bi 为待处理框,bi 和M的IOU越大,bi 的得分si 就下降的越厉害。
在这里插入图片描述

soft-NMS算法中的修剪步骤可以写成如下的评分函数:

(1)线性加权:
在这里插入图片描述

(2)高斯加权:
在这里插入图片描述
在这里插入图片描述
假如还检测出了3号框(最细的红色框),而我们的最终目标是检测出1号和2号框,并且剔除3号框,原始的nms只会检测出一个1号框并剔除2号框和3号框,而softnms算法可以对1、2、3号检测狂进行置信度排序,可以知道这三个框的置信度从大到小的顺序依次为:1-》2-》3(由于是使用了惩罚,所有可以获得这种大小关系),如果我们再选择了合适的置信度阈值,就可以保留1号和2号,同时剔除3号,实现我们的功能。

但是,这里也有一个问题就是置信度的阈值如何选择,作者在这里依然使用手工设置的值,依然存在很大的局限性,所以该算法依然存在改进的空间

sotf-NMS算法实现代码如下:

# coding:utf-8
import numpy as np
def soft_nms(boxes, sigma=0.5, Nt=0.1, threshold=0.001, method=1):N = boxes.shape[0]pos = 0maxscore = 0maxpos = 0for i in range(N):maxscore = boxes[i, 4]maxpos = itx1 = boxes[i,0]ty1 = boxes[i,1]tx2 = boxes[i,2]ty2 = boxes[i,3]ts = boxes[i,4]pos = i + 1# get max boxwhile pos < N:if maxscore < boxes[pos, 4]:maxscore = boxes[pos, 4]maxpos = pospos = pos + 1# add max box as a detectionboxes[i,0] = boxes[maxpos,0]boxes[i,1] = boxes[maxpos,1]boxes[i,2] = boxes[maxpos,2]boxes[i,3] = boxes[maxpos,3]boxes[i,4] = boxes[maxpos,4]# swap ith box with position of max boxboxes[maxpos,0] = tx1boxes[maxpos,1] = ty1boxes[maxpos,2] = tx2boxes[maxpos,3] = ty2boxes[maxpos,4] = tstx1 = boxes[i,0]ty1 = boxes[i,1]tx2 = boxes[i,2]ty2 = boxes[i,3]ts = boxes[i,4]pos = i + 1# NMS iterations, note that N changes if detection boxes fall below thresholdwhile pos < N:x1 = boxes[pos, 0]y1 = boxes[pos, 1]x2 = boxes[pos, 2]y2 = boxes[pos, 3]s = boxes[pos, 4]area = (x2 - x1 + 1) * (y2 - y1 + 1)iw = (min(tx2, x2) - max(tx1, x1) + 1)if iw > 0:ih = (min(ty2, y2) - max(ty1, y1) + 1)if ih > 0:ua = float((tx2 - tx1 + 1) * (ty2 - ty1 + 1) + area - iw * ih)ov = iw * ih / ua #iou between max box and detection boxif method == 1: # linearif ov > Nt:weight = 1 - ovelse:weight = 1elif method == 2: # gaussianweight = np.exp(-(ov * ov)/sigma)else: # original NMSif ov > Nt:weight = 0else:weight = 1boxes[pos, 4] = weight*boxes[pos, 4]print(boxes[:, 4])# if box score falls below threshold, discard the box by swapping with last box# update Nif boxes[pos, 4] < threshold:boxes[pos,0] = boxes[N-1, 0]boxes[pos,1] = boxes[N-1, 1]boxes[pos,2] = boxes[N-1, 2]boxes[pos,3] = boxes[N-1, 3]boxes[pos,4] = boxes[N-1, 4]N = N - 1pos = pos - 1pos = pos + 1keep = [i for i in range(N)]return keep
boxes = np.array([[100, 100, 150, 168, 0.63],[166, 70, 312, 190, 0.55],[221, 250, 389, 500, 0.79],[12, 190, 300, 399, 0.9],[28, 130, 134, 302, 0.3]])
keep = soft_nms(boxes)
print(keep)

效果

下图可以看出,基本可以获得平均1%的提升,且不增加额外的训练和计算负担。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目微管理 - 总结也是新的开始

时间都去哪了&#xff1f;听着这首耳熟能详的旋律&#xff0c;感叹着飞速流逝的年华&#xff0c;我渐渐的陷入到沉思之中。时间过的真的很快&#xff0c;从一名程序员到接手一个一线项目团队一晃已经2年多了。在这段时间里&#xff0c;我接触了各种各样的人&#xff0c;处理了各…

一维二维_Excel二维数据转一维,2种方法轻松搞定

今天是2020年1月1日&#xff0c;祝各位小伙伴们新年快乐&#xff0c;开心每一天~如下所示&#xff0c;左边是二维交叉数据表&#xff0c;我们希望快速转换成右边的一维数据表如果复制粘贴&#xff0c;效率太低了&#xff0c;今天分享两种方法&#xff0c;实现快速转换1、powerq…

数百种 Windows 软件的免费替代品列表

程序所执行任务的描述WindowsLinux1) 网络连接网页浏览器微软 IE&#xff0c;网景 Netscape / Mozilla&#xff0c; Opera [私有]&#xff0c;Firebird&#xff0c;……1) Netscape/Mozilla 2) Galeon. 3) Konqueror. 4) Opera.[私有] 5) Firebird. 6) Nautilus 7) Epiphany 8)…

深度学习之 Cascade R-CNN

Zhaowei Cai, Nuno Vasconcelos. 《Cascade R-CNN: Delving into High Quality Object Detection》. CVPR 2018.论文链接&#xff1a;https://arxiv.org/abs/1712.00726代码链接&#xff1a;https://github.com/zhaoweicai/cascade-rcnn 前言 IOU阈值被用来定义正负例&#x…

转换文档参数_明明2秒可以搞定Word、Excel相互转换,你却用了半小时!真亏了...

我们在用office三件套工作的时候&#xff0c;经常都需要对文件的格式进行转换&#xff0c;像是Word文档和Excel表格的转换&#xff0c;很多小伙伴都要花上半个小时甚至以上的时间才能搞定&#xff0c;效率实在不行。别担心&#xff0c;今天小编将分享能快速完成Word、Excel转换…

深度学习之 DCN(Deformable Convolution)-可变形卷积

Paper link: http://openaccess.thecvf.com/content_ICCV_2017/papers/Dai_Deformable_Convolutional_Networks_ICCV_2017_paper.pdfhttps://arxiv.org/pdf/1703.06211 Code link: https://github.com/msracver/Deformable-ConvNets Abstract 如何有效地对几何图形的变化进行…

软件开发 项目进展 软件架构 指南

软件开发&#xff0c;标准化流水线式开发的实施构想 软件开发&#xff0c;标准化流水线式开发的实施构想 近日看到一篇博文&#xff0c;讨论标准化流水线开发模式的话题&#xff0c;但是这篇博文仅仅提出这个问题&#xff0c;未见回应。 这其实是一个很大的问题&#xff0c;我…

linux 下php多版本安装

php-multi-version ubuntu apt-get 安装php5.6 添加软件源sudo add-apt-repository ppa:ondrej/php sudo apt-get updatesudo apt-get install php5.6sudo apt-get install php5sudo apt-get install php7 /usr/local/bin 与/usr/bin echo $PATH/usr/local/sbin:/usr/local/bin…

c++ 舞伴配对问题_挑战新物体描述问题,视觉词表解决方案超越人类表现

编者按&#xff1a;最近&#xff0c;研究者们发布了 nocaps 挑战&#xff0c;用以测量在没有对应的训练数据的情况下&#xff0c;模型能否准确描述测试图像中新出现的各种类别的物体。针对挑战中的问题&#xff0c;微软 Azure 认知服务团队和微软研究院的研究员提出了全新解决方…

深度学习之双线性插值(Bilinear interpolation)

1. 什么是插值 Interpolation is a method of constructing new data points within the range of a discrete set of known data points. Image interpolation refers to the“guess”of intensity values at missing locations. 图片放大是图像处理中的一个特别基础的操作。…

div table 超出了_div包裹的table,table的宽度超出了的宽度,出现的滚动条的在windows下无法拖动...

1.父级div是否设置了宽度&#xff0c;只有设置了宽度且滚动条在div内才是你想要控制的滚动2.仅凭你说的这些属性不知道滚动条怎么不能动&#xff0c;可以贴一下代码&#xff1f;3.横向需要滚动条的话必须设置table的确定宽度做了一个demo:.table{table-layout:fixed; width:…

第二阶段站立会议7

昨天&#xff1a;美化页面 今天&#xff1a;进行项目上传 问题&#xff1a;阿里云服务器上的mysql出现连接问题转载于:https://www.cnblogs.com/sdysyhj/p/8301489.html

深度学习之 OHEM (Online Hard Example Mining)

论文 《Training Region-based Object Detectors with Online Hard Example Mining》链接 https://arxiv.org/pdf/1604.03540.pdf Astract 摘要主要讲了四点&#xff1a; (1) 训练过程需要进行参数的空间搜索(2) 简单样本与难分辨样本之间的类别不平衡是亟需解决的问题(3) 自…

音视频 详解

avi文件格式详解 AVI是音频视频交错(Audio Video Interleaved)的英文缩写&#xff0c;它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式&#xff0c;原先用于Microsoft Video for Windows (简称VFW)环境&#xff0c;现在已被Windows 95/98、OS/2等多数操…

c6011取消对null指针的引用_C++| 函数的指针参数如何传递内存?

函数的参数是一个一级指针&#xff0c;可以传递内存吗&#xff1f;如果函数的参数是一个一级指针&#xff0c;不要指望用该指针去申请动态内存。看下面的实例&#xff1a;#include using namespace std;void GetMemory(char *p, int num){p (char *)malloc(sizeof(char) * num…

Servlet执行时要实现的方法

Servlet执行时要实现的方法 public void init(ServletConfig config) public ServletConfig getServletConfig() public String getServletInfo() public void service(ServletRequest request,ServletResponse response) public void destroy() 本文转自sucre03 5…

axios 设置拦截器 全局设置带默认参数(发送 token 等)

应用场景&#xff1a;1&#xff0c;每个请求都带上的参数&#xff0c;比如token&#xff0c;时间戳等。2&#xff0c;对返回的状态进行判断&#xff0c;比如token是否过期代码如下&#xff1a;[javascript] view plain copyaxios.interceptors.request.use( config &g…

深度学习目标检测之 YOLO v2

论文名&#xff1a;《YOLO9000: Better, Faster, Stronger》原文&#xff1a;https://arxiv.org/pdf/1612.08242v1.pdf代码&#xff1a;http://pjreddie.com/darknet/yolo/ YOLO v2 斩获了CVPR 2017 Best Paper Honorable Mention。在这篇文章中&#xff0c;作者首先在YOLOv1的…

tcpmp 编译 源代码分析

TCPMP源代码分析 TCPMP源代码分析 播放器主要由核心框架模块&#xff08;common工程&#xff09;和解码器、分离器插件组成。TCPMP的插件非常多&#xff0c;其中主要的插件有&#xff1a;interface插件实现了TCPMP的界面&#xff0c;ffmpeg是系统主要的音视频解码模块&#xff…

使用zerorpc踩的第一个坑:

Server端代码&#xff1a;注意s.run() 和 s.run的区别&#xff0c;一个括号搞死我了.如果不加括号&#xff0c;服务端服务是不会启动的&#xff0c;客户端就会报连接超时的错误 Server端在本机所有IP上监听4242端口的tcp协议 import zerorpcclass HelloRPC(object):   def __…