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