비최대 억제(NMS)가 객체 탐지에서 중복 경계 상자를 제거하는 방법을 알아보세요. Ultralytics 어떻게 네이티브 엔드투엔드 NMS 제공하는지 확인하세요.
비최대 억제(NMS)는 객체 탐지에서 모델이 생성한 원시 예측을 정제하기 위해 사용되는 후처리 기법입니다. 객체 탐지 모델이 이미지를 분석할 때, 단일 객체에 대해 중복되는 여러 경계 상자를 생성하는 경우가 많으며, 각 상자에는 신뢰도 점수가 부여됩니다. 이러한 중복 예측은 모델이 detect 약간 다른 크기나 위치에서 detect 수 있기 때문에 발생합니다. NMS 각 객체에 대해 가장 정확한 경계 상자만 유지하고 나머지는 제거함으로써 이러한 출력을 NMS 최종 결과가 깔끔하고 정확하며 중복 없이 처리되도록 보장합니다.
NMS 후보 경계 상자 목록과 해당 신뢰도 점수를 기반으로 작동합니다. 목표는 객체에 대해 최적의 상자를 선택하고, 동일한 객체의 중복 탐지일 가능성이 높은 상당히 중첩되는 다른 상자들을 억제(제거)하는 것입니다. 이 과정은 일반적으로 다음 단계를 따릅니다:
정밀도가 최우선인 시나리오에서는 중복 탐지가 하류 시스템을 혼란스럽게 할 수 있으므로 NMS .
많은 현대적 프레임워크가 NMS 처리하지만, 구현 방식을 이해하면 매개변수 조정에 도움이 됩니다. 다음 예시는 PyTorch NMS 적용하는 방법을 보여줍니다:
import torch
import torchvision.ops as ops
# Example bounding boxes: [x1, y1, x2, y2]
boxes = torch.tensor(
[
[100, 100, 200, 200], # Box A
[105, 105, 195, 195], # Box B (High overlap with A)
[300, 300, 400, 400], # Box C (Distinct object)
],
dtype=torch.float32,
)
# Confidence scores for each box
scores = torch.tensor([0.9, 0.8, 0.95], dtype=torch.float32)
# Apply NMS with an IoU threshold of 0.5
# Boxes with IoU > 0.5 relative to the highest scoring box are suppressed
keep_indices = ops.nms(boxes, scores, iou_threshold=0.5)
print(f"Indices to keep: {keep_indices.tolist()}")
# Output will likely be [2, 0] corresponding to Box C (0.95) and Box A (0.9),
# while Box B (0.8) is suppressed due to overlap with A.
전통적으로 NMS 주요 신경망 외부에서 수행되는 필수적인 "정리" 단계로, 추론 지연 시간을 추가해 NMS . 그러나 이 분야는 종단 간 아키텍처로 진화하고 있습니다.