|
import os |
|
import sys |
|
import tempfile |
|
import json |
|
from json import encoder |
|
from uniperceiver.config import configurable |
|
from .build import EVALUATION_REGISTRY |
|
from pycocotools.coco import COCO |
|
from pycocoevalcap.eval import COCOEvalCap |
|
from uniperceiver.utils import comm |
|
|
|
@EVALUATION_REGISTRY.register() |
|
class COCOEvaler(object): |
|
def __init__(self, cfg, annfile, output_dir): |
|
super(COCOEvaler, self).__init__() |
|
|
|
self.coco = COCO(annfile) if annfile != '' else None |
|
if not os.path.exists("./data/temp") and comm.is_main_process(): |
|
os.makedirs("./data/temp") |
|
|
|
if output_dir is not None: |
|
self.output_dir = os.path.join(output_dir, 'results') |
|
if not os.path.exists(self.output_dir) and comm.is_main_process(): |
|
os.makedirs(self.output_dir) |
|
else: |
|
self.output_dir = None |
|
|
|
def eval(self, results_input, epoch): |
|
image_ids = [] |
|
results = [] |
|
for result in results_input: |
|
if result['image_id'] not in image_ids: |
|
results.append(result) |
|
image_ids.append(result['image_id']) |
|
|
|
if self.output_dir is not None: |
|
json.dump(results, open(os.path.join(self.output_dir, str(epoch) + '.json'), "w")) |
|
|
|
in_file = tempfile.NamedTemporaryFile(mode='w', |
|
delete=False, |
|
dir="./data/temp") |
|
json.dump(results, in_file) |
|
in_file.close() |
|
|
|
if self.coco is None: |
|
return {} |
|
|
|
cocoRes = self.coco.loadRes(in_file.name) |
|
cocoEval = COCOEvalCap(self.coco, cocoRes) |
|
cocoEval.evaluate() |
|
os.remove(in_file.name) |
|
return cocoEval.eval |