|
|
|
|
|
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) |
|
|
|
|
|
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 |
|
|