Intersection over Union (IoU)
교집합 대 합집합(IoU)은 예측 박스가 실제 박스와 얼마나 겹치는지 0에서 1까지 점수로 나타냅니다. 공식, Python 코드, 임계값, IoU 기반 손실을 다룹니다.
교집합 대비 합집합(IoU)은 두 영역이 얼마나 겹치는지를 측정합니다. 즉, 두 영역이 공유하는 면적을 두 영역이 함께 차지하는 전체 면적으로 나눈 값입니다. IoU는 서로 닿지 않는 영역의 0부터 동일한 영역의 1까지이며, 통계학에서 자카드 지수로 알려진 값과 동일합니다. 객체 탐지에서는 IoU로 예측한 바운딩 박스와 레이블이 지정된 정답 박스를 비교합니다. 또한 예측의 정답 여부, 제거할 중복 예측, 박스 예측의 학습 방식을 결정합니다.
IoU 계산 방법#
IoU = 교집합 면적 / 합집합 면적이며, 합집합은 박스 A의 면적에 박스 B의 면적을 더한 뒤 교집합을 빼서 계산하므로 공통 영역은 한 번만 계산됩니다. 모서리 좌표 형식으로 표현된 두 개의 축 정렬 박스에서는 두 박스의 안쪽 모서리로 경계가 정해지는 사각형이 교집합이 되며, 두 박스가 겹치지 않으면 너비 또는 높이를 0으로 제한합니다.
# Boxes as [x1, y1, x2, y2] in pixels
label = [100, 100, 200, 200]
pred = [110, 110, 210, 210]
# Intersection rectangle, clamped to zero when the boxes do not overlap
w = max(0, min(label[2], pred[2]) - max(label[0], pred[0]))
h = max(0, min(label[3], pred[3]) - max(label[1], pred[1]))
intersection = w * h
# Union counts the overlap only once
area_label = (label[2] - label[0]) * (label[3] - label[1])
area_pred = (pred[2] - pred[0]) * (pred[3] - pred[1])
union = area_label + area_pred - intersection
print(f"IoU = {intersection} / {union} = {intersection / union:.3f}")스크립트는 IoU = 8100 / 11900 = 0.681을 출력합니다. 한 변이 100픽셀인 박스를 각 방향으로 10픽셀 이동하면 겹치는 영역은 90 × 90픽셀로 줄고 합집합은 11,900으로 늘어나므로, 10%의 이동으로 점수가 거의 3분의 1 감소합니다. 두 면적이 함께 스케일되므로 IoU는 스케일에 영향을 받지 않습니다. 상대적 정렬 오차가 같다면 20픽셀짜리 새와 2,000픽셀짜리 트럭에서 점수도 같습니다. 따라서 고정된 픽셀 오차는 작은 객체에 더 큰 영향을 주며, 박스를 옆으로 1픽셀 이동하면 20픽셀 박스의 IoU는 0.905, 200픽셀 박스의 IoU는 0.990으로 낮아집니다.
평가에서의 IoU 임계값#
평가 임계값은 IoU를 예/아니요 판정으로 변환합니다. 클래스가 일치하고 아직 매칭되지 않은 정답 박스와의 IoU가 임계값 이상이면 예측은 참 양성이며, 그렇지 않으면 거짓 양성입니다. PASCAL VOC 벤치마크는 0.5를 사용했습니다. 이 기준은 생각보다 느슨합니다. 너비가 같은 두 박스가 너비의 3분의 1만큼 옆으로 어긋나면 IoU가 정확히 0.5입니다. COCO 벤치마크는 0.50부터 0.95까지 10개 임계값에서 결과를 평균하며, 이를 통해 평균 정밀도(mAP)는 위치 정밀도를 반영합니다.
학습 및 후처리에서의 IoU#
- 박스 회귀 손실: 탐지기는 1 − IoU 또는 그 변형을 사용해 박스 좌표를 학습합니다. 원시 좌표에 대한 손실은 작은 박스와 큰 박스에서 10픽셀 오차를 동일하게 취급하기 때문입니다. 기본 IoU는 박스가 겹치지 않을 때 그래디언트를 제공하지 않으므로, 일반화 IoU(GIoU)는 두 박스를 모두 포함하는 최소 박스에 기반한 페널티를 추가하며, 거리 IoU 및 완전 IoU(DIoU, CIoU)는 중심점 거리와 종횡비 항목을 추가합니다. YOLO26은 CIoU 손실을 사용해 박스 헤드를 학습하고, 학습 중 각 레이블 객체에 할당할 예측을 결정할 때도 CIoU를 사용합니다.
- 비최대 억제(NMS): 추론 시 동일한 클래스의 점수가 더 높은 박스와 IoU가 임계값을 초과하는 박스는 중복으로 간주해 제거합니다.
- 객체 추적: ByteTrack과 같은 추적기는 기존 트랙과 새 탐지 결과 간의 IoU를 프레임 간 매칭 비용으로 사용합니다.
다른 모양에 적용하는 IoU#
동일한 비율은 모든 영역 쌍에 적용됩니다. 세그멘테이션은 픽셀 집합에 대한 마스크 IoU를 계산합니다. 인스턴스 세그멘테이션은 예측 마스크와 레이블을 매칭할 때 IoU를 사용하며, 시맨틱 세그멘테이션 벤치마크에서는 클래스별 IoU의 평균을 mIoU로 보고합니다. 회전 박스는 폴리곤 교집합이나 ProbIoU와 같은 가우시안 근사가 필요하며, 3D 탐지는 3차원 전체에서 또는 조감도상의 바닥 영역 겹침으로 입체 박스 간 IoU를 계산합니다.
IoU와 관련 지표 비교#
- 다이스 계수: 교집합을 두 면적의 합으로 나눈 값에 2를 곱합니다. Dice = 2 × IoU / (1 + IoU)이므로 IoU와 동일한 순서로 예측의 순위를 매기며, 의료 이미지 세그멘테이션에서 흔히 사용됩니다.
- 정확도: 올바르게 분류한 예측의 비율이며, 박스의 위치는 나타내지 않습니다.
- mAP: IoU 임계값을 기반으로 위치 추정과 클래스별 정밀도 및 재현율을 결합한 탐지 단위 요약 지표입니다.
다이스 관계식을 사용해 임계값도 변환할 수 있습니다. IoU 0.5는 Dice 점수 0.667에 해당하며, IoU 0.9는 Dice 점수 0.947에 해당합니다.










