论文1: Soft-NMS – Improving Object Detection With One Line of Code (ICCV2017) 速达>>
论文2: Softer-NMS–Bounding Box Regression with Uncertainty for Accurate Object Detection(CVPR 2019)速达>>

文章目录

  • 针对问题
  • Soft-NMS
    • Soft NMS算法流程
    • Soft-NMS算法实现
    • 实验
  • Softer-NMS
    • Bounding Box Regression with KL Loss
    • Softer-NMS算法
    • 实验
  • 参考文献

针对问题

传统的NMS存在的问题:

  • 同类的两目标重合度比较大时,容易误删,如 Figure 1
  • 如果过目标附近的预测框均不好呢?Figure 2 (a)的情况如何抉择,两个框都不是好的选择
  • IoU 和分类 score 并不强相关,最高 score 的框不一定是最好的,如 Figure 2 (b)

Soft-NMS

Soft NMS算法流程

NMS 删除框的方式太 Hard,容易误删,针对该问题改进 NMS 得到了Soft NMS:IOU超过阈值时不是立马将其当做重复框剔除,而是降低其分数,最后剔除分数低的,大致流程如下:

传统NMS处理方式比较刚,超过设定阈值就删除该框,容易误伤友军(两个目标的框被当做一个目标的给处理了):
si={si,iou(M,bi)≤Nt0,iou(M,bi)≥Nt\begin{aligned}s_i = \left\{\begin{aligned} s_i,\qquad iou(\mathcal M,b_i)\leq N_t \\ 0,\qquad iou(\mathcal M,b_i)\geq N_t \end{aligned}\right.\end{aligned}si​={si​,iou(M,bi​)≤Nt​0,iou(M,bi​)≥Nt​​​

Soft NMS则更温柔,多给了重合度高的框一个证明自己的机会,以一个降低该框 score 方式(IoU越高则分数应该越低),让其重新去后面排队。最容易想到的就是用线性的方法,将该框 score 和 IoU 直接相乘,论文中给出的是乘以 (1−iou(M,bi)(1-iou(\mathcal M,b_i)(1−iou(M,bi​):
si={si,iou(M,bi)≤Ntsi(1−iou(M,bi)),iou(M,bi)≥Nt\begin{aligned}s_i = \left\{\begin{aligned} &s_i,\qquad\qquad\qquad\qquad\quad iou(\mathcal M,b_i)\leq N_t \\ &s_i(1-iou(\mathcal M,b_i)),\qquad iou(\mathcal M,b_i)\geq N_t \end{aligned}\right.\end{aligned}si​={​si​,iou(M,bi​)≤Nt​si​(1−iou(M,bi​)),iou(M,bi​)≥Nt​​​

但上式不连续,所以实际上用 高斯函数
si=sie−iou(M,bi)2σ,∀bi∉Ds_i = s_ie^{-\frac{iou(\mathcal M,b_i)^2}{\sigma}},\forall b_i \notin \mathcal Dsi​=si​e−σiou(M,bi​)2​,∀bi​∈/​D

当然,最后还是得选择一个合适的score阈值来去掉那些重复框

Soft-NMS算法实现

def cpu_soft_nms(np.ndarray[float, ndim=2] boxes, float sigma=0.5, float Nt=0.3, float threshold=0.001, unsigned int method=0):cdef unsigned int N = boxes.shape[0]cdef float iw, ih, box_areacdef float uacdef int pos = 0cdef float maxscore = 0cdef int maxpos = 0cdef float x1,x2,y1,y2,tx1,tx2,ty1,ty2,ts,area,weight,ovfor i in range(N):# 在i之后找到confidence最高的框,标记为max_posmaxscore = 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# 找到max的框while pos < N:if maxscore < boxes[pos, 4]:maxscore = boxes[pos, 4]maxpos = pospos = pos + 1# 交换max_pos位置和i位置的数据# add max box as a detection boxes[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 + 1while pos < N:# 先记录内层循环的数据bix1 = boxes[pos, 0]y1 = boxes[pos, 1]x2 = boxes[pos, 2]y2 = boxes[pos, 3]s = boxes[pos, 4]# 计算iouarea = (x2 - x1 + 1) * (y2 - y1 + 1)iw = (min(tx2, x2) - max(tx1, x1) + 1) # 计算两个框交叉矩形的宽度,如果宽度小于等于0,即没有相交,因此不需要判断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) #计算union面积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]# 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

实验


Softer-NMS

Soft-NMS 针对的是误删的问题,对另外两个问题没有考虑,而要解释 Softer-NMS 首先得介绍 Bounding Box Regression with KL Loss

Bounding Box Regression with KL Loss

在原本分类和回归两个支路的基础上,增加了一条关于Box std(目标框与对应预测框的距离)的回归支路,定位的同时估计定位置信度,指导修正预测框位置

假设预测框位置与目标框位置间的距离分布为高斯分布, xex_exe​ 表示预测框位置,用一维高斯分布描述如下:
PΘ(x)=12πσ2e−(x−xe)22σ2P_\Theta(x) = \frac1{2\pi\sigma^2}e^{-\frac{(x-x_e)^2}{2\sigma^2}}PΘ​(x)=2πσ21​e−2σ2(x−xe​)2​

目标框位置视为狄拉克分布(只存在有没有的问题)
PD(x)=δ(x−xg)P_D(x) = \delta(x - x_g)PD​(x)=δ(x−xg​)

狄拉克函数性质:∫−∞+∞PD(x)dx=1\int^{+\infty}_{-\infty}P_D(x)dx=1∫−∞+∞​PD​(x)dx=1

KL距离:衡量两个分布间的差异,也称为 KL散度(Kullback-Leibler divergence)、相对熵(relative entropy),令p,qp,qp,q分别为真实和假设两个分布,则两分布间的 KL 距离为:
DKL(p∣∣q)=Ep[log⁡p(x)⏞真实分布q(x)⏟假设分布]=∑x∈χp(x)log⁡p(x)q(x)=∑x∈χ[p(x)log⁡p(x)−p(x)log⁡q(x)]=∑x∈χp(x)log⁡p(x)−∑x∈χp(x)log⁡q(x)\begin{aligned} D_{KL}(p||q)&=E_p\bigg[\log\frac{\overbrace{p(x)}^{\color{blue}\text{真实分布}} }{\underbrace{q(x)}_{\color{blue}\text{假设分布}} } \bigg]=\sum_{x∈χ} p(x)\log\frac{p(x)}{q(x)}\\ &=\sum_{x∈χ}[p(x)\log p(x)−p(x)\log q(x)]\\ &=\sum_{x∈χ}p(x)\log p(x)−\sum_{x∈χ}p(x)\log q(x)\\ \end{aligned}DKL​(p∣∣q)​=Ep​[log假设分布q(x)​​p(x)​真实分布​​]=x∈χ∑​p(x)logq(x)p(x)​=x∈χ∑​[p(x)logp(x)−p(x)logq(x)]=x∈χ∑​p(x)logp(x)−x∈χ∑​p(x)logq(x)​

所以优化目标就是让预测框分布与目标框分布接近:


又有:

对 xex_exe​ 和 σ\sigmaσ 分别求偏导:

σ\sigmaσ 作为分母,为避免梯度爆炸,令 α=log⁡(σ2)\alpha=\log(\sigma^2)α=log(σ2) 代替 σ\sigmaσ,:

参照 Smooth L1Loss\text{Smooth}\ {L_1}\ LossSmooth L1​ Loss 的形式:
SmoothL1(x)={0.5x2if∣x∣<1∣x∣−0.5otherwise\text{Smooth}_{L_1}(x)=\bigg\{\begin{aligned} &0.5x^2 \qquad \quad\; if\;|x|<1\\ &|x|-0.5\qquad otherwise \end{aligned}SmoothL1​​(x)={​0.5x2if∣x∣<1∣x∣−0.5otherwise​

当 ∣xg−xe>1∣|x_g-x_e >1|∣xg​−xe​>1∣时,LregL_{reg}Lreg​ 取下列形式

最终的损失形式为:
SmoothLreg(x)={e−α2(xg−xe)2+12αif∣xg−xe∣<1e−α(∣xg−xe∣−12)+12αotherwise{\color{blue}\text{Smooth}_{L_{reg}}}(x)=\left\{\begin{aligned} &\frac{e^{-\alpha}}{2}(x_g-x_e)^2+\frac 12 \alpha \qquad \qquad\;\; if\;|xg-x_e|<1\\ &{e^{-\alpha}}\left(|x_g-x_e|-\frac12\right)+\frac 12 \alpha\qquad otherwise \end{aligned} \right.SmoothLreg​​(x)=⎩⎪⎪⎨⎪⎪⎧​​2e−α​(xg​−xe​)2+21​αif∣xg−xe​∣<1e−α(∣xg​−xe​∣−21​)+21​αotherwise​

Softer-NMS算法

Softer-NMS 与标准 NMS 不同的是:超过阈值的框根据 IoU 置信度加权合并多个框得到最终框,而不是直接舍弃

IoU置信度与两个因素有关:

  • 方差:方差大置信度低(认为离目标远)
  • IOU:IOU小置信度低(与 score 最高的Box)

分类分数与权重无关,因为得分较低的盒子可能具有较高的定位置信度


Softer-NMS 算法流程

实验






参考文献

【1】Soft(er)-NMS:非极大值抑制算法的两个改进算法
【2】softer-nms论文学习详解
【3】Soft NMS算法笔记

Soft NMS+Softer NMS+KL Loss相关推荐

  1. 交并比 (IoU), mAP (mean Average Precision), 非极大值抑制 (NMS, Soft NMS, Softer NMS, IoU-Net)

    目录 目标检测的评价指标 交并比 (Intersection of Union, IoU) mAP (mean Average Precision) 其他指标 非极大值抑制 (Non-Maximum ...

  2. NMS、soft NMS、softer NMS与IOU-Guided NMS

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 NMS.soft NMS.softer NMS与IOU-Guided NMS 一.NMS 二.soft NMS 三.softer NM ...

  3. NMS系列(NMS,Soft-NMS,Weighted-NMS,IOU-Guided NMS,Softer-NMS,Adaptive NMS,DIOU NMS,Cluster NMS)

    文章目录 NMS ConvNMS(2016) Soft-NMS(2017) Weighted-NMS(2017) IOU-Guided NMS (2018) Pure NMS Network(2017 ...

  4. 目标检测中的NMS,soft NMS,softer NMS,Weighted Boxes Fusion

    NMS 非最大值抑制算法,诞生至少50年了. 在经典的两阶段目标检测算法中,为了提高对于目标的召回率,在anchor阶段会生成密密麻麻的anchor框. 所以在后处理的时候,会存在着很多冗余框对应着同 ...

  5. softer nms论文阅读Bounding Box Regression with Uncertainty for Accurate Object Detection

    论文地址:https://arxiv.org/pdf/1809.08545.pdf 代码地址:https://github.com/yihui-he/KL-Loss https://github.co ...

  6. 目标检测后处理:从nms到softer nms

    文章目录 1 NMS 1.1 动机 1.2 步骤 2 Soft-NMS 2.1 动机 2.2 算法思想 2.3 步骤 3 Softer-NMS 3.1 动机 3.1.1 现有方法的问题 3.1.2 本 ...

  7. 目标检测(后处理):从 NMS 到 Soft-NMS 到 Softer NMS

    目标检测(后处理):从 NMS 到 Soft-NMS 到 Softer NMS 1.NMS 2.Soft-NMS 3.Softer-NMS 4.总结 1.NMS 非最大抑制(NMS)主要用于基于深度学 ...

  8. soft-nms(softnms)(pytorch实现) softer nms

    softnms和softer nms是nms的两个改进算法 传统nms存在的问题 传统的NMS方法是基于分类分数的,只有最高分数的预测框能留下来,但是大多数情况下IoU和分类分数不是强相关,很多分类标 ...

  9. NMS技术总结(NMS原理、多类别NMS、NMS的缺陷、NMS的改进思路、各种NMS方法)

    点击上方"计算机视觉工坊",选择"星标" 干货第一时间送达 作者丨仿佛若有光157 来源丨CV技术指南 前言  本文介绍了NMS的应用场合.基本原理.多类别NM ...

最新文章

  1. pip、NumPy、Matplotlib在Windows上的安装过程
  2. silverlight、wpf中 dispatcher和timer区别
  3. Fast construction of FM-index for long sequence reads
  4. [笔记]何为Linux及其文件系统(四)
  5. AJAX-jQuery实现Ajax
  6. html鼠标点击切换图片,js鼠标点击图片切换效果代码分享
  7. Mysql数据库的基本概念
  8. windows中架设基于Apache的svn服务器
  9. scala编程第16章学习笔记(3)——List类的高阶方法
  10. phpstudy连接SQL Server 2008数据库 以及 php使用sql server出现乱码解决方式
  11. Linux c语言 creat参数,C语言open和creat函数
  12. 前端实战项目:前端框架Vue3.0项目教程(一)Vue3.0环境的搭建
  13. java算法竞赛入门经典_算法竞赛入门经典笔记(1-3章)
  14. OA办公管理系统的功能有什么特点
  15. 程序员如何让自己的技术能力突飞猛进?
  16. 串口,使用交叉还是直连串口线
  17. 子午线收敛角python代码
  18. “秀才造反,十年不成”是什么意思? - 已解决 - 搜搜问问
  19. 一文带你入门Redis
  20. 03.OpenWrt-系统固件烧录

热门文章

  1. 数据结构与算法基础Day2
  2. PyTorch 学习之Ubuntu16.04 下安装 PyTorch(conda与pip两种方式安装)
  3. 水质监测系统解决方案
  4. python房价数据分析统计服_Python 爬取分析全国 12 个城市 4 万条房价信息,告诉你该怎样买房?...
  5. Cisco NSF 与NSR 与GR
  6. 蛮力枚举算法C语言,算法01-蛮力法
  7. 【单片机毕业设计】【mcuclub-jj-006】基于单片机的指纹电子密码锁的设计
  8. 深度学习模型CPT的环境配置经验
  9. HDU1000题纪念
  10. 噪声dba是什么单位_声音的大小dB,到底是什么单位?