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