前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详解NMS和soft-nms算法

详解NMS和soft-nms算法

原创
作者头像
大盘鸡拌面
发布2024-01-28 21:35:22
4040
发布2024-01-28 21:35:22

详解NMS和soft-nms算法

在目标检测中,非极大值抑制(Non-Maximum Suppression,简称NMS)是一种常用的技术,用于在多个候选目标框中选择最佳的目标框。NMS算法能够根据目标框的置信度和重叠度对目标框进行筛选和排序,从而得到高质量的检测结果。然而,在某些情况下,NMS算法可能会遇到一些问题,如低目标框重叠度下的漏检和过多候选框。 为了解决NMS算法的一些问题,研究人员提出了soft-nms算法,对NMS进行改进和扩展。soft-nms算法在目标框的置信度上进行了改进,引入了递减置信度的惩罚因子,从而在一定程度上减小了漏检和过多候选框的问题。

NMS算法

NMS算法的基本思想是根据目标框的置信度对候选目标框进行排序,并按照置信度从高到低的顺序选择最佳的目标框。选择过程中,若两个目标框的重叠度大于一定阈值(通常为0.5),则将置信度较低的目标框丢弃,保留置信度较高的目标框。 下面是NMS算法的伪代码:

代码语言:javascript
复制
pythonCopy code
def nms(detections, iou_threshold):
    # 根据置信度对候选目标框进行排序
    detections = sorted(detections, key=lambda x: x.confidence, reverse=True)
    # 初始化结果列表
    results = []
    while detections:
        # 选择置信度最高的目标框,将其添加到结果列表中
        best = detections.pop(0)
        results.append(best)
        # 计算重叠度,删除与置信度最高的目标框重叠度较高的目标框
        detections = [box for box in detections if box.iou(best) < iou_threshold]
    return results

soft-nms算法

soft-nms算法在NMS的基础上进行改进,引入递减置信度的惩罚因子。惩罚因子根据目标框与其他目标框的重叠度进行计算,通过逐渐减小目标框的置信度,实现逐步削弱重叠框的竞争力。 下面是soft-nms算法的伪代码:

代码语言:javascript
复制
pythonCopy code
def soft_nms(detections, iou_threshold, sigma=0.5, score_threshold=0.001):
    # 根据置信度对候选目标框进行排序
    detections = sorted(detections, key=lambda x: x.confidence, reverse=True)
    # 初始化结果列表
    results = []
    while detections:
        # 选择置信度最高的目标框,将其添加到结果列表中
        best = detections.pop(0)
        results.append(best)
        # 降低与置信度最高的目标框重叠度较高的目标框的置信度
        for detection in detections:
            iou = detection.iou(best)
            # 计算惩罚因子
            penalty = np.exp(-(iou ** 2) / sigma)
            # 调整置信度
            detection.confidence *= penalty
        # 删除置信度低于阈值的目标框
        detections = [box for box in detections if box.confidence > score_threshold]
    return results

soft-nms算法通过递减置信度的方式,能够更好地抑制重叠框的竞争,从而减小了漏检和过多候选框的问题。

行人检测。以下是一个示例代码,展示了如何在行人检测结果中应用NMS和soft-nms算法。

代码语言:javascript
复制
pythonCopy code
import numpy as np
# 定义目标框类
class BoundingBox:
    def __init__(self, xmin, ymin, xmax, ymax, confidence):
        self.xmin = xmin
        self.ymin = ymin
        self.xmax = xmax
        self.ymax = ymax
        self.confidence = confidence
    # 计算两个目标框的重叠度(IoU)
    def iou(self, other):
        area_intersection = max(0, min(self.xmax, other.xmax) - max(self.xmin, other.xmin)) * max(0, min(self.ymax, other.ymax) - max(self.ymin, other.ymin))
        area_self = (self.xmax - self.xmin) * (self.ymax - self.ymin)
        area_other = (other.xmax - other.xmin) * (other.ymax - other.ymin)
        iou = area_intersection / (area_self + area_other - area_intersection)
        return iou
# 定义目标检测结果列表
detections = [
    BoundingBox(100, 150, 300, 400, 0.9),
    BoundingBox(200, 250, 400, 500, 0.8),
    BoundingBox(150, 200, 350, 450, 0.7),
    BoundingBox(250, 300, 500, 600, 0.95),
    BoundingBox(400, 450, 600, 700, 0.85)
]
def nms(detections, iou_threshold):
    # 根据置信度对候选目标框进行排序
    detections = sorted(detections, key=lambda x: x.confidence, reverse=True)
    # 初始化结果列表
    results = []
    while detections:
        # 选择置信度最高的目标框,将其添加到结果列表中
        best = detections.pop(0)
        results.append(best)
        # 计算重叠度,删除与置信度最高的目标框重叠度较高的目标框
        detections = [box for box in detections if box.iou(best) < iou_threshold]
    return results
def soft_nms(detections, iou_threshold, sigma=0.5, score_threshold=0.001):
    # 根据置信度对候选目标框进行排序
    detections = sorted(detections, key=lambda x: x.confidence, reverse=True)
    # 初始化结果列表
    results = []
    while detections:
        # 选择置信度最高的目标框,将其添加到结果列表中
        best = detections.pop(0)
        results.append(best)
        # 降低与置信度最高的目标框重叠度较高的目标框的置信度
        for detection in detections:
            iou = detection.iou(best)
            # 计算惩罚因子
            penalty = np.exp(-(iou ** 2) / sigma)
            # 调整置信度
            detection.confidence *= penalty
        # 删除置信度低于阈值的目标框
        detections = [box for box in detections if box.confidence > score_threshold]
    return results
# 调用NMS算法进行行人检测结果的筛选
nms_results = nms(detections, iou_threshold=0.5)
print("NMS算法结果:")
for result in nms_results:
    print("目标框:", result.xmin, result.ymin, result.xmax, result.ymax, "置信度:", result.confidence)
# 调用soft-nms算法进行行人检测结果的筛选
soft_nms_results = soft_nms(detections, iou_threshold=0.5)
print("soft-nms算法结果:")
for result in soft_nms_results:
    print("目标框:", result.xmin, result.ymin, result.xmax, result.ymax, "置信度:", result.confidence)

这个示例代码演示了如何创建目标框对象,并使用NMS和soft-nms算法对行人检测结果进行筛选。最终输出了经过NMS和soft-nms算法筛选后的结果。

soft-nms算法是一种用于目标检测中非最大值抑制(Non-maximum Suppression,NMS)的改进方法。它的主要目标是解决传统NMS算法在目标重叠较大时可能会删除一些正确的边界框的问题。虽然soft-nms算法在某些情况下可以提供更好的性能,但它仍然存在一些缺点和类似的替代方法。 缺点:

  1. 参数的选择问题:soft-nms算法中有几个关键参数需要进行调优,包括IoU阈值(用于判定两个边界框是否重叠)、惩罚因子(用于根据IoU值降低置信度)等。这些参数的选择可能对算法的性能产生影响,但其最优值通常取决于特定的数据集和应用场景,需要进行实验或经验调整。
  2. 计算复杂度较高:soft-nms算法需要计算目标框之间的IoU值和惩罚因子,并在每一次迭代中更新目标框的置信度。这种计算过程会增加算法的计算复杂度,尤其在大规模的目标检测任务中可能导致较高的时间开销。 类似的替代方法:
  3. Gaussian NMS(gNMS):与soft-nms类似,gNMS也是一种改进的NMS方法,通过引入高斯权重来抑制边界框的置信度。与soft-nms相比,gNMS在计算上更加简单,并且可以在一定程度上解决边界框重叠时的问题。不同的高斯权重函数和参数设置可能会影响性能,因此使用时需要根据具体情况进行调整。
  4. Soft NMS with Learnable Weight Adjustment(SNIP):SNIP是另一种基于soft-nms的改进方法,它通过学习可调整的权重来抑制重复的边界框。相比于传统的soft-nms,SNIP考虑了边界框之间的复杂关系,并通过学习权重的方式更好地适应数据集的特点。
  5. 动态阈值(Dynamic Thresholding):动态阈值方法不使用固定的IoU阈值,而是根据目标框的置信度和相对位置动态调整阈值。这种方法可以根据实际情况自适应地选择合适的抑制阈值,从而提高目标检测的准确性。

总结

NMS和soft-nms算法是目标检测中常用的选择最佳目标框的技术。NMS算法基于目标框的置信度和重叠度进行筛选和排序,是一种简单而有效的算法。然而,在某些情况下,NMS算法可能存在一些问题,这时可以考虑使用soft-nms算法进行改进。soft-nms算法引入了递减置信度的惩罚因子,能够在一定程度上解决重叠框竞争的问题,得到更准确的检测结果。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 详解NMS和soft-nms算法
    • NMS算法
      • soft-nms算法
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
        http://www.vxiaotou.com