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