"""
@File : test.py
@Author : Songkey
@Email : songkey@pku.edu.cn
@Date : 11/1/2024
@Desc : Created by Shengjie Wu (wu.shengjie@immomo.com)
"""
import numpy as np
import cv2
import os.path as osp
from .utils import create_onnx_session, get_warp_mat_bbox_by_gt_pts_float, download_file_from_cloud
class HelloARKitBSPred(object):
def __init__(self, gpu_id=0, modelscope=False):
model_path = download_file_from_cloud(model_id='songkey/hello_group_facemodel',
file_name='hello_arkit_blendshape.onnx',
modelscope=modelscope)
self.face_rig_net = create_onnx_session(model_path, gpu_id=gpu_id)
self.onnx_input_name = self.face_rig_net.get_inputs()[0].name
self.onnx_output_name = [output.name for output in self.face_rig_net.get_outputs()]
self.image_size = 224
self.expand_ratio = 0.15
def forward(self, src_image, src_pt):
left_eye_corner = src_pt[74]
right_eye_corner = src_pt[96]
radian = np.arctan2(right_eye_corner[1] - left_eye_corner[1], right_eye_corner[0] - left_eye_corner[0] + 0.00000001)
rotate_angle = np.rad2deg(radian)
align_warp_mat = get_warp_mat_bbox_by_gt_pts_float(src_pt, base_angle=rotate_angle, dst_size=self.image_size,
expand_ratio=self.expand_ratio)
face_rig_input = cv2.warpAffine(src_image, align_warp_mat, (self.image_size, self.image_size))
face_rig_onnx_input = face_rig_input.transpose((2, 0, 1)).astype(np.float32)[np.newaxis, :, :, :] / 255.0
face_rig_params = self.face_rig_net.run(self.onnx_output_name,
{self.onnx_input_name: face_rig_onnx_input})
face_rig_params = face_rig_params[0][0]
return face_rig_params