lotrlol's picture
Duplicate from OFA-Sys/OFA-Image_Caption
9b43833
import json
import sys
import os.path as op
from pycocotools.coco import COCO
from pycocoevalcap.eval import COCOEvalCap
def evaluate_on_coco_caption(res_file, label_file, outfile=None):
"""
res_file: txt file, each row is [image_key, json format list of captions].
Each caption is a dict, with fields "caption", "conf".
label_file: JSON file of ground truth captions in COCO format.
"""
coco = COCO(label_file)
cocoRes = coco.loadRes(res_file)
cocoEval = COCOEvalCap(coco, cocoRes)
# evaluate on a subset of images by setting
# cocoEval.params['image_id'] = cocoRes.getImgIds()
# please remove this line when evaluating the full validation set
cocoEval.params['image_id'] = cocoRes.getImgIds()
# evaluate results
# SPICE will take a few minutes the first time, but speeds up due to caching
cocoEval.evaluate()
result = cocoEval.eval
if not outfile:
print(result)
else:
with open(outfile, 'w') as fp:
json.dump(result, fp, indent=4)
return result
if __name__ == "__main__":
if len(sys.argv) == 3:
evaluate_on_coco_caption(sys.argv[1], sys.argv[2])
elif len(sys.argv) == 4:
evaluate_on_coco_caption(sys.argv[1], sys.argv[2], sys.argv[3])
else:
raise NotImplementedError