Source code for datumaro.plugins.data_formats.kitti_3d.importer

# Copyright (C) 2024 Intel Corporation
#
# SPDX-License-Identifier: MIT

import os.path as osp
from typing import List

from datumaro.components.errors import DatasetImportError
from datumaro.components.format_detection import FormatDetectionConfidence, FormatDetectionContext
from datumaro.components.importer import Importer

from .format import Kitti3dPath


[docs] class Kitti3dImporter(Importer): _ANNO_EXT = ".txt"
[docs] @classmethod def detect(cls, context: FormatDetectionContext) -> FormatDetectionConfidence: context.require_file(f"{Kitti3dPath.CALIB_DIR}/*.txt") cls._check_ann_file(context.require_file(f"{Kitti3dPath.LABEL_DIR}/*.txt"), context) return FormatDetectionConfidence.MEDIUM
@classmethod def _check_ann_file(cls, fpath: str, context: FormatDetectionContext) -> bool: with context.probe_text_file( fpath, "Requirements for the annotation file of Kitti 3D format" ) as fp: for line in fp: fields = line.rstrip("\n").split(" ") if len(fields) == 15 or len(fields) == 16: return True raise DatasetImportError( f"Kitti 3D format txt file should have 15 or 16 fields for " f"each line, but the read line has {len(fields)} fields: " f"fields={fields}." ) raise DatasetImportError("Empty file is not allowed.")
[docs] @classmethod def get_file_extensions(cls) -> List[str]: return [cls._ANNO_EXT]
[docs] @classmethod def find_sources(cls, path): # return [{"url": path, "format": "kitti3d"}] sources = cls._find_sources_recursive( path, "", "kitti3d", dirname=Kitti3dPath.LABEL_DIR, file_filter=lambda p: osp.isdir(p) ) if len(sources) == 0: return [{"url": path, "format": "kitti3d"}] else: return sources