Skip to content
Snippets Groups Projects
Commit 8d0d6271 authored by Tiago de Freitas Pereira's avatar Tiago de Freitas Pereira Committed by Amir MOHAMMADI
Browse files

Created legacy mixin for preprocessor and extractors

parent 54d0ebfb
No related branches found
No related tags found
1 merge request!180[dask] Preparing bob.bio.base for dask pipelines
......@@ -13,3 +13,4 @@ sphinx
dist
build
record.txt
.DS_Store
# from bob.bio.base.pipelines.vanilla_biometrics.legacy import DatabaseConnector, AlgorithmAdaptor
import bob.db.atnt
from bob.bio.base.pipelines.vanilla_biometrics.legacy import DatabaseConnector
database = DatabaseConnector(bob.db.atnt.Database(), protocol="Default")
from sklearn.pipeline import Pipeline, make_pipeline
from sklearn.decomposition import PCA
from bob.pipelines.mixins import CheckpointMixin, SampleMixin
from bob.bio.base.mixins import CheckpointSampleLinearize
from bob.bio.base.mixins.legacy import LegacyProcessorMixin
class CheckpointSamplePCA(CheckpointMixin, SampleMixin, PCA):
"""
Enables SAMPLE and CHECKPOINTIN handling for https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html
"""
pass
#### PREPROCESSOR LEGACY ###
import functools
# Cropping
CROPPED_IMAGE_HEIGHT = 80
CROPPED_IMAGE_WIDTH = CROPPED_IMAGE_HEIGHT * 4 // 5
# eye positions for frontal images
RIGHT_EYE_POS = (CROPPED_IMAGE_HEIGHT // 5, CROPPED_IMAGE_WIDTH // 4 - 1)
LEFT_EYE_POS = (CROPPED_IMAGE_HEIGHT // 5, CROPPED_IMAGE_WIDTH // 4 * 3)
# RANDOM EYES POSITIONS
# I JUST MADE UP THESE NUMBERS
FIXED_RIGHT_EYE_POS = (30, 30)
FIXED_LEFT_EYE_POS = (20, 50)
import bob.bio.face
face_cropper = functools.partial(
bob.bio.face.preprocessor.FaceCrop,
cropped_image_size=(CROPPED_IMAGE_HEIGHT, CROPPED_IMAGE_WIDTH),
cropped_positions={"leye": LEFT_EYE_POS, "reye": RIGHT_EYE_POS},
fixed_positions={"leye": FIXED_LEFT_EYE_POS, "reye": FIXED_RIGHT_EYE_POS},
)
from bob.pipelines.mixins import mix_me_up
preprocessor = mix_me_up((CheckpointMixin, SampleMixin), LegacyProcessorMixin)
from bob.pipelines.mixins import dask_it
extractor = Pipeline(
steps=[
("0", preprocessor(callable=face_cropper, features_dir="./example/extractor0")),
("1", CheckpointSampleLinearize(features_dir="./example/extractor1")),
(
"2",
CheckpointSamplePCA(
features_dir="./example/extractor2", model_path="./example/pca.pkl"
),
),
]
)
# extractor = dask_it(extractor)
from bob.bio.base.pipelines.vanilla_biometrics.biometric_algorithm import (
Distance,
BiometricAlgorithmCheckpointMixin,
)
class CheckpointDistance(BiometricAlgorithmCheckpointMixin, Distance):
pass
algorithm = CheckpointDistance(features_dir="./example/")
# algorithm = Distance()
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
# @author: Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
"""
Mixins to handle legacy components
"""
from bob.pipelines.mixins import CheckpointMixin, SampleMixin
from sklearn.base import TransformerMixin
from sklearn.utils.validation import check_array
class LegacyProcessorMixin(TransformerMixin):
"""Class that wraps :py:class:`bob.bio.base.preprocessor.Preprocessor` and
:py:class:`bob.bio.base.extractor.Extractors`
Example
-------
Wrapping preprocessor with functtools
>>> from bob.bio.base.mixins.legacy import LegacyProcessorMixin
>>> from bob.bio.face.preprocessor import FaceCrop
>>> import functools
>>> transformer = LegacyProcessorMixin(functools.partial(FaceCrop, cropped_image_size=(10,10)))
Example
-------
Wrapping extractor
>>> from bob.bio.base.mixins.legacy import LegacyProcessorMixin
>>> from bob.bio.face.extractor import Linearize
>>> transformer = LegacyProcessorMixin(Linearize)
Parameters
----------
callable: callable
Calleble function that instantiates the scikit estimator
"""
def __init__(self, callable=None):
self.callable = callable
self.instance = None
def fit(self, X, y=None, **fit_params):
return self
def transform(self, X):
X = check_array(X, allow_nd=True)
# Instantiates and do the "real" transform
if self.instance is None:
self.instance = self.callable()
return [self.instance(x) for x in X]
......@@ -201,8 +201,8 @@ def vanilla_biometrics(
else:
raise TypeError("The output of the pipeline is not writeble")
dask_client.shutdown()
if dask_client is not None:
dask_client.shutdown()
@click.command()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment