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






