Skip to content
Snippets Groups Projects
Commit e684c59d authored by Olegs NIKISINS's avatar Olegs NIKISINS
Browse files

Added the unit tests for the VideoSvmPadAlgorithm algorithm

parent 93833890
No related branches found
No related tags found
1 merge request!8Added unit tests for all preprocessors, extractors, algorithms, excluding qualitymeasure related stuff
Pipeline #
...@@ -446,7 +446,8 @@ class VideoSvmPadAlgorithm(Algorithm): ...@@ -446,7 +446,8 @@ class VideoSvmPadAlgorithm(Algorithm):
machine_type = 'C_SVC', kernel_type = 'RBF', machine_type = 'C_SVC', kernel_type = 'RBF',
trainer_grid_search_params = { 'cost': [2**p for p in range(-5, 16, 2)], 'gamma': [2**p for p in range(-15, 4, 2)]}, trainer_grid_search_params = { 'cost': [2**p for p in range(-5, 16, 2)], 'gamma': [2**p for p in range(-15, 4, 2)]},
mean_std_norm_flag = False, mean_std_norm_flag = False,
projector_file = ""): projector_file = "",
save_debug_data_flag = True):
""" """
First, this function tunes the hyper-parameters of the SVM classifier using First, this function tunes the hyper-parameters of the SVM classifier using
grid search on the sub-sets of training data. Train and cross-validation grid search on the sub-sets of training data. Train and cross-validation
...@@ -487,6 +488,10 @@ class VideoSvmPadAlgorithm(Algorithm): ...@@ -487,6 +488,10 @@ class VideoSvmPadAlgorithm(Algorithm):
be save in this path. This file contains information, which might be be save in this path. This file contains information, which might be
usefull for debugging. usefull for debugging.
``save_debug_data_flag`` : :py:class:`bool`
Save the data, which might be usefull for debugging if ``True``.
Default: ``True``.
**Returns:** **Returns:**
``machine`` : object ``machine`` : object
...@@ -544,16 +549,18 @@ class VideoSvmPadAlgorithm(Algorithm): ...@@ -544,16 +549,18 @@ class VideoSvmPadAlgorithm(Algorithm):
setattr(trainer, key, selected_params[key]) # set the params of trainer setattr(trainer, key, selected_params[key]) # set the params of trainer
# Save the data, which is usefull for debugging. # Save the data, which is usefull for debugging.
debug_file = os.path.join( os.path.split(projector_file)[0], "debug_data.hdf5" ) if save_debug_data_flag:
debug_dict = {}
debug_dict['precisions_train'] = precisions_train debug_file = os.path.join( os.path.split(projector_file)[0], "debug_data.hdf5" )
debug_dict['precisions_cv'] = precisions_cv debug_dict = {}
debug_dict['cost'] = selected_params['cost'] debug_dict['precisions_train'] = precisions_train
debug_dict['gamma'] = selected_params['gamma'] debug_dict['precisions_cv'] = precisions_cv
f = bob.io.base.HDF5File(debug_file, 'w') # open hdf5 file to save the debug data debug_dict['cost'] = selected_params['cost']
for key in debug_dict.keys(): debug_dict['gamma'] = selected_params['gamma']
f.set(key, debug_dict[key]) f = bob.io.base.HDF5File(debug_file, 'w') # open hdf5 file to save the debug data
del f for key in debug_dict.keys():
f.set(key, debug_dict[key])
del f
# training_features[0] - training features for the REAL class. # training_features[0] - training features for the REAL class.
real = self.convert_list_of_frame_cont_to_array(training_features[0]) # output is array real = self.convert_list_of_frame_cont_to_array(training_features[0]) # output is array
......
...@@ -29,6 +29,10 @@ from ..extractor import FrameDiffFeatures ...@@ -29,6 +29,10 @@ from ..extractor import FrameDiffFeatures
from ..extractor import VideoLBPHistogram from ..extractor import VideoLBPHistogram
from ..algorithm import VideoSvmPadAlgorithm
import random
#============================================================================== #==============================================================================
def test_lbp_histogram(): def test_lbp_histogram():
lbp = LBPHistogram() lbp = LBPHistogram()
...@@ -257,37 +261,93 @@ def test_video_lbp_histogram(): ...@@ -257,37 +261,93 @@ def test_video_lbp_histogram():
assert (lbp_histograms[0][1][-1] - 0.031737773152965658) < 0.000001 assert (lbp_histograms[0][1][-1] - 0.031737773152965658) < 0.000001
#==============================================================================
def convert_array_to_list_of_frame_cont(data):
"""
Convert an input 2D array to a list of FrameContainers.
**Parameters:**
``data`` : 2D :py:class:`numpy.ndarray`
Input data array of the dimensionality (N_samples X N_features ).
**Returns:**
``frame_container_list`` : [FrameContainer]
A list of FrameContainers, see ``bob.bio.video.utils.FrameContainer``
for further details. Each frame container contains one feature vector.
"""
frame_container_list = []
for idx, vec in enumerate(data):
frame_container = bob.bio.video.FrameContainer() # initialize the FrameContainer
frame_container.add(0, vec)
frame_container_list.append( frame_container ) # add current frame to FrameContainer
return frame_container_list
#==============================================================================
def test_video_svm_pad_algorithm():
"""
Test the VideoSvmPadAlgorithm algorithm.
"""
random.seed(7)
N = 20000
mu = 1
sigma = 1
real_array = np.transpose( np.vstack([[random.gauss(mu, sigma) for _ in range(N)], [random.gauss(mu, sigma) for _ in range(N)]]) )
mu = 5
sigma = 1
attack_array = np.transpose( np.vstack([[random.gauss(mu, sigma) for _ in range(N)], [random.gauss(mu, sigma) for _ in range(N)]]) )
real = convert_array_to_list_of_frame_cont(real_array)
attack = convert_array_to_list_of_frame_cont(attack_array)
training_features = [real, attack]
MACHINE_TYPE = 'C_SVC'
KERNEL_TYPE = 'RBF'
N_SAMPLES = 1000
TRAINER_GRID_SEARCH_PARAMS = {'cost': [1], 'gamma': [0.5, 1]}
MEAN_STD_NORM_FLAG = True # enable mean-std normalization
FRAME_LEVEL_SCORES_FLAG = True # one score per frame(!) in this case
algorithm = VideoSvmPadAlgorithm(machine_type = MACHINE_TYPE,
kernel_type = KERNEL_TYPE,
n_samples = N_SAMPLES,
trainer_grid_search_params = TRAINER_GRID_SEARCH_PARAMS,
mean_std_norm_flag = MEAN_STD_NORM_FLAG,
frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
machine = algorithm.train_svm(training_features = training_features,
n_samples = algorithm.n_samples,
machine_type = algorithm.machine_type,
kernel_type = algorithm.kernel_type,
trainer_grid_search_params = algorithm.trainer_grid_search_params,
mean_std_norm_flag = algorithm.mean_std_norm_flag,
projector_file = "",
save_debug_data_flag = False)
assert machine.n_support_vectors == [148, 150]
assert machine.gamma == 0.5
real_sample = algorithm.convert_frame_cont_to_array(real[0])
prob = machine.predict_class_and_probabilities( real_sample )[1]
assert prob[0,0] > prob[0,1]
precision = algorithm.comp_prediction_precision(machine, real_array, attack_array)
assert precision > 0.99
......
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