in lmms_eval/tasks/refcocog/utils.py [0:0]
def refcoco_aggregation_result(results, metric):
scorers = [(Bleu(4), "Bleu_1"), (Bleu(4), "Bleu_2"), (Bleu(4), "Bleu_3"), (Bleu(4), "Bleu_4"), (Meteor(), "METEOR"), (Rouge(), "ROUGE_L"), (Cider(), "CIDEr"), (Spice(), "SPICE")]
scorers_dict = {s[1]: s for s in scorers}
stored_results = []
# In order to make the coco eval tools to successfully create index
# We need at least two dict in the dataset
# 'annotation' and 'images'
# 'annotation' exactly reproduce the original annotation
# 'images' however only need the image id which is contained in the file name
dataset = {"annotations": [], "images": []}
idx = 0
ann_id = 0
for result in results:
stored_results.append({"image_id": idx, "caption": result["pred"]})
for s in result["answer"]:
dataset["annotations"].append({"image_id": idx, "caption": s, "id": ann_id})
ann_id += 1
dataset["images"].append({"id": idx})
idx += 1
coco = COCO()
# Manually create index here
coco.dataset = dataset
coco.createIndex()
coco_result = coco.loadRes(stored_results)
coco_eval = COCOEvalCap(coco, coco_result)
imgIds = coco_eval.params["image_id"]
gts = {}
res = {}
for imgId in imgIds:
gts[imgId] = coco_eval.coco.imgToAnns[imgId]
res[imgId] = coco_eval.cocoRes.imgToAnns[imgId]
eval_logger.info("tokenization...")
tokenizer = PTBTokenizer()
gts = tokenizer.tokenize(gts)
res = tokenizer.tokenize(res)
eval_logger.info(f"Computing {metric} scores...")
score, scores = scorers_dict[metric][0].compute_score(gts, res)
# coco_eval.setEval(score, metric)
# When metric is one of the Bleu, score will be a list
if type(score) == list:
n = int(metric.split("_")[-1])
score = score[n - 1]
return score