From e3a9a96d7bc5aa1abe779eaa1660ab5946c7ec34 Mon Sep 17 00:00:00 2001 From: skbidiap <sushil.bhattacharjee@idiap.ch> Date: Fri, 2 Dec 2016 15:43:55 +0100 Subject: [PATCH] doc. indentations fixed --- bob/pad/base/evaluation/PadIsoMetrics.py | 58 +++++++++++++----------- doc/conf.py | 3 +- doc/implemented.rst | 6 +++ 3 files changed, 40 insertions(+), 27 deletions(-) diff --git a/bob/pad/base/evaluation/PadIsoMetrics.py b/bob/pad/base/evaluation/PadIsoMetrics.py index 9dd2173..e4b0544 100644 --- a/bob/pad/base/evaluation/PadIsoMetrics.py +++ b/bob/pad/base/evaluation/PadIsoMetrics.py @@ -18,6 +18,8 @@ class PadIsoMetrics(): self.attack_name = 'attack' #attack_presentation_name #'attack' def save_scores_hdf5(self, outfile, scores_dict): + """ saves input scores_dict dictionary in a hdf5 formatted file""" + h5out = bob.io.base.HDF5File(outfile, "w") for p in scores_dict.keys(): @@ -33,6 +35,8 @@ class PadIsoMetrics(): del h5out def load_scores_hdf5(self, infile): + """ loads a hdf5 file, and trys to construct a dictionary of scores. Returns the score-dictionary.""" + h5in = bob.io.base.HDF5File(infile, "r") scores_dict = {} @@ -55,15 +59,16 @@ class PadIsoMetrics(): """ computes EER threshold using the scores in the supplied dictionary Input: scores_dict: dictionary where each key is the name of the presentation ('real' or one attack-type), - and the corresponding value is a tuple: (scores, attack_potential). - 'scores' should be a 1D numpy-array of floats containing scores - 'attack_potential' should be one of the 3 letters 'A', 'B', or 'C') - Scores for 'real' presentations will not have an associated 'attack_potential', - so, if the value of a key is a tuple of length 1, the key-value pair is assumed - to represent a 'real'-presentation set. + and the corresponding value is a tuple: (scores, attack_potential). + 'scores' should be a 1D numpy-array of floats containing scores + 'attack_potential' should be one of the 3 letters 'A', 'B', or 'C') + Scores for 'real' presentations will not have an associated 'attack_potential', + so, if the value of a key is a tuple of length 1, the key-value pair is assumed + to represent a 'real'-presentation set. Return: tuple of three floats: (eer_threshold, far, frr). These are computed using functions from bob.measure. """ + real_scores = None attack_scores = None assert scores_dict is not None, 'no development score-set provided for computing EER' @@ -93,16 +98,17 @@ class PadIsoMetrics(): """ computes HTER on test-set scores, using the supplied score-threshold. Inputs: scores_dict: dictionary where each key is the name of the presentation ('real' or one attack-type), - and the corresponding value is a tuple: (scores, attack_potential). - 'scores' should be a 1D numpy-array of floats containing scores - 'attack_potential' should be one of the 3 letters 'A', 'B', or 'C') - Scores for 'real' presentations will not have an associated 'attack_potential', - so, if the value of a key is a tuple of length 1, the key-value pair is assumed - to represent a 'real'-presentation set. + and the corresponding value is a tuple: (scores, attack_potential). + 'scores' should be a 1D numpy-array of floats containing scores + 'attack_potential' should be one of the 3 letters 'A', 'B', or 'C') + Scores for 'real' presentations will not have an associated 'attack_potential', + so, if the value of a key is a tuple of length 1, the key-value pair is assumed + to represent a 'real'-presentation set. score_threshold: (float) value to be used for thresholding scores. Return: tuple of three floats: (hter, far, frr). These are computed using functions from bob.measure. """ + assert ((score_threshold is not None) and isinstance(score_threshold, (int, long, float)) ), 'input score_threshold should be a number (float or integer).' real_scores = None @@ -132,6 +138,7 @@ class PadIsoMetrics(): def _check_attack_potential(self, attack_potential): """ For now, we assume three levels of attack-potential: 'C'>'B'>'A' """ + if attack_potential is None: attack_potential = 'C' if attack_potential not in ['A', 'B', 'C']: @@ -144,13 +151,13 @@ class PadIsoMetrics(): """ computes BPCER on test-set scores, using either the supplied score-threshold, or the threshold computed from the EER of the development set Inputs: - scores: a 1D numpy-array of scores corresponding to genuine (bona-fide) presentations. - - score_threshold: a floating point number specifying the score-threshold to be used for deciding accept/reject. + scores: a 1D numpy-array of scores corresponding to genuine (bona-fide) presentations. + score_threshold: a floating point number specifying the score-threshold to be used for deciding accept/reject. Return: - floating-point number representing the bpcer computed for the input score-set + floating-point number representing the bpcer computed for the input score-set """ + bonafide_scores = None if isinstance(scores, dict): #extract 'real' scores from dictionary @@ -175,19 +182,18 @@ class PadIsoMetrics(): """computes APCER as defined in ISO standard. For now, we assume three levels of attack-potential: 'C'>'B'>'A' Inputs: - scores_dict: a dictionary where each key corresponds to a specific PAI (presentation-attack-instrument) - Keys corresponding to PAIs will have as value a list of 2 elements: - 1st element: a 1D numpy-array of scores - 2nd element: a single letter 'A', 'B', or 'C', specifying the attack-potential of the PAI. + scores_dict: a dictionary where each key corresponds to a specific PAI (presentation-attack-instrument) + Keys corresponding to PAIs will have as value a list of 2 elements: + 1st element: a 1D numpy-array of scores + 2nd element: a single letter 'A', 'B', or 'C', specifying the attack-potential of the PAI. - attack_potential: a letter 'A', 'B', or 'C', specifying the attack_potential at which the APCER is to be computed - - score_threshold: a floating point number specifying the score-threshold to be used for deciding accept/reject. + attack_potential: a letter 'A', 'B', or 'C', specifying the attack_potential at which the APCER is to be computed + score_threshold: a floating point number specifying the score-threshold to be used for deciding accept/reject. Returns: - tuple consisting of 2 elements: - 1st element: apcer at specified attack-potential - 2nd element: dictionary of hter of individual PAIs that have attack-potential at or below input-parameter attack_potential. + tuple consisting of 2 elements: + 1st element: apcer at specified attack-potential + 2nd element: dictionary of hter of individual PAIs that have attack-potential at or below input-parameter attack_potential. """ attack_potential = self._check_attack_potential( attack_potential) diff --git a/doc/conf.py b/doc/conf.py index 5e0205c..a00bb35 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -39,6 +39,7 @@ nitpicky = True # Ignores stuff we can't easily resolve on other project's sphinx manuals nitpick_ignore = [] +keep_warnings = True # Allows the user to override warnings from a separate file if os.path.exists('nitpick-exceptions.txt'): @@ -261,4 +262,4 @@ def member_function_test(app, what, name, obj, skip, options): return False def setup(app): - app.connect('autodoc-skip-member', member_function_test) \ No newline at end of file + app.connect('autodoc-skip-member', member_function_test) diff --git a/doc/implemented.rst b/doc/implemented.rst index 7228f2b..9beafd9 100644 --- a/doc/implemented.rst +++ b/doc/implemented.rst @@ -44,6 +44,12 @@ Algorithms .. automodule:: bob.pad.base.algorithm +Evaluation +~~~~~~~~~~ + +.. automodule:: bob.pad.base.evaluation + + Databases --------- -- GitLab