Problem: Precision이나 Recall이 -1.000 (잘못된 값)으로 나타남
Precision이나 Recall이 -1일 때는 areaRng의 small, medium, large가 데이터셋 분포에 맞게 잘 설정되었는지 확인해보자.
Average forward time: 0.54 ms, Average NMS time: 0.43 ms, Average inference time: 0.97 ms
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.287
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.443
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.326
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.287
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.483
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.535
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.535
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.535
잘 보면 area=small과 area=medium에서만 -1.000이 표시되는 것을 확인할 수 있다. 간단하게 COCOeval의 areaRng
parameter를 변경하여 문제를 해결할 수 있다. 넣어야 하는 값은 데이터셋 내 Bounding box의 distribution을 직접 분석하여 구하자. (여기에서 COCO 데이터셋 내 객체들은 small이 41%, medium이 34%, 나머지 large가 24%라고 한다.)
하지만 이렇게 되면 일반적으로 여러 논문에서 표시하는 $AP_S$, $AP_M$, $AP_L$ metric과 비교할 수 없게 된다는 문제점이 있으므로 주의하자.
# COCOeval 초기화 부분
...
cocoEval = COCOeval(cocoGt, cocoDt, annType)
# areaRng parameter를 변경한다.
obj_area_sm = 777268
obj_area_md = 93240
cocoEval.params.areaRng = [
[0, 1e5**2],
[0, obj_area_sm],
[obj_area_sm, obj_area_md],
[obj_area_md, 1e5**2],
]
...
Further Research
기본 COCO Python Evaluator COCOEval
에서는 아래 3개의 기준으로 all, small, medium, large
크기를 구분한다. COCO paper에서는 이러한 언급이 별도로 없지만 COCO Evaluation API에서 해당 내용을 구현한다(원본 코드 보러가기)
- all: $0$ ~ $10000^2$
- small: $0$ ~ $32^2$
- medium: $32^2$ ~ $96^2$
- large: $96^2$ ~ $10000^2$
Custom COCO-style Dataset이 이러한 크기보다 훨씬 큰 Object만을 가지고 있다면 이중 일부는 -1.000으로 표시되는 것으로 파악된다.