From 24bc61829c370832e355884ce67a2898f4b44d76 Mon Sep 17 00:00:00 2001 From: Vedrana KRIVOKUCA <vkrivokuca@italix32.idiap.ch> Date: Wed, 18 Oct 2017 18:15:51 +0200 Subject: [PATCH] Make HammingDistance class plus add test --- bob/bio/vein/algorithm/HammingDistance.py | 28 ++++++++++++++++++----- bob/bio/vein/tests/test.py | 23 +++++++++++++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/bob/bio/vein/algorithm/HammingDistance.py b/bob/bio/vein/algorithm/HammingDistance.py index 6497cb8..3ce7729 100644 --- a/bob/bio/vein/algorithm/HammingDistance.py +++ b/bob/bio/vein/algorithm/HammingDistance.py @@ -1,8 +1,24 @@ -# Calculates the Hamming distance (proportion of mismatching corresponding bits) between two binary vectors +#!/usr/bin/env python +# vim: set fileencoding=utf-8 : -import bob.bio.base + +from bob.bio.base.algorithm import Distance import scipy.spatial.distance -algorithm = bob.bio.base.algorithm.Distance( - distance_function = scipy.spatial.distance.hamming, - is_distance_function = False # setting this to False ensures that Hamming distances are returned as positive values rather than negative -) \ No newline at end of file + + +class HammingDistance (Distance): + """Finger vein matching: Hamming Distance between binary fingervein feature vectors + """ + + def __init__( + self, + distance_function = scipy.spatial.distance.hamming, + is_distance_function = False # setting this to False ensures that Hamming distances are returned as positive values rather than negative + ): + + # Call base class constructor + Distance.__init__( + self, + distance_function = distance_function, + is_distance_function = is_distance_function + ) \ No newline at end of file diff --git a/bob/bio/vein/tests/test.py b/bob/bio/vein/tests/test.py index 8a594b2..fb4c4e1 100644 --- a/bob/bio/vein/tests/test.py +++ b/bob/bio/vein/tests/test.py @@ -685,3 +685,26 @@ def test_correlation(): total = time.clock() - start print('scipy+correlate2d, %d iterations - %.2e per iteration' % (N, total/N)) ''' + + +def test_hamming_distance(): + + from ..algorithm.HammingDistance import HammingDistance + HD = HammingDistance() + + # Tests on simple binary arrays: + # 1.) Maximum HD (1.0): + model_1 = numpy.array([0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0]) + probe_1 = numpy.array([[1, 0, 0, 0, 1, 0], [0, 1, 1, 1, 0, 1]]) + score_max = HD.score(model_1, probe_1) + assert score_max == 1.0 + # 2.) Minimum HD (0.0): + model_2 = numpy.array([0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1]) + probe_2 = numpy.array([[0, 1, 1, 1, 0, 1], [0, 1, 1, 1, 0, 1]]) + score_min = HD.score(model_2, probe_2) + assert score_min == 0.0 + # 3.) HD of exactly half (0.5) + model_3 = numpy.array([0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0]) + probe_3 = numpy.array([[0, 1, 1, 1, 0, 1], [0, 1, 1, 1, 0, 1]]) + score_half = HD.score(model_3, probe_3) + assert score_half == 0.5 \ No newline at end of file -- GitLab