阅读笔记8——NMS

文章介绍了物体检测中非极大值抑制(NMS)的基本原理和流程,包括如何通过得分和IoU来过滤重叠的候选框。然后讨论了NMS可能导致的漏检问题,提出了SoftNMS作为改进方案,通过线性或指数衰减得分来避免直接删除边框。进一步,SofterNMS引入了位置置信度和KL散度损失函数,优化边框预测的准确性,从而提升检测性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基本NMS

1. 处理过程

  为了保证物体检测的召回率,对于同一个真实物体往往会有多于1个的候选框输出。但是多余的候选框会影响检测精度,因此需要利用NMS过滤掉重叠的候选框,基本的NMS方法利用得分高的边框抑制得分低重叠程度高的边框。

  如图1-1所示,图片中存在3个候选框,但是候选框A与C对应的是同一个物体,由于C的得分比A要低,在计算召回率时,C候选框会被当做一个False Positive来看待,从而降低模型的精度。Recall=TNTN+FPRecall=\frac{TN}{TN+FP}Recall=TN+FPTN,当FPFPFP增大时,RecallRecallRecall减小)实际上,由于候选框A的质量要比C好,理想的输出是A而不是C,因此希望能够抑制掉候选框C。

在这里插入图片描述

图1-1 NMS处理过程示意图
2. 量化指标

  检测网络在最后会增加一个NMS(非极大值抑制),将重复冗余的候选框去掉。这个过程涉及以下两个量化指标:

  • 预测得分:NMS假设一个边框的预测得分越高,这个边框就要被优先考虑,其他与其重叠超过一定程度的边框都要被舍弃,非极大值即是指得分的非极大值。
  • IoU:用于评价两个边框的重合程度。如果两个边框的IoU超过一定阈值时,得分低的边框会被舍弃。阈值通常取0.5或者0.7。
3. 具体流程

  NMS的输入包含5个预测量,即所有候选框的得分、左上点坐标、右下点坐标,以及1个设定的IoU阈值。
  具体流程如下:

  • 按照得分,对所有边框进行降序排列,记录下排列的索引order,并新建一个列表keep,作为最终筛选后的边框索引结果。
  • 将排序后的第一个边框置为当前边框,并将其保留到keep中,再求当前边框与剩余所有框的IoU。
  • 在order中,仅仅保留IoU小于设定阈值的索引,重复第二步,直到order中仅仅剩余一个边框,则将其保留到keep中,退出循环,NMS结束。

二、Soft NMS

1. 漏检现象

  NMS对于分布密集的物体,容易出现漏检现象。即当两个真实物体靠的较近且得分不一致时,两个框的IoU较大,可能超过了阈值,此时NMS会筛掉得分较低的框。

  NMS的计算公式如式(2-1)所示:
