Source code for bob.pad.base.database.csv_dataset

#!/usr/bin/env python
# vim: set fileencoding=utf-8 :


from bob.bio.base.database.legacy import check_parameters_for_validity
from bob.pad.base.pipelines.abstract_classes import Database
from bob.pipelines.datasets import FileListDatabase


def validate_pad_sample(sample):
    if not hasattr(sample, "subject"):
        raise RuntimeError(
            "PAD samples should contain a `subject` attribute which "
            "reveals the identifies the person from whom the sample is created."
        )
    if not hasattr(sample, "attack_type"):
        raise RuntimeError(
            "PAD samples should contain a `attack_type` attribute which "
            "should be '' for bona fide samples and something like "
            "print, replay, mask, etc. for attacks. This attribute is "
            "considered the PAI type of each attack is used to compute APCER."
        )
    if sample.attack_type == "":
        sample.attack_type = None
    sample.is_bonafide = sample.attack_type is None
    if not hasattr(sample, "key"):
        sample.key = sample.filename
    return sample


class FileListPadDatabase(Database, FileListDatabase):
    """A PAD database interface from CSV files."""

    def __init__(
        self,
        dataset_protocols_path,
        protocol,
        transformer=None,
        **kwargs,
    ):
        super().__init__(
            dataset_protocols_path=dataset_protocols_path,
            protocol=protocol,
            transformer=transformer,
            **kwargs,
        )

    def __repr__(self) -> str:
        return "FileListPadDatabase(dataset_protocols_path='{}', protocol='{}', transformer={})".format(
            self.dataset_protocols_path, self.protocol, self.transformer
        )

[docs] def purposes(self): return ("real", "attack")
[docs] def samples(self, groups=None, purposes=None): results = super().samples(groups=groups) purposes = check_parameters_for_validity( purposes, "purposes", self.purposes(), self.purposes() ) def _filter(s): return (s.is_bonafide and "real" in purposes) or ( (not s.is_bonafide) and "attack" in purposes ) results = [validate_pad_sample(sample) for sample in results] results = list(filter(_filter, results)) return results
[docs] def fit_samples(self): return self.samples(groups="train")
[docs] def predict_samples(self, group="dev"): return self.samples(groups=group)