
COCO Detection 평가 튜토리얼
loadRes: 델이 출력한 예측 결과(JSON)를 COCO annotation 형식으로 감싸, 정답(GT)과 동일한 COCO API로 접근할 수 있게 만드는 함수COCOeval: COCO 형식의 정답(GT)과 예측(DT)을 IoU(또는 OKS) 기준으로 비교·매칭하여 AP·AR 등 표준 성능 지표를 계산하는 공식 평가 모듈- 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.annscoco_gt.imgscoco_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를 사용함
getAnnIdsloadAnnsshowAnns
- 단,
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()
참고로, 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
'ML' 카테고리의 다른 글
| Deployment 가능한 HF Custom (Vision) Model 만들기 (0) | 2025.12.18 |
|---|---|
| torchvision.datasets.CocoDetection 간단 소개. (0) | 2025.12.16 |
| pycocotools COCO API 기초 (0) | 2025.12.16 |
| MS COCO (Microsoft의 Common Object in Context) Dataset (1) | 2025.12.16 |
| Detection Task에서 collate_fn의 입·출력 구조와 default_collate의 한계 (0) | 2025.12.15 |