아래 코랩 소스코드는 무작위로 제출 결과파일을 생성하는 코드를 포함하고 있습니다. 이 코드에서 생성한 제출 파일을 제출하여 리더보드에 정상적으로 등록되는 지 확인할 수 있습니다.
아래는 평가에 사용하는 계산식이므로 참고바랍니다.
mAP 계산은 map_boxes 라이브러리를 이용해 계산됩니다.
https://github.com/ZFTurbo/Mean-Average-Precision-for-Boxes/tree/master/map_boxes
(__init__.py의 mean_average_precision_for_boxes 함수 참고)
mAP 계산시 상대좌표로 정규화된 경계상자 좌표값을 이용해 계산하도록 되어있지만,
채점 스크립트에서 자체적으로 정규화를 진행합니다.
따라서 참가자 분들은 평가 데이터 원본 이미지 크기에 맞는 절대 좌표를 XMin, XMax, YMin, YMax 열에 기록 해주시면 됩니다.
정답 파일에는 객체의 상대좌표 경계상자, 클래스(pig, cow), 평가 이미지 원본 넓이, 높이 값이 기록되어있으며,
참가자 분들이 제출한 제출 파일과 정답 파일의 mAP 스코어 산출 스크립트는 아래와 같습니다.
from sys import argv
import pandas as pd
from map_boxes import mean_average_precision_for_boxes
ans = pd.read_csv(argv[1])
pred = pd.read_csv(argv[2])
pred = pred[['ImageID', 'LabelName', 'Conf', 'XMin', 'XMax', 'YMin', 'YMax']]
ans = ans.sort_values(by=['ImageID'], ignore_index=True)
pred = pred.sort_values(by=['ImageID'], ignore_index=True)
ans_images = list(ans['ImageID'].unique())
for image_name in ans_images:
width, height = ans[ans['ImageID'] == image_name][['Width', 'Height']].values[0]
pred.loc[pred['ImageID'] == image_name, 'XMin':'XMax'] /= width
pred.loc[pred['ImageID'] == image_name, 'YMin':'YMax'] /= height
ans_arr = ans[['ImageID', 'LabelName', 'XMin', 'XMax', 'YMin', 'YMax']].values
pred_arr = pred[['ImageID', 'LabelName', 'Conf', 'XMin', 'XMax', 'YMin', 'YMax']].values
mean_ap, ap = mean_average_precision_for_boxes(ans_arr, pred_arr, verbose=False)
mean_ap = round(mean_ap, 5)
print(f'score:{mean_ap}')