Ssongkey-winlittle change
47fe6144创建于 2025年6月25日历史提交
"""
@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