双重检测与非极大值合并技术

计算机视觉领域,尤其是在对象检测任务中,模型可能会多次检测到同一个对象,这种现象被称为双重检测。这种情况通常由两种情况引起:模型自身产生的重叠检测,以及为了处理图像切片而故意创建的重叠。例如,使用YOLO或Faster R-CNN等模型时,可能会因为多个锚框覆盖同一对象而产生多个检测。此外,如果模型对对象的类别不够确定,可能会产生带有不同类别标签的多个检测。

非极大值抑制(NMS)与非极大值合并(NMM)

为了解决双重检测问题,可以使用两种算法:非极大值抑制(NMS)和非极大值合并(NMM)。NMS通过计算检测框之间的交并比(IOU),保留最有信心的检测并丢弃其他检测。而NMM则在检测框重叠时合并这些检测。这两种方法都旨在减少对象检测中的冗余,提高检测的准确性。

交并比(IOU)是衡量两个检测框重叠程度的指标,计算方式是两个框的交集面积除以它们的并集面积。IOU的值介于0到1之间,值越高表示重叠程度越大。在NMS中,首先根据置信度对所有检测进行排序,然后计算每对检测的IOU,如果重叠程度高于用户指定的阈值,则丢弃置信度较低的检测。这个过程会一直进行,直到处理完所有类别和检测对。

NMS可以按类别进行,也可以跨类别进行。而NMM则更为复杂,它首先对检测进行排序,然后计算每对检测的IOU,并根据用户指定的阈值将重叠的检测分组。接着,对于每组检测,NMM会进行合并操作,合并后的检测会替换掉原始检测。这个过程会一直进行,直到所有检测都被处理完毕。

示例代码

import cv2 import supervision as sv from inference import get_model image = cv2.imread("<SOURCE_IMAGE_PATH>") model = get_model(model_id="yolov8m-640") result = model.infer(image)[0] detections = sv.Detections.from_inference(result) detections = detections.with_nmm( threshold=0.5 ) # 可视化结果 annotated_frame = sv.BoundingBoxAnnotator().annotate( scene=image.copy(), detections=detections ) sv.plot_image(annotated_frame)

在实际应用中,可以根据需要选择使用NMS或NMM。NMS在处理速度上更快,而NMM则在处理重叠检测时更为精确。在实际使用中,可以先使用NMS,然后根据需要调整阈值,并尝试使用NMM。

在性能方面,NMS通常比NMM快约两倍。例如,在处理35个检测时,NMS需要1.25毫秒,而NMM需要4.23毫秒。在处理750个检测时,NMS需要41.15毫秒,而NMM需要75.71毫秒。因此,在实际应用中,需要根据具体情况权衡速度和精度。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485