| import sys |
| import dlib |
| import os |
| import cv2 |
| import face_alignment |
| from multiprocessing import Pool, Process, Queue |
| import time |
|
|
|
|
| def run(gpu, files): |
| os.environ["CUDA_VISIBLE_DEVICES"] = str(gpu) |
| fa = face_alignment.FaceAlignment(face_alignment.LandmarksType._2D, flip_input=False, device='cuda') |
| print('gpu={},n_files={}'.format(gpu, len(files))) |
| tic = time.time() |
| count = 0 |
| for (img_name, savename) in files: |
| I = cv2.imread(img_name) |
| points_list = fa.get_landmarks(I) |
| |
| with open(savename, 'w') as f: |
| if points_list is not None: |
| for points in points_list: |
| for (x, y) in points: |
| f.write('({}, {})\t'.format(x, y)) |
| f.write('\n') |
|
|
| count += 1 |
| if count % 1000 == 0: |
| print('dst={},eta={}'.format(savename, (time.time()-tic)/(count) * (len(files) - count) / 3600.0)) |
| |
|
|
| if __name__ == '__main__': |
| with open('imgs.txt', 'r') as f: |
| data = [line.strip() for line in f.readlines()] |
| |
| data = [(name, name.replace('.jpg', '.txt')) for name in data] |
| for (_, dst) in data: |
| dir, _ = os.path.split(dst) |
| if not os.path.exists(dir): |
| os.makedirs(dir) |
| |
| processes = [] |
| n_p = 3 |
| gpus = ['1', '2', '3'] |
| bs = len(data) // n_p |
|
|
| for i in range(n_p): |
| if i == n_p - 1: |
| bs = len(data) |
|
|
| p = Process(target=run, args=(gpus[i],data[:bs],)) |
| data = data[bs:] |
| p.start() |
| processes.append(p) |
| assert(len(data) == 0) |
| for p in processes: |
| p.join() |
|
|