Non-Maximum Suppression (NMS)
비최대 억제(NMS)는 서로 겹치는 중복 박스를 제거해 각 객체에 하나의 검출 결과만 남깁니다. 작동 방식, 튜닝 방법, NMS 없는 모델을 살펴봅니다.
비최대 억제 (NMS)는 감지기의 원시 중첩 예측을 객체당 하나의 박스로 정리하는 후처리 단계입니다. 밀집된 객체 감지 모델은 이미지마다 수천 개의 후보 바운딩 박스에 점수를 매기며, 여러 인접 후보가 약간씩 다른 위치와 점수로 동일한 객체를 감지하는 경우가 많습니다. NMS는 각 중첩 군집에서 신뢰도가 가장 높은 박스를 유지하고 나머지는 억제합니다. 이때 교집합 대비 합집합 (IoU)을 사용해 어떤 박스가 중복으로 간주될 만큼 충분히 겹치는지 판단합니다.
비최대 억제 작동 방식#
표준 방식인 그리디 NMS는 먼저 신뢰도 임계값보다 낮은 후보를 제거하고 나머지를 점수순으로 정렬합니다. 그런 다음 가장 높은 점수의 박스를 유지하고, 해당 박스와의 IoU가 IoU 임계값을 초과하는 나머지 박스를 모두 제거합니다. 남은 박스가 없을 때까지 이 과정을 반복하며, 매번 아직 남아 있는 박스 중 점수가 가장 높은 박스를 선택합니다. 감지기는 일반적으로 클래스별로 NMS를 한 번씩 실행하므로, 사람 박스가 겹치는 자전거 박스를 억제하지 않습니다.
torchvision의 nms은 한 클래스에 대해 그리디 NMS를 구현하고, 유지된 박스의 인덱스를 점수순으로 반환합니다.
import torch
from torchvision.ops import nms
# 후보 박스는 [x1, y1, x2, y2] 형식이며 각 박스에 신뢰도 점수가 하나씩 있습니다.
boxes = torch.tensor(
[
[100, 100, 200, 200], # A
[105, 105, 195, 195], # B: A와 거의 중복되는 박스 (IoU 0.81)
[300, 300, 400, 400], # C: 별개의 객체
],
dtype=torch.float32,
)
scores = torch.tensor([0.90, 0.80, 0.95])
# 점수가 더 높은 유지 박스와의 IoU가 0.5를 초과하는 박스를 모두 억제합니다.
keep = nms(boxes, scores, iou_threshold=0.5)
print(keep.tolist())출력은 [2, 0]입니다. 가장 높은 점수를 가진 박스 C가 먼저 유지되고, C와 겹치지 않는 박스 A도 유지됩니다. A와의 IoU가 0.81인 박스 B는 제거됩니다.
임계값 조정#
신뢰도 임계값은 억제 작업을 시작하기 전에 신뢰도가 낮은 후보를 제거합니다. IoU 임계값은 어느 정도 겹쳐야 중복으로 판단할지 설정합니다. 임계값이 너무 낮으면 군중 속 사람들처럼 가까이 서 있는 실제 객체 두 개가 하나의 감지 결과로 합쳐져 재현율이 떨어집니다. 임계값이 너무 높으면 중복 박스가 남아 정밀도가 떨어집니다. 클래스 비종속 NMS는 클래스와 관계없이 어떤 박스든 다른 박스를 억제할 수 있도록 합니다. 따라서 모델이 "자동차"와 "트럭"처럼 하나의 객체에 유사한 클래스를 두 개 부여할 때 중복 레이블을 제거할 수 있습니다.
NMS의 한계#
- 혼잡한 장면: 고정된 IoU 임계값 하나로는 중복 박스와 실제로 첫 번째 객체와 겹치는 두 번째 객체를 구분할 수 없으므로, 심하게 가려진 객체가 억제됩니다.
- 고정된 휴리스틱: 임계값을 수동으로 설정하고 학습된 네트워크 외부에서 적용하며, 데이터로 학습하지 않습니다.
- 지연 시간 및 배포: 그리디 루프는 네트워크 실행 후에 수행되며 후보 수가 늘어날수록 처리 비용도 증가해 추론 지연 시간이 늘어납니다. 모델 그래프에 NMS를 포함할 수 없는 내보내기 형식은 원시 후보를 출력하므로 애플리케이션이 직접 NMS를 실행해야 합니다.
NMS 변형 기법과 NMS를 사용하지 않는 감지#
Soft-NMS는 중첩 박스를 삭제하는 대신 중첩 정도에 따라 점수를 낮춰 군중 속 객체를 더 많이 검출합니다. Distance-IoU 손실과 함께 제안된 DIoU-NMS는 박스 중심 간 거리도 고려하므로 중심이 멀리 떨어진 두 박스는 억제될 가능성이 낮습니다.
엔드투엔드 탐지기는 해당 단계를 완전히 제거합니다. DETR은 예측과 라벨을 일대일 헝가리안 매칭으로 학습하므로 객체마다 정확히 하나의 예측을 생성합니다. YOLOv10은 실시간 YOLO 모델에 원투원 헤드를 도입했습니다. YOLO26은 두 종류의 헤드를 모두 학습하고 기본적으로 NMS를 적용합니다. 원투매니 헤드의 점수가 약간 더 높기 때문입니다. YOLO26n의 COCO mAP50-95는 COCO에서 40.9 대 40.1입니다. nms=False을 전달하면 원투원 헤드가 선택됩니다. 이 헤드는 NMS 단계 없이 이미지당 최종 박스를 최대 300개 출력하며, 엔드투엔드 탐지 가이드에서 예측 및 내보내기 방법을 설명합니다.










