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