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
示例#2
0
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
示例#3
0
 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
示例#4
0
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!')