详解NMS和soft-nms算法

2024-01-28 21:35:22 浏览数 (1)

详解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算法引入了递减置信度的惩罚因子,能够在一定程度上解决重叠框竞争的问题,得到更准确的检测结果。

0 人点赞