|
|
| import os |
| os.environ['DISPLAY'] = ':0.0' |
| os.environ['PYOPENGL_PLATFORM'] = 'osmesa' |
| os.environ["MUJOCO_GL"] = "osmesa" |
| from argparse import ArgumentParser |
| import numpy as np |
| import OpenGL.GL as gl |
| import imageio |
| import cv2 |
| import random |
| import torch |
| import moviepy.editor as mp |
| from scipy.spatial.transform import Rotation as RRR |
| import mGPT.render.matplot.plot_3d_global as plot_3d |
| from mGPT.render.pyrender.hybrik_loc2rot import HybrIKJointsToRotmat |
| from mGPT.render.pyrender.smpl_render import SMPLRender |
|
|
|
|
| if __name__ == '__main__': |
|
|
| parser = ArgumentParser() |
| parser.add_argument('--joints_path', type=str, help='Path to joints data') |
| parser.add_argument('--method', type=str, help='Method for rendering') |
| parser.add_argument('--output_mp4_path', type=str, help='Path to output MP4 file') |
| parser.add_argument('--smpl_model_path', type=str, help='Path to SMPL model') |
|
|
| args = parser.parse_args() |
|
|
| joints_path = args.joints_path |
| method = args.method |
| output_mp4_path = args.output_mp4_path |
| smpl_model_path = args.smpl_model_path |
|
|
|
|
| data = np.load(joints_path) |
|
|
| if method == 'slow': |
| if len(data.shape) == 4: |
| data = data[0] |
| data = data - data[0, 0] |
| pose_generator = HybrIKJointsToRotmat() |
| pose = pose_generator(data) |
| pose = np.concatenate([ |
| pose, |
| np.stack([np.stack([np.eye(3)] * pose.shape[0], 0)] * 2, 1) |
| ], 1) |
| shape = [768, 768] |
| render = SMPLRender(smpl_model_path) |
|
|
| r = RRR.from_rotvec(np.array([np.pi, 0.0, 0.0])) |
| pose[:, 0] = np.matmul(r.as_matrix().reshape(1, 3, 3), pose[:, 0]) |
| vid = [] |
| aroot = data[:, 0] |
| aroot[:, 1:] = -aroot[:, 1:] |
| params = dict(pred_shape=np.zeros([1, 10]), |
| pred_root=aroot, |
| pred_pose=pose) |
| render.init_renderer([shape[0], shape[1], 3], params) |
| for i in range(data.shape[0]): |
| renderImg = render.render(i) |
| vid.append(renderImg) |
|
|
| out = np.stack(vid, axis=0) |
| output_gif_path = output_mp4_path[:-4] + '.gif' |
| imageio.mimwrite(output_gif_path, out, duration=50) |
| out_video = mp.VideoFileClip(output_gif_path) |
| out_video.write_videofile(output_mp4_path) |
|
|
| elif method == 'fast': |
| output_gif_path = output_mp4_path[:-4] + '.gif' |
| if len(data.shape) == 3: |
| data = data[None] |
| if isinstance(data, torch.Tensor): |
| data = data.cpu().numpy() |
| pose_vis = plot_3d.draw_to_batch(data, [''], [output_gif_path]) |
| out_video = mp.VideoFileClip(output_gif_path) |
| out_video.write_videofile(output_mp4_path) |
|
|