[informative] 리더보드에 스코어 띄워보기
Opened this issue · 2 comments
chldydgh4687 commented
다른 것에서는 괜찮았는데 이 부분에서 json을 안해봤어서 그런지 애로사항이 있었습니다.
- evalutation_script\main.py로 이동하여, challenge_config.yaml에 입력했던 정답 파일의 경로를 바탕으로 평가 코드를 작성합니다.
이 부분에서 도움되시라고 MNIST 예제로 변형시켜서 올려봅니다.
한 번 리더보드에 점수 띄워보시고 본인의 테스크에 맞게 구상하셔서 바꿔서 코딩하시면 될 것 같습니다.
해당 사항에 도움을 준 @socome @big-chan 에게 감사의 말씀을 : )
MNIST 구성할 시 예제 설계
- 분류기를 거친 예상된 10개 테스트셋에 대한 숫자 답으로 json에 기록된다. (submission.json).
- 답변은 이와 같은 10개에 대한 숫자 답으로 json에 기록되어 있어야 한다. (test.json)
- main.py 에서 10개의 답에 대한 예측의 정확도를 계산해서 return시킨다. (leaderboard 에 나올 점수)
- challenge_config.yaml 의 해당 부분의 변수가 main.py 안에 들어가니 일치시켜줘야하는 부분은 일치시켜줘야한다. ( ex) pred_avg, codename, test_annotation_file )
main.py 와 일치시켜야하는 부분의 challenge_config.yaml
# --- #
# 리더보드의 평가 메트릭 관한 부분 #
# 평가 매트릭 이름을 여기서 입력합니다. #
# 평가는 evalutaion_script/main.py에서 작성한 코드로 하고, 리더보드 자체는 맨 아래에서 만듭니다. #
leaderboard:
- id: 1
schema:
{
"labels": ["pred_avg"],
"default_order_by": "pred_avg",
# --- #
# 리더보드에 설명을 붙이고싶으면 아래와 같이 가능합니다. #
# 오름차순 내림차순 설정과, 간단한 설명을 리더보드 페이지에 추가할 수 있습니다. #
"metadata": {
"pred_avg": {
"sort_ascending": True,
"description": "Recall@1 is defined as the ratio of correctly retrieved queries
within the top 1 predictions to the total number of queries ",
}
}
# --- #
}
test_annotation_file: annotations/test.json
codename: dev
allowed_submission_file_types: ".json"
dataset_splits:
- id: 1
name: Test Split
codename: test_split
# --- #
mnist에 해당하는 evaluation_script/main.py
import random
import json
import numpy as np
def evaluate(test_annotation_file, user_submission_file, phase_codename, **kwargs):
print("Starting Evaluation.....")
# --- #
# test_annotation_file == challenge_config.yaml에서 설정한 정답 파일 #
# user_submission_file == 유저가 사이트에서 업로드할 파일 #
# phase_codename = challenge_config에서 설정하였음
# --- #
# --- #
# 아래 output에 결과를 입력하고 return하면 사이트내 리더보드에 올라갑니다. #
# output의 양식은 본인이 challenge_config.yaml에서 설정한 dataset_splits과 leaderboard(평가 메트릭)에 맞추시면 됩니다. #
output = {}
if phase_codename == "dev":
# --- #
# "dataset_splits" : { leaderboard's labels : 000 } #
# 와 같은 형태로 입력해야합니다. #
# challenge_config.yaml의 이름과 동일한지 꼭 확인해주세요 #
print("MNIST Evaluation...")
answer_path = test_annotation_file
test_path = user_submission_file
with open(answer_path, "r") as gt_path:
ground_truth = json.load(gt_path)
with open(test_path, "r") as pred_path:
predictions = json.load(pred_path)
correct = 0.0
for idx in range(len(ground_truth["mnist"])):
pred = predictions["mnist"][idx]["pred"]
gt = ground_truth['mnist'][idx]['pred']
if pred == gt:
correct += 1
else:
pass
avg = correct / len(ground_truth["mnist"])
output["result"] = [
{
"test_split": {
"pred_avg": avg
}
}
]
# --- #
# To display the results in the result file
output["submission_result"] = output["result"][0]["test_split"]
print("Completed evaluation")
return output
test.json (정답)
{
"mnist": [
{
"id" : 0, "pred" : 0
},
{
"id" : 1, "pred" : 1
},
{
"id" : 2, "pred" : 2
},
{
"id" : 3, "pred" : 3
},
{
"id" : 4, "pred" : 4
},
{
"id" : 5, "pred" : 5
},
{
"id" : 6, "pred" : 6
},
{
"id" : 7, "pred" : 7
},
{
"id" : 8, "pred" : 8
},
{
"id": 9, "pred": 9
}
]
}
Submission.json (baseline)
{
"mnist": [
{
"id" : 0, "pred" : 0
},
{
"id" : 1, "pred" : 1
},
{
"id" : 2, "pred" : 2
},
{
"id" : 3, "pred" : 3
},
{
"id" : 4, "pred" : 4
},
{
"id" : 5, "pred" : 5
},
{
"id" : 6, "pred" : 6
},
{
"id" : 7, "pred" : 7
},
{
"id" : 8, "pred" : 8
},
{
"id" : 9, "pred" : 8
}
]
}
zip. 파일 업로드 후의 과정
- ComputerVision-Slack 에 가셔서 reboot 를 외칩니다.
- 본인 리더보드 Sumbit에 가셔서 Submission.json을 제출해봅니다.
- my submissions / all submissions 에 가면 다음의 내용을 확인할 수 있습니다. 잘못되었다면 baseline 에 N/A 혹은 Stderr file에 누룰 수 있는 버튼과 함께 누르시면 오류 내용이 뜰겁니다. (주로 main.py의 문법 오류 json 파일 불일치 문제)
- Show on leaderboard, baseline에 정상적으로 네모박스가 있는데 누르시면, Leaderboard에 본인이 설정한 baseline 점수를 볼 수 있습니다.
my submissions / all submissions 정상 제출 화면
main.py 평가코드에 의해 연산된 스코어가 leaderboard에 올라간 모습
y2sman commented
최용호 연구원님, 다른 친구들을 위해 친절한 설명 감사합니다. 시간될 떄 @y2sman 이런 부분이 메뉴얼에 반영될 수 있도록 해주세요.
evaluation_script쪽 주석에 관련 내용을 추가하였습니다...! 자세한 사용기를 작성해주셔서 @chldydgh4687 감사합니다!