Source code for facereclib.tools.LGBPHS

#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
# Manuel Guenther <Manuel.Guenther@idiap.ch>

import bob.math

import numpy

from .Tool import Tool
from .. import utils

[docs]class LGBPHS (Tool): """Tool chain for computing local Gabor binary pattern histogram sequences""" def __init__( self, distance_function = bob.math.chi_square, is_distance_function = True, multiple_probe_scoring = 'average' ): """Initializes the local Gabor binary pattern histogram sequence tool""" # call base class constructor Tool.__init__( self, distance_function = str(distance_function), is_distance_function = is_distance_function, multiple_model_scoring = None, multiple_probe_scoring = multiple_probe_scoring ) # remember distance function self.m_distance_function = distance_function self.m_factor = -1. if is_distance_function else 1
[docs] def enroll(self, enroll_features): """Enrolling model by taking the average of all features""" sparse = len(enroll_features) > 0 and enroll_features[0].shape[0] == 2 if sparse: # get all indices for the sparse model values = {} # assert that we got sparse features assert enroll_features[0].shape[0] == 2 # iterate through all sparse features for i in range(len(enroll_features)): feature = enroll_features[i] # collect the values by index for j in range(feature.shape[1]): index = int(feature[0,j]) value = feature[1,j] / float(len(enroll_features)) # add up values if index in values: values[index] += value else: values[index] = value # create model containing all the used indices model = numpy.ndarray((2, len(values)), dtype = numpy.float64) i = 0 for index in sorted(values.keys()): model[0,i] = index model[1,i] = values[index] i += 1 else: model = numpy.zeros(enroll_features[0].shape, dtype = numpy.float64) # add up models for i in range(len(enroll_features)): model += enroll_features[i] # normalize by number of models model /= float(len(enroll_features)) # return averaged model return model
[docs] def score(self, model, probe): """Computes the score using the specified histogram measure; returns a similarity value (bigger -> better)""" sparse = model.shape[0] == 2 if sparse: # assure that the probe is sparse as well sparse_probe = utils.histogram.sparsify(probe) return self.m_factor * self.m_distance_function(model[0,:], model[1,:], sparse_probe[0,:], sparse_probe[1,:]) else: return self.m_factor * self.m_distance_function(model.flatten(), probe.flatten())