Spaces:
Running
on
L40S
Running
on
L40S
# Copyright (c) Facebook, Inc. and its affiliates. | |
from detectron2.data.catalog import Metadata | |
from detectron2.evaluation import COCOEvaluator | |
from densepose.data.datasets.coco import ( | |
get_contiguous_id_to_category_id_map, | |
maybe_filter_categories_cocoapi, | |
) | |
def _maybe_add_iscrowd_annotations(cocoapi) -> None: | |
for ann in cocoapi.dataset["annotations"]: | |
if "iscrowd" not in ann: | |
ann["iscrowd"] = 0 | |
class Detectron2COCOEvaluatorAdapter(COCOEvaluator): | |
def __init__( | |
self, | |
dataset_name, | |
output_dir=None, | |
distributed=True, | |
): | |
super().__init__(dataset_name, output_dir=output_dir, distributed=distributed) | |
maybe_filter_categories_cocoapi(dataset_name, self._coco_api) | |
_maybe_add_iscrowd_annotations(self._coco_api) | |
# substitute category metadata to account for categories | |
# that are mapped to the same contiguous id | |
if hasattr(self._metadata, "thing_dataset_id_to_contiguous_id"): | |
self._maybe_substitute_metadata() | |
def _maybe_substitute_metadata(self): | |
cont_id_2_cat_id = get_contiguous_id_to_category_id_map(self._metadata) | |
cat_id_2_cont_id = self._metadata.thing_dataset_id_to_contiguous_id | |
if len(cont_id_2_cat_id) == len(cat_id_2_cont_id): | |
return | |
cat_id_2_cont_id_injective = {} | |
for cat_id, cont_id in cat_id_2_cont_id.items(): | |
if (cont_id in cont_id_2_cat_id) and (cont_id_2_cat_id[cont_id] == cat_id): | |
cat_id_2_cont_id_injective[cat_id] = cont_id | |
metadata_new = Metadata(name=self._metadata.name) | |
for key, value in self._metadata.__dict__.items(): | |
if key == "thing_dataset_id_to_contiguous_id": | |
setattr(metadata_new, key, cat_id_2_cont_id_injective) | |
else: | |
setattr(metadata_new, key, value) | |
self._metadata = metadata_new | |