def test_remove_video_info_missing_or_incomplete_videos(self): video_infos_a = MOCK_VIDEO_INFOS.copy() video_frames_a = get_flat_video_frames("testdirectory2", "jpg") video_frames_a_copy = video_frames_a.copy() # No-Op VideoDataset._remove_video_info_missing_or_incomplete_videos( video_frames_a, video_infos_a ) self.assertEqual(len(video_infos_a), len(MOCK_VIDEO_INFOS)) for video_id in video_infos_a: self.assertEqual(video_infos_a[video_id], MOCK_VIDEO_INFOS[video_id]) self.assertEqual(len(video_frames_a), len(video_frames_a_copy)) for video_id in video_frames_a: self.assertEqual(video_frames_a[video_id], video_frames_a_copy[video_id]) video_infos_b = MOCK_VIDEO_INFOS.copy() video_frames_b = video_frames_a_copy.copy() # Unmatched video info, should be removed video_infos_b["P07_001"] = VideoInfo( video_id="P07_001", resolution="720x1280", duration=17.001, fps=30 ) # Unmatched video frame entry, should be removed video_frames_b["P07_002"]: VideoFrameInfo( min_frame_number=1, max_frame_number=1530, frame_string_length=8 ) # Video info that defines approximately 6000 frames with 600 present from frame manifest # Should be dropped video_frames_b["P08_001"]: VideoFrameInfo( min_frame_number=1, max_frame_number=600, frame_string_length=8 ) video_infos_b["P08_001"] = VideoInfo( video_id="P08_001", resolution="720x1280", duration=100, fps=60 ) VideoDataset._remove_video_info_missing_or_incomplete_videos( video_frames_b, video_infos_b ) # All newly added fields should be removed self.assertEqual(len(video_infos_b), len(MOCK_VIDEO_INFOS)) for video_id in video_infos_b: self.assertEqual(video_infos_b[video_id], MOCK_VIDEO_INFOS[video_id]) self.assertEqual(len(video_frames_b), len(video_frames_a_copy)) for video_id in video_frames_b: self.assertEqual(video_frames_b[video_id], video_frames_a_copy[video_id])
def add_participant_video_frames(participant_id: str, participant_path: str) -> None: participant_frames = sorted(g_pathmgr.ls(str(participant_path))) for frame_file_name in participant_frames: file_extension = frame_file_name.split(".")[-1] frame_name = frame_file_name[:-(len(file_extension) + 1)] [path_participant_id, path_video_id, path_frame_id] = frame_name.split("_") assert path_participant_id == participant_id video_id = f"{path_participant_id}_{path_video_id}" if ( video_id not in video_frames ): # This is the first frame we have seen from video w/ video_id video_frames[video_id] = VideoFrameInfo( video_id=video_id, location=participant_path, frame_file_stem=f"{video_id}_", frame_string_length=len(frame_name), min_frame_number=int(path_frame_id), max_frame_number=int(path_frame_id), file_extension=file_extension, ) else: video_frame_info = video_frames[video_id] # Check that this new frame is of the same format as other frames for this video # and that it is the next frame in order, if so update the frame info for this # video to reflect there is an additional frame. # We don't need to check video_id or frame_file_stem as they are function of # video_id which is aligned within the dictionary assert video_frame_info.frame_string_length == len(frame_name) assert video_frame_info.location == participant_path, ( f"Frames for {video_id} found in two paths: " f"{video_frame_info.location} and {participant_path}") assert video_frame_info.max_frame_number + 1 == int( path_frame_id) assert ( video_frame_info.file_extension == file_extension ), f"Frames with two different file extensions found for video {video_id}" video_frames[video_id] = VideoFrameInfo( video_id=video_frame_info.video_id, location=video_frame_info.location, frame_file_stem=video_frame_info.frame_file_stem, frame_string_length=video_frame_info.frame_string_length, min_frame_number=video_frame_info.min_frame_number, max_frame_number=int(path_frame_id), # Update file_extension=video_frame_info.file_extension, )
def get_flat_video_frames(directory, file_extension): frame_file_stem = "frame_" return { MOCK_VIDEO_IDS[0]: VideoFrameInfo( video_id=MOCK_VIDEO_IDS[0], location=f"{directory}/{MOCK_VIDEO_IDS[0]}", frame_file_stem=frame_file_stem, frame_string_length=16, min_frame_number=1, max_frame_number=3000, file_extension=file_extension, ), MOCK_VIDEO_IDS[1]: VideoFrameInfo( video_id=MOCK_VIDEO_IDS[1], location=f"{directory}/{MOCK_VIDEO_IDS[1]}", frame_file_stem=frame_file_stem, frame_string_length=16, min_frame_number=2, max_frame_number=3001, file_extension=file_extension, ), MOCK_VIDEO_IDS[2]: VideoFrameInfo( video_id=MOCK_VIDEO_IDS[2], location=f"{directory}/{MOCK_VIDEO_IDS[2]}", frame_file_stem=frame_file_stem, frame_string_length=16, min_frame_number=1, max_frame_number=30003, file_extension=file_extension, ), MOCK_VIDEO_IDS[3]: VideoFrameInfo( video_id=MOCK_VIDEO_IDS[3], location=f"{directory}/{MOCK_VIDEO_IDS[3]}", frame_file_stem=frame_file_stem, frame_string_length=16, min_frame_number=1, max_frame_number=1530, file_extension=file_extension, ), }
def get_nested_video_frames(directory, file_extension): return { "P02_001": VideoFrameInfo( video_id="P02_001", location=f"{directory}/P02", frame_file_stem="P02_001_", frame_string_length=16, min_frame_number=1, max_frame_number=3000, file_extension=file_extension, ), "P02_002": VideoFrameInfo( video_id="P02_002", location=f"{directory}/P02", frame_file_stem="P02_002_", frame_string_length=16, min_frame_number=2, max_frame_number=3001, file_extension=file_extension, ), "P02_005": VideoFrameInfo( video_id="P02_005", location=f"{directory}/P02", frame_file_stem="P02_005_", frame_string_length=16, min_frame_number=1, max_frame_number=30003, file_extension=file_extension, ), "P07_002": VideoFrameInfo( video_id="P07_002", location=f"{directory}/P07", frame_file_stem="P07_002_", frame_string_length=16, min_frame_number=2, max_frame_number=1530, file_extension=file_extension, ), }
def test_VideoFrameInfo(self): video_frame_info = VideoFrameInfo( # This is a key-mapping as the underlying # annotation files are of these string columns **{ "video_id": "P01_012", "location": "c:/", "frame_file_stem": "P01_012_", "frame_string_length": "20", "min_frame_number": "0", "max_frame_number": "22", "file_extension": "png", } ) self.assertEqual(video_frame_info.video_id, "P01_012") self.assertEqual(video_frame_info.location, "c:/") self.assertEqual(video_frame_info.frame_file_stem, "P01_012_") self.assertEqual(video_frame_info.frame_string_length, 20) self.assertEqual(video_frame_info.min_frame_number, 0) self.assertEqual(video_frame_info.max_frame_number, 22) self.assertEqual(video_frame_info.file_extension, "png")