성능 지표 이해

Object Detection 모델을 올바르게 평가하려면 각 지표의 정의와 상호 관계를 명확히 이해해야 한다. 특히 철도와 같은 안전 critical 도메인에서는 지표 해석이 시스템 설계와 직결된다.

핵심 요약

지표정의범위철도 적용 우선순위
IoU예측-실제 박스 겹침 비율0 ~ 1임계값 기준 (0.5 표준)
Precision탐지한 것 중 맞은 비율0 ~ 1오탐 비용 높을 때
Recall실제 중 탐지한 비율0 ~ 1최우선 (미탐 방지)
F1 ScorePrecision·Recall 조화평균0 ~ 1균형 평가 시
mAP@50IoU=0.5에서 클래스별 AP 평균0 ~ 1일반 성능 비교
mAP@50-95IoU 0.5~0.95 평균 mAP0 ~ 1COCO 표준, 위치 정밀도

문서 탐색


IoU (Intersection over Union)

IoU는 예측 바운딩 박스(Predicted Box)와 실제 바운딩 박스(Ground Truth Box) 간의 겹침 정도를 측정하는 지표이다.

수식

특성

  • 범위: 0 (전혀 겹치지 않음) ~ 1 (완전히 일치)
  • 임계값 역할: IoU ≥ 임계값이면 True Positive(TP), 미만이면 False Positive(FP)로 판정
  • 표준 임계값: 0.5 (PASCAL VOC 기준), 0.5~0.95 (COCO 기준)

시각적 이해

┌──────────────────────────────┐
│                              │
│  Ground Truth Box            │
│  ┌─────────────────┐         │
│  │                 │         │
│  │     교집합      │         │
│  │    ┌───────┐   │         │
│  │    │■■■■■■│   │         │
│  └────┼───────┼───┘         │
│       │       │ Predicted   │
│       └───────┘ Box         │
│                              │
│  IoU = 교집합 / 합집합       │
│      = ■■■■■■ / (GT + Pred - ■■) │
└──────────────────────────────┘

IoU 임계값별 판정 예시

IoU 값판정 (임계값 0.5)의미
0.95TP (True Positive)매우 정확한 탐지
0.70TP양호한 탐지
0.50TP (경계)최소 허용 기준
0.45FP (False Positive)임계값 미달 → 오탐 처리
0.10FP위치 매우 부정확
0.00FP완전히 다른 위치

Precision vs Recall

혼동 행렬(Confusion Matrix) 기반 정의

                실제
              Pos    Neg
예측  Pos  │  TP  │  FP  │
      Neg  │  FN  │  TN  │

TP: 실제 객체를 올바르게 탐지
FP: 없는 객체를 있다고 탐지 (오탐)
FN: 실제 객체를 탐지 못함 (미탐)
TN: 없는 객체를 올바르게 탐지 안 함

비교표

항목PrecisionRecall
수식TP / (TP + FP)TP / (TP + FN)
의미탐지한 것 중 얼마나 맞았나실제 중 얼마나 탐지했나
높을 때오탐이 적다미탐이 적다
낮을 때오탐이 많다미탐이 많다
중요한 경우오탐 비용이 높을 때 (불필요한 경보 방지)미탐 비용이 높을 때 (안전 critical)

Precision-Recall 트레이드오프

신뢰도 임계값(confidence threshold)을 낮추면 Recall이 높아지고 Precision이 낮아진다. 반대로 임계값을 높이면 Precision이 높아지고 Recall이 낮아진다.

Confidence 임계값 조정에 따른 변화:

임계값 낮춤 (예: 0.1)
→ 더 많이 탐지 → Recall ↑, Precision ↓
→ 오탐 증가, 미탐 감소

임계값 높임 (예: 0.9)
→ 확실한 것만 탐지 → Recall ↓, Precision ↑
→ 오탐 감소, 미탐 증가

F1 Score

F1 Score는 Precision과 Recall의 조화평균(harmonic mean)이다. 두 지표 중 하나가 0에 가까우면 F1도 낮아지는 특성 덕분에 단순 평균보다 균형 잡힌 평가가 가능하다.

클래스 불균형 데이터에서의 유용성

철도 데이터셋은 정상 상태(배경) 대비 결함·지장물 이미지 비율이 매우 낮아 클래스 불균형이 심각하다. 이때 Accuracy(전체 정확도)는 왜곡되지만, F1 Score는 소수 클래스 성능을 민감하게 반영한다.

예시PrecisionRecallF1 Score해석
균형 탐지0.850.850.85이상적
Recall 우선0.600.950.74미탐 최소화, 오탐 허용
Precision 우선0.950.600.74오탐 최소화, 미탐 허용
극단적 불균형0.200.990.33F1로 실제 문제 드러남

mAP 상세

AP (Average Precision) 계산 과정

  1. 신뢰도 기준으로 탐지 결과 정렬 (내림차순)
  2. 각 임계값에서 Precision과 Recall 계산
  3. PR 곡선(Precision-Recall Curve) 생성
  4. 곡선 아래 면적(AUC) = AP

mAP (mean AP)

mAP는 모든 클래스에 대한 AP의 평균이다.

mAP@50 vs mAP@50-95

항목mAP@50mAP@50-95
IoU 기준0.5 고정0.5, 0.55, 0.60, …, 0.95 평균
표준PASCAL VOCCOCO
난이도상대적 쉬움상대적 어려움 (위치 정확도 요구)
활용빠른 성능 비교최종 성능 보고 표준
동일 탐지 결과mAP@50 > mAP@50-95 항상 성립
철도 용도논문 비교, 모델 선택최종 시스템 평가

Confusion Matrix 해석법

Object Detection의 Confusion Matrix는 클래스별로 다음과 같이 해석한다.

           예측
         cls_A  cls_B  Background
실제  cls_A │  TP  │  FP(오분류) │  FN(미탐)  │
      cls_B │  FP  │    TP      │    FN     │
      BG    │  FP  │    FP      │    TN     │

주요 해석 패턴

패턴위치의미대응 방법
대각선 높음Matrix 대각올바른 탐지 많음현재 상태 유지
FP 많음배경 → 클래스오탐 과다신뢰도 임계값 높임
FN 많음클래스 → 배경미탐 과다신뢰도 임계값 낮춤, 데이터 보강
클래스간 혼동비대각 클래스 셀유사 클래스 구분 어려움클래스별 특징 강화 학습

철도 분야 지표 해석

안전 Critical 원칙

철도는 미탐(FN)이 오탐(FP)보다 훨씬 치명적이다. 지장물을 탐지 못하면 열차 충돌로 이어지지만, 오탐은 불필요한 경보에 그친다.

철도 지표 우선순위:
1순위: Recall (미탐 최소화 — 절대 기준)
2순위: F1 Score (오탐·미탐 균형)
3순위: Precision (운영 효율성)
4순위: mAP@50-95 (위치 정밀도)

분야별 권장 임계값

점검 분야신뢰도 임계값목표 Recall목표 Precision
지장물 탐지0.25 ~ 0.35≥ 0.97≥ 0.70
레일 균열0.30 ~ 0.40≥ 0.95≥ 0.75
체결장치 이상0.35 ~ 0.45≥ 0.93≥ 0.80
전차선 이상0.25 ~ 0.35≥ 0.97≥ 0.70
시설물 일반 점검0.40 ~ 0.55≥ 0.90≥ 0.85

지장물 탐지와 전차선 이상의 신뢰도 임계값을 낮게 설정하는 이유: 오탐보다 미탐의 위험이 훨씬 크므로 Recall을 최대화한다.

성능 평가 코드

from ultralytics import YOLO
 
model = YOLO("best.pt")
 
# 검증 데이터셋 평가
metrics = model.val(
    data="railway.yaml",
    imgsz=640,
    conf=0.30,          # 신뢰도 임계값
    iou=0.50,           # IoU 임계값
    device=0,
)
 
# 지표 출력
print(f"mAP@50:    {metrics.box.map50:.4f}")
print(f"mAP@50-95: {metrics.box.map:.4f}")
print(f"Precision: {metrics.box.mp:.4f}")
print(f"Recall:    {metrics.box.mr:.4f}")
 
# 클래스별 AP
for i, class_name in enumerate(metrics.names.values()):
    print(f"  {class_name}: AP50 = {metrics.box.ap50[i]:.4f}")

문서 탐색


참고 자료