Source code for tensorbay.opendataset.HardHatWorkers.loader

#!/usr/bin/env python3
#
# Copyright 2021 Graviti. Licensed under MIT License.
#
# pylint: disable=invalid-name

"""Dataloader of HardHatWorker dataset."""

import os
from typing import Any, List

from tensorbay.dataset import Data, Dataset
from tensorbay.label import LabeledBox2D
from tensorbay.opendataset._utility import glob

try:
    import xmltodict
except ModuleNotFoundError:
    from tensorbay.opendataset._utility.mocker import xmltodict  # pylint:disable=ungrouped-imports

DATASET_NAME = "HardHatWorkers"


[docs]def HardHatWorkers(path: str) -> Dataset: """`Hard Hat Workers <https://makeml.app/datasets/hard-hat-workers>`_ dataset. The file structure should be like:: <path> annotations/ hard_hat_workers0.xml ... images/ hard_hat_workers0.png ... Arguments: path: The root directory of the dataset. Returns: Loaded :class:`~tensorbay.dataset.dataset.Dataset` instance. """ root_path = os.path.abspath(os.path.expanduser(path)) annotation_dir = os.path.join(root_path, "annotations") dataset = Dataset(DATASET_NAME) dataset.load_catalog(os.path.join(os.path.dirname(__file__), "catalog.json")) segment = dataset.create_segment() image_paths = glob(os.path.join(root_path, "images", "*.png")) for image_path in image_paths: data = Data(image_path) data.label.box2d = _load_labels( os.path.join(annotation_dir, f"{os.path.splitext(os.path.basename(image_path))[0]}.xml") ) segment.append(data) return dataset
def _load_labels(label_file: str) -> List[LabeledBox2D]: with open(label_file, encoding="utf-8") as fp: labels: Any = xmltodict.parse(fp.read()) objects = labels["annotation"]["object"] box2ds = [] if not isinstance(objects, list): objects = [objects] for obj in objects: bndbox = obj["bndbox"] box2ds.append( LabeledBox2D( xmin=float(bndbox["xmin"]), ymin=float(bndbox["ymin"]), xmax=float(bndbox["xmax"]), ymax=float(bndbox["ymax"]), category=obj["name"], ) ) return box2ds