File size: 3,399 Bytes
50a8af6
dc8d315
50a8af6
9f90348
dc8d315
88ad01d
 
98b0ec0
1996ce2
98b0ec0
 
 
 
88ad01d
1f61dfb
88ad01d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1f61dfb
 
98b0ec0
1f61dfb
dc8d315
1f61dfb
 
 
 
 
ed5d96c
1f61dfb
 
 
 
 
 
 
 
 
 
 
 
dc8d315
ed5d96c
1f61dfb
 
 
 
 
 
 
 
 
 
 
ed5d96c
1f61dfb
 
dc8d315
 
5d2f363
1f61dfb
 
 
88ad01d
dc8d315
 
 
 
 
 
1f61dfb
dc8d315
50a8af6
1f61dfb
 
50a8af6
dc8d315
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import gradio as gr
from evaluate import run_evaluation
import pandas as pd

LEADERBOARD_CSV = "leaderboard.csv"
import os
from datetime import datetime, date
from datasets import load_dataset
dataset = load_dataset(os.getenv('VG_user'))
aaa = dataset['train'].to_dict()
for i in aaa:
    aaa[i] = aaa[i][0]
users =aaa
SUBMIT_RECORD = "submissions.csv"
MAX_SUBMIT_PER_DAY = 5

def check_submission_limit(username):
    if not os.path.exists(SUBMIT_RECORD):
        return True  # 没有人提交过

    df = pd.read_csv(SUBMIT_RECORD)
    today = date.today()

    user_today_subs = df[
        (df["username"] == username) &
        (pd.to_datetime(df["timestamp"]).dt.date == today)
    ]

    return len(user_today_subs) < MAX_SUBMIT_PER_DAY

def record_submission(username):
    now = datetime.now().isoformat()
    if os.path.exists(SUBMIT_RECORD):
        df = pd.read_csv(SUBMIT_RECORD)
    else:
        df = pd.DataFrame(columns=["username", "timestamp"])
    df.loc[len(df)] = {"username": username, "timestamp": now}
    df.to_csv(SUBMIT_RECORD, index=False)
import json
def check_user_valid(username, password):

    return username in users and users.get(username) == password

def update_leaderboard(username, score1, score2, score3):
    # 追加记录到总提交记录
    if os.path.exists("leaderboard.csv"):
        sub_df = pd.read_csv("leaderboard.csv")
    else:
        sub_df = pd.DataFrame(columns=["username", "[email protected]", "[email protected]", "[email protected]"])
    sub_df.loc[len(sub_df)] = [username, score1, score2, score3]
    sub_df.to_csv("leaderboard.csv", index=False)

    # 从所有提交中挑选每用户score1最高的记录
    top_df = sub_df.sort_values("[email protected]", ascending=False).drop_duplicates("username", keep="first")
    top_df = top_df.sort_values("[email protected]", ascending=False)
    top_df.to_csv("leaderboard.csv", index=False)
    return top_df

def show_lb():
    if os.path.exists("leaderboard.csv"):
        sub_df = pd.read_csv("leaderboard.csv")
    else:
        sub_df = pd.DataFrame(columns=["username", "[email protected]", "[email protected]", "[email protected]"])
    return sub_df
def evaluate_and_update(pred_file, username,password):
    
    if not check_submission_limit(username):
        return "⛔ Submission limit exceeded for today.", pd.DataFrame()
    if not check_user_valid(username, password):
        return "❌ Invalid username or password", pd.DataFrame()
    score1, score2, score3 = run_evaluation(pred_file.name)
    record_submission(username)
    leaderboard_df = update_leaderboard(username, score1, score2, score3)

    return f"✅ [email protected]: {score1:.4f}, [email protected]: {score2:.4f}, [email protected]: {score3:.4f}", leaderboard_df



with gr.Blocks() as demo:
    gr.Markdown("# 🧊 MMScan HVG Challenge")
    with gr.Row():
        username = gr.Textbox(label="Username")
        password = gr.Textbox(label="Password", type="password")
    upload = gr.File(label="Upload your prediction (.json)")
    score_text = gr.Textbox(label="Evaluation score")
    leaderboard = gr.Dataframe(headers=["Name", "Score"], interactive=False)

    submit_btn = gr.Button("Submit")
    submit_btn.click(
        fn=evaluate_and_update,
        inputs=[upload, username,password],
        outputs=[score_text, leaderboard]
    )
    show_btn = gr.Button("Show Leaderboard")
    show_btn.click(fn=show_lb,inputs=[],outputs=[leaderboard])

demo.launch()