si={si,iou(M,bi)<Nt0,iou(M,bi)⩾Nt(2-1)s_{i}=\left\{\begin{matrix} s_{i}, & iou(M,b_{i})< N_{t}& \\ 0, & iou(M,b_{i})\geqslant N_{t}& \end{matrix}\right.\tag{2-1}si={si,0,iou(M,bi)<Ntiou(M,bi)Nt(2-1)

  公式中SiS_{i}Si代表了每个框的得分,MMM为当前得分最高的框,bib_{i}bi为剩余框的某一个,NtN_{t}Nt为设定的阈值,可以看到当IoU大于NtN_{t}Nt时,该边框的得分直接置0,相当于被舍弃了,从而有可能造成边框的漏检。

2. Soft NMS

  Soft NMS对于IoU大于阈值的边框,没有将其得分直接置0,而是降低该边框的得分。

  Soft NMS的计算公式如式(2-2)所示:

si={si,iou(M,bi)<Ntsi(1−iou(M,bi)),iou(M,bi)⩾Nt(2-2)s_{i}=\left\{\begin{matrix} s_{i}, & iou(M,b_{i})< N_{t}& \\ s_{i}(1-iou(M,b_{i})), & iou(M,b_{i})\geqslant N_{t}& \end{matrix}\right.\tag{2-2}si={si,si(1iou(M,bi)),iou(M,bi)<Ntiou(M,bi)Nt(2-2)

  从公式中可以看出,利用边框的得分与IoU来确定新的边框得分,如果当前边框与边框MMM的IoU超过设定阈值NtN_{t}Nt时,边框的得分呈线性的衰减。

  但是,式(2-2)不是一个连续函数,当一个边框与MMM的重叠IoU超过阈值NtN_{t}Nt时,其得分会发生跳变,这种跳变会对检测结果产生较大的波动,因此还需要寻找一个更为稳定、连续的得分重置函数,最终Soft NMS给出了式(2-3)所示的重置函数。

si=sie−iou(M,bi)2σ,∀bi∉D(2-3)s_{i}=s_{i}e^-{\frac{iou(M,b_{i})^{2}}{\sigma }}, \forall b_{i}\notin D \tag{2-3}si=sieσiou(M,bi)2,bi/D(2-3)

  采用这种得分衰减的方式,对于那些得分很高的边框来说,在后续的计算中还有可能被作为正确的检测款框,从而提高模型的召回率。

三、Softer NMS

1. 定位置信度

  NMS和Soft NMS都使用了预测分类置信度作为衡量指标,即假定分类置信度越高的边框,其位置也越准确。

  但位置置信度与分类置信度并不是强相关的关系,基于此,Softer NMS新增加了一个定位置信度的预测,使得高分类置信度的边框位置变得更加准确,从而有效提升了检测的性能。

2. 分布假设

  为了更全面地描述边框预测,Softer NMS方法对预测边框与真实物体做了两个分布假设:

  • 真实物体的分布是狄拉克delta分布,即标准差为0的高斯分布的极限。

δ(x)={+∞,x=00,x=otherwise\delta (x)=\left\{\begin{matrix} +\infty , & x=0 & \\ 0 , & x=otherwise & \end{matrix}\right.δ(x)={+,0,x=0x=otherwise

  • 预测边框的分布满足高斯分布。

X∼N(μ,σ2)X\sim N(\mu ,\sigma ^{2})XN(μ,σ2)

  基于以上两个假设,Softer NMS提出了一种基于KL(Kullback-Leibler)散度的边框回归损失函数KL Loss。KL散度是用来精确计算当把一个分布近似为另一个分布时,损失了多少信息KL散度是用来精确计算当把一个分布近似为另一个分布时,损失了多少信息KL散度是用来精确计算当把一个分布近似为另一个分布时,损失了多少信息这里的KL Loss是最小化预测边框的高斯分布与真实物体的狄克拉分布之间的KL散度。即预测边框分布越接近于真实物体分布,损失越小。

3. 网络结构

在这里插入图片描述

图3-1 Softer NMS网络结构图

  Softer NMS在计算回归损失时,增加了一个标准差预测分支,从而形成边框的高斯分布,与边框的预测一起求得KL损失。

  边框的标准差可以被看做边框的位置置信度,因此Softer NMS利用该标准差也改善了NMS过程。

### YOLOv8中的自适应NMS 在目标检测任务中,非极大值抑制(Non-Maximum Suppression, NMS)用于消除冗余的边界框,保留最有可能的目标位置。YOLOv8引入了一种改进版本——自适应NMS(Adaptive Non-Maximum Suppression),旨在根据不同场景动态调整参数以优化检测效果。 #### 自适应NMS的工作原理 传统NMS依赖固定的阈值来决定哪些预测框应被移除。然而,在复杂环境中固定阈值可能不是最优选择。自适应NMS通过分析图像特征自动调节这些超参数: - **置信度分数**:对于高分区域采用更严格的过滤标准;而对于低分部分则放宽条件。 - **类别间差异处理**:当多个类别的物体重叠时,考虑它们之间的相对关系而非简单地依据IoU指标去除候选框[^1]。 #### 实现细节 以下是Python代码片段展示了如何在YOLOv8框架内实现这一机制: ```python def adaptive_nms(predictions, iou_threshold=0.5, score_threshold=0.7): """ Apply Adaptive Non Maximum Suppression on the predictions. Args: predictions (list): List of bounding boxes with their scores and classes. iou_threshold (float): Intersection over Union threshold for suppression. score_threshold (float): Minimum confidence score to consider a box valid. Returns: list: Filtered prediction results after applying ANMS. """ # Sort by descending order based on scores sorted_predictions = sorted(predictions, key=lambda x: x['score'], reverse=True) keep_indices = [] while len(sorted_predictions) > 0: current_box = sorted_predictions.pop(0) if current_box['score'] >= score_threshold: keep_indices.append(current_box) suppressed_boxes = [] for next_box in sorted_predictions[:]: if calculate_iou(current_box, next_box) > iou_threshold * adjust_factor(current_box, next_box): suppressed_boxes.append(next_box) sorted_predictions.remove(next_box) # Adjust factor can be defined as per specific requirements or learned from data def adjust_factor(box_a, box_b): pass return keep_indices # Helper function to compute IoU between two boxes def calculate_iou(boxA, boxB): ... ``` 此函数接受一组带有得分和分类标签的边界框作为输入,并返回经过筛选后的最终结果列表。`adjust_factor()`方法可以根据实际情况定义或从数据中学得,用来微调两个盒子间的比较逻辑[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓shuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值