비최대 억제(NMS)란? AI에서 겹치는 탐지 상자를 점수 순서로 정리하는 방법
TL;DR
비최대 억제(Non-Maximum Suppression, NMS)는 점수가 높은 탐지 상자를 남기고 그 상자와 많이 겹치는 후보를 순서대로 제외하는 방법입니다. 같은 물체에 네모가 여러 개 생기는 중복 탐지를 줄일 때 씁니다. 겹침 기준인 IoU 임계값과 점수 기준은 서로 다르며, 실제 물체가 가까이 붙은 장면에서는 필요한 상자까지 사라질 수 있습니다.
핵심 3줄 요약
- 핵심 1
높은 점수부터 남깁니다. 선택한 상자와 많이 겹치는 낮은 점수 후보를 제외하고 남은 후보에서 반복합니다. - 핵심 2
겹침과 신뢰도는 다른 기준입니다. IoU는 상자끼리의 면적 관계이고 점수는 모델이 각 후보에 붙인 값입니다. - 핵심 3
남은 상자가 정답이라는 보장은 없습니다. 가까운 실제 물체가 함께 억제될 수 있어 중복 감소와 놓침을 같이 봅니다.
이 글에서 다룰 내용
- 비최대 억제의 한 문장 정의
- 상품 사진으로 이해하는 중복 상자
- 점수 정렬과 IoU 비교의 작동 순서
- 점수 임계값·출력 상한·클래스별 처리
- 객체 탐지·IoU·Soft-NMS와의 차이
- 좌표 형식과 결과 인덱스 점검법
- 밀집 장면과 재현성의 주의점
비최대 억제를 한 문장으로 정의하면 무엇인가요?
비최대 억제는 탐지 후보의 점수와 상자 간 겹침을 이용해 대표 상자를 탐욕적으로 선택하는 후처리 알고리즘입니다.
비극대 억제라는 번역도 쓰며 영문 약어는 NMS입니다. 여기서 최대는 이미지 전체에서 물체 하나만 고른다는 뜻이 아닙니다. 겹치는 후보들 사이에서 점수가 높은 상자를 먼저 선택한다는 뜻입니다. 서로 떨어진 물체의 상자는 함께 남을 수 있습니다.
탐욕적이라는 말은 현재 남은 후보 중 가장 높은 점수부터 결정한다는 의미입니다. 모든 상자 조합을 비교해 전체적으로 가장 좋은 정답 집합을 찾는 절차는 아닙니다. 앞서 선택한 상자가 뒤의 후보를 제외하는 기준이 되므로 점수의 순서가 결과에 영향을 줍니다.
한 줄 정리: NMS는 이미 나온 탐지 후보를 정리합니다. 이미지에서 새로운 물체를 찾아내거나 상자 좌표를 다시 학습하는 단계와 구분합니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 진열대 사진에서 병을 찾는다고 가정해 보겠습니다. 탐지 모델이 같은 병 주변에 위치가 조금 다른 상자 A와 B를 만들고, 옆 병에는 상자 C를 만들었습니다. 원리를 설명하기 위한 가정이며 실제 모델의 측정 결과는 아닙니다.
A의 점수가 가장 높고 A와 B가 많이 겹친다면 A를 먼저 남긴 뒤 B를 후보에서 제외합니다. C가 A와 충분히 떨어져 있다면 C는 다음 선택 대상으로 남습니다. 이 과정으로 같은 병을 여러 번 세는 중복을 줄일 수 있습니다.
문제는 실제 병 두 개가 가까이 붙어 있을 때입니다. 서로 다른 병의 상자도 크게 겹칠 수 있으므로 NMS가 한쪽을 중복으로 판단해 제외할 수 있습니다. 알고리즘은 병의 신원을 아는 것이 아니라 상자와 점수로 비교합니다. 정리 뒤 상자 수가 줄었다고 곧바로 재고 수가 정확해졌다고 볼 수 없습니다.
쉬운 예시: 한 물체를 둘러싼 비슷한 네모 중 대표를 남기는 절차입니다. 두 네모가 많이 겹친다는 사실만으로 같은 물체라고 확정하지는 못합니다.
왜 AI에서 비최대 억제가 중요한가요?
중복 후보가 다음 작업에 섞이는 일을 줄입니다
탐지 결과를 개수 세기, 이미지 자르기, 알림 생성에 연결할 때 같은 대상을 여러 번 처리하면 결과가 부풀려집니다. NMS는 겹치는 후보를 줄여 후속 작업에 넘길 목록을 정리합니다. 다만 잘못된 라벨이나 부정확한 위치까지 자동으로 고치는 기능은 아닙니다.
같은 모델도 후처리 설정에 따라 다르게 보입니다
모델 가중치가 같아도 IoU 임계값이나 클래스 처리 방식이 바뀌면 최종 상자 목록이 달라집니다. 배포 전후에 탐지 개수가 달라졌다면 모델 파일뿐 아니라 후처리 설정도 확인합니다. 성능 비교 기록에는 후보를 거르는 기준과 출력 상한을 함께 남기는 편이 좋습니다.
밀집 장면의 놓침을 따로 점검하게 합니다
Soft-NMS 원 논문은 겹치는 실제 객체가 일반 NMS에서 누락될 수 있다는 문제를 다룹니다. 사람이나 상품이 서로 가리는 장면에서는 중복 상자를 줄이는 효과와 실제 대상을 놓치는 위험을 함께 확인합니다. 상자가 적고 깔끔한 화면만으로 모델을 평가하지 않습니다.
비최대 억제는 어떤 순서로 작동하나요?
상자와 점수를 같은 순서로 준비합니다
상자 하나마다 좌표와 점수 하나가 대응해야 합니다. 점수 배열만 정렬하고 상자 배열을 그대로 두면 엉뚱한 위치가 높은 점수를 받습니다. 클래스별 처리를 할 경우 클래스 ID도 같은 행에 연결합니다. 빈 입력과 잘못된 좌표를 다루는 규칙도 미리 정합니다.
남은 후보에서 점수가 가장 높은 상자를 고릅니다
현재 후보 중 가장 높은 점수의 상자를 결과에 추가합니다. 이미 선택한 상자는 다음 순위 경쟁에서 빠집니다. 기본적인 NMS는 선택한 상자의 원래 좌표를 그대로 사용하며 주변 상자 좌표의 평균을 내서 새 상자를 만드는 방식과는 다릅니다.
선택한 상자와 많이 겹치는 후보를 제외합니다
겹침은 주로 IoU로 계산합니다. 두 상자의 교집합 면적을 합집합 면적으로 나눈 값이므로 겹치지 않으면 낮고 거의 일치하면 높습니다. Torchvision의 nms 문서는 IoU가 iou_threshold보다 큰 후보를 제외한다고 명시합니다. 경계값과 같은 경우까지 임의로 같은 조건이라고 가정하지 않습니다.
남은 후보에서 같은 절차를 반복합니다
제외되지 않은 후보 중 다음으로 높은 점수의 상자를 고르고 다시 겹침을 비교합니다. 후보가 없어지거나 구현에서 정한 출력 한도에 이르면 선택을 마칩니다. Torchvision과 TensorFlow의 해당 함수는 남은 상자의 좌표 자체가 아니라 입력 배열의 인덱스를 반환합니다.
핵심 인사이트: NMS 결과의 인덱스로 원래 상자·점수·라벨을 함께 골라야 합니다. 반환값을 새 좌표나 클래스 번호로 읽으면 후속 화면과 집계가 어긋납니다.
임계값과 주요 설정은 무엇을 뜻하나요?
IoU 임계값은 겹침을 판단하는 기준입니다
낮은 IoU 임계값은 더 작은 겹침도 억제 대상으로 삼습니다. 높은 임계값은 더 크게 겹쳐야 제외하므로 중복을 허용하는 쪽으로 작용합니다. 어느 값이 적절한지는 물체 크기와 밀집 정도에 따라 달라집니다. 정답 상자와 비교하는 평가용 IoU 기준과 NMS에서 후보끼리 비교하는 기준은 용도가 다릅니다.
점수 임계값과 출력 상한은 별도 설정입니다
점수 임계값은 모델 점수가 낮은 후보를 걸러내는 기준입니다. TensorFlow의 non_max_suppression에는 score_threshold와 max_output_size가 있으며 후자는 최대로 남길 상자 수입니다. 상한에 도달해 잘린 후보를 겹침 때문에 사라진 후보로 오해하지 않도록 단계별 개수를 확인합니다.
클래스별 처리인지 전체 처리인지 구분합니다
Torchvision의 기본 nms는 클래스 ID를 받지 않습니다. 서로 다른 라벨의 상자를 한꺼번에 넣으면 라벨 구분 없이 겹침을 비교합니다. batched_nms는 idxs에 담긴 범주를 기준으로 다른 범주의 상자끼리는 억제하지 않습니다. 함수 이름의 batched만 보고 여러 이미지가 자동으로 분리된다고 생각하지 않습니다.
여러 이미지를 묶어 처리한다면 이미지 경계도 따로 보장해야 합니다. 서로 다른 이미지의 같은 좌표는 같은 물체의 중복 후보가 아닙니다. 클래스 ID만 같다는 이유로 다른 이미지의 상자까지 한 그룹에 섞지 않도록 호출 단위와 그룹 구성을 점검합니다.
비최대 억제와 헷갈리는 용어는 무엇이 다른가요?
객체 탐지와 NMS의 차이
객체 탐지는 이미지에서 사물의 종류와 위치를 예측하는 전체 작업입니다. NMS는 그 결과 후보를 정리하는 한 절차입니다. 탐지 모델이 찾지 못한 물체는 NMS만 조정해서 새로 만들어 낼 수 없습니다. 탐지 전에 입력을 고치는 일과 탐지 뒤 후보를 고르는 일을 나눠 보면 원인을 찾기 쉽습니다.
IoU와 NMS의 차이
IoU는 두 영역이 얼마나 겹치는지 나타내는 수치이고 NMS는 그 수치와 점수로 선택을 반복하는 알고리즘입니다. IoU가 높다는 말만으로 정답이라고 판정할 수는 없습니다. 예측 상자와 정답 상자를 비교했는지, 중복 후보 두 개를 비교했는지에 따라 해석이 달라집니다.
일반 NMS와 Soft-NMS의 차이
일반 NMS는 겹침이 기준을 넘은 후보를 선택 대상에서 제외합니다. Soft-NMS는 겹침에 따라 후보의 점수를 낮추는 방식으로 이를 바꿉니다. 서로 가까운 실제 물체가 함께 사라지는 문제를 줄이려는 접근입니다. 점수를 낮춘다는 설명만으로 모든 후보가 최종 출력에 남는다고 보장하지는 않습니다.
배경 개념은 객체 탐지 용어 설명에서 이어 볼 수 있습니다. 그 글이 라벨·위치·신뢰도라는 출력의 의미를 다룬다면 여기서는 겹치는 후보를 어떤 순서와 기준으로 남기는지에 초점을 맞춥니다.
실전에서는 어디에 쓰이나요?
상품이나 부품의 중복 탐지를 정리합니다
진열대의 병이나 생산 라인의 부품처럼 같은 대상 주변에 여러 상자가 나온 경우 최종 목록을 정리하는 데 씁니다. 개수를 업무 시스템에 넘기기 전에는 중복 감소뿐 아니라 가려진 물체가 빠지는지도 확인합니다. 사진의 정답 개수와 대조하는 표본 검수가 필요합니다.
잘라낼 이미지 영역을 고릅니다
탐지한 영역을 잘라 별도 분류나 문자 인식에 넘길 때 비슷한 영역을 반복 처리하지 않도록 후보를 정리합니다. 크기가 다른 중첩 영역은 서로 다른 목적의 입력일 수 있으므로 무조건 합치지 않습니다. 상자 선택 기준은 후속 작업이 필요로 하는 영역의 의미와 맞춰 정합니다.
영상 분석에 넘길 프레임별 후보를 준비합니다
영상의 각 프레임에서 탐지 후보를 정리한 뒤 추적 모듈에 전달하는 흐름에 사용합니다. NMS 자체는 이전 프레임의 물체 ID나 이동 경로를 기억하지 않습니다. 현재 프레임에서 중복을 줄이는 일과 시간에 따라 같은 대상을 연결하는 일은 별도로 검증합니다.
비최대 억제를 적용할 때 어떤 순서로 확인하나요?
1. 좌표 순서와 단위를 확인합니다
Torchvision nms는
(x1, y1, x2, y2)
를, TensorFlow non_max_suppression은
[y1, x1, y2, x2]
를 안내합니다. 이름이 비슷해도 배열을 그대로 옮기지 않습니다. 픽셀과 정규화 좌표를 섞지 않고 원본 이미지에서 상자가 의도한 위치에 그려지는지 먼저 봅니다.
2. 이미지와 클래스의 경계를 고정합니다
한 번의 호출에 어느 이미지의 어떤 범주를 넣는지 기록합니다. 클래스별 NMS를 쓰면 라벨이 다른 중복 상자가 함께 남을 수 있습니다. 전체 범주를 함께 처리하면 서로 다른 실제 객체가 억제될 수 있으므로 업무의 라벨 관계에 맞게 비교합니다.
3. 전후 후보와 제외 이유를 비교합니다
점수 필터 뒤 후보, NMS 뒤 후보, 출력 상한을 적용한 최종 목록을 구분해 저장합니다. 제외된 상자도 원래 점수와 좌표로 다시 그려 봅니다. 검증 자료에서는 중복 탐지가 얼마나 줄었는지와 정답 물체를 얼마나 놓쳤는지를 같이 살펴 설정을 고릅니다.
4. 반환 인덱스와 실행 환경을 기록합니다
출력 인덱스를 원본 입력 행에 연결하고 클래스·점수·좌표가 함께 움직이는지 확인합니다. 라이브러리 버전, 장치, 임계값과 입력 순서도 남깁니다. 점수가 정확히 같은 후보는 CPU와 GPU에서 선택 결과가 같다고 보장되지 않는다는 Torchvision 문서의 주의점도 확인합니다.
실전 팁: 잘 떨어진 물체, 같은 물체의 중복 후보, 서로 가리는 실제 물체를 나눠 검토하세요. 한 종류의 장면만 보고 정한 임계값은 다른 장면의 놓침을 숨길 수 있습니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 높은 점수의 상자가 위치까지 정확하다고 단정하지 않습니다. NMS는 입력 점수 순서로 선택합니다. 잘못된 높은 점수 후보가 먼저 남으면 더 적절한 낮은 점수 후보가 제외될 수 있습니다. 점수의 품질과 위치 오차는 후처리와 따로 살펴봅니다.
둘째, 밀집 장면에서 필요한 상자를 지울 수 있습니다. 가까운 사람이나 겹쳐 놓인 상품은 서로 다른 물체여도 상자 겹침이 큽니다. 전체 평균 성능 외에 작은 물체·가려진 물체·밀집 구간의 결과를 따로 봅니다. 제거된 후보를 확인하지 않으면 놓침의 원인을 모델 탓으로만 돌리기 쉽습니다.
셋째, 상자 수와 처리 시간을 함께 봅니다. 후보가 많아지면 정렬과 겹침 비교에 드는 부담이 커집니다. 점수 필터나 후보 상한으로 계산을 줄일 때는 필요한 낮은 점수 후보도 함께 사라지는지 확인합니다. 작은 샘플의 실행 시간만으로 실제 영상의 처리 속도를 추정하지 않습니다.
넷째, 최종 탐지 개수를 확정 사실로 쓰지 않습니다. 잘못된 탐지와 누락은 후처리 뒤에도 남습니다. 사람이나 차량을 다루는 영상에서는 수집 목적과 접근 권한을 정하고 결과를 고위험 자동 제재에 곧바로 연결하지 않습니다. 오류를 확인하고 수정할 절차를 둡니다.
주의: NMS는 중복 후보를 줄이는 규칙입니다. 같은 물체인지의 확정 판정, 정확한 재고 집계, 사람의 신원 확인을 대신하지 않습니다.
자주 묻는 질문
Q1. NMS는 학습 알고리즘인가요?
여기서 설명한 일반 NMS는 주어진 상자와 점수로 후보를 고르는 후처리입니다. 실행할 때 모델 가중치를 새로 학습하지 않습니다. 점수와 좌표를 만든 탐지 모델의 학습 과정과 구분하면 됩니다.
Q2. IoU 임계값을 높이면 더 엄격하게 지우나요?
일반적인 NMS의 겹침 기준에서는 반대입니다. 더 크게 겹쳐야 억제하므로 중복을 남기기 쉬운 방향입니다. 모델의 낮은 점수를 거르는 점수 임계값과 혼동하지 마세요.
Q3. NMS가 반환한 숫자는 상자 좌표인가요?
이 글에서 확인한 Torchvision과 TensorFlow 함수는 선택한 입력 행의 인덱스를 반환합니다. 그 인덱스로 원래 상자를 골라야 합니다. 동일한 인덱스를 점수와 라벨에도 적용해 대응 관계를 유지합니다.
Q4. batched_nms가 이미지별로 자동 분리하나요?
Torchvision 문서에서 idxs는 각 상자의 범주를 나타냅니다. 다른 범주는 서로 억제하지 않지만 이미지 경계를 자동으로 알아낸다는 뜻은 아닙니다. 여러 이미지를 다룰 때는 호출을 분리하거나 그룹 구성을 명확히 합니다.
Q5. NMS를 거친 상자 수가 실제 물체 수인가요?
반드시 같지는 않습니다. 중복이 남거나 실제 물체가 억제될 수 있고 처음부터 탐지되지 않은 물체도 있습니다. 정답이 있는 검증 사진에서 최종 개수와 놓친 대상을 함께 확인해야 합니다.
출처
마무리
비최대 억제는 높은 점수의 상자를 먼저 고르고 많이 겹치는 후보를 제외하는 절차입니다. 객체 탐지 결과를 개수 세기나 영역 처리에 연결하기 전에 중복을 줄이는 데 도움이 됩니다. 다만 상자가 깔끔해졌다는 사실과 실제 물체를 정확히 찾았다는 판단은 구분해야 합니다.
처음에는 IoU와 점수 임계값을 나눠 읽고 좌표 순서·클래스 경계·반환 인덱스를 확인하세요. 그다음 밀집 장면에서 사라진 상자를 검토합니다. 전후 후보와 설정을 함께 남겨 두면 모델 자체의 오류와 후처리 때문에 생긴 오류를 구분하기가 쉬워집니다.
