Spaces:
Runtime error
Runtime error
import os | |
import re | |
import json | |
import argparse | |
from collections import defaultdict | |
import numpy as np | |
from PIL import Image | |
from tqdm import tqdm | |
import torch | |
from torch.utils.data import DataLoader | |
from datasets import load_dataset | |
from minigpt4.datasets.datasets.vqa_datasets import OKVQAEvalData,VizWizEvalData,IconQAEvalData,GQAEvalData,VSREvalData,HMEvalData | |
from minigpt4.common.vqa_tools.VQA.PythonHelperTools.vqaTools.vqa import VQA | |
from minigpt4.common.vqa_tools.VQA.PythonEvaluationTools.vqaEvaluation.vqaEval import VQAEval | |
from minigpt4.common.eval_utils import prepare_texts, init_model, eval_parser | |
from minigpt4.conversation.conversation import CONV_VISION_minigptv2 | |
from minigpt4.common.config import Config | |
def list_of_str(arg): | |
return list(map(str, arg.split(','))) | |
parser = eval_parser() | |
parser.add_argument("--dataset", type=list_of_str, default='refcoco', help="dataset to evaluate") | |
args = parser.parse_args() | |
cfg = Config(args) | |
model, vis_processor = init_model(args) | |
conv_temp = CONV_VISION_minigptv2.copy() | |
conv_temp.system = "" | |
model.eval() | |
save_path = cfg.run_cfg.save_path | |
if 'okvqa' in args.dataset: | |
eval_file_path = cfg.evaluation_datasets_cfg["okvqa"]["eval_file_path"] | |
img_path = cfg.evaluation_datasets_cfg["okvqa"]["img_path"] | |
batch_size = cfg.evaluation_datasets_cfg["okvqa"]["batch_size"] | |
max_new_tokens = cfg.evaluation_datasets_cfg["okvqa"]["max_new_tokens"] | |
evaluation_annntation_path = os.path.join(eval_file_path, "okvqa_test_split.json") | |
with open(evaluation_annntation_path) as f: | |
ok_vqa_test_split = json.load(f) | |
data = OKVQAEvalData(ok_vqa_test_split, vis_processor, img_path) | |
eval_dataloader = DataLoader(data, batch_size=batch_size, shuffle=False) | |
minigpt4_predict = [] | |
for images, questions, question_ids, img_ids in eval_dataloader: | |
texts = prepare_texts(questions, conv_temp) # warp the texts with conversation template | |
answers = model.generate(images, texts, max_new_tokens=max_new_tokens, do_sample=False) | |
for answer, question_id, question, img_id in zip(answers, question_ids, questions, img_ids): | |
result = dict() | |
answer = answer.lower().replace('<unk>','').strip() | |
result['answer'] = answer | |
result['question_id'] = int(question_id) | |
minigpt4_predict.append(result) | |
file_save_path= os.path.join(save_path,"okvqa.json") | |
with open(file_save_path,'w') as f: | |
json.dump(minigpt4_predict, f) | |
annFile = os.path.join(eval_file_path,"mscoco_val2014_annotations_clean.json") | |
quesFile = os.path.join(eval_file_path,"OpenEnded_mscoco_val2014_questions_clean.json" ) | |
vqa = VQA(annFile, quesFile) | |
vqaRes = vqa.loadRes(file_save_path, quesFile) | |
vqaEval = VQAEval(vqa, vqaRes, n=2) | |
vqaEval.evaluate() | |
print ("Overall OKVQA Accuracy is: %.02f\n" %(vqaEval.accuracy['overall']), flush=True) | |
if 'vizwiz' in args.dataset: | |
eval_file_path = cfg.evaluation_datasets_cfg["vizwiz"]["eval_file_path"] | |
img_path = cfg.evaluation_datasets_cfg["vizwiz"]["img_path"] | |
batch_size = cfg.evaluation_datasets_cfg["vizwiz"]["batch_size"] | |
max_new_tokens = cfg.evaluation_datasets_cfg["vizwiz"]["max_new_tokens"] | |
vizwiz = json.load(open(eval_file_path, 'r')) | |
data = VizWizEvalData(vizwiz, vis_processor, img_path) | |
eval_dataloader = DataLoader(data, batch_size=batch_size, shuffle=False) | |
minigpt4_predict = [] | |
total_acc = [] | |
for images, texts, gt_answers in tqdm(eval_dataloader): | |
texts = prepare_texts(texts, conv_temp) # warp the texts with conversation template | |
with torch.no_grad(): | |
answers = model.generate(images, texts, max_new_tokens=max_new_tokens, do_sample=False,repetition_penalty=1.0) | |
for answer, gt_answer in zip(answers, gt_answers): | |
result = dict() | |
result['answer'] = answer.replace('<unk>','').strip() | |
minigpt4_predict.append(result) | |
count=0 | |
gt_answer = gt_answer.split('_') | |
for gt in gt_answer: | |
if gt.lower() == answer.lower(): | |
count += 1 | |
acc = min(count/3.0, 1.0) | |
total_acc.append(acc) | |
file_save_path = os.path.join(save_path, "vizwiz.json") | |
with open(file_save_path,'w') as f: | |
json.dump(minigpt4_predict, f) | |
print('vizwiz Acc: ', np.average(total_acc)* 100.0, flush=True) | |
if 'iconvqa' in args.dataset: | |
eval_file_path = cfg.evaluation_datasets_cfg["iconvqa"]["eval_file_path"] | |
img_path = cfg.evaluation_datasets_cfg["iconvqa"]["img_path"] | |
batch_size = cfg.evaluation_datasets_cfg["iconvqa"]["batch_size"] | |
max_new_tokens = cfg.evaluation_datasets_cfg["iconvqa"]["max_new_tokens"] | |
iconqa_text_val = json.load(open(eval_file_path,"r")) | |
data = IconQAEvalData(iconqa_text_val, vis_processor, img_path) | |
eval_dataloader = DataLoader(data, batch_size=batch_size, shuffle=False) | |
count = 0 | |
for images, texts, candidates, answers in tqdm(eval_dataloader): | |
candidates = [candidate.split('_') for candidate in candidates] | |
num_cand = [len(candidate) for candidate in candidates] | |
for candidate in candidates: | |
candidate.extend(['none'] * (max(num_cand) - len(candidate))) | |
candidates = [list(x) for x in zip(*candidates)] | |
instructions = ["<s>[INST] <Img><ImageHere></Img> {} [/INST]".format(text) for text in texts] | |
answer_ranks = model.multi_select(images, instructions, candidates, num_cand=num_cand) | |
for idx, answer in enumerate(answers): | |
if answer_ranks[idx][0] == answer: | |
count += 1 | |
print('iconqa Acc: ', count / len(iconqa_text_val) * 100.0, flush=True) | |
if 'gqa' in args.dataset: | |
eval_file_path = cfg.evaluation_datasets_cfg["gqa"]["eval_file_path"] | |
img_path = cfg.evaluation_datasets_cfg["gqa"]["img_path"] | |
batch_size = cfg.evaluation_datasets_cfg["gqa"]["batch_size"] | |
max_new_tokens = cfg.evaluation_datasets_cfg["gqa"]["max_new_tokens"] | |
gqa = json.load(open(eval_file_path)) | |
data = GQAEvalData(gqa, vis_processor, img_path) | |
eval_dataloader = DataLoader(data, batch_size=batch_size, shuffle=False) | |
count=0 | |
total=0 | |
minigpt4_predict = [] | |
for images, texts, labels in tqdm(eval_dataloader): | |
texts = prepare_texts(texts, conv_temp) # warp the texts with conversation template | |
answers = model.generate(images, texts, max_new_tokens=max_new_tokens, do_sample=False) | |
for answer, label in zip(answers, labels): | |
result = dict() | |
result['pred'] = answer.lower().replace('<unk>','').strip() | |
result['gt'] = label | |
minigpt4_predict.append(result) | |
if answer.lower() == label: | |
count+=1 | |
total+=1 | |
print('gqa val:', count / total * 100, flush=True) | |
file_save_path = os.path.join(save_path, "gqa.json") | |
with open(file_save_path,'w') as f: | |
json.dump(minigpt4_predict, f) | |
if 'vsr' in args.dataset: | |
img_path = cfg.evaluation_datasets_cfg["vsr"]["img_path"] | |
batch_size = cfg.evaluation_datasets_cfg["vsr"]["batch_size"] | |
max_new_tokens = cfg.evaluation_datasets_cfg["vsr"]["max_new_tokens"] | |
annotation = load_dataset("cambridgeltl/vsr_zeroshot", split='test') | |
data = VSREvalData(annotation, vis_processor, img_path) | |
eval_dataloader = DataLoader(data, batch_size=batch_size, shuffle=False) | |
count=0 | |
total=0 | |
minigpt4_predict = [] | |
for images, texts, labels in tqdm(eval_dataloader): | |
texts = prepare_texts(texts, conv_temp) # warp the texts with conversation template | |
answers = model.generate(images, texts, max_new_tokens=max_new_tokens, do_sample=False) | |
for answer, label in zip(answers, labels): | |
result = dict() | |
result['pred'] = answer.replace('<unk>','').strip() | |
result['gt'] = label | |
minigpt4_predict.append(result) | |
if answer.lower() == label.lower(): | |
count+=1 | |
total+=1 | |
print('vsr test:', count / total * 100, flush=True) | |
file_save_path = os.path.join(save_path,"vsr.json") | |
with open(file_save_path,'w') as f: | |
json.dump(minigpt4_predict, f) | |
if 'hm' in args.dataset: | |
eval_file_path = cfg.evaluation_datasets_cfg["hm"]["eval_file_path"] | |
img_path = cfg.evaluation_datasets_cfg["hm"]["img_path"] | |
batch_size = cfg.evaluation_datasets_cfg["hm"]["batch_size"] | |
max_new_tokens = cfg.evaluation_datasets_cfg["hm"]["max_new_tokens"] | |
annotation = [] | |
with open(eval_file_path, 'r') as jsonl_file: | |
for line in jsonl_file: | |
json_obj = json.loads(line) | |
annotation.append(json_obj) | |
data = HMEvalData(annotation, vis_processor, img_path) | |
eval_dataloader = DataLoader(data, batch_size=batch_size, shuffle=False) | |
count=0 | |
total=0 | |
minigpt4_predict = [] | |
for images, texts, labels in tqdm(eval_dataloader): | |
texts = prepare_texts(texts, conv_temp) # warp the texts with conversation template | |
answers = model.generate(images, texts, max_new_tokens=max_new_tokens, do_sample=False) | |
for answer, label in zip(answers, labels): | |
result = dict() | |
if answer.lower().strip() =="yes": | |
answer=1 | |
elif answer.lower().strip()=="no": | |
answer=0 | |
else: | |
print("non-matching answer",answer) | |
result['pred'] = answer | |
result['gt'] = int(label) | |
minigpt4_predict.append(result) | |
if answer == label: | |
count+=1 | |
total+=1 | |
print('hm val:', count / total * 100, flush=True) | |
file_save_path = os.path.join(save_path, "hm.json") | |
with open(file_save_path,'w') as f: | |
json.dump(minigpt4_predict, f) | |