Update utils/other_tools_hf.py
Browse files- utils/other_tools_hf.py +97 -0
utils/other_tools_hf.py
CHANGED
@@ -600,6 +600,103 @@ def generate_images(frames, vertices_all, vertices1_all, faces, output_dir, file
|
|
600 |
# ]
|
601 |
# )
|
602 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
603 |
def render_one_sequence(
|
604 |
res_npz_path,
|
605 |
gt_npz_path,
|
|
|
600 |
# ]
|
601 |
# )
|
602 |
|
603 |
+
def render_one_sequence_with_face(
|
604 |
+
res_npz_path,
|
605 |
+
gt_npz_path,
|
606 |
+
output_dir,
|
607 |
+
audio_path,
|
608 |
+
model_folder="/data/datasets/smplx_models/",
|
609 |
+
model_type='smplx',
|
610 |
+
gender='NEUTRAL_2020',
|
611 |
+
ext='npz',
|
612 |
+
num_betas=300,
|
613 |
+
num_expression_coeffs=100,
|
614 |
+
use_face_contour=False,
|
615 |
+
use_matplotlib=False,
|
616 |
+
args=None):
|
617 |
+
import smplx
|
618 |
+
import matplotlib.pyplot as plt
|
619 |
+
import imageio
|
620 |
+
from tqdm import tqdm
|
621 |
+
import os
|
622 |
+
import numpy as np
|
623 |
+
import torch
|
624 |
+
import moviepy.editor as mp
|
625 |
+
import librosa
|
626 |
+
|
627 |
+
model = smplx.create(model_folder, model_type=model_type,
|
628 |
+
gender=gender, use_face_contour=use_face_contour,
|
629 |
+
num_betas=num_betas,
|
630 |
+
num_expression_coeffs=num_expression_coeffs,
|
631 |
+
ext=ext, use_pca=False).cuda()
|
632 |
+
|
633 |
+
#data_npz = np.load(f"{output_dir}{res_npz_path}.npz")
|
634 |
+
data_np_body = np.load(res_npz_path, allow_pickle=True)
|
635 |
+
gt_np_body = np.load(gt_npz_path, allow_pickle=True)
|
636 |
+
|
637 |
+
if not os.path.exists(output_dir): os.makedirs(output_dir)
|
638 |
+
# if not use_matplotlib:
|
639 |
+
# import trimesh
|
640 |
+
#import pyrender
|
641 |
+
from pyvirtualdisplay import Display
|
642 |
+
#'''
|
643 |
+
#display = Display(visible=0, size=(1000, 1000))
|
644 |
+
#display.start()
|
645 |
+
faces = np.load(f"{model_folder}/smplx/SMPLX_NEUTRAL_2020.npz", allow_pickle=True)["f"]
|
646 |
+
seconds = 1
|
647 |
+
#data_npz["jaw_pose"].shape[0]
|
648 |
+
n = data_np_body["poses"].shape[0]
|
649 |
+
beta = torch.from_numpy(data_np_body["betas"]).to(torch.float32).unsqueeze(0).cuda()
|
650 |
+
beta = beta.repeat(n, 1)
|
651 |
+
expression = torch.from_numpy(data_np_body["expressions"][:n]).to(torch.float32).cuda()
|
652 |
+
jaw_pose = torch.from_numpy(data_np_body["poses"][:n, 66:69]).to(torch.float32).cuda()
|
653 |
+
pose = torch.from_numpy(data_np_body["poses"][:n]).to(torch.float32).cuda()
|
654 |
+
transl = torch.from_numpy(data_np_body["trans"][:n]).to(torch.float32).cuda()
|
655 |
+
# print(beta.shape, expression.shape, jaw_pose.shape, pose.shape, transl.shape, pose[:,:3].shape)
|
656 |
+
output = model(betas=beta, transl=transl, expression=expression, jaw_pose=jaw_pose,
|
657 |
+
global_orient=pose[:,:3], body_pose=pose[:,3:21*3+3], left_hand_pose=pose[:,25*3:40*3], right_hand_pose=pose[:,40*3:55*3],
|
658 |
+
leye_pose=pose[:, 69:72],
|
659 |
+
reye_pose=pose[:, 72:75],
|
660 |
+
return_verts=True)
|
661 |
+
vertices_all = output["vertices"].cpu().detach().numpy()
|
662 |
+
|
663 |
+
beta1 = torch.from_numpy(data_np_body["betas"]).to(torch.float32).unsqueeze(0).cuda()
|
664 |
+
beta1 = beta1.repeat(n, 1)
|
665 |
+
expression1 = torch.from_numpy(data_np_body["expressions"][:n]).to(torch.float32).cuda()
|
666 |
+
zero_pose = np.zeros_like(data_np_body["poses"])
|
667 |
+
jaw_pose1 = torch.from_numpy(zero_pose[:n,66:69]).to(torch.float32).cuda()
|
668 |
+
pose1 = torch.from_numpy(zero_pose[:n]).to(torch.float32).cuda()
|
669 |
+
zero_trans = np.zeros_like(data_np_body["trans"])
|
670 |
+
transl1 = torch.from_numpy(zero_trans[:n]).to(torch.float32).cuda()
|
671 |
+
output1 = model(betas=beta1, transl=transl1, expression=expression1, jaw_pose=jaw_pose1,
|
672 |
+
global_orient=pose1[:,:3], body_pose=pose1[:,3:21*3+3], left_hand_pose=pose1[:,25*3:40*3], right_hand_pose=pose1[:,40*3:55*3],
|
673 |
+
leye_pose=pose1[:, 69:72],
|
674 |
+
reye_pose=pose1[:, 72:75],
|
675 |
+
return_verts=True)
|
676 |
+
vertices1_all = output1["vertices"].cpu().detach().numpy()*8
|
677 |
+
trans_down = np.zeros_like(vertices1_all)
|
678 |
+
trans_down[:, :, 1] = 1.55
|
679 |
+
vertices1_all = vertices1_all - trans_down
|
680 |
+
if args.debug:
|
681 |
+
seconds = 1
|
682 |
+
else:
|
683 |
+
seconds = vertices_all.shape[0]//30
|
684 |
+
silent_video_file_path = utils.fast_render.generate_silent_videos(args.render_video_fps,
|
685 |
+
args.render_video_width,
|
686 |
+
args.render_video_height,
|
687 |
+
args.render_concurrent_num,
|
688 |
+
args.render_tmp_img_filetype,
|
689 |
+
int(seconds*args.render_video_fps),
|
690 |
+
vertices1_all,
|
691 |
+
vertices_all,
|
692 |
+
faces,
|
693 |
+
output_dir)
|
694 |
+
base_filename_without_ext = os.path.splitext(os.path.basename(res_npz_path))[0]
|
695 |
+
final_clip = os.path.join(output_dir, f"{base_filename_without_ext}.mp4")
|
696 |
+
utils.media.add_audio_to_video(silent_video_file_path, audio_path, final_clip)
|
697 |
+
os.remove(silent_video_file_path)
|
698 |
+
return final_clip
|
699 |
+
|
700 |
def render_one_sequence(
|
701 |
res_npz_path,
|
702 |
gt_npz_path,
|