Skip to content
Snippets Groups Projects
Commit bf936a42 authored by Pavel KORSHUNOV's avatar Pavel KORSHUNOV
Browse files

allow missing files projector

parent f147e798
No related branches found
No related tags found
1 merge request!18Adding allow-missing-files to projection and scoring
Pipeline #
...@@ -22,20 +22,26 @@ from .FileSelector import FileSelector ...@@ -22,20 +22,26 @@ from .FileSelector import FileSelector
from bob.bio.base import utils from bob.bio.base import utils
def _compute_scores(algorithm, toscore_objects): def _compute_scores(algorithm, toscore_objects, allow_missing_files):
"""Compute scores for the given list of objectis using provided algorithm. """Compute scores for the given list of objects using provided algorithm.
""" """
# the scores to be computed # the scores to be computed; initialized with NaN
scores = [] scores = numpy.ones((1, len(toscore_objects)), numpy.float64) * numpy.nan
scores = numpy.reshape(scores, [len(toscore_objects)])
# Loops over the toscore sets # Loops over the toscore sets
for i, toscore_element in enumerate(toscore_objects): for i, toscore_element in enumerate(toscore_objects):
# filter missing files
if allow_missing_files and not os.path.exists(toscore_element):
# we keep the NaN score
continue
# read toscore # read toscore
toscore = algorithm.read_toscore_object(toscore_element) toscore = algorithm.read_toscore_object(toscore_element)
# compute score # compute score
if isinstance(toscore, list) or isinstance(toscore[0], numpy.ndarray): if isinstance(toscore, list) or isinstance(toscore[0], numpy.ndarray):
scores.insert(i, algorithm.score_for_multiple_projections(toscore)) scores[i] = algorithm.score_for_multiple_projections(toscore)
else: else:
scores.insert(i, algorithm.score(toscore)) scores[i] = algorithm.score(toscore)
# Returns the scores # Returns the scores
return scores return scores
...@@ -100,8 +106,11 @@ def _save_scores(score_file, scores, toscore_objects, write_compressed=False): ...@@ -100,8 +106,11 @@ def _save_scores(score_file, scores, toscore_objects, write_compressed=False):
for i, toscore_object in enumerate(toscore_objects): for i, toscore_object in enumerate(toscore_objects):
id_str = (str(toscore_object.client_id)).zfill(3) id_str = (str(toscore_object.client_id)).zfill(3)
sample_name = str(toscore_object.make_path()) sample_name = str(toscore_object.make_path())
# scores[i] is a list, so
# each sample is allowed to have multiple scores
for score in scores[i]: for score in scores[i]:
if not toscore_object.attack_type or toscore_object.attack_type=="None": if not toscore_object.attack_type or toscore_object.attack_type == "None":
_write(f, "%s %s %s %.12f\n" % (id_str, id_str, sample_name, score), write_compressed) _write(f, "%s %s %s %.12f\n" % (id_str, id_str, sample_name, score), write_compressed)
else: else:
attackname = toscore_object.attack_type attackname = toscore_object.attack_type
...@@ -110,7 +119,7 @@ def _save_scores(score_file, scores, toscore_objects, write_compressed=False): ...@@ -110,7 +119,7 @@ def _save_scores(score_file, scores, toscore_objects, write_compressed=False):
_close_written(score_file, f, write_compressed) _close_written(score_file, f, write_compressed)
def _scores_all(algorithm, group, force, write_compressed=False): def _scores_all(algorithm, group, force, allow_missing_files=False, write_compressed=False):
"""Computes scores for all (real, attack) files in a given group using the provided algorithm.""" """Computes scores for all (real, attack) files in a given group using the provided algorithm."""
# the file selector object # the file selector object
fs = FileSelector.instance() fs = FileSelector.instance()
...@@ -136,7 +145,7 @@ def _scores_all(algorithm, group, force, write_compressed=False): ...@@ -136,7 +145,7 @@ def _scores_all(algorithm, group, force, write_compressed=False):
# get the attack files # get the attack files
current_files = fs.get_paths(current_objects, 'projected' if algorithm.performs_projection else 'extracted') current_files = fs.get_paths(current_objects, 'projected' if algorithm.performs_projection else 'extracted')
# compute scores for the list of File objects # compute scores for the list of File objects
cur_scores = _compute_scores(algorithm, current_files) cur_scores = _compute_scores(algorithm, current_files, allow_missing_files)
total_scores += cur_scores total_scores += cur_scores
# Save scores to text file # Save scores to text file
_save_scores(score_file, cur_scores, current_objects, write_compressed) _save_scores(score_file, cur_scores, current_objects, write_compressed)
...@@ -175,4 +184,4 @@ def compute_scores(algorithm, force=False, groups=['dev', 'eval'], allow_missing ...@@ -175,4 +184,4 @@ def compute_scores(algorithm, force=False, groups=['dev', 'eval'], allow_missing
algorithm.load_projector(fs.projector_file) algorithm.load_projector(fs.projector_file)
for group in groups: for group in groups:
_scores_all(algorithm, group, force, write_compressed) _scores_all(algorithm, group, force, allow_missing_files, write_compressed)
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