def generate_align_hash(self, videos: list) -> {str: Align}: align_hash = {} for path in videos: video_name = get_file_name(path) align_path = os.path.join(self.aligns_path, video_name) + '.align' align_hash[video_name] = align_from_file(align_path, self.max_string) return align_hash
def extract_video_data(path: str, detector, predictor, verbose: bool = True) -> Optional[np.ndarray]: if verbose: print('\n{}'.format(path)) video_data = skvideo.io.vread(path) video_data_len = len(video_data) # if video_data_len != env.FRAME_COUNT: # print(ERROR_LOG + 'Wrong number of frames: {}'.format(video_data_len)) # return None mouth_data = [] bar = ShadyBar( get_file_name(path) + '.npy', max=video_data_len, suffix='%(percent)d%% [%(elapsed_td)s]') if verbose else None countOfNone = 1 for i, f in enumerate(video_data): c = extract_mouth_on_frame(f, detector, predictor, i) if c is None: return None mouth_data.append(c) # if c is None: # countOfNone+=1 # else: # while countOfNone>=1: # mouth_data.append(c) # countOfNone -=1 if verbose and bar: bar.next() mouth_data = np.array(mouth_data) if verbose and bar: bar.finish() return mouth_data
def get_data_from_path(self, path: str) -> (np.ndarray, str, np.ndarray, int): align = self.align_hash[get_file_name(path)] return get_video_data_from_file( path), align.sentence, align.labels, align.length
def extract_to_npy(videos_path: str, output_path: str, predictor_path: str, pattern: str, first_video: int, last_video: int): print('\nEXTRACT\n') print('Searching for files in: {}'.format(videos_path)) print('Using predictor at: {}'.format(predictor_path)) print('Match for: {}\n'.format(pattern)) videos_failed = [] had_errors = False videos_failed_path = os.path.join(output_path, 'videos_failed.log') if is_file(videos_failed_path): with open(videos_failed_path, 'r+') as f: for line in f.readlines(): videos_failed.append(line.rstrip()) last_group_dir_name = '' video_count_per_group = 0 detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor(predictor_path) for file_path in get_files_in_dir(videos_path, pattern): group_dir_name = os.path.basename(os.path.dirname(file_path)) video_file_name = get_file_name(file_path) video_target_dir = os.path.join(output_path, group_dir_name) video_target_path = os.path.join(video_target_dir, video_file_name) + '.npy' if video_target_path in videos_failed: print(Fore.RED + 'Video {} is probably corrupted and was ignored'.format( video_file_name)) continue if group_dir_name == last_group_dir_name: video_count_per_group += 1 else: video_count_per_group = 0 last_group_dir_name = group_dir_name if video_count_per_group < first_video or video_count_per_group >= last_video: continue if is_file(video_target_path): print(Style.DIM + Fore.CYAN + 'Video {} is already at: {}'.format( video_file_name, video_target_path)) continue make_dir_if_not_exists(video_target_dir) if not video_to_frames(file_path, video_target_path, detector, predictor): had_errors = True if video_count_per_group > 0: video_count_per_group -= 1 else: video_count_per_group = 0 with open(videos_failed_path, 'a+') as f: f.write(video_target_path + '\n') if had_errors: print(Fore.YELLOW + '\nExtraction finished with some errors') else: print(Fore.GREEN + '\nExtraction finished!')