import math import os import numpy as np import tensorflow as tf from utils.my_utils import normalize_wrt_maximum_distance_point, retrieve_interest_points def head_pose_estimation(kpt, detector, gaze_model, id_list=None): fps, shape = 20, (1280, 720) yaw_list, pitch_list, roll_list, yaw_u_list, pitch_u_list, roll_u_list = [], [], [], [], [], [] center_xy = [] for j, kpt_person in enumerate(kpt): # TODO here change order if openpose face_kpt = retrieve_interest_points(kpt_person, detector=detector) tdx = np.mean([face_kpt[k] for k in range(0, 15, 3) if face_kpt[k] != 0.0]) tdy = np.mean([face_kpt[k + 1] for k in range(0, 15, 3) if face_kpt[k + 1] != 0.0]) if math.isnan(tdx) or math.isnan(tdy): tdx = -1 tdy = -1 center_xy.append([tdx, tdy]) face_kpt_normalized = np.array(normalize_wrt_maximum_distance_point(face_kpt)) # print(type(face_kpt_normalized), face_kpt_normalized) aux = tf.cast(np.expand_dims(face_kpt_normalized, 0), tf.float32) yaw, pitch, roll = gaze_model(aux, training=False) # print(yaw[0].numpy()[0], pitch, roll) yaw_list.append(yaw[0].numpy()[0]) pitch_list.append(pitch[0].numpy()[0]) roll_list.append(roll[0].numpy()[0]) yaw_u_list.append(yaw[0].numpy()[1]) pitch_u_list.append(pitch[0].numpy()[1]) roll_u_list.append(roll[0].numpy()[1]) # print(id_lists[j]) # print('yaw: ', yaw[0].numpy()[0], 'yaw unc: ', yaw[0].numpy()[1], 'pitch: ', pitch[0].numpy()[0], # 'pitch unc: ', pitch[0].numpy()[1], 'roll: ', roll[0].numpy()[0], 'roll unc: ', roll[0].numpy()[1]) # draw_axis(yaw.numpy(), pitch.numpy(), roll.numpy(), im_pose, tdx, tdy) return center_xy, yaw_list, pitch_list, roll_list def hpe(gaze_model, kpt_person, detector): # TODO here change order if openpose face_kpt = retrieve_interest_points(kpt_person, detector=detector) tdx = np.mean([face_kpt[k] for k in range(0, 15, 3) if face_kpt[k] != 0.0]) tdy = np.mean([face_kpt[k + 1] for k in range(0, 15, 3) if face_kpt[k + 1] != 0.0]) if math.isnan(tdx) or math.isnan(tdy): tdx = -1 tdy = -1 # center_xy.append([tdx, tdy]) face_kpt_normalized = np.array(normalize_wrt_maximum_distance_point(face_kpt)) # print(type(face_kpt_normalized), face_kpt_normalized) aux = tf.cast(np.expand_dims(face_kpt_normalized, 0), tf.float32) yaw, pitch, roll = gaze_model(aux, training=False) return yaw, pitch, roll, tdx, tdy def project_ypr_in2d(yaw, pitch, roll): """ Project yaw pitch roll on image plane. Result is NOT normalised. :param yaw: :param pitch: :param roll: :return: """ pitch = pitch * np.pi / 180 yaw = -(yaw * np.pi / 180) roll = roll * np.pi / 180 x3 = (math.sin(yaw)) y3 = (-math.cos(yaw) * math.sin(pitch)) # normalize the components length = np.sqrt(x3**2 + y3**2) return [x3, y3]