|
from vlmeval.smp import * |
|
from vlmeval.tools import EVAL |
|
import gradio as gr |
|
|
|
HEADER = """ |
|
# Welcome to MMBench👏👏 |
|
We are delighted that you are willing to submit the evaluation results to the MMBench official website! The evaluation service currently can handle submissions of MMBench, MMBench-CN, and CCBench. We use `gpt-3.5-turbo-0125` to help answer matching. Evaluation Codes in VLMEvalKit: https://github.com/open-compass/VLMEvalKit. Please adopt / follow the implementation of VLMEvalKit to generate the submission files. |
|
|
|
The evaluation script is available at https://github.com/open-compass/VLMEvalKit/tree/main/scripts/mmb_eval_gradio.py |
|
Please contact `opencompass@pjlab.org.cn` for any inquirys about this script. |
|
""" |
|
|
|
def upload_file(file): |
|
file_path = file.name |
|
return file_path |
|
|
|
def prepare_file(file_name): |
|
file_md5 = md5(file_name) |
|
root = LMUDataRoot() |
|
root = osp.join(root, 'eval_server') |
|
os.makedirs(root, exist_ok=True) |
|
suffix = file_name.split('.')[-1] |
|
if suffix not in ['xlsx', 'tsv', 'csv']: |
|
return False, "Please submit a file that ends with `.xlsx`, `.tsv`, or `.csv`" |
|
new_file_name = osp.join(root, f'{file_md5}.{suffix}') |
|
shutil.move(file_name, new_file_name) |
|
eval_file = new_file_name |
|
try: |
|
data = load(eval_file) |
|
except: |
|
return False, "Your excel file can not be successfully loaded by `pd.read_excel`, please double check and submit again. " |
|
for k in data.keys(): |
|
data[k.lower() if k not in 'ABCD' else k] = data.pop(k) |
|
if "index" not in data: |
|
return False, "Your excel file should have a column named `index`, please double check and submit again" , {} |
|
if "prediction" not in data: |
|
return False, "Your excel file should have a column named `prediction`, please double check and submit again" , {} |
|
for ch in 'ABCD': |
|
if ch not in data: |
|
return False, f"Your excel file should have a column named `{ch}`, please double check and submit again" , {} |
|
dump(data, eval_file) |
|
return True, eval_file |
|
|
|
def determine_dataset(eval_file): |
|
data = load(eval_file) |
|
def cn_ratio(data): |
|
iscn = [cn_string(x) for x in data['question']] |
|
return np.mean(iscn) |
|
max_ind = np.max([int(x) for x in data['index'] if int(x) < 1e5]) |
|
if max_ind < 1000 and 'l2-category' not in data: |
|
return 'CCBench' if cn_ratio(data) > 0.5 else "Unknown" |
|
elif max_ind < 3000 : |
|
return 'MMBench_CN' if cn_ratio(data) > 0.5 else "MMBench" |
|
else: |
|
return 'MMBench_CN_V11' if cn_ratio(data) > 0.5 else "MMBench_V11" |
|
|
|
|
|
def reformat_acc(acc): |
|
splits = set(acc['split']) |
|
keys = list(acc.keys()) |
|
keys.remove('split') |
|
nacc = {'Category': []} |
|
for sp in splits: |
|
nacc[sp.upper()] = [] |
|
for k in keys: |
|
nacc['Category'].append(k) |
|
for sp in splits: |
|
nacc[sp.upper()].append(acc[acc['split'] == sp].iloc[0][k] * 100) |
|
return pd.DataFrame(nacc) |
|
|
|
def evaluate(file): |
|
file_name = file.name |
|
flag, eval_file = prepare_file(file_name) |
|
if not flag: |
|
return "Error: " + eval_file |
|
dataset = determine_dataset(eval_file) |
|
if dataset == 'Unknown': |
|
return "Error: Cannot determine the dataset given your submitted file. " |
|
|
|
eval_id = eval_file.split('/')[-1].split('.')[0] |
|
ret = f"Evaluation ID: {eval_id}\n" |
|
timestamp = datetime.datetime.now().strftime('%Y.%m.%d %H:%M:%S') |
|
ret += f'Evaluation Timestamp: {timestamp}\n' |
|
acc = EVAL(dataset, eval_file) |
|
nacc = reformat_acc(acc).round(1) |
|
return ret, nacc |
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown(HEADER) |
|
file_output = gr.File() |
|
upload_button = gr.UploadButton("Click to upload you prediction files for a supported benchmark") |
|
upload_button.upload(upload_file, upload_button, file_output) |
|
|
|
btn = gr.Button("🚀 Evaluate") |
|
eval_log = gr.Textbox(label="Evaluation Log", placeholder="Your evaluation log will be displayed here") |
|
df_empty = pd.DataFrame([], columns=['Evaluation Result']) |
|
eval_result = gr.components.DataFrame(value=df_empty) |
|
btn.click(evaluate, inputs=[file_output], outputs=[eval_log, eval_result]) |
|
|
|
if __name__ == '__main__': |
|
demo.launch(server_name='0.0.0.0', debug=True, show_error=True) |