Source code for datumaro.plugins.data_formats.mmdet
# Copyright (C) 2023 Intel Corporation
#
# SPDX-License-Identifier: MIT
import os.path as osp
from glob import glob
from typing import Optional
from datumaro.components.dataset_base import DEFAULT_SUBSET_NAME
from datumaro.components.format_detection import FormatDetectionConfidence, FormatDetectionContext
from datumaro.components.importer import ImportContext
from datumaro.plugins.data_formats.coco.base import _CocoBase
from datumaro.plugins.data_formats.coco.format import CocoImporterType, CocoTask
from datumaro.plugins.data_formats.coco.importer import CocoImporter
[docs]
class MmdetCocoImporter(CocoImporter):
[docs]
@classmethod
def detect(
cls,
context: FormatDetectionContext,
) -> FormatDetectionConfidence:
ann_paths = context.require_files("annotations/instances_*.json")
for ann_path in ann_paths:
subset_name = cls._get_subset_name(ann_path)
with context.require_any():
with context.alternative():
image_files = osp.join(subset_name, "*.jpg")
context.require_file(f"{image_files}")
return FormatDetectionConfidence.MEDIUM
def __call__(self, path, stream: bool = False, **extra_params):
subset_paths = glob(osp.join(path, "**", "instances_*.json"), recursive=True)
sources = []
for subset_path in subset_paths:
options = dict(extra_params)
options["subset"] = self._get_subset_name(subset_path)
if stream:
options["stream"] = True
sources.append({"url": subset_path, "format": "mmdet_coco", "options": options})
return sources
@classmethod
def _get_subset_name(cls, subset_path: str):
parts = osp.splitext(osp.basename(subset_path))[0].split("instances_", maxsplit=1)
subset_name = parts[1] if len(parts) == 2 else DEFAULT_SUBSET_NAME
return subset_name
[docs]
class MmdetCocoBase(_CocoBase):
"""
Parses Roboflow COCO annotations written in the following format:
https://cocodataset.org/#format-data
"""
def __init__(
self,
path,
*,
subset: Optional[str] = None,
stream: bool = False,
ctx: Optional[ImportContext] = None,
):
super().__init__(
path,
task=CocoTask.instances,
coco_importer_type=CocoImporterType.mmdet,
subset=subset,
stream=stream,
ctx=ctx,
)