miguelmuzo's picture
Upload 426 files
3de0e37 verified
# -*- coding: utf-8 -*-
"""
# File name: landmarks_util.py
# Time : 2022/07/15
# Author: [email protected]
# Description:
"""
import os
import pickle as pkl
import dlib as dlib
import numpy as np
import tqdm
import cv2
detector = dlib.get_frontal_face_detector()
predictor_dict = {68: dlib.shape_predictor('models/CtrlHair/external_model_params/shape_predictor_68_face_landmarks.dat'),
81: dlib.shape_predictor('models/CtrlHair/external_model_params/shape_predictor_81_face_landmarks.dat')}
def detect_landmarks(root_dir, dataset_name, landmark_output_file_path, output_dir=None, predictor=None):
result_dic = {}
for dn in dataset_name:
img_dir = os.path.join(root_dir, dn, 'images_256')
files = os.listdir(img_dir)
files.sort()
if output_dir and not os.path.exists(output_dir):
os.makedirs(output_dir)
for f in tqdm.tqdm(files):
file_path = os.path.join(img_dir, f)
img_rd = cv2.imread(file_path)
img_gray = cv2.cvtColor(img_rd, cv2.COLOR_BGR2RGB)
faces = detector(img_gray, 0)
font = cv2.FONT_HERSHEY_SIMPLEX
# annotate landmarks
if len(faces) != 0:
landmarks = np.array([[p.x, p.y] for p in predictor(img_rd, faces[0]).parts()])
result_dic['%s___%s' % (dn, f[:-4])] = landmarks / img_gray.shape[0]
if output_dir:
for idx, point in enumerate(landmarks):
pos = (point[0], point[1])
cv2.circle(img_rd, pos, 2, color=(139, 0, 0))
cv2.putText(img_rd, str(idx + 1), pos, font, 0.5, (0, 0, 255), 2, cv2.LINE_AA)
cv2.imwrite(os.path.join(output_dir, f), img_rd)
else:
# not detect face
print('no face for %s' % file_path)
with open(landmark_output_file_path, 'wb') as f:
pkl.dump(result_dic, f)