Source code for bob.bio.csu.algorithm.LRPCA

#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
# @author: Manuel Guenther <Manuel.Guenther@idiap.ch>
# @date: Mon Oct 29 09:27:59 CET 2012
#
# Copyright (C) 2011-2012 Idiap Research Institute, Martigny, Switzerland
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import facerec2010
import bob.bio.base
import numpy

from .. import utils


[docs]class LRPCA (bob.bio.base.algorithm.Algorithm): """This class defines a wrapper for the :py:class:`facerec2010.baseline.lda.LRPCA` class to be used as an image :py:class:`bob.bio.base.algorithm.Algorithm`. **Parameters:** TUNING : dict The tuning for the LRPCA algorithm as taken from the :py:attr:`facerec2010.baseline.lrpca.GBU_TUNING`. multiple_model_scoring : str The scoring strategy if models are enrolled from several images, see :py:func:`bob.bio.base.score_fusion_strategy` for more information. multiple_probe_scoring : str The scoring strategy if a score is computed from several probe images, see :py:func:`bob.bio.base.score_fusion_strategy` for more information. """ def __init__( self, TUNING = facerec2010.baseline.lrpca.GBU_TUNING, multiple_model_scoring = 'max', # by default, compute the average between several models and the probe multiple_probe_scoring = 'max' # by default, compute the average between the model and several probes ): bob.bio.base.algorithm.Algorithm.__init__(self, multiple_model_scoring=multiple_model_scoring, multiple_probe_scoring=multiple_probe_scoring, **TUNING) # initialize LRPCA (not sure if this is really required) self.lrpca = facerec2010.baseline.lrpca.LRPCA(**TUNING) def _check_feature(self, feature): """Assures that the feature is of the desired type""" assert isinstance(feature, numpy.ndarray) assert feature.ndim == 1 assert feature.dtype == numpy.float64 def _check_model(self, model): """Assures that the model is of the desired type""" assert isinstance(model, facerec2010.baseline.pca.FaceRecord) assert hasattr(model, "feature")
[docs] def enroll(self, enroll_features): """enroll(enroll_features) -> model Enrolls a model from features from several images by simply storing all given features. **Parameters:** enroll_features : [:py:class:`numpy.ndarray`] The features used to enroll the model. **Returns:** model : [:py:class:`facerec2010.baseline.pca.FaceRecord`] The model, which a collection of face records, storing the given ``enroll_features``. """ # no rule to enroll features in the LRPCA setup, so we just store all features # create model Face records model_records = [] for feature in enroll_features: model_record = facerec2010.baseline.pca.FaceRecord(None,None,None) model_record.feature = feature[:] model_records.append(model_record) return model_records
[docs] def write_model(self, model, model_file): """Saves the enrolled model to file using the :py:func:`bob.bio.csu.save_pickle` function. **Parameters:** model : [:py:class:`facerec2010.baseline.pca.FaceRecord`] The model to be written. model_file : str The name of the model file that is written. """ # just dump the model to .pkl file utils.save_pickle(model, model_file)
[docs] def read_model(self, model_file): """read_model(model_file) -> model Loads an enrolled model from file using the :py:func:`bob.bio.csu.load_pickle` function. **Parameters:** model_file : str The name of the model file to be read. **Returns:** model : [:py:class:`facerec2010.baseline.pca.FaceRecord`] The model read from file. """ # just read the model from .pkl file return utils.load_pickle(model_file)
[docs] def score(self, model, probe): """score(model, probe) -> score Compute the score for the given model (a list of FaceRecords) and a probe (a FaceRecord). **Parameters:** model : [:py:class:`facerec2010.baseline.pca.FaceRecord`] The model to compare, which is actually a list of extracted features. probe : :py:class:`numpy.ndarray` The probe to compare. **Returns**: score : float A score that was fused using the fusion function defined in the constructor of this class. """ if isinstance(model, list): # compute score fusion strategy with several model features (which is implemented in the base class) return self.score_for_multiple_models(model, probe) else: self._check_model(model) self._check_feature(probe) # compute score for one model and one probe probe_record = facerec2010.baseline.pca.FaceRecord(None,None,None) probe_record.feature = probe return self.lrpca.similarityMatrix([probe_record], [model])[0,0]