Non-Maximum Suppression (NMS)
비최대 억제가 객체 탐지에서 중복 바운딩 박스를 제거하는 방식을 알아보세요. Ultralytics YOLO26이 네이티브 종단 간 비최대 억제를 제공하는 방법을 살펴보세요.
비최대 억제 (NMS)는 모델이 생성한 원시 예측을 개선하기 위해 객체 탐지에서 사용되는 후처리 기법입니다. 객체 탐지 모델이 이미지를 분석하면 하나의 객체에 대해 각각 관련 신뢰도 점수가 포함된 서로 겹치는 여러 바운딩 박스를 생성하는 경우가 많습니다. 이러한 중복 예측은 모델이 약간 다른 크기나 위치에서 동일한 특징을 탐지할 수 있기 때문에 발생합니다. NMS는 각 객체에 대해 가장 정확한 바운딩 박스만 유지하고 나머지는 제거하여 이 출력을 필터링함으로써 최종 출력이 깔끔하고 정확하며 중복이 없도록 합니다.
비최대 억제 작동 방식#
NMS 알고리즘은 후보 바운딩 박스 목록과 이에 대응하는 신뢰도 점수를 대상으로 작동합니다. 목표는 객체에 가장 적합한 박스를 선택하고 이 박스와 크게 겹치는 다른 박스를 억제(제거)하는 것입니다. 이러한 박스는 동일한 객체를 중복 탐지한 것일 가능성이 높기 때문입니다. 일반적으로 이 과정은 다음 단계로 진행됩니다:
-
필터링: 특정 임계값(예: 0.25)보다 신뢰도 점수가 낮은 모든 바운딩 박스를 제거하여 신뢰도가 낮은 예측을 즉시 삭제합니다.
-
정렬: 남은 박스를 신뢰도 점수를 기준으로 내림차순 정렬합니다.
-
선택: 신뢰도 점수가 가장 높은 박스를 유효한 탐지 결과로 선택합니다.
-
비교: 선택한 박스를 다른 모든 남은 박스와 교집합 대비 합집합 (IoU)을 사용하여 비교합니다. IoU는 두 박스 간 겹침 정도를 측정하는 지표입니다.
-
억제: 선택한 박스와 다른 박스 간의 IoU가 사전 정의된 임계값(예: 0.45)을 초과하면 점수가 더 낮은 박스를 중복으로 간주하여 제거합니다.
-
반복: 아직 억제되거나 선택되지 않은 박스 중 다음으로 점수가 높은 박스를 대상으로 모든 박스를 처리할 때까지 이 과정을 반복합니다.
실제 적용 사례#
NMS는 정확도가 매우 중요하고 중복 탐지로 인해 다운스트림 시스템이 혼동될 수 있는 시나리오에서 필수적입니다.
- 자율주행: 자율주행 차량 시스템에서 카메라는 보행자, 다른 차량 및 교통 표지판을 탐지합니다. 모델은 한 명의 보행자에 대해 약간씩 다른 박스 3개를 예측할 수 있습니다. NMS는 차량의 경로 계획 시스템이 해당 보행자에 대해 하나의 좌표만 수신하도록 하여, "유령" 장애물로 인해 발생하는 불규칙한 제동이나 경로 계획 오류를 방지합니다.
- 소매 재고 관리: 선반의 제품을 세기 위해 컴퓨터 비전을 사용할 때 제품이 서로 가까이 밀집해 있는 경우가 많습니다. NMS가 없으면 겹치는 예측으로 인해 탄산음료 캔 하나가 두 번 집계될 수 있으며, 이는 부정확한 재고 수량으로 이어집니다. NMS는 이러한 탐지 결과를 개선하여 재고 수량이 실제 수량과 일치하도록 합니다.
PyTorch를 사용한 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가 기본 신경망 외부에서 수행되는 필수 "정리" 단계였으며, 추론 지연 시간을 추가했습니다. 그러나 이 분야는 엔드투엔드 아키텍처로 발전하고 있습니다.
- 표준 NMS: IoU 임계값을 수동으로 조정해야 하는 휴리스틱 프로세스입니다. 임계값이 너무 낮으면 서로 가까이 있는 유효한 객체를 놓칠 수 있습니다(재현율이 낮음). 반대로 너무 높으면 중복이 남습니다(정밀도가 낮음).
- 엔드투엔드 모델: YOLO26과 같은 차세대 모델은 본질적으로 엔드투엔드 방식으로 설계되었습니다. 이러한 모델은 학습 중 객체당 정확히 하나의 박스를 예측하도록 학습하여 NMS 프로세스를 효과적으로 내부화합니다. 따라서 외부 후처리가 필요하지 않으며, Ultralytics Platform에서 더 빠른 추론 속도와 단순한 배포 파이프라인을 구현할 수 있습니다.
관련 개념#
- Soft-NMS: 겹치는 박스를 엄격하게 제거하지 않고 신뢰도 점수를 낮추는 변형 방식입니다. 이를 통해 서로 어느 정도 겹치는 객체(예: 군중 속 사람)도 감쇠 후 점수가 충분히 높게 유지되면 탐지할 수 있습니다.
- Anchor Boxes: 많은 탐지기가 객체 크기를 추정하는 데 사용하는 사전 정의된 박스 형태입니다. NMS는 이러한 앵커에서 개선된 최종 예측에 적용됩니다.
- 교집합 대비 합집합 (IoU): 두 박스가 얼마나 겹치는지 판단하기 위해 NMS가 사용하는 수학적 공식으로, 억제를 결정하는 임계값 역할을 합니다.









