File size: 4,081 Bytes
fa81432
 
 
 
 
95f108c
fa81432
 
 
 
 
 
 
 
 
 
 
347c16b
 
 
fdbf59c
 
347c16b
fdbf59c
fa81432
fdbf59c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fa81432
fdbf59c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95f108c
fa81432
 
347c16b
fa81432
347c16b
 
 
 
 
fa81432
95f108c
347c16b
95f108c
 
 
 
 
 
347c16b
fdbf59c
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import sys
if sys.version_info[0] < 3 and sys.version_info[1] < 2:
    raise Exception("Must be using >= Python 3.2")
from os import listdir, path
if not path.isfile('data/face_detection/s3fd-619a316812.pth'):
    raise FileNotFoundError('Save the s3fd model to face_detection/detection/sfd/s3fd.pth before running this script!')
import multiprocessing as mp
from concurrent.futures import ThreadPoolExecutor, as_completed
import numpy as np
import argparse, os, traceback, subprocess
import cv2
from tqdm import tqdm
from glob import glob
import audio
from hparams import hparams as hp
import face_detection

def _progress(generated, to_generate):
    progress((generated, to_generate))

def preprocess_video_files(args):
    fa = [face_detection.FaceAlignment(face_detection.LandmarksType._2D, flip_input=False, device='cpu') for _ in range(args.ngpu)]

    template = 'ffmpeg -loglevel panic -y -i {} -strict -2 {}'

    def process_video_file(vfile, args, gpu_id):
        video_stream = cv2.VideoCapture(vfile)
        frames = []
        while 1:
            still_reading, frame = video_stream.read()
            if not still_reading:
                video_stream.release()
                break
            frames.append(frame)
        vidname = os.path.basename(vfile).split('.')[0]
        dirname = vfile.split('/')[-2]
        fulldir = path.join(args.preprocessed_root, dirname, vidname)
        os.makedirs(fulldir, exist_ok=True)
        batches = [frames[i:i + args.batch_size] for i in range(0, len(frames), args.batch_size)]
        i = -1
        for fb in tqdm(batches, desc='Processing Video Frames'):
            preds = fa[gpu_id].get_detections_for_batch(np.asarray(fb))
            for j, f in enumerate(preds):
                i += 1
                if f is None:
                    continue
                x1, y1, x2, y2 = f
                cv2.imwrite(path.join(fulldir, '{}.jpg'.format(i)), fb[j][y1:y2, x1:x2])
                _progress(i + 1, len(batches) * args.batch_size)

    def process_audio_file(vfile, args):
        vidname = os.path.basename(vfile).split('.')[0]
        dirname = vfile.split('/')[-2]
        fulldir = path.join(args.preprocessed_root, dirname, vidname)
        os.makedirs(fulldir, exist_ok=True)
        wavpath = path.join(fulldir, 'audio.wav')
        command = template.format(vfile, wavpath)
        subprocess.call(command, shell=True)
        _progress(1, 1)

    def mp_handler(job):
        vfile, args, gpu_id = job
        try:
            process_video_file(vfile, args, gpu_id)
        except KeyboardInterrupt:
            exit(0)
        except:
            traceback.print_exc()

    print('Started processing for {} with {} GPUs'.format(args.data_root, args.ngpu))
    filelist = glob(path.join(args.data_root, '*.mp4'))
    
    jobs = [(vfile, args, i % args.ngpu) for i, vfile in enumerate(filelist)]
    p = ThreadPoolExecutor(args.ngpu)
    futures = [p.submit(mp_handler, j) for j in jobs]
    _ = [r.result() for r in tqdm(as_completed(futures), total=len(futures))]
    
    print('Dumping audios...')
    
    for vfile in tqdm(filelist):
        try:
            process_audio_file(vfile, args)
            _progress(1, 1)
        except KeyboardInterrupt:
            exit(0)
        except:
            traceback.print_exc()
            continue

def main(args):
    print('Started processing for {} with {} GPUs'.format(args.data_root, args.ngpu))
    filelist = glob(path.join(args.data_root, '*.mp4'))

    jobs = [(vfile, args, i % args.ngpu) for i, vfile in enumerate(filelist)]
    p = ThreadPoolExecutor(args.ngpu)
    futures = [p.submit(mp_handler, j) for j in jobs]
    _ = [r.result() for r in tqdm(as_completed(futures), total=len(futures))]
    _progress(1, 1)

print('Dumping audios...')
for vfile in tqdm(filelist, desc='Processing Audio Files'):
    try:
        process_audio_file(vfile, args)
    except KeyboardInterrupt:
        exit(0)
    except:
        traceback.print_exc()
        continue
    _progress(1, len(filelist))

if __name__ == '__main__':
    main(args)