diff --git a/bob/pad/face/algorithm/VideoLRPadAlgorithm.py b/bob/pad/face/algorithm/VideoLRPadAlgorithm.py index 833bd858923eea2051cf0b938dce35348683728b..ff05a55b20dcce2a16d70f5def6cab98328fa6a4 100644 --- a/bob/pad/face/algorithm/VideoLRPadAlgorithm.py +++ b/bob/pad/face/algorithm/VideoLRPadAlgorithm.py @@ -45,17 +45,39 @@ class VideoLRPadAlgorithm(Algorithm): ``frame_level_scores_flag`` : :py:class:`bool` Return scores for each frame individually if True. Otherwise, return a - single score per video. Default: False. + single score per video. Default: ``False``. + + ``subsample_train_data_flag`` : :py:class:`bool` + Uniformly subsample the training data if ``True``. Default: ``False``. + + ``subsampling_step`` : :py:class:`int` + Training data subsampling step, only valid is + ``subsample_train_data_flag = True``. Default: 10 . + + ``subsample_videos_flag`` : :py:class:`bool` + Uniformly subsample the training videos if ``True``. Default: ``False``. + + ``video_subsampling_step`` : :py:class:`int` + Training videos subsampling step, only valid is + ``subsample_videos_flag = True``. Default: 3 . """ def __init__(self, C = 1, - frame_level_scores_flag = False): + frame_level_scores_flag = False, + subsample_train_data_flag = False, + subsampling_step = 10, + subsample_videos_flag = False, + video_subsampling_step = 3): Algorithm.__init__(self, C = C, frame_level_scores_flag = frame_level_scores_flag, + subsample_train_data_flag = subsample_train_data_flag, + subsampling_step = subsampling_step, + subsample_videos_flag = subsample_videos_flag, + video_subsampling_step = video_subsampling_step, performs_projection=True, requires_projector_training=True) @@ -63,6 +85,14 @@ class VideoLRPadAlgorithm(Algorithm): self.frame_level_scores_flag = frame_level_scores_flag + self.subsample_train_data_flag = subsample_train_data_flag + + self.subsampling_step = subsampling_step + + self.subsample_videos_flag = subsample_videos_flag + + self.video_subsampling_step = video_subsampling_step + self.lr_machine = None # this argument will be updated with pretrained LR machine self.features_mean = None # this argument will be updated with features mean @@ -316,6 +346,32 @@ class VideoLRPadAlgorithm(Algorithm): del f + #========================================================================== + def subsample_train_videos(self, training_features, step): + """ + Uniformly select subset of frmae containes from the input list + + **Parameters:** + + ``training_features`` : [FrameContainer] + A list of FrameContainers + + ``step`` : :py:class:`int` + Data selection step. + + **Returns:** + + ``training_features_subset`` : [FrameContainer] + A list with selected FrameContainers + """ + + indexes = range(0, len(training_features), step) + + training_features_subset = [training_features[x] for x in indexes] + + return training_features_subset + + #========================================================================== def train_projector(self, training_features, projector_file): """ @@ -336,9 +392,31 @@ class VideoLRPadAlgorithm(Algorithm): """ # training_features[0] - training features for the REAL class. - real = self.convert_list_of_frame_cont_to_array(training_features[0]) # output is array # training_features[1] - training features for the ATTACK class. - attack = self.convert_list_of_frame_cont_to_array(training_features[1]) # output is array + + if self.subsample_videos_flag: # subsample videos of the real class + + real = self.convert_list_of_frame_cont_to_array( self.subsample_train_videos(training_features[0], self.video_subsampling_step) ) # output is array + + else: + + real = self.convert_list_of_frame_cont_to_array(training_features[0]) # output is array + + if self.subsample_train_data_flag: + + real = real[range(0,len(real), self.subsampling_step), :] + + if self.subsample_videos_flag: # subsample videos of the real class + + attack = self.convert_list_of_frame_cont_to_array( self.subsample_train_videos(training_features[1], self.video_subsampling_step) ) # output is array + + else: + + attack = self.convert_list_of_frame_cont_to_array(training_features[1]) # output is array + + if self.subsample_train_data_flag: + + attack = attack[range(0,len(attack), self.subsampling_step), :] # Train the LR machine and get normalizers: machine, features_mean, features_std = self.train_lr(real = real,