Source code for tensorbay.opendataset.BioIDFace.loader

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

"""Dataloader of BioIDFace dataset."""

import os
from itertools import islice
from typing import List

from tensorbay.dataset import Data, Dataset
from tensorbay.geometry import Keypoint2D
from tensorbay.label import LabeledKeypoints2D
from tensorbay.opendataset._utility import glob

DATASET_NAME = "BioIDFace"


[docs]def BioIDFace(path: str) -> Dataset: """`BioID Face <https://www.bioid.com/facedb/>`_ dataset. The folder structure should be like:: <path> BioID-FaceDatabase-V1.2/ BioID_0000.eye BioID_0000.pgm ... points_20/ bioid_0000.pts 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)) 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, "BioID-FaceDatabase-V1.2", "*.pgm")) face_keypoints_paths = glob(os.path.join(root_path, "points_20", "*.pts")) for image_path, face_keypoints_path in zip(image_paths, face_keypoints_paths): data = Data(image_path) data.label.keypoints2d = _get_label( f"{os.path.splitext(image_path)[0]}.eye", face_keypoints_path ) segment.append(data) return dataset
def _get_label(eye_keypoints_path: str, face_keypoints_path: str) -> List[LabeledKeypoints2D]: eye_keypoints = LabeledKeypoints2D(category="EyePosition") with open(eye_keypoints_path, encoding="utf-8") as fp: fp.readline() # The first line is like: #LX LY RX RY lx, ly, rx, ry = map(int, fp.readline().split()) eye_keypoints.append(Keypoint2D(lx, ly)) eye_keypoints.append(Keypoint2D(rx, ry)) face_keypoints = LabeledKeypoints2D(category="Face") with open(face_keypoints_path, encoding="utf-8") as fp: # The annotation file is like: # 1 version: 1 # 2 n_points: 20 # 3 { # 4 159.128 108.541 # ... # 24 } for line in islice(fp, 3, 23): x, y = map(float, line.split()) face_keypoints.append(Keypoint2D(x, y)) return [eye_keypoints, face_keypoints]