객체 탐지를 이해하기 위해서는 먼저 정밀도(Precision)와 재현율(Recall) 개념을 알아야 합니다.
| 개념 | 수식 | 의미 |
|---|---|---|
| Precision | TP / (TP + FP) | 예측 중 정답인 비율 |
| Recall | TP / (TP + FN) | 실제 객체 중 예측한 비율 |
모델은 각 예측 박스에 대해 confidence score를 출력합니다.
이 점수를 기준으로 정렬한 후 threshold 값을 변화시키며 Precision과 Recall의 관계를 그리면 PR 곡선이 생성됩니다.
일반적으로 Recall이 증가하면 Precision은 감소하는 경향이 있습니다.
AP는 하나의 클래스에 대해 생성된 Precision–Recall 곡선 아래 면적(Area Under Curve)입니다.
mAP (mean Average Precision)는 객체 탐지(Object Detection)에서 모든 클래스에 대한 Average Precision(AP)의 평균값을 의미합니다.
각 클래스마다의 탐지 성능(AP)을 구한 뒤, 그 평균을 내어 모델 전체의 객체 탐지 성능을 평가합니다.
mAP는 아래와 같은 방식으로 계산됩니다:
즉, 모든 클래스의 AP를 평균낸 값이 mAP입니다.
객체 탐지에서 예측이 정답과 얼마나 잘 맞는지를 평가할 때 사용하는 기준은 IoU (Intersection over Union)입니다.
일반적으로 IoU ≥ 0.5이면 정답(True Positive)으로 간주합니다.
| 기준 | 설명 | 난이도 |
|---|---|---|
| VOC mAP@0.5 | IoU ≥ 0.5일 때 각 클래스별 AP를 평균 | 비교적 간단 |
| COCO mAP@[0.5:0.95] | IoU 0.5부터 0.95까지 0.05 간격으로 총 10개의 AP를 평균 | 훨씬 정밀하고 까다로움 |
| 항목 | 설명 |
|---|---|
| mAP@[0.5:0.95] | 10개 IoU 기준에서 AP를 측정하고 평균 |
| mAP@0.5 | VOC와 동일한 기준 (IoU ≥ 0.5) |
| mAP@0.75 | 보다 엄격한 IoU 기준 (IoU ≥ 0.75) |
| mAP_small / medium / large | 객체 크기에 따라 성능을 나누어 평가 |
클래스별 AP가 다음과 같을 때:
| 항목 | 설명 |
|---|---|
| mAP | 전체 클래스의 AP 평균값 |
| IoU | 예측 박스와 정답 박스의 겹침 정도 |
| VOC mAP@0.5 | IoU ≥ 0.5에서 AP 측정 |
| COCO mAP@[0.5:0.95] | 10개 IoU 기준에서 평균 AP 측정 (더 정밀함) |
Precision–Recall(PR) 곡선은 객체 탐지 모델의 정확도(Precision)와 재현율(Recall) 사이의 관계를 시각적으로 나타낸 곡선입니다.
예측 결과를 기반으로 PR 곡선을 시각화하려면 다음과 같은 과정을 거칩니다.
from sklearn.metrics import precision_recall_curve
import matplotlib.pyplot as plt
# 예측 결과와 정답 레이블
y_true = [0, 1, 1, 0, 1, 1, 0, 0] # 실제 값
y_scores = [0.1, 0.9, 0.8, 0.3, 0.75, 0.65, 0.2, 0.05] # 예측 confidence score
# PR 곡선 계산
precision, recall, thresholds = precision_recall_curve(y_true, y_scores)
# 시각화
plt.plot(recall, precision, marker='.')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision–Recall Curve')
plt.grid(True)
plt.show()
이 곡선은 confidence threshold(신뢰도 임계값)를 조절할 때 모델의 탐지 성능이 어떻게 변화하는지를 시각적으로 보여줍니다.
| 곡선 형태 | 의미 |
|---|---|
| 곡선이 높고 완만함 | 높은 precision을 유지하며 recall 증가 → 좋은 탐지기 |
| 급격한 하강 | confidence score가 불안정하거나 FP가 많음 |
| 넓은 면적 | AP 높음 |
| 좁은 면적 | AP 낮음, 불안정 |
PR 곡선이 천천히 떨어질수록 모델이 다양한 threshold에서도 성능이 안정적이라는 뜻입니다.
mAP는 클래스별 AP를 평균한 값이기 때문에, PR 곡선이 얼마나 안정적으로 유지되었는가에 대한 총평입니다.
| 모델 | AP@0.5 | PR 곡선 형태 | 해석 |
|---|---|---|---|
| 모델 A | 0.85 | 완만한 하강 | 높은 정밀도, 안정적인 탐지 |
| 모델 B | 0.52 | 급격한 하강 | threshold에 민감, 탐지 불안정 |
| 모델 C | 0.30 | 낮은 precision 유지 | 탐지는 많으나 정답률 낮음 (FP↑) |
| 항목 | 설명 |
|---|---|
| PR 곡선 | Precision과 Recall의 관계를 시각화 |
| AP | PR 곡선 아래 면적 (클래스별 성능 척도) |
| mAP | 전체 클래스의 AP 평균 |
| 좋은 PR 곡선 | 높은 Precision을 유지하며 완만하게 감소 |
| 해석 | mAP은 탐지 정확도 + 안정성을 동시에 평가하는 지표 |
mAP@0.5를 간단하게 구현하려면 다음과 같은 절차를 따릅니다
mAP@0.5 간단 구현 절차
- 예측 박스와 정답 박스 수집
- IoU 계산
- TP / FP 결정
- Precision–Recall 곡선 생성
- AP 계산 → 클래스별 평균 → mAP 산출
from sklearn.metrics import average_precision_score
# 예시: binary classification 기반 AP 계산
y_true = [0, 1, 1, 0, 1] # ground truth (0: background, 1: object)
y_scores = [0.1, 0.8, 0.9, 0.4, 0.75] # prediction confidence
ap = average_precision_score(y_true, y_scores)
print(f"AP: {ap:.4f}")
이 방식은 VOC 스타일의 mAP@0.5 단일 IoU 기준 평가와 유사합니다.
def compute_iou(box1, box2):
# box: [x1, y1, x2, y2]
x1 = max(box1[0], box2[0])
y1 = max(box1[1], box2[1])
x2 = min(box1[2], box2[2])
y2 = min(box1[3], box2[3])
inter_area = max(0, x2 - x1) * max(0, y2 - y1)
box1_area = (box1[2] - box1[0]) * (box1[3] - box1[1])
box2_area = (box2[2] - box2[0]) * (box2[3] - box2[1])
iou = inter_area / float(box1_area + box2_area - inter_area + 1e-6)
return iou
!pip install pycocotools
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval
annFile = 'annotations/instances_val2017.json'
resFile = 'results.json'
coco_gt = COCO(annFile)
coco_dt = coco_gt.loadRes(resFile)
coco_eval = COCOeval(coco_gt, coco_dt, iouType='bbox')
coco_eval.evaluate()
coco_eval.accumulate()
coco_eval.summarize()
출력 결과에는 mAP@[.5:.95], mAP@0.5, mAP_small, mAP_medium, mAP_large 등 다양한 평가 지표가 포함됩니다.
VOC mAP 계산은 Pascal VOC에서 제공한 Python 평가 코드를 활용할 수 있습니다.
• 평가 대상은 voc_format: XML or .txt 기반 라벨링
• 클래스별로 예측과 정답을 비교하여 mAP@0.5 계산
https://github.com/Cartucho/mAP (가장 널리 쓰이는 오픈소스 구현)
| 항목 | 설명 |
|---|---|
| 직접 구현 | sklearn.metrics와 IoU 계산으로 간단한 mAP 측정 가능 |
| VOC 평가 | 단일 IoU@0.5 기준, 빠르고 직관적, 구현 간단 |
| COCO 평가 | 다양한 IoU(0.5~0.95) 기준에서 평가, 더욱 정밀 |
| 추천 툴 | pycocotools (COCO 공식), Cartucho/mAP (VOC 오픈소스) |
mAP은 단순한 수치이지만, 실제로는 모델의 구조, 학습 방식, 후처리 등 다양한 요소가 영향을 미칩니다.
| 기법 | 설명 | 효과 |
|---|---|---|
| Random Flip / Scale / Crop | 다양한 시야 제공 | 위치 다양성 확보 |
| Color Jitter / HSV shift | 밝기, 채도 변화 | 조명 변화 대응 |
| Mosaic Augmentation | 여러 이미지를 하나로 합침 (YOLOv4+) | 작은 객체 탐지 향상 |
| MixUp / CutMix | 두 이미지를 혼합하여 새로운 샘플 생성 | regularization + 일반화 능력 향상 |
| 전략 | 설명 |
|---|---|
| Backbone 변경 | 더 강력한 feature extractor 사용 (e.g., CSPDarknet → EfficientNet) |
| FPN, PAN 추가 | multi-scale feature 통합으로 작은 객체 탐지 개선 |
| Attention 모듈 | CBAM, SE-block 등으로 중요한 영역 강조 |
| Re-parameterization | 훈련 시 복잡 → 추론 시 단순화하여 성능 유지 + 속도 향상 |
| 기법 | 설명 | 효과 |
|---|---|---|
| NMS (Non-Max Suppression) | 겹치는 박스 제거 | FP 감소 |
| Soft-NMS | 점수 감쇠 방식으로 박스 제거 완화 | recall 증가 |
| Score threshold 조정 | confidence가 낮은 박스 제거 | noise 제거 + precision 증가 |
| 영역 | 전략 예시 |
|---|---|
| 데이터 증강 | Mosaic, CutMix, Flip, HSV |
| 앵커 박스 | AutoAnchor, k-means clustering |
| 모델 구조 | FPN, Attention, Efficient Backbone |
| 후처리 | NMS, Soft-NMS, threshold 조절 |
| 최적화 | Focal loss, LR decay, label smoothing |