diff --git a/bob/bio/face/database/replaymobile.py b/bob/bio/face/database/replaymobile.py index f48cac93630cca219f013072e2bb8fcc5596fad4..75927753ec067e8b0ea0904bfe15f5690fdce739 100644 --- a/bob/bio/face/database/replaymobile.py +++ b/bob/bio/face/database/replaymobile.py @@ -89,7 +89,7 @@ class ReplayMobileCSVFrameSampleLoader(CSVToSampleLoaderBiometrics): if "purpose" not in fields: raise ValueError(f"`purpose` not available in {header}") - kwargs = {k: fields[k] for k in fields.keys() - {"id",}} + kwargs = {k: fields[k] for k in fields.keys() - {"id","should_flip"}} # Retrieve the references list if fields["purpose"].lower() == "enroll" and fields["reference_id"] not in self.references_list: @@ -107,7 +107,7 @@ class ReplayMobileCSVFrameSampleLoader(CSVToSampleLoaderBiometrics): load_frame_from_file_replaymobile, file_name=os.path.join(self.dataset_original_directory, fields["path"] + self.extension), frame=frame, - should_flip=kwargs["should_flip"]=="TRUE", + should_flip=fields["should_flip"]=="TRUE", ), key=f"{fields['id']}_{frame}", frame=frame, @@ -142,8 +142,21 @@ def read_frame_annotation_file_replaymobile(file_name, frame, annotations_type=" logger.debug(f"Reading annotation file '{file_name}', frame {frame}.") video_annotations = read_annotation_file(file_name, annotation_type=annotations_type) - # read_annotation_file returns an ordered dict with string keys - return video_annotations[f"{frame}"] + # read_annotation_file returns an ordered dict with str keys as frame number + # Annotations can be "null". Take the last annotated frame in this case + offset = 1 + frame_annotations = video_annotations[f"{frame}"] + if frame_annotations is None: + logger.warning(f"Annotation for file '{file_name}' at frame {frame} was 'null' retrieving nearest frame's annotations.") + while frame_annotations is None: + frame_annotations = video_annotations[f"{max(frame-offset, 1)}"] + if frame_annotations is not None: + break + frame_annotations = video_annotations[f"{min(frame+offset, len(video_annotations)-1)}"] + offset += 1 + if frame-offset < 1 and frame+offset > len(video_annotations): + raise IOError(f"Annotations file '{file_name}' does not contain any annotations.") + return frame_annotations class FrameBoundingBoxAnnotationLoader(AnnotationsLoader): """A transformer that adds bounding-box to a sample from annotations files.