| | import os
|
| | import cv2
|
| | import numpy as np
|
| | from scipy.io import loadmat
|
| | import tensorflow as tf
|
| | from util.preprocess import align_for_lm
|
| | from shutil import move
|
| |
|
| | mean_face = np.loadtxt('util/test_mean_face.txt')
|
| | mean_face = mean_face.reshape([68, 2])
|
| |
|
| | def save_label(labels, save_path):
|
| | np.savetxt(save_path, labels)
|
| |
|
| | def draw_landmarks(img, landmark, save_name):
|
| | landmark = landmark
|
| | lm_img = np.zeros([img.shape[0], img.shape[1], 3])
|
| | lm_img[:] = img.astype(np.float32)
|
| | landmark = np.round(landmark).astype(np.int32)
|
| |
|
| | for i in range(len(landmark)):
|
| | for j in range(-1, 1):
|
| | for k in range(-1, 1):
|
| | if img.shape[0] - 1 - landmark[i, 1]+j > 0 and \
|
| | img.shape[0] - 1 - landmark[i, 1]+j < img.shape[0] and \
|
| | landmark[i, 0]+k > 0 and \
|
| | landmark[i, 0]+k < img.shape[1]:
|
| | lm_img[img.shape[0] - 1 - landmark[i, 1]+j, landmark[i, 0]+k,
|
| | :] = np.array([0, 0, 255])
|
| | lm_img = lm_img.astype(np.uint8)
|
| |
|
| | cv2.imwrite(save_name, lm_img)
|
| |
|
| |
|
| | def load_data(img_name, txt_name):
|
| | return cv2.imread(img_name), np.loadtxt(txt_name)
|
| |
|
| |
|
| | def load_lm_graph(graph_filename):
|
| | with tf.gfile.GFile(graph_filename, 'rb') as f:
|
| | graph_def = tf.GraphDef()
|
| | graph_def.ParseFromString(f.read())
|
| |
|
| | with tf.Graph().as_default() as graph:
|
| | tf.import_graph_def(graph_def, name='net')
|
| | img_224 = graph.get_tensor_by_name('net/input_imgs:0')
|
| | output_lm = graph.get_tensor_by_name('net/lm:0')
|
| | lm_sess = tf.Session(graph=graph)
|
| |
|
| | return lm_sess,img_224,output_lm
|
| |
|
| |
|
| | def detect_68p(img_path,sess,input_op,output_op):
|
| | print('detecting landmarks......')
|
| | names = [i for i in sorted(os.listdir(
|
| | img_path)) if 'jpg' in i or 'png' in i or 'jpeg' in i or 'PNG' in i]
|
| | vis_path = os.path.join(img_path, 'vis')
|
| | remove_path = os.path.join(img_path, 'remove')
|
| | save_path = os.path.join(img_path, 'landmarks')
|
| | if not os.path.isdir(vis_path):
|
| | os.makedirs(vis_path)
|
| | if not os.path.isdir(remove_path):
|
| | os.makedirs(remove_path)
|
| | if not os.path.isdir(save_path):
|
| | os.makedirs(save_path)
|
| |
|
| | for i in range(0, len(names)):
|
| | name = names[i]
|
| | print('%05d' % (i), ' ', name)
|
| | full_image_name = os.path.join(img_path, name)
|
| | txt_name = '.'.join(name.split('.')[:-1]) + '.txt'
|
| | full_txt_name = os.path.join(img_path, 'detections', txt_name)
|
| |
|
| |
|
| | if not os.path.isfile(full_txt_name):
|
| | move(full_image_name, os.path.join(remove_path, name))
|
| | continue
|
| |
|
| |
|
| | img, five_points = load_data(full_image_name, full_txt_name)
|
| | input_img, scale, bbox = align_for_lm(img, five_points)
|
| |
|
| |
|
| | if scale == 0:
|
| | move(full_txt_name, os.path.join(
|
| | remove_path, txt_name))
|
| | move(full_image_name, os.path.join(remove_path, name))
|
| | continue
|
| |
|
| |
|
| | input_img = np.reshape(
|
| | input_img, [1, 224, 224, 3]).astype(np.float32)
|
| | landmark = sess.run(
|
| | output_op, feed_dict={input_op: input_img})
|
| |
|
| |
|
| | landmark = landmark.reshape([68, 2]) + mean_face
|
| | landmark[:, 1] = 223 - landmark[:, 1]
|
| | landmark = landmark / scale
|
| | landmark[:, 0] = landmark[:, 0] + bbox[0]
|
| | landmark[:, 1] = landmark[:, 1] + bbox[1]
|
| | landmark[:, 1] = img.shape[0] - 1 - landmark[:, 1]
|
| |
|
| | if i % 100 == 0:
|
| | draw_landmarks(img, landmark, os.path.join(vis_path, name))
|
| | save_label(landmark, os.path.join(save_path, txt_name))
|
| |
|