Mean Average Precision (mAP)
평균 정밀도(mAP)는 재현율, 클래스, IoU 임계값에 걸쳐 정밀도를 평균해 객체 검출기의 성능을 평가합니다. mAP50 및 mAP50-95 계산 방법을 살펴봅니다.
평균 정밀도(mAP)는 객체 탐지의 표준 평가 지표이며, 같은 방식으로 인스턴스 분할, 포즈 추정, 방향성 객체 탐지의 성능을 평가합니다. 이 지표는 모델이 모든 객체를 찾아내고 오탐을 피하며 각 바운딩 박스를 정확하게 배치하는 능력을 평가하고, 이 세 가지를 0과 1 사이의 단일 숫자로 나타냅니다. 흔히 백분율로 표기합니다. 평균 정밀도(AP)는 한 클래스의 정밀도-재현율 곡선 아래 면적이고, mAP는 클래스 전체 AP의 평균입니다. 가장 널리 보고되는 형식인 mAP50-95는 교집합 대비 합집합(IoU) 임계값 열 개에 대해서도 평균을 계산합니다.
기본 구성 요소#
- IoU: 예측 박스와 레이블이 지정된 박스 간의 겹침 정도로, 0에서 1 사이의 값입니다. 예측 박스와 아직 매칭되지 않은 동일 클래스 레이블 간의 IoU가 0.5와 같은 임계값 이상인 경우에만 예측을 참양성으로 판정합니다.
- 정밀도: 올바른 예측의 비율, TP / (TP + FP)입니다.
- 재현율: 모델이 찾아낸 레이블 객체의 비율, TP / (TP + FN)입니다.
- 신뢰도: 탐지 결과의 순위를 정하는 점수입니다. 각 신뢰도 임계값은 하나의 정밀도-재현율 쌍을 제공하며, 모든 임계값을 함께 사용하면 정밀도-재현율 곡선을 그릴 수 있습니다.
mAP 계산 방법#
평가에서는 전체 데이터셋에서 한 클래스에 속하는 모든 탐지 결과를 모아 신뢰도순으로 정렬합니다. 목록을 따라가며 각 탐지 결과는 같은 클래스에서 가장 많이 겹치는 미매칭 레이블을 차지해 참양성이 되거나, 거짓양성이 됩니다. 레이블은 한 번만 할당할 수 있으므로 이미 찾은 객체에 두 번째 박스가 지정되면 정밀도가 낮아집니다. 각 단계마다 정밀도와 재현율을 다시 계산하여 신뢰도가 가장 높은 탐지 결과부터 가장 낮은 탐지 결과까지 정밀도-재현율 곡선을 그립니다.
AP는 해당 곡선 아래의 면적입니다. 적분하기 전에 곡선을 포락선으로 대체합니다. 즉, 각 재현율 수준이나 그 이상에서 확인된 최고 정밀도를 사용하므로 작은 지그재그 변화는 점수에 영향을 주지 않습니다. COCO 평가는 재현율 0부터 1까지 101개 지점에서 포락선을 샘플링합니다. 기존 PASCAL VOC 벤치마크는 11개 지점을 사용했습니다. 모델이 도달하지 못한 재현율 수준은 정밀도 0으로 계산하므로, 누락된 객체가 있으면 AP가 낮아집니다.
import numpy as np
# One class: 8 detections sorted by confidence (1 = matched a label, 0 = false positive)
tp = np.array([1, 1, 0, 1, 0, 1, 0, 0])
num_labels = 5 # ground-truth objects of this class in the dataset
# Precision and recall after each detection in the ranked list
tp_cum = np.cumsum(tp)
precision = tp_cum / np.arange(1, len(tp) + 1)
recall = tp_cum / num_labels
# Precision envelope: best precision at this recall or any higher recall
envelope = np.maximum.accumulate(precision[::-1])[::-1]
# COCO-style AP: average the envelope at 101 recall points (0 beyond the highest recall reached)
points = np.linspace(0, 1, 101)
idx = np.searchsorted(recall, points, side="left")
ap = np.mean([envelope[i] if i < len(envelope) else 0.0 for i in idx])
print(f"Max recall: {recall[-1]:.1f}, AP: {ap:.3f}")스크립트는 Max recall: 0.8, AP: 0.686을 출력합니다. 레이블이 지정된 객체 5개 중 1개를 탐지하지 못하므로 재현율 축의 마지막 5분의 1 구간은 면적에 기여하지 않습니다. 따라서 신뢰도가 가장 높은 탐지 결과 두 개가 모두 정확하더라도 AP는 0.686입니다.
mAP와 관련 지표 비교#
- 정확도는 올바른 예측 수를 전체 예측 수로 나누며, 이를 계산하려면 참음성 수를 세어야 합니다. 탐지기에서 참음성은 배경의 모든 빈 패치에 해당하므로 정확도는 객체 탐지에서 의미 있는 지표가 아닙니다.
- F1 점수는 하나의 신뢰도 임계값에서 정밀도와 재현율을 결합해 단일 운영 지점을 나타냅니다. 예를 들어 배포된 모델이 사용하는 임계값이 이에 해당합니다.
- 혼동 행렬은 하나의 임계값에서 탐지기가 어떤 클래스를 혼동하는지 계산합니다. 이는 단일 mAP 점수로는 알 수 없는 세부 정보입니다.
mAP50, mAP75, mAP50-95#
mAP는 클래스 전체에 대한 단순 평균이므로, 희귀 클래스도 흔한 클래스만큼 동일한 비중을 차지합니다. IoU 임계값은 올바른 검출로 인정되기 위해 박스가 얼마나 정확해야 하는지를 정합니다.
- mAP50: IoU가 0.5일 때 검출을 올바른 것으로 판정하며, 이는 PASCAL VOC 규칙입니다.
- mAP75: 임계값이 0.75로 높아져 위치 정확도를 엄격하게 평가합니다.
- mAP50-95: 0.50부터 0.95까지 0.05 간격으로 설정한 10개 임계값에서 평균한 mAP입니다. COCO에서는 이 수치를 단순히 "AP"라고 부르며, AP와 mAP를 구분하지 않고 주요 챌린지 지표로 사용합니다.
Ultralytics YOLO26 학습은 검증 mAP50-95가 가장 높은 에폭의 best.pt를 유지하며, 검증에서는 매 실행마다 세 가지 변형을 모두 보고합니다.
from ultralytics import YOLO
# Load a pretrained YOLO26 nano detector
model = YOLO("yolo26n.pt")
# Validate on the small COCO8 dataset to compute mAP
metrics = model.val(data="coco8.yaml")
# The same detections scored at three IoU thresholds
print(f"mAP50: {metrics.box.map50:.3f}")
print(f"mAP75: {metrics.box.map75:.3f}")
print(f"mAP50-95: {metrics.box.map:.3f}")IoU 임계값이 낮을수록 더 많은 검출이 올바른 것으로 판정되므로 mAP50이 가장 높고 mAP50-95는 그보다 낮습니다. COCO는 객체 크기별로 AP를 구분하기도 합니다. 소형 객체는 면적이 32 × 32픽셀 미만이고, 중형 객체는 최대 96 × 96픽셀이며, 대형 객체는 그보다 큽니다.










