torchnet / face_det_sfd.py
milselarch's picture
push to main
df07554
import sys
import dlib
import os
import cv2
import face_alignment
import time
from multiprocessing import Pool, Process, Queue
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()