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", "gtop-1@0.25", "AP@0.25", "gtop-3@0.25"]) 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("gtop-1@0.25", ascending=False).drop_duplicates("username", keep="first") top_df = top_df.sort_values("gtop-1@0.25", 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", "gtop-1@0.25", "AP@0.25", "gtop-3@0.25"]) 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"✅ gtop-1@0.25: {score1:.4f}, AP@0.25: {score2:.4f}, gtop-3@0.25: {score3:.4f}", leaderboard_df with open("gradio_show.md", "r", encoding="utf-8") as f: readme_content = f.read() with gr.Blocks() as demo: gr.Markdown(readme_content) 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()