| __all__ = ['block', 'make_clickable_model', 'make_clickable_user', 'get_submissions'] |
| import os |
| import gradio as gr |
| import pandas as pd |
| import json |
| import numpy as np |
|
|
|
|
| from constants import * |
| from huggingface_hub import Repository |
| HF_TOKEN = os.environ.get("HF_TOKEN") |
|
|
| global data_component, filter_component |
|
|
|
|
| category_to_dimension = {} |
| for key, value in DIM2CAT_T2V.items(): |
| if value not in category_to_dimension: |
| category_to_dimension[value] = [] |
| category_to_dimension[value].append(key) |
|
|
| def upload_file(files): |
| file_paths = [file.name for file in files] |
| return file_paths |
|
|
| def get_normalized_i2v_df(df): |
| normalize_df = df.copy().fillna(0.0) |
| for column in normalize_df.columns[4:]: |
| min_val = NORMALIZE_DIC[column]['Min'] |
| max_val = NORMALIZE_DIC[column]['Max'] |
| normalize_df[column] = (normalize_df[column] - min_val) / (max_val - min_val) |
| return normalize_df |
|
|
| def get_normalized_t2v_df(df): |
| normalize_df = df.copy() |
| for column in normalize_df.columns: |
| min_val = NORMALIZE_DIC[column]['Min'] |
| max_val = NORMALIZE_DIC[column]['Max'] |
| normalize_df[column] = (normalize_df[column] - min_val) / (max_val - min_val) |
| return normalize_df |
|
|
| def calculate_selected_score_i2v(df, selected_columns): |
| selected_QUALITY = [i for i in selected_columns if i in I2V_QUALITY_LIST] |
| selected_I2V = [i for i in selected_columns if i in I2V_LIST] |
| selected_quality_score = df[selected_QUALITY].sum(axis=1)/sum([DIM_WEIGHT_I2V[i] for i in selected_QUALITY]) |
| selected_i2v_score = df[selected_I2V].sum(axis=1)/sum([DIM_WEIGHT_I2V[i] for i in selected_I2V ]) |
| if selected_quality_score.isna().any().any() and selected_i2v_score.isna().any().any(): |
| selected_score = (selected_quality_score * I2V_QUALITY_WEIGHT + selected_i2v_score * I2V_WEIGHT) / (I2V_QUALITY_WEIGHT + I2V_WEIGHT) |
| return selected_score.fillna(0.0) |
| if selected_quality_score.isna().any().any(): |
| return selected_i2v_score |
| if selected_i2v_score.isna().any().any(): |
| return selected_quality_score |
| selected_score = (selected_quality_score * I2V_QUALITY_WEIGHT + selected_i2v_score * I2V_WEIGHT) / (I2V_QUALITY_WEIGHT + I2V_WEIGHT) |
| return selected_score.fillna(0.0) |
|
|
|
|
| def get_final_score_t2i(df, selected_columns, select_subject_button=None): |
| normalize_df = df.copy().fillna(0.0) |
|
|
| for name in df.drop('Model Name', axis=1).drop('Resolution', axis=1).drop('Total Score', axis=1): |
| if name in DIM_WEIGHT_T2I: |
| normalize_df[name] = normalize_df[name]*DIM_WEIGHT_T2I[name] |
|
|
| |
| |
| use_text_rendering_formula = ( |
| select_subject_button in ["text-and-typography", "text-and-typography-cn"] or |
| "Text Rendering" in selected_columns |
| ) |
| |
| if use_text_rendering_formula: |
| |
| |
| aesthetic_quality_avg = (normalize_df["Aesthetic"] + normalize_df["Image Quality"]) / 2 |
| semantic_text_avg = (normalize_df["Prompt Semantic Alignment"] + normalize_df["Text Rendering"]) / 2 |
| selected_score = (aesthetic_quality_avg + semantic_text_avg) / 2 |
| else: |
| |
| |
| aesthetic_quality_avg = (normalize_df["Aesthetic"] + normalize_df["Image Quality"]) / 2 |
| selected_score = (aesthetic_quality_avg + normalize_df["Prompt Semantic Alignment"]) / 2 |
| |
| if 'Selected Score' in df: |
| df['Selected Score'] = selected_score |
| else: |
| df.insert(4, 'Selected Score', selected_score) |
| return df |
|
|
| def get_final_score_i2i(df, selected_task_button=TASK_I2I): |
| normalize_df = df.copy().fillna(0.0) |
| selected_score = normalize_df[selected_task_button].sum(axis=1)/len(selected_task_button) |
| total_score = normalize_df[TASK_I2I].sum(axis=1)/len(TASK_I2I) |
| if 'Total Score' in df: |
| df['Total Score'] = total_score |
| else: |
| df.insert(2, 'Total Score', total_score) |
| if 'Selected Score' in df: |
| df['Selected Score'] = selected_score |
| else: |
| df.insert(3, 'Selected Score', selected_score) |
| return df |
|
|
|
|
| def get_final_score_i2v(df, selected_columns): |
| normalize_df = get_normalized_i2v_df(df) |
| try: |
| for name in normalize_df.drop('Model Name', axis=1).drop('Resolution', axis=1).drop('Duration', axis=1).drop('FPS', axis=1): |
| normalize_df[name] = normalize_df[name]*DIM_WEIGHT_I2V[name] |
| except: |
| for name in normalize_df.drop('Model Name', axis=1).drop('Resolution', axis=1).drop('Duration', axis=1).drop('FPS', axis=1): |
| normalize_df[name] = normalize_df[name]*DIM_WEIGHT_I2V[name] |
| quality_score = normalize_df[I2V_QUALITY_LIST].sum(axis=1)/sum([DIM_WEIGHT_I2V[i] for i in I2V_QUALITY_LIST]) |
| i2v_score = normalize_df[I2V_LIST].sum(axis=1)/sum([DIM_WEIGHT_I2V[i] for i in I2V_LIST ]) |
| final_score = (quality_score * I2V_QUALITY_WEIGHT + i2v_score * I2V_WEIGHT) / (I2V_QUALITY_WEIGHT + I2V_WEIGHT) |
| if 'Total Score' in df: |
| df['Total Score'] = final_score |
| else: |
| df.insert(1, 'Total Score', final_score) |
| if 'I2V Score' in df: |
| df['I2V Score'] = i2v_score |
| else: |
| df.insert(2, 'I2V Score', i2v_score) |
| if 'Quality Score' in df: |
| df['Quality Score'] = quality_score |
| else: |
| df.insert(3, 'Quality Score', quality_score) |
| selected_score = calculate_selected_score_i2v(normalize_df, selected_columns) |
| if 'Selected Score' in df: |
| df['Selected Score'] = selected_score |
| else: |
| df.insert(1, 'Selected Score', selected_score) |
| mask = df.iloc[:, 8:].isnull().any(axis=1) |
| df.loc[mask, ['Total Score', 'I2V Score','Selected Score' ]] = np.nan |
| return df |
|
|
| def get_final_score_t2v(df, selected_columns): |
| score_names = [] |
| for cur_score in category_to_dimension: |
| score_name = f"{cur_score} Score" |
| score_names.append(score_name) |
| filtered_columns = [col for col in category_to_dimension[cur_score] if col in selected_columns] |
| if cur_score == "Quality": |
| print(filtered_columns) |
| normalize_df = get_normalized_t2v_df(df[filtered_columns]) |
| for name in filtered_columns: |
| normalize_df[name] = normalize_df[name]*DIM_WEIGHT_QUALITY_T2V[name] |
| score = normalize_df[filtered_columns].sum(axis=1)/sum([DIM_WEIGHT_QUALITY_T2V[i] for i in filtered_columns]) |
| else: |
| score = df[filtered_columns].mean(axis=1) |
| if score_name in df: |
| df[score_name] = score |
| else: |
| df.insert(1, score_name, score) |
|
|
| dim_cols = [c for c in selected_columns if c in DIM_KEY_TO_COL.values()] |
| text_rendering_cols = [c for c in selected_columns if c in DIM_KEY_TO_COL_TEXT_RENDERING.values()] |
| quality_cols = [c for c in selected_columns if c in DIM_KEY_TO_COL_QUALITY.values()] |
|
|
| scores = pd.DataFrame() |
| weighted_cols = [] |
|
|
| if len(dim_cols) > 0: |
| for col in dim_cols: |
| scores[col] = df[col] |
| weighted_cols.append(col) |
| if len(text_rendering_cols) > 0: |
| text_rendering_score = df[text_rendering_cols].mean(axis=1) |
| scores['Text Rendering'] = text_rendering_score |
| weighted_cols.append("Text Rendering") |
| if len(quality_cols) > 0: |
| quality_normalize_df = get_normalized_t2v_df(df[quality_cols]) |
| for name in quality_cols: |
| quality_normalize_df[name] = quality_normalize_df[name]*DIM_WEIGHT_QUALITY_T2V[name] |
| quality_score = quality_normalize_df[quality_cols].sum(axis=1)/sum([DIM_WEIGHT_QUALITY_T2V[i] for i in quality_cols]) |
| scores['Quality'] = quality_score |
| weighted_cols.append("Quality") |
|
|
| for col in weighted_cols: |
| scores[col] = scores[col] * DIM_WEIGHT_T2V[col] |
| selected_score = scores[weighted_cols].sum(axis=1)/sum([DIM_WEIGHT_T2V[i] for i in weighted_cols]) |
|
|
| if 'Selected Score' in df: |
| df['Selected Score'] = selected_score |
| else: |
| df.insert(1, 'Selected Score', selected_score) |
| return df |
|
|
| def get_df_from_json_t2i(file_dir, select_subject_button=None): |
| if not os.path.isdir(file_dir): |
| return pd.DataFrame(columns=COLUMN_NAMES_T2I) |
| |
| colname_to_key = { |
| "Aesthetic": "aesthetic", |
| "Image Quality": "imaging", |
| "Prompt Semantic Alignment": "semantic_alignment", |
| "Text Rendering": "text_rendering", |
| "Total Score": "task_score", |
| } |
| image_generation_params = [ |
| "Model Name", |
| "Resolution" |
| ] |
|
|
| rows = [] |
| for filename in os.listdir(file_dir): |
| if not filename.endswith(".json") or not filename.startswith("eval_results_"): |
| continue |
| file_path = os.path.join(file_dir, filename) |
| try: |
| with open(file_path, "r") as f: |
| data = json.load(f) |
| except Exception: |
| continue |
| row = {} |
| for col_name, json_key in colname_to_key.items(): |
| if col_name == "Total Score": |
| value = data.get("task_score", 0) |
| row[col_name] = value |
| continue |
| |
| dimension_results = data.get("dimension_results", {}) |
| dim_info = dimension_results.get(json_key, {}) |
| result_items = dim_info.get("result_items", []) |
| if select_subject_button is None: |
| value = dim_info.get("score", 0) |
| else: |
| score_list = [] |
| target_categories = [select_subject_button] |
| |
| for item in result_items: |
| item_categories = item.get("Category", []) |
| |
| if any(cat in item_categories for cat in target_categories): |
| value = item.get("image_results", 0) |
| score_list.append(value) |
| |
| if len(score_list) > 0: |
| value = sum(score_list) / len(score_list) |
| else: |
| value = 0 |
| |
| if col_name in SHOW_DIM_WEIGHT_IMAGE: |
| value = value * SHOW_DIM_WEIGHT_IMAGE[col_name] |
| row[col_name] = value |
| for key in image_generation_params: |
| value = data.get("image_generation_params").get(key) |
| row[key] = value |
|
|
| rows.append(row) |
| if len(rows) == 0: |
| return pd.DataFrame(columns=COLUMN_NAMES_T2I) |
| df = pd.DataFrame(rows)[["Model Name", "Resolution", "Total Score"] + T2I_TAB] |
| return df |
|
|
| def get_df_from_json_i2i(file_dir): |
| select_task_button = TASK_I2I |
| if not os.path.isdir(file_dir): |
| return pd.DataFrame(columns=MODEL_INFO_TAB_I2I+select_task_button) |
| rows = [] |
|
|
| image_generation_params = ["Model Name"] |
| task_dims_list = [f"{task}_{dim}" for task in select_task_button for dim in I2I_TAB_DICT[task]] |
| for filename in os.listdir(file_dir): |
| if not filename.endswith(".json") or not filename.startswith("eval_results_"): |
| continue |
| file_path = os.path.join(file_dir, filename) |
| try: |
| with open(file_path, "r") as f: |
| data = json.load(f) |
| except Exception: |
| continue |
| row = {} |
| model_image_generation_params = data.get("image_generation_params", {}) |
| for key in image_generation_params: |
| value = model_image_generation_params.get(key, "None") |
| row[key] = value |
|
|
| for task in select_task_button: |
| value = 0 |
| task_info = data.get(task) |
| value = task_info.get("task_score", 0) |
|
|
| row[task] = value |
| for dim, dim_info in task_info.get("dimension_results").items(): |
| dim_score = dim_info.get("score", 0) |
| if dim in SHOW_DIM_WEIGHT_IMAGE: |
| dim_score = dim_score * SHOW_DIM_WEIGHT_IMAGE[dim] |
| row[f"{task}_{DIM_KEY_TO_COL_I2I[dim]}"] = dim_score |
|
|
|
|
| |
| rows.append(row) |
| if len(rows) == 0: |
| return pd.DataFrame(columns=MODEL_INFO_TAB_I2I+select_task_button) |
| df = pd.DataFrame(rows)[["Model Name"] + select_task_button + task_dims_list] |
| return df |
|
|
|
|
| def get_df_from_json_i2v(file_dir): |
| if not os.path.isdir(file_dir): |
| return pd.DataFrame(columns=COLUMN_NAMES_I2V) |
| |
| colname_to_key = { |
| |
| "Video-Image Subject Consistency": "i2v_subject", |
| "Video-Image Background Consistency": "i2v_background", |
| "Subject Consistency": "subject_consistency", |
| "Background Consistency": "background_consistency", |
| "Motion Smoothness": "motion_smoothness", |
| "Dynamic Degree": "dynamic_degree", |
| "Aesthetic Quality": "aesthetic_quality", |
| "Imaging Quality": "imaging_quality", |
| "Temporal Flickering": "temporal_flickering", |
| } |
| |
| rows = [] |
| for filename in os.listdir(file_dir): |
| if not filename.endswith(".json") or not filename.startswith("eval_results_"): |
| continue |
| file_path = os.path.join(file_dir, filename) |
| try: |
| with open(file_path, "r") as f: |
| data = json.load(f) |
| except Exception: |
| continue |
| |
| row = {} |
| |
| for col_name, json_key in colname_to_key.items(): |
| value = 0 |
| dim_info = data.get(json_key) |
| if isinstance(dim_info, dict): |
| score_list = dim_info.get("score", []) |
| if isinstance(score_list, list) and len(score_list) >= 1: |
| value = score_list[0] |
| row[col_name] = value |
| video_generation_params = data.get("video_generation_params", {}) |
| for key, value in video_generation_params.items(): |
| row[key] = value |
| |
| rows.append(row) |
| |
| if len(rows) == 0: |
| return pd.DataFrame(columns=COLUMN_NAMES_I2V) |
| |
| df = pd.DataFrame(rows)[["Model Name", "Resolution", "Duration", "FPS"] + I2V_TAB] |
| return df |
|
|
| def get_df_from_json_t2v(file_dir): |
| if not os.path.isdir(file_dir): |
| return pd.DataFrame(columns=COLUMN_NAMES_T2V) |
|
|
| rows = [] |
| for filename in os.listdir(file_dir): |
| if not filename.endswith(".json") or not filename.startswith("eval_results_"): |
| continue |
| file_path = os.path.join(T2V_DIR, filename) |
| try: |
| with open(file_path, "r") as f: |
| data = json.load(f) |
| except Exception as e: |
| continue |
|
|
| row = {} |
| for json_key, col_name in DIM_KEY_TO_COL.items(): |
| dim_info = data.get(json_key, {}) |
| score_list = dim_info.get("score", []) |
| row[col_name] = score_list[1] if isinstance(score_list, list) and len(score_list) == 3 else 0 |
| for json_key, col_name in DIM_KEY_TO_COL_TEXT_RENDERING.items(): |
| dim_info = data.get(json_key, {}) |
| score_list = dim_info.get("score", []) |
| row[col_name] = score_list[1] if isinstance(score_list, list) and len(score_list) == 3 else 0 |
| for json_key, col_name in DIM_KEY_TO_COL_QUALITY.items(): |
| dim_info = data.get(json_key, {}) |
| score_list = dim_info.get("score", []) |
| row[col_name] = score_list[0] if isinstance(score_list, list) and len(score_list) == 1 else 0 |
| final_fixed = data.get("final_score_fixed", {}) |
| for json_key, col_name in FINAL_FIXED_KEY_TO_COL.items(): |
| row[col_name] = final_fixed.get(json_key) |
| video_generation_params = data.get("video_generation_params") |
| for key, value in video_generation_params.items(): |
| row[key] = value |
| rows.append(row) |
| |
| if len(rows) == 0: |
| return pd.DataFrame(columns=COLUMN_NAMES_T2V) |
|
|
| df = pd.DataFrame(rows) |
| return df |
|
|
| def try_sync_repo(): |
| try: |
| submission_repo = Repository(local_dir=SUBMISSION_NAME, clone_from=SUBMISSION_URL, use_auth_token=HF_TOKEN, repo_type="dataset") |
| submission_repo.git_pull() |
| return True |
| except Exception as e: |
| print(f"[警告] 无法同步远程仓库,将使用本地数据: {e}") |
| return False |
|
|
| def get_baseline_df_i2v(): |
| try_sync_repo() |
| df = get_df_from_json_i2v(I2V_DIR) |
| df = get_final_score_i2v(df, checkbox_group_i2v.value) |
| df = df.sort_values(by="Selected Score", ascending=False) |
| present_columns = MODEL_INFO_TAB_I2V + checkbox_group_i2v.value |
| df = df[present_columns] |
| df = convert_scores_to_percentage(df) |
| return df |
|
|
| def get_baseline_df_t2i(): |
| try_sync_repo() |
| |
| _subject_value = select_subject_button.value |
| if _subject_value is not None and _subject_value in T2I_SUBJECT_REVERSE_MAP: |
| _subject_value = T2I_SUBJECT_REVERSE_MAP[_subject_value] |
| df = get_df_from_json_t2i(T2I_DIR, _subject_value) |
| |
| df = get_final_score_t2i(df, checkbox_group_t2i.value, _subject_value) |
| df = df.sort_values(by="Selected Score", ascending=False) |
| present_columns = MODEL_INFO_TAB_T2I + checkbox_group_t2i.value |
| df = df[present_columns] |
| df = convert_scores_to_percentage(df) |
| return df |
|
|
| def get_baseline_df_i2i(): |
| try_sync_repo() |
| df = get_df_from_json_i2i(I2I_DIR) |
| df = get_final_score_i2i(df) |
| df = df.sort_values(by="Selected Score", ascending=False) |
| present_columns = MODEL_INFO_TAB_I2I + TASK_I2I |
| df = df[present_columns] |
| df = convert_scores_to_percentage(df) |
| return df |
|
|
| def get_baseline_df_t2v(): |
| try_sync_repo() |
| df = get_all_df_t2v(TASK_INFO_T2V) |
| df = df[COLUMN_NAMES_T2V] |
| df = df.sort_values(by="Total Score", ascending=False) |
| df = convert_scores_to_percentage(df) |
| return df |
|
|
| def get_all_df_i2v(selected_columns, dir=I2V_DIR): |
| try_sync_repo() |
| df = get_df_from_json_i2v(dir) |
| df = get_final_score_i2v(df, selected_columns) |
| df = df.sort_values(by="Selected Score", ascending=False) |
| return df |
|
|
| def get_all_df_t2i(selected_columns, select_subject_button=None, dir=T2I_DIR): |
| try_sync_repo() |
| df = get_df_from_json_t2i(dir, select_subject_button) |
| df = get_final_score_t2i(df, selected_columns, select_subject_button) |
| df = df.sort_values(by="Selected Score", ascending=False) |
| return df |
|
|
| def get_all_df_t2v(selected_columns, dir=T2V_DIR): |
| try_sync_repo() |
| df = get_df_from_json_t2v(dir) |
| df = get_final_score_t2v(df, selected_columns) |
| df = df.sort_values(by="Total Score", ascending=False) |
| return df |
|
|
| def convert_scores_to_percentage(df): |
| df_copy = df.copy() |
| NON_SCORE_COLS = ['Model Name', 'Resolution', 'Duration', 'FPS'] |
| |
| for col in df_copy.columns: |
| if col not in NON_SCORE_COLS: |
| numeric_series = pd.to_numeric(df_copy[col], errors='coerce') |
| |
| if numeric_series.notna().any(): |
| processed_series = round(numeric_series * 100, 2) |
| formatted_series = processed_series.apply(lambda x: f"{x:05.2f}%" if pd.notna(x) else x) |
| df_copy[col] = df_copy[col].astype(str).where(formatted_series.isna(), formatted_series) |
| return df_copy |
|
|
|
|
| def on_filter_model_size_method_change_t2i(selected_columns, select_subject_button=None): |
| updated_data = get_all_df_t2i(selected_columns, select_subject_button, T2I_DIR) |
| selected_columns = [item for item in T2I_TAB if item in selected_columns] |
| present_columns = MODEL_INFO_TAB_T2I+ selected_columns |
| updated_data = updated_data[present_columns] |
| updated_data = updated_data.sort_values(by="Selected Score", ascending=False) |
| updated_headers = present_columns |
| update_datatype = [T2I_TITLE_TYPE[COLUMN_NAMES_T2I.index(x)] for x in updated_headers] |
| updated_data = convert_scores_to_percentage(updated_data) |
| filter_component = gr.components.Dataframe( |
| value=updated_data, |
| headers=updated_headers, |
| type="pandas", |
| datatype=update_datatype, |
| interactive=False, |
| visible=True, |
| ) |
| return filter_component |
|
|
| def on_filter_model_size_method_change_i2i(selected_categories): |
| selected_tasks = TASK_INFO_I2I[selected_categories] |
| updated_data = get_df_from_json_i2i(I2I_DIR) |
| updated_data = get_final_score_i2i(updated_data, selected_tasks) |
| present_columns = MODEL_INFO_TAB_I2I + selected_tasks |
| updated_data = updated_data[present_columns] |
| updated_data = updated_data.sort_values(by="Selected Score", ascending=False) |
| updated_headers = present_columns |
| update_datatype = ["markdown"] + ["number"] * (len(updated_headers)-1) |
| updated_data = convert_scores_to_percentage(updated_data) |
| filter_component = gr.components.Dataframe( |
| value=updated_data, |
| headers=updated_headers, |
| type="pandas", |
| datatype=update_datatype, |
| interactive=False, |
| visible=True, |
| ) |
| |
| return filter_component, gr.update(value=selected_tasks) |
|
|
| def on_filter_task_method_change_i2i(selected_tasks): |
| updated_data = get_df_from_json_i2i(I2I_DIR) |
| updated_data = get_final_score_i2i(updated_data, selected_tasks) |
| present_columns = MODEL_INFO_TAB_I2I + selected_tasks |
| present_dim = [] |
| |
| |
| |
| |
| |
| all_present_columns = present_columns |
| updated_data = updated_data[all_present_columns] |
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
| updated_data = updated_data.sort_values(by="Selected Score", ascending=False) |
| updated_headers = present_columns + present_dim |
| update_datatype = ["markdown"] + ["number"] * (len(updated_headers)-1) |
| updated_data = convert_scores_to_percentage(updated_data) |
| filter_component = gr.components.Dataframe( |
| value=updated_data, |
| headers=updated_headers, |
| type="pandas", |
| datatype=update_datatype, |
| interactive=False, |
| visible=True, |
| ) |
| return filter_component |
|
|
| |
| def on_filter_model_size_method_change_i2v(selected_columns): |
| updated_data = get_all_df_i2v(selected_columns, I2V_DIR) |
| selected_columns = [item for item in I2V_TAB if item in selected_columns] |
| present_columns = MODEL_INFO_TAB_I2V + selected_columns |
| updated_data = updated_data[present_columns] |
| updated_data = updated_data.sort_values(by="Selected Score", ascending=False) |
| updated_data = convert_scores_to_percentage(updated_data) |
| updated_headers = present_columns |
| update_datatype = [I2V_TITLE_TYPE[COLUMN_NAMES_I2V.index(x)] for x in updated_headers] |
| filter_component = gr.components.Dataframe( |
| value=updated_data, |
| headers=updated_headers, |
| type="pandas", |
| datatype=update_datatype, |
| interactive=False, |
| visible=True, |
| ) |
| return filter_component |
|
|
| def on_filter_model_size_method_change_t2v(selected_columns=TASK_INFO_T2V): |
| updated_data = get_all_df_t2v(selected_columns, T2V_DIR) |
|
|
| present_columns = MODEL_INFO_TAB_T2V + selected_columns |
| updated_headers = present_columns |
| update_datatype = [T2V_TITLE_TYPE[COLUMN_NAMES_T2V.index(x)] for x in updated_headers] |
|
|
| updated_data = updated_data[present_columns] |
| updated_data = updated_data.sort_values(by="Selected Score", ascending=False) |
| updated_data = convert_scores_to_percentage(updated_data) |
| |
| filter_component = gr.components.Dataframe( |
| value=updated_data, |
| headers=updated_headers, |
| type="pandas", |
| datatype=update_datatype, |
| interactive=False, |
| visible=True, |
| ) |
| return filter_component |
|
|
| def on_filter_model_size_method_score_change_t2v(select_score): |
| selected_columns = category_to_dimension[select_score] |
| updated_data = get_all_df_t2v(selected_columns, T2V_DIR) |
| present_columns = MODEL_INFO_TAB_T2V + [f"{select_score} Score"] + selected_columns |
| updated_headers = present_columns |
| updated_data = updated_data[present_columns] |
| updated_data = updated_data.sort_values(by=f"{select_score} Score", ascending=False) |
| updated_data = convert_scores_to_percentage(updated_data) |
| update_datatype = [T2V_TITLE_TYPE[COLUMN_NAMES_T2V.index(x)] for x in updated_headers] |
| filter_component = gr.components.Dataframe( |
| value=updated_data, |
| headers=updated_headers, |
| type="pandas", |
| datatype=update_datatype, |
| interactive=False, |
| visible=True, |
| ) |
| return filter_component, gr.update(value=selected_columns) |
|
|
| def refresh_and_switch_tab(t2v_selected_columns, i2i_selected_tasks): |
| t2v_data, t2v_file = on_filter_dim_and_update_download_t2v(t2v_selected_columns) |
| i2i_data, i2i_file = on_filter_task_and_update_download_i2i(i2i_selected_tasks) |
| return t2v_data, i2i_data, t2v_file, i2i_file |
|
|
| def download_t2v_xlsx(selected_columns, vbench_t2v_download_file=None): |
| import tempfile |
| updated_data = get_all_df_t2v(selected_columns, T2V_DIR) |
| present_columns = MODEL_INFO_T2V + selected_columns |
| updated_data = updated_data[present_columns] |
| updated_data = convert_scores_to_percentage(updated_data) |
| |
| temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".xlsx", prefix="VBench_T2V_Leaderboard_") |
| updated_data.to_excel(temp_file.name, index=False, engine='openpyxl') |
| |
| if vbench_t2v_download_file is not None: |
| return gr.update(value=temp_file.name, visible=True) |
| else: |
| return gr.update(value=temp_file.name) |
|
|
|
|
| def download_t2i_xlsx(selected_columns, select_subject_button=None,t2i_download_file=None): |
| import tempfile |
| if select_subject_button is not None and select_subject_button in T2I_SUBJECT_REVERSE_MAP: |
| select_subject_button = T2I_SUBJECT_REVERSE_MAP[select_subject_button] |
| updated_data = get_all_df_t2i(selected_columns,select_subject_button, T2I_DIR) |
| selected_columns = [item for item in T2I_TAB if item in selected_columns] |
| present_columns = MODEL_INFO_TAB_T2I + selected_columns |
| updated_data = updated_data[present_columns] |
| updated_data = convert_scores_to_percentage(updated_data) |
| temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".xlsx", prefix="IBench_T2I_Leaderboard_") |
| updated_data.to_excel(temp_file.name, index=False, engine='openpyxl') |
| if t2i_download_file is not None: |
| return gr.update(value=temp_file.name, visible=True) |
| else: |
| return gr.update(value=temp_file.name) |
| |
| def download_i2i_xlsx(selected_tasks, i2i_download_file=None): |
| import tempfile |
| |
| updated_data = get_df_from_json_i2i(I2I_DIR) |
| updated_data = get_final_score_i2i(updated_data, selected_tasks) |
| present_columns = MODEL_INFO_TAB_I2I + selected_tasks |
| updated_data = updated_data[present_columns] |
| updated_data = convert_scores_to_percentage(updated_data) |
| temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".xlsx", prefix="IBench_I2I_Leaderboard_") |
| updated_data.to_excel(temp_file.name, index=False, engine='openpyxl') |
| if i2i_download_file is not None: |
| return gr.update(value=temp_file.name, visible=True) |
| else: |
| return gr.update(value=temp_file.name) |
|
|
| def download_i2v_xlsx(selected_columns, i2v_download_file=None): |
| import tempfile |
| updated_data = get_all_df_i2v(selected_columns, I2V_DIR) |
| selected_columns = [item for item in I2V_TAB if item in selected_columns] |
| present_columns = MODEL_INFO_TAB_I2V + selected_columns |
| updated_data = updated_data[present_columns] |
| updated_data = convert_scores_to_percentage(updated_data) |
| |
| temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".xlsx", prefix="VBench_I2V_Leaderboard_") |
| updated_data.to_excel(temp_file.name, index=False, engine='openpyxl') |
| |
| if i2v_download_file is not None: |
| return gr.update(value=temp_file.name, visible=True) |
| else: |
| return gr.update(value=temp_file.name) |
|
|
| def on_filter_and_update_download_t2v(select_score, selected_columns): |
| data, checkgroup = on_filter_model_size_method_score_change_t2v(select_score) |
| file = download_t2v_xlsx(selected_columns) |
| return data, checkgroup, file |
|
|
| def on_filter_dim_and_update_download_t2v(selected_columns): |
| data = on_filter_model_size_method_change_t2v(selected_columns) |
| file = download_t2v_xlsx(selected_columns) |
| return data, file |
|
|
| def on_filter_task_and_update_download_i2i(selected_tasks): |
| data = on_filter_task_method_change_i2i(selected_tasks) |
| file = download_i2i_xlsx(selected_tasks) |
| return data, file |
|
|
| def on_filter_and_update_download_i2v(selected_columns): |
| data = on_filter_model_size_method_change_i2v(selected_columns) |
| file = download_i2v_xlsx(selected_columns) |
| return data, file |
|
|
| def update_t2i_checkbox_choices(select_subject_button_value, current_selected_columns): |
| """根据 subject 更新 checkbox 选项 |
| - 🌐 All、🔤 Text & Typography (EN)、🔤 Text & Typography (CN) 显示 Text Rendering |
| - 其他 subject 不显示 Text Rendering |
| 返回: (gr.update对象, 更新后的选中值列表) |
| """ |
| |
| |
| show_text_rendering = ( |
| select_subject_button_value == "🌐 All" or |
| select_subject_button_value == "🔤 Text & Typography (EN)" or |
| select_subject_button_value == "🔤 Text & Typography (CN)" |
| ) |
| |
| |
| is_text_typography = False |
| if select_subject_button_value is not None: |
| |
| internal_subject = T2I_SUBJECT_REVERSE_MAP.get(select_subject_button_value, select_subject_button_value) |
| is_text_typography = internal_subject in ["text-and-typography", "text-and-typography-cn"] |
| |
| |
| if show_text_rendering: |
| |
| available_choices = T2I_TAB.copy() |
| else: |
| |
| available_choices = [col for col in T2I_TAB if col != "Text Rendering"] |
| |
| |
| updated_selected = [col for col in current_selected_columns if col in available_choices] |
| |
| |
| if is_text_typography: |
| |
| if "Text Rendering" not in updated_selected: |
| updated_selected.append("Text Rendering") |
| else: |
| |
| if "Text Rendering" in updated_selected: |
| updated_selected.remove("Text Rendering") |
| |
| |
| if len(updated_selected) == 0 and len(available_choices) > 0: |
| updated_selected = [available_choices[0]] |
| |
| checkbox_update = gr.update(choices=available_choices, value=updated_selected) |
| return checkbox_update, updated_selected |
|
|
| def on_filter_and_update_download_t2i(selected_columns, select_subject_button=None): |
| if select_subject_button is not None and select_subject_button in T2I_SUBJECT_REVERSE_MAP: |
| select_subject_button = T2I_SUBJECT_REVERSE_MAP[select_subject_button] |
| data = on_filter_model_size_method_change_t2i(selected_columns, select_subject_button) |
| file = download_t2i_xlsx(selected_columns, select_subject_button) |
| return data, file |
|
|
| def on_filter_and_update_download_i2i(selected_categories, selected_tasks): |
| data, checkgroup = on_filter_model_size_method_change_i2i(selected_categories) |
| file = download_i2i_xlsx(selected_tasks) |
| return data, checkgroup, file |
|
|
|
|
| css = """ |
| table { |
| text-align: center; |
| } |
| thead th { |
| text-align: center !important; |
| } |
| tbody td { |
| text-align: center !important; |
| } |
| |
| /* 让 Text to Video 的 7 个评分按钮宽度一致:固定为 5 列网格布局(第二行自动补空位) */ |
| #vbench_t2v_score_buttons { |
| display: grid !important; |
| grid-template-columns: repeat(7, minmax(0, 1fr)); |
| gap: 8px; |
| align-items: stretch; |
| } |
| /* 防止内部容器撑开导致网格溢出 */ |
| #vbench_t2v_score_buttons > div { |
| min-width: 0; |
| } |
| /* 让按钮填满各自网格单元格 */ |
| #vbench_t2v_score_buttons button { |
| width: 100%; |
| } |
| """ |
|
|
| block = gr.Blocks(css=css) |
|
|
|
|
| with block: |
| gr.Markdown( |
| LEADERBORAD_INTRODUCTION |
| ) |
| with gr.Tabs(elem_classes="tab-buttons") as tabs: |
|
|
| |
| with gr.TabItem("Text to Video", elem_id="vbench-tab-table", id=1): |
| gr.Markdown( |
| TABLE_INTRODUCTION |
| ) |
| with gr.Row(elem_id="vbench_t2v_score_buttons"): |
| vbench_t2v_creativity_button = gr.Button("Show Creativity Score") |
| vbench_t2v_commonsense_button = gr.Button("Show Commonsense Score") |
| vbench_t2v_control_button = gr.Button("Show Controllability Score") |
| vbench_t2v_human_button = gr.Button("Show Human Fidelity Score") |
| vbench_t2v_physics_button = gr.Button("Show Physics Score") |
| vbench_t2v_text_rendering_button = gr.Button("Show Text Rendering Score") |
| vbench_t2v_quality_button = gr.Button("Show Quality Score") |
| with gr.Row(): |
| vbench_t2v_checkgroup = gr.CheckboxGroup( |
| choices=TASK_INFO_T2V, |
| value=TASK_INFO_T2V, |
| label="Evaluation Dimension", |
| interactive=True, |
| ) |
| with gr.Row(): |
| vbench_t2v_download_btn = gr.Button("📥 Download", variant="secondary") |
| with gr.Row(): |
| vbench_t2v_download_file = gr.File(label="下载文件", visible=False) |
| |
| data_component_t2v = gr.components.Dataframe( |
| value=get_baseline_df_t2v, |
| headers=COLUMN_NAMES_T2V, |
| type="pandas", |
| datatype=T2V_TITLE_TYPE, |
| interactive=False, |
| visible=True, |
| |
| ) |
| |
| |
| vbench_t2v_creativity_button.click(fn=on_filter_and_update_download_t2v, inputs=[gr.State("Creativity"), vbench_t2v_checkgroup], outputs=[data_component_t2v, vbench_t2v_checkgroup, vbench_t2v_download_file], api_name=False) |
| vbench_t2v_commonsense_button.click(fn=on_filter_and_update_download_t2v, inputs=[gr.State("Commonsense"), vbench_t2v_checkgroup], outputs=[data_component_t2v, vbench_t2v_checkgroup, vbench_t2v_download_file], api_name=False) |
| vbench_t2v_control_button.click(fn=on_filter_and_update_download_t2v, inputs=[gr.State("Controllability"), vbench_t2v_checkgroup], outputs=[data_component_t2v, vbench_t2v_checkgroup, vbench_t2v_download_file], api_name=False) |
| vbench_t2v_human_button.click(fn=on_filter_and_update_download_t2v, inputs=[gr.State("Human Fidelity"), vbench_t2v_checkgroup], outputs=[data_component_t2v, vbench_t2v_checkgroup, vbench_t2v_download_file], api_name=False) |
| vbench_t2v_physics_button.click(fn=on_filter_and_update_download_t2v, inputs=[gr.State("Physics"), vbench_t2v_checkgroup], outputs=[data_component_t2v, vbench_t2v_checkgroup, vbench_t2v_download_file], api_name=False) |
| vbench_t2v_text_rendering_button.click(fn=on_filter_and_update_download_t2v, inputs=[gr.State("Text Rendering"), vbench_t2v_checkgroup], outputs=[data_component_t2v, vbench_t2v_checkgroup, vbench_t2v_download_file], api_name=False) |
| vbench_t2v_quality_button.click(fn=on_filter_and_update_download_t2v, inputs=[gr.State("Quality"), vbench_t2v_checkgroup], outputs=[data_component_t2v, vbench_t2v_checkgroup, vbench_t2v_download_file], api_name=False) |
| vbench_t2v_download_btn.click(fn=download_t2v_xlsx, inputs=[vbench_t2v_checkgroup, vbench_t2v_download_file], outputs=vbench_t2v_download_file, api_name=False) |
|
|
| |
| with gr.TabItem("Image to Video", elem_id="vbench-tab-table", id=2): |
| with gr.Row(): |
| with gr.Column(scale=1.0): |
| |
| checkbox_group_i2v = gr.CheckboxGroup( |
| choices=I2V_TAB, |
| value=I2V_TAB, |
| label="Evaluation Quality Dimension", |
| interactive=True, |
| ) |
| with gr.Row(): |
| i2v_download_btn = gr.Button("📥 Download", variant="secondary") |
| with gr.Row(): |
| i2v_download_file = gr.File(label="下载文件", visible=False) |
|
|
| data_component_i2v = gr.components.Dataframe( |
| value=get_baseline_df_i2v, |
| headers=COLUMN_NAMES_I2V, |
| type="pandas", |
| datatype=I2V_TITLE_TYPE, |
| interactive=False, |
| visible=True, |
| ) |
| |
| checkbox_group_i2v.change(fn=on_filter_and_update_download_i2v, inputs=[checkbox_group_i2v], outputs=[data_component_i2v, i2v_download_file], api_name=False) |
| i2v_download_btn.click(fn=download_i2v_xlsx, inputs=[checkbox_group_i2v, i2v_download_file], outputs=i2v_download_file, api_name=False) |
|
|
| |
| with gr.TabItem("Text to Image", elem_id="ibench-tab-table", id=3): |
| with gr.Row(): |
| with gr.Column(scale=1.0): |
| |
| |
| initial_t2i_choices = T2I_TAB.copy() |
| initial_t2i_value = [col for col in T2I_TAB if col != "Text Rendering"] |
| checkbox_group_t2i = gr.CheckboxGroup( |
| choices=initial_t2i_choices, |
| value=initial_t2i_value, |
| label="Evaluation Dimension", |
| interactive=True, |
| ) |
| with gr.Row(): |
| with gr.Column(scale=1.0): |
| select_subject_button = gr.Radio( |
| choices=T2I_SHOW_SUBJECT_TAB, |
| value="🌐 All", |
| label="Subject", |
| interactive=True |
| ) |
| |
| with gr.Row(): |
| t2i_download_btn = gr.Button("📥 Download", variant="secondary") |
| with gr.Row(): |
| t2i_download_file = gr.File(label="下载文件", visible=False) |
|
|
| data_component_t2i = gr.components.Dataframe( |
| value=get_baseline_df_t2i, |
| headers=COLUMN_NAMES_T2I, |
| type="pandas", |
| datatype=T2I_TITLE_TYPE, |
| interactive=False, |
| visible=True, |
| ) |
| def on_subject_change(select_subject_value, current_selected): |
| |
| checkbox_update, updated_selected = update_t2i_checkbox_choices(select_subject_value, current_selected) |
| |
| data, file = on_filter_and_update_download_t2i(updated_selected, select_subject_value) |
| return checkbox_update, data, file |
| |
| checkbox_group_t2i.change(fn=on_filter_and_update_download_t2i, inputs=[checkbox_group_t2i, select_subject_button], outputs=[data_component_t2i, t2i_download_file], api_name=False) |
| select_subject_button.change(fn=on_subject_change, inputs=[select_subject_button, checkbox_group_t2i], outputs=[checkbox_group_t2i, data_component_t2i, t2i_download_file], api_name=False) |
| t2i_download_btn.click(fn=download_t2i_xlsx, inputs=[checkbox_group_t2i, select_subject_button, t2i_download_file], outputs=t2i_download_file, api_name=False) |
| |
| |
|
|
| |
| with gr.TabItem("Image to Image", elem_id="ibench-tab-table", id=4): |
| with gr.Row(): |
| i2i_controllable_generation_button = gr.Button("Controllable Generation") |
| i2i_global_editing_button = gr.Button("Global Editing") |
| i2i_local_editing_button = gr.Button("Local Editing") |
| i2i_reference_generation_button = gr.Button("Reference Generation") |
| i2i_reference_editing_button = gr.Button("Reference Editing") |
| with gr.Row(): |
| i2i_checkgroup_tasks = gr.CheckboxGroup( |
| choices=TASK_I2I, |
| value=TASK_I2I, |
| label="Specific Tasks", |
| interactive=True, |
| ) |
| with gr.Row(): |
| i2i_download_btn = gr.Button("📥 Download", variant="secondary") |
| with gr.Row(): |
| i2i_download_file = gr.File(label="下载文件", visible=False) |
| |
| data_component_i2i = gr.components.Dataframe( |
| value=get_baseline_df_i2i, |
| headers=MODEL_INFO_TAB_I2I+TASK_I2I, |
| type="pandas", |
| datatype=I2I_TITLE_TYPE, |
| interactive=False, |
| visible=True, |
| ) |
| |
| i2i_controllable_generation_button.click(fn=on_filter_and_update_download_i2i, inputs=[gr.State("Controllable Generation"), i2i_checkgroup_tasks], outputs=[data_component_i2i, i2i_checkgroup_tasks, i2i_download_file], api_name=False) |
| i2i_global_editing_button.click(fn=on_filter_and_update_download_i2i, inputs=[gr.State("Global Editing"), i2i_checkgroup_tasks], outputs=[data_component_i2i, i2i_checkgroup_tasks, i2i_download_file], api_name=False) |
| i2i_local_editing_button.click(fn=on_filter_and_update_download_i2i, inputs=[gr.State("Local Editing"), i2i_checkgroup_tasks], outputs=[data_component_i2i, i2i_checkgroup_tasks, i2i_download_file], api_name=False) |
| i2i_reference_generation_button.click(fn=on_filter_and_update_download_i2i, inputs=[gr.State("Reference Generation"), i2i_checkgroup_tasks], outputs=[data_component_i2i, i2i_checkgroup_tasks, i2i_download_file], api_name=False) |
| i2i_reference_editing_button.click(fn=on_filter_and_update_download_i2i, inputs=[gr.State("Reference Editing"), i2i_checkgroup_tasks], outputs=[data_component_i2i, i2i_checkgroup_tasks, i2i_download_file], api_name=False) |
| i2i_download_btn.click(fn=download_i2i_xlsx, inputs=[i2i_checkgroup_tasks, i2i_download_file], outputs=i2i_download_file, api_name=False) |
| |
| |
| |
| with gr.TabItem("📝 About", elem_id="mvbench-tab-table", id=5): |
| gr.Markdown(LEADERBORAD_INFO, elem_classes="markdown-text") |
|
|
| with gr.Row(): |
| data_run = gr.Button("Refresh") |
| data_run.click(refresh_and_switch_tab, inputs=[vbench_t2v_checkgroup, i2i_checkgroup_tasks], outputs=[data_component_t2v, data_component_i2i, vbench_t2v_download_file, i2i_download_file], api_name=False) |
|
|
|
|
| block.launch(share=True) |