본문 바로가기
목차
ML

Object Detection 태스크에 대한 모델 평가를 COCO API로 하기

by ds31x 2025. 12. 16.
728x90
반응형

 

COCO Detection 평가 튜토리얼

  1. loadRes : 델이 출력한 예측 결과(JSON)를 COCO annotation 형식으로 감싸, 정답(GT)과 동일한 COCO API로 접근할 수 있게 만드는 함수
  2. COCOeval: COCO 형식의 정답(GT)과 예측(DT)을 IoU(또는 OKS) 기준으로 비교·매칭하여 AP·AR 등 표준 성능 지표를 계산하는 공식 평가 모듈
  3. mAP

mAP (mean Average Precision)
여러 IoU 기준과 모든 클래스에 대해
계산한 Average Precision(AP)을 평균낸,
객체 검출 성능을 대표하는 단일 평가 지표

 

2025.12.16 - [ML] - pycocotools COCO API 기초

 

pycocotools COCO API 기초

pycocotools COCO API에서 자주 쓰는 메서드들에 대한 정리:getAnnIdsgetCatIdsgetImgIdsloadAnnsloadCatsloadImgsloadResshowAnns2025.12.16 - [ML] - MS COCO (Microsoft의 Common Object in Context) Dataset MS COCO (Microsoft의 Common Object in Cont

ds31x.tistory.com


0. 전제 조건 (중요)

GT(annotation)

coco/annotations/instances_val2017.json

Prediction 결과(JSON)

[
  {
    "image_id": 397133,
    "category_id": 1,
    "bbox": [217.6, 240.5, 38.9, 57.3],
    "score": 0.92
  }
]
  • bbox[x, y, width, height] (XYWH)
  • score필수 임!

1. COCO GT (Ground True) 로딩

from pycocotools.coco import COCO

ANN_GT = "coco/annotations/instances_val2017.json"
coco_gt = COCO(ANN_GT)

이 시점에

  • coco_gt.anns
  • coco_gt.imgs
  • coco_gt.cats

가 모두 구성됨.


2. Prediction 결과 로딩 (loadRes)

앞서 JSON으로 저장한 파일을 로딩.

ANN_PRED = "pred_instances_val2017.json"

coco_dt = coco_gt.loadRes(ANN_PRED)
  • coco_dt : coco detection 결과를 의미

핵심 개념

  • coco_dt“모델이 예측한 결과에 대한 COCO 객체”
  • GT와 같은 API를 사용함
    • getAnnIds
    • loadAnns
    • showAnns
  • 단, score 필드가 추가적으로 존재. DT와 GT의 차이점

3. COCOeval 객체 생성

  • COCO 형식의 정답(GT)과 모델 예측(DT)을 비교하여,
  • IoU 기반으로 매칭을 수행하고
  • mAP·AR 등 표준 COCO 성능 지표를 계산하는 공식 evaluation module

AR (Average Recall)
주어진 IoU 기준과 최대 검출 개수(maxDets) 조건에서,
모델이 실제 객체들을 얼마나 많이 찾아냈는지를 평균적으로 나타내는 sensitivity (=recall) 지표

from pycocotools.cocoeval import COCOeval

coco_eval = COCOeval(
    cocoGt=coco_gt,
    cocoDt=coco_dt,
    iouType="bbox"   # detection
)

iouType 종류

task iouType
Object Detection "bbox"
Instance Segmentation "segm"
Keypoints "keypoints"
  • 여기서 "keypoints"의 경우는 일반 IoU가 아니라 OKS(Object Keypoint Similarity)를 사용함.

4. 평가 실행 (3단계 필수)

coco_eval.evaluate()
coco_eval.accumulate()
coco_eval.summarize()

3줄은 반드시 순서대로 실행해야 함.

  • coco_eval.evaluate()
    • 정답(GT)과 예측(DT)을 IoU(또는 OKS) 기준으로 매칭 수행
    • 각 이미지, 클래스, 임계값별로 recision/recall 계산에 필요한 raw evaluation result를 생성
  • coco_eval.accumulate()
    • evaluate()에서 계산된 raaw result를
      • IoU 와 recall 축으로 누적(accumulate)하여,
      • 전체 데이터셋 기준의 Precision–Recall 통계를 구성.
  • coco_eval.summarize()
    • 누적된 Precision–Recall 통계를 요약하여
    • mAP, AP@0.50, AP@0.75, AR 등 COCO 표준 성능 지표를 출력.

참고로, iscrowd=1인 GT는 일반적인 TP/FP 계산에서 제외


5. 출력되는 COCO 공식 mAP 지표

summarize() 실행 시 자동 출력:

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.376
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.581
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.402
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.201
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.411
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.523

6. mAP 값만 코드로 직접 쓰고 싶을 때

ap_5095 = coco_eval.stats[0]  # AP@[0.50:0.95]
ap_50   = coco_eval.stats[1]  # AP@0.50
ap_75   = coco_eval.stats[2]  # AP@0.75

print(ap_5095, ap_50, ap_75)

참고: stats 의미 (Detection)

index 표기 desc
0 mAP@[.50:.95] IoU 0.50부터 0.95까지 0.05 간격으로 계산한 AP를 평균한 COCO 대표 성능 지표
1 AP@0.50 IoU=0.50에서의 AP로, 상대적으로 느슨한 매칭 기준의 성능
2 AP@0.75 IoU=0.75에서의 AP로, 더 엄격한 위치 정확도를 요구하는 성능
3 AP small 작은 객체(area small)에 대한 평균 정밀도
4 AP medium 중간 크기 객체(area medium)에 대한 평균 정밀도
5 AP large 큰 객체(area large)에 대한 평균 정밀도
6 AR maxDets=1 이미지당 최대 1개 검출만 허용했을 때의 평균 재현율
7 AR maxDets=10 이미지당 최대 10개 검출을 허용했을 때의 평균 재현율
8 AR maxDets=100 이미지당 최대 100개 검출을 허용했을 때의 평균 재현율
9 AR small 작은 객체(area small)에 대한 평균 재현율
10 AR medium 중간 크기 객체(area medium)에 대한 평균 재현율
11 AR large 큰 객체(area large)에 대한 평균 재현율

 

위에서 small, medium, large는 area의 값에 다음의 기준을 적용하여 구분:

구분 정량적 기준 (pixel²) 의미
small area < 32² = 1,024 매우 작은 객체
medium 32² ≤ area < 96² = 9,216 중간 크기 객체
large area ≥ 96² = 9,216 큰 객체

7. 특정 클래스만 평가하고 싶을 때

person_cat_id = coco_gt.getCatIds(catNms=["person"])
coco_eval = COCOeval(coco_gt, coco_dt, "bbox") # 생략 가능하나 다시 생성하는게 좋음.
coco_eval.params.catIds = person_cat_id
coco_eval.evaluate()
coco_eval.accumulate()
coco_eval.summarize()
  • 위 코드는 person class만으로 mAP를 계산

8️. 특정 이미지 subset만 평가

from pycocotools.cocoeval import COCOeval

img_ids = coco_gt.getImgIds()[:100]  # 앞 100장만
coco_eval = COCOeval(coco_gt, coco_dt, "bbox") # 생략 가능하나 다시 생성하는게 좋음.
coco_eval.params.imgIds = img_ids # 평가에 사용할 이미지 ID만 제한, GT와 DT 모두 동일하게 적용

coco_eval.evaluate()
coco_eval.accumulate()
coco_eval.summarize()

9️. 전체 흐름 요약

GT COCO         : coco_gt = COCO(gt.json)
Prediction load : coco_dt = coco_gt.loadRes(pred.json)

Evaluation
  ├─ coco_eval = COCOeval(coco_gt, coco_dt, "bbox")
  ├─ coco_eval.evaluate()
  ├─ coco_eval.accumulate()
  └─ coco_eval.summarize()

같이 보면 좋은 자료

2025.12.16 - [ML] - MS COCO (Microsoft의 Common Object in Context) Dataset

 

MS COCO (Microsoft의 Common Object in Context) Dataset

COCO 데이터셋은 여러 종류의 task 에 대한 모델을 훈련시킬 수 있음: 다음의 task들로 구분됨.1. Object Detection (객체 탐지)목적: 이미지 안에 있는 객체의 location 과 class (=category)를 추출 : things만annotat

ds31x.tistory.com

 

728x90