From edf4910f938835ca400c1d3b8eb9b634abaf41b5 Mon Sep 17 00:00:00 2001 From: Amir MOHAMMADI <amir.mohammadi@idiap.ch> Date: Thu, 14 Feb 2019 11:18:10 +0100 Subject: [PATCH] Fixes #8 Algorithm.read_toscore_object should not exist --- bob/pad/base/algorithm/Algorithm.py | 25 +++---------------------- bob/pad/base/script/spoof.py | 1 + bob/pad/base/tools/scoring.py | 17 +++++++++++------ 3 files changed, 15 insertions(+), 28 deletions(-) diff --git a/bob/pad/base/algorithm/Algorithm.py b/bob/pad/base/algorithm/Algorithm.py index 2d18387..71f8b2f 100644 --- a/bob/pad/base/algorithm/Algorithm.py +++ b/bob/pad/base/algorithm/Algorithm.py @@ -85,7 +85,9 @@ class Algorithm(object): **Parameters:** toscore : object - The object to compute the score for. + The object to compute the score for. This will be the output of + extractor if performs_projection is False, otherwise this will be the + output of project method of the algorithm. **Returns:** @@ -159,27 +161,6 @@ class Algorithm(object): """ return utils.load(feature_file) - def read_toscore_object(self, toscore_object_file): - """read_toscore_object(toscore_object_file) -> toscore_object - - Reads the toscore_object feature from a file. - By default, the toscore_object feature is identical to the projected feature. - Hence, this base class implementation simply calls :py:meth:`read_feature`. - - If your algorithm requires different behavior, please overwrite this function. - - **Parameters:** - - toscore_object_file : str or :py:class:`bob.io.base.HDF5File` - The file open for reading, or the file name to read from. - - **Returns:** - - toscore_object : object - The toscore_object that was read from file. - """ - return self.read_feature(toscore_object_file) - def train_projector(self, training_features, projector_file): """This function can be overwritten to train the feature projector. If you do this, please also register the function by calling this base class constructor diff --git a/bob/pad/base/script/spoof.py b/bob/pad/base/script/spoof.py index 094bc48..76d28b6 100644 --- a/bob/pad/base/script/spoof.py +++ b/bob/pad/base/script/spoof.py @@ -202,6 +202,7 @@ def execute(args): elif args.sub_task == 'compute-scores': tools.compute_scores( args.algorithm, + args.extractor, groups=[args.group], allow_missing_files=args.allow_missing_files, force=args.force, diff --git a/bob/pad/base/tools/scoring.py b/bob/pad/base/tools/scoring.py index 9e145c9..b6bd9b0 100644 --- a/bob/pad/base/tools/scoring.py +++ b/bob/pad/base/tools/scoring.py @@ -23,7 +23,7 @@ from .FileSelector import FileSelector from bob.bio.base import utils -def _compute_scores(algorithm, toscore_objects, allow_missing_files): +def _compute_scores(algorithm, extractor, toscore_objects, allow_missing_files): """Compute scores for the given list of objects using provided algorithm. """ # the scores to be computed @@ -37,7 +37,10 @@ def _compute_scores(algorithm, toscore_objects, allow_missing_files): scores.insert(i, [numpy.nan]) continue # read toscore - toscore = algorithm.read_toscore_object(toscore_element) + if algorithm.performs_projection: + toscore = algorithm.read_feature(toscore_element) + else: + toscore = extractor.read_feature(toscore_element) # compute score if isinstance(toscore, list) or isinstance(toscore[0], numpy.ndarray): scores.insert(i, algorithm.score_for_multiple_projections(toscore)) @@ -120,7 +123,7 @@ def _save_scores(score_file, scores, toscore_objects, write_compressed=False): _close_written(score_file, f, write_compressed) -def _scores_all(algorithm, group, force, allow_missing_files=False, write_compressed=False): +def _scores_all(algorithm, extractor, group, force, allow_missing_files=False, write_compressed=False): """Computes scores for all (real, attack) files in a given group using the provided algorithm.""" # the file selector object fs = FileSelector.instance() @@ -148,7 +151,7 @@ def _scores_all(algorithm, group, force, allow_missing_files=False, write_compre # get the attack files current_files = fs.get_paths(current_objects, 'projected' if algorithm.performs_projection else 'extracted') # compute scores for the list of File objects - cur_scores = _compute_scores(algorithm, current_files, allow_missing_files) + cur_scores = _compute_scores(algorithm, extractor, current_files, allow_missing_files) total_scores += cur_scores # Save scores to text file _save_scores(score_file, cur_scores, current_objects, write_compressed) @@ -164,7 +167,7 @@ def _scores_all(algorithm, group, force, allow_missing_files=False, write_compre current_toscore_objects[0]+current_toscore_objects[1], write_compressed) -def compute_scores(algorithm, force=False, groups=['dev', 'eval'], allow_missing_files=False, write_compressed=False): +def compute_scores(algorithm, extractor, force=False, groups=['dev', 'eval'], allow_missing_files=False, write_compressed=False): """Computes the scores for the given groups. This function computes all scores for the experiment and writes them to score files. @@ -175,6 +178,8 @@ def compute_scores(algorithm, force=False, groups=['dev', 'eval'], allow_missing algorithm : py:class:`bob.bio.base.algorithm.Algorithm` or derived The algorithm, used for enrolling model and writing them to file. + extractor : py:class:`bob.bio.base.extractor.Extractor` or derived + force : bool If given, files are regenerated, even if they already exist. @@ -192,4 +197,4 @@ def compute_scores(algorithm, force=False, groups=['dev', 'eval'], allow_missing algorithm.load_projector(fs.projector_file) for group in groups: - _scores_all(algorithm, group, force, allow_missing_files, write_compressed) + _scores_all(algorithm, extractor, group, force, allow_missing_files, write_compressed) -- GitLab