Skip to content
Snippets Groups Projects
Commit ad03fddc authored by Manuel Günther's avatar Manuel Günther
Browse files

Merge branch '19-algorithm-read_probe-should-be-removed' into 'master'

Removed read_probe; ISV.read_feature now always reads the Ux (which is written by write_feature)

Closes #19

See merge request !10
parents 1e632c95 f43a9525
No related branches found
No related tags found
1 merge request!10Removed read_probe; ISV.read_feature now always reads the Ux (which is written by write_feature)
Pipeline #
......@@ -216,8 +216,6 @@ class GMM (Algorithm):
"""Reads the model, which is a GMM machine"""
return bob.learn.em.GMMMachine(bob.io.base.HDF5File(model_file))
read_probe = read_feature
def score(self, model, probe):
"""Computes the score for the given model and the given probe using the scoring function from the config file"""
assert isinstance(model, bob.learn.em.GMMMachine)
......@@ -267,11 +265,6 @@ class GMMRegular (GMM):
######################################################
################ Feature comparison ##################
def read_probe(self, probe_file):
"""Reads a feature from file, which is supposed to be a simple 2D array"""
return bob.bio.base.load(probe_file)
def score(self, model, probe):
"""Computes the score for the given model and the given probe.
The score are Log-Likelihood.
......
......@@ -151,15 +151,25 @@ class ISV (GMM):
hdf5file = bob.io.base.HDF5File(feature_file)
hdf5file.cd('gmmstats')
gmmstats = bob.learn.em.GMMStats(hdf5file)
return gmmstats
hdf5file.cd('..')
Ux = hdf5file.read('Ux')
return [gmmstats, Ux]
def _check_projected(self, probe):
"""Checks that the probe is of the desired type"""
assert isinstance(probe, (tuple, list))
assert len(probe) == 2
assert isinstance(probe[0], bob.learn.em.GMMStats)
assert isinstance(probe[1], numpy.ndarray) and probe[1].ndim == 1 and probe[1].dtype == numpy.float64
def enroll(self, enroll_features):
"""Performs ISV enrollment"""
for feature in enroll_features:
assert isinstance(feature, bob.learn.em.GMMStats)
self._check_projected(feature)
machine = bob.learn.em.ISVMachine(self.isvbase)
self.isv_trainer.enroll(machine, enroll_features, self.isv_enroll_iterations)
self.isv_trainer.enroll(machine, [f[0] for f in enroll_features], self.isv_enroll_iterations)
# return the resulting gmm
return machine
......@@ -172,27 +182,12 @@ class ISV (GMM):
machine.isv_base = self.isvbase
return machine
def read_probe(self, probe_file):
"""Read the type of features that we require, namely GMMStats"""
hdf5file = bob.io.base.HDF5File(probe_file)
hdf5file.cd('gmmstats')
gmmstats = bob.learn.em.GMMStats(hdf5file)
hdf5file.cd('..')
Ux = hdf5file.read('Ux')
return [gmmstats, Ux]
def _check_probe(self, probe):
"""Checks that the probe is of the desired type"""
assert isinstance(probe, (tuple, list))
assert len(probe) == 2
assert isinstance(probe[0], bob.learn.em.GMMStats)
assert isinstance(probe[1], numpy.ndarray) and probe[1].ndim == 1 and probe[1].dtype == numpy.float64
def score(self, model, probe):
"""Computes the score for the given model and the given probe."""
assert isinstance(model, bob.learn.em.ISVMachine)
self._check_probe(probe)
self._check_projected(probe)
gmmstats = probe[0]
Ux = probe[1]
......@@ -201,7 +196,7 @@ class ISV (GMM):
def score_for_multiple_probes(self, model, probes):
"""This function computes the score between the given model and several given probe files."""
assert isinstance(model, bob.learn.em.ISVMachine)
[self._check_probe(probe) for probe in probes]
[self._check_projected(probe) for probe in probes]
if self.probe_fusion_function is not None:
# When a multiple probe fusion function is selected, use it
return Algorithm.score_for_multiple_probes(self, model, probes)
......
......@@ -71,10 +71,10 @@ class IVector (GMM):
self.use_plda = use_plda
self.subspace_dimension_of_t = subspace_dimension_of_t
self.tv_training_iterations = tv_training_iterations
self.ivector_trainer = bob.learn.em.IVectorTrainer(update_sigma=update_sigma)
self.whitening_trainer = bob.learn.linear.WhiteningTrainer()
self.lda_dim = lda_dim
self.lda_trainer = bob.learn.linear.FisherLDATrainer(strip_to_rank=False)
self.wccn_trainer = bob.learn.linear.WCCNTrainer()
......@@ -82,7 +82,7 @@ class IVector (GMM):
self.plda_dim_F = plda_dim_F
self.plda_dim_G = plda_dim_G
self.plda_training_iterations = plda_training_iterations
def _check_ivector(self, feature):
......@@ -131,7 +131,7 @@ class IVector (GMM):
def train_projector(self, train_features, projector_file):
"""Train Projector and Enroller at the same time"""
[self._check_feature(feature) for client in train_features for feature in client]
train_features_flatten = [feature for client in train_features for feature in client]
......@@ -158,15 +158,15 @@ class IVector (GMM):
self.train_whitener(train_ivectors_flatten)
# whitening and length-normalizing i-vectors
train_ivectors = [[self.project_whitening(ivec) for ivec in client] for client in train_ivectors]
if self.use_lda:
self.train_lda(train_ivectors)
train_ivectors = [[self.project_lda(ivec) for ivec in client] for client in train_ivectors]
if self.use_wccn:
self.train_wccn(train_ivectors)
train_ivectors = [[self.project_wccn(ivec) for ivec in client] for client in train_ivectors]
if self.use_plda:
self.train_plda(train_ivectors)
......@@ -191,7 +191,7 @@ class IVector (GMM):
hdf5file.create_group('Whitener')
hdf5file.cd('Whitener')
self.whitener.save(hdf5file)
if self.use_lda:
hdf5file.cd('/')
hdf5file.create_group('LDA')
......@@ -203,13 +203,13 @@ class IVector (GMM):
hdf5file.create_group('WCCN')
hdf5file.cd('WCCN')
self.wccn.save(hdf5file)
if self.use_plda:
hdf5file.cd('/')
hdf5file.create_group('PLDA')
hdf5file.cd('PLDA')
self.plda_base.save(hdf5file)
def load_tv(self, tv_file):
hdf5file = bob.io.base.HDF5File(tv_file)
......@@ -228,12 +228,12 @@ class IVector (GMM):
def load_wccn(self, wccn_file):
hdf5file = bob.io.base.HDF5File(wccn_file)
self.wccn = bob.learn.linear.Machine(hdf5file)
def load_plda(self, plda_file):
hdf5file = bob.io.base.HDF5File(plda_file)
self.plda_base = bob.learn.em.PLDABase(hdf5file)
self.plda_machine = bob.learn.em.PLDAMachine(self.plda_base)
def load_projector(self, projector_file):
"""Load the GMM and the ISV model from the same HDF5 file"""
hdf5file = bob.io.base.HDF5File(projector_file)
......@@ -250,18 +250,18 @@ class IVector (GMM):
# Load Whitening
hdf5file.cd('/Whitener')
self.load_whitener(hdf5file)
if self.use_lda:
# Load LDA
hdf5file.cd('/LDA')
self.load_lda(hdf5file)
if self.use_wccn:
if self.use_wccn:
# Load WCCN
hdf5file.cd('/WCCN')
self.load_wccn(hdf5file)
if self.use_plda:
if self.use_plda:
# Load PLDA
hdf5file.cd('/PLDA')
self.load_plda(hdf5file)
......@@ -338,9 +338,6 @@ class IVector (GMM):
else:
return bob.bio.base.load(model_file)
def read_probe(self, probe_file):
"""read probe file which is an i-vector"""
return bob.bio.base.load(probe_file)
def score(self, model, probe):
"""Computes the score for the given model and the given probe."""
......
......@@ -114,8 +114,6 @@ class JFA (GMM):
machine.jfa_base = self.jfa_base
return machine
read_probe = read_feature
def score(self, model, probe):
"""Computes the score for the given model and the given probe"""
assert isinstance(model, bob.learn.em.JFAMachine)
......
......@@ -119,7 +119,7 @@ def test_gmm():
_compare(model, pkg_resources.resource_filename('bob.bio.gmm.test', 'data/gmm_model.hdf5'), gmm1.write_model, gmm1.read_model)
# compare model with probe
probe = gmm1.read_probe(pkg_resources.resource_filename('bob.bio.gmm.test', 'data/gmm_projected.hdf5'))
probe = gmm1.read_feature(pkg_resources.resource_filename('bob.bio.gmm.test', 'data/gmm_projected.hdf5'))
reference_score = -0.01676570
assert abs(gmm1.score(model, probe) - reference_score) < 1e-5, "The scores differ: %3.8f, %3.8f" % (gmm1.score(model, probe), reference_score)
assert abs(gmm1.score_for_multiple_probes(model, [probe, probe]) - reference_score) < 1e-5
......@@ -227,17 +227,17 @@ def test_isv():
assert len(projected) == 2
assert isinstance(projected[0], bob.learn.em.GMMStats)
assert isinstance(projected[1], numpy.ndarray)
_compare_complex(projected, pkg_resources.resource_filename('bob.bio.gmm.test', 'data/isv_projected.hdf5'), isv1.write_feature, isv1.read_probe)
_compare_complex(projected, pkg_resources.resource_filename('bob.bio.gmm.test', 'data/isv_projected.hdf5'), isv1.write_feature, isv1.read_feature)
# enroll model from random features
random_features = utils.random_training_set((20,45), count=5, minimum=-5., maximum=5.)
enroll_features = [isv1.project(feature)[0] for feature in random_features]
enroll_features = [isv1.project(feature) for feature in random_features]
model = isv1.enroll(enroll_features)
assert isinstance(model, bob.learn.em.ISVMachine)
_compare(model, pkg_resources.resource_filename('bob.bio.gmm.test', 'data/isv_model.hdf5'), isv1.write_model, isv1.read_model)
# compare model with probe
probe = isv1.read_probe(pkg_resources.resource_filename('bob.bio.gmm.test', 'data/isv_projected.hdf5'))
probe = isv1.read_feature(pkg_resources.resource_filename('bob.bio.gmm.test', 'data/isv_projected.hdf5'))
reference_score = 0.02136784
assert abs(isv1.score(model, probe) - reference_score) < 1e-5, "The scores differ: %3.8f, %3.8f" % (isv1.score(model, probe), reference_score)
# assert abs(isv1.score_for_multiple_probes(model, [probe]*4) - reference_score) < 1e-5, isv1.score_for_multiple_probes(model, [probe, probe])
......@@ -321,7 +321,7 @@ def test_jfa():
_compare(model, pkg_resources.resource_filename('bob.bio.gmm.test', 'data/jfa_model.hdf5'), jfa1.write_model, jfa1.read_model)
# compare model with probe
probe = jfa1.read_probe(pkg_resources.resource_filename('bob.bio.gmm.test', 'data/gmm_projected.hdf5'))
probe = jfa1.read_feature(pkg_resources.resource_filename('bob.bio.gmm.test', 'data/gmm_projected.hdf5'))
reference_score = 0.02225812
assert abs(jfa1.score(model, probe) - reference_score) < 1e-5, "The scores differ: %3.8f, %3.8f" % (jfa1.score(model, probe), reference_score)
# TODO: implement that
......@@ -386,7 +386,7 @@ def test_ivector_cosine():
_compare(model, pkg_resources.resource_filename('bob.bio.gmm.test', 'data/ivector_model.hdf5'), ivec1.write_model, ivec1.read_model)
# compare model with probe
probe = ivec1.read_probe(pkg_resources.resource_filename('bob.bio.gmm.test', 'data/ivector_projected.hdf5'))
probe = ivec1.read_feature(pkg_resources.resource_filename('bob.bio.gmm.test', 'data/ivector_projected.hdf5'))
reference_score = -0.00187151
assert abs(ivec1.score(model, probe) - reference_score) < 1e-5, "The scores differ: %3.8f, %3.8f" % (ivec1.score(model, probe), reference_score)
# TODO: implement that
......@@ -449,7 +449,7 @@ def test_ivector_plda():
_compare(model, pkg_resources.resource_filename('bob.bio.gmm.test', 'data/ivector2_model.hdf5'), ivec1.write_model, ivec1.read_model)
# compare model with probe
probe = ivec1.read_probe(pkg_resources.resource_filename('bob.bio.gmm.test', 'data/ivector2_projected.hdf5'))
probe = ivec1.read_feature(pkg_resources.resource_filename('bob.bio.gmm.test', 'data/ivector2_projected.hdf5'))
logger.info("%f" %ivec1.score(model, probe))
reference_score = 1.21879822
assert abs(ivec1.score(model, probe) - reference_score) < 1e-5, "The scores differ: %3.8f, %3.8f" % (ivec1.score(model, probe), reference_score)
......@@ -514,7 +514,7 @@ def test_ivector_lda_wccn_plda():
_compare(model, pkg_resources.resource_filename('bob.bio.gmm.test', 'data/ivector3_model.hdf5'), ivec1.write_model, ivec1.read_model)
# compare model with probe
probe = ivec1.read_probe(pkg_resources.resource_filename('bob.bio.gmm.test', 'data/ivector3_projected.hdf5'))
probe = ivec1.read_feature(pkg_resources.resource_filename('bob.bio.gmm.test', 'data/ivector3_projected.hdf5'))
reference_score = 0.338051
assert abs(ivec1.score(model, probe) - reference_score) < 1e-5, "The scores differ: %3.8f, %3.8f" % (ivec1.score(model, probe), reference_score)
assert abs(ivec1.score_for_multiple_probes(model, [probe, probe]) - reference_score) < 1e-5
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment