|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import json |
|
import os |
|
|
|
import util.misc as utils |
|
|
|
try: |
|
from panopticapi.evaluation import pq_compute |
|
except ImportError: |
|
pass |
|
|
|
|
|
class PanopticEvaluator(object): |
|
def __init__(self, ann_file, ann_folder, output_dir="panoptic_eval"): |
|
self.gt_json = ann_file |
|
self.gt_folder = ann_folder |
|
if utils.is_main_process(): |
|
if not os.path.exists(output_dir): |
|
os.mkdir(output_dir) |
|
self.output_dir = output_dir |
|
self.predictions = [] |
|
|
|
def update(self, predictions): |
|
for p in predictions: |
|
with open(os.path.join(self.output_dir, p["file_name"]), "wb") as f: |
|
f.write(p.pop("png_string")) |
|
|
|
self.predictions += predictions |
|
|
|
def synchronize_between_processes(self): |
|
all_predictions = utils.all_gather(self.predictions) |
|
merged_predictions = [] |
|
for p in all_predictions: |
|
merged_predictions += p |
|
self.predictions = merged_predictions |
|
|
|
def summarize(self): |
|
if utils.is_main_process(): |
|
json_data = {"annotations": self.predictions} |
|
predictions_json = os.path.join(self.output_dir, "predictions.json") |
|
with open(predictions_json, "w") as f: |
|
f.write(json.dumps(json_data)) |
|
return pq_compute(self.gt_json, predictions_json, gt_folder=self.gt_folder, pred_folder=self.output_dir) |
|
return None |
|
|