| import numpy as np
|
| import torch
|
| import imageio
|
| import matplotlib
|
| from textwrap import wrap
|
|
|
|
|
|
|
| humanact12_kinematic_chain = [[0, 1, 4, 7, 10],
|
| [0, 2, 5, 8, 11],
|
| [0, 3, 6, 9, 12, 15],
|
| [9, 13, 16, 18, 20, 22],
|
| [9, 14, 17, 19, 21, 23]]
|
|
|
| smpl_kinematic_chain = humanact12_kinematic_chain
|
|
|
| mocap_kinematic_chain = [[0, 1, 2, 3],
|
| [0, 12, 13, 14, 15],
|
| [0, 16, 17, 18, 19],
|
| [1, 4, 5, 6, 7],
|
| [1, 8, 9, 10, 11]]
|
|
|
| vibe_kinematic_chain = [[0, 12, 13, 14, 15],
|
| [0, 9, 10, 11, 16],
|
| [0, 1, 8, 17],
|
| [1, 5, 6, 7],
|
| [1, 2, 3, 4]]
|
|
|
| action2motion_kinematic_chain = vibe_kinematic_chain
|
|
|
| colors_blue = ["#4D84AA", "#5B9965", "#61CEB9", "#34C1E2", "#80B79A"]
|
| colors_orange = ["#DD5A37", "#D69E00", "#B75A39", "#FF6D00", "#DDB50E"]
|
| colors_purple = ["#6B31DB", "#AD40A8", "#AF2B79", "#9B00FF", "#D836C1"]
|
|
|
| def add_shadow(img, shadow=15):
|
| img = np.copy(img)
|
| mask = img > shadow
|
| img[mask] = img[mask] - shadow
|
| img[~mask] = 0
|
| return img
|
|
|
|
|
| def load_anim(path, timesize=None):
|
| data = np.array(imageio.mimread(path, memtest=False))[..., :3]
|
| if timesize is None:
|
| return data
|
|
|
| lastframe = add_shadow(data[-1])
|
| alldata = np.tile(lastframe, (timesize, 1, 1, 1))
|
|
|
|
|
| lenanim = data.shape[0]
|
| alldata[:lenanim] = data[:lenanim]
|
| return alldata
|
|
|
|
|
| def plot_3d_motion(motion, length, save_path, params, title="", interval=50, palette=None):
|
| import matplotlib
|
| import matplotlib.pyplot as plt
|
| from mpl_toolkits.mplot3d import Axes3D
|
| from mpl_toolkits.mplot3d.art3d import Poly3DCollection
|
| from matplotlib.animation import FuncAnimation, writers
|
|
|
| matplotlib.use('Agg')
|
| pose_rep = params["pose_rep"]
|
| appearance = params['appearance_mode']
|
|
|
| fig = plt.figure(figsize=[2.6, 2.8])
|
| ax = fig.add_subplot(111, projection='3d')
|
|
|
|
|
|
|
| def init():
|
| ax.set_xticklabels([])
|
| ax.set_yticklabels([])
|
| ax.set_zticklabels([])
|
|
|
| ax.set_xlim(-0.7, 0.7)
|
| ax.set_ylim(-0.7, 0.7)
|
| ax.set_zlim(-0.7, 0.7)
|
|
|
| ax.view_init(azim=-90, elev=110)
|
|
|
| ax.xaxis._axinfo["grid"]['color'] = (0.5, 0.5, 0.5, 0.25)
|
| ax.yaxis._axinfo["grid"]['color'] = (0.5, 0.5, 0.5, 0.25)
|
| ax.zaxis._axinfo["grid"]['color'] = (0.5, 0.5, 0.5, 0.25)
|
| if appearance == 'motionclip':
|
| ax.set_axis_off()
|
|
|
| colors = ['red', 'magenta', 'black', 'green', 'blue']
|
|
|
| if appearance == 'motionclip':
|
| if palette == 'orange':
|
| colors = colors_orange
|
| else:
|
| colors = colors_blue
|
|
|
| if pose_rep != "xyz":
|
| raise ValueError("It should already be xyz.")
|
|
|
| if torch.is_tensor(motion):
|
| motion = motion.numpy()
|
|
|
|
|
| motion[:, 1, :] = -motion[:, 1, :]
|
| motion[:, 2, :] = -motion[:, 2, :]
|
|
|
|
|
| """
|
| Debug: to rotate the bodies
|
| import src.utils.rotation_conversions as geometry
|
| glob_rot = [0, 1.5707963267948966, 0]
|
| global_orient = torch.tensor(glob_rot)
|
| rotmat = geometry.axis_angle_to_matrix(global_orient)
|
| motion = np.einsum("ikj,ko->ioj", motion, rotmat)
|
| """
|
|
|
| if motion.shape[0] == 18:
|
| kinematic_tree = action2motion_kinematic_chain
|
| elif motion.shape[0] == 24:
|
| kinematic_tree = smpl_kinematic_chain
|
| else:
|
| kinematic_tree = None
|
|
|
| def update(index):
|
| ax.lines = []
|
| ax.collections = []
|
| if kinematic_tree is not None:
|
| for chain, color in zip(kinematic_tree, colors):
|
| ax.plot(motion[chain, 0, index],
|
| motion[chain, 1, index],
|
| motion[chain, 2, index], linewidth=4.0, color=color)
|
| else:
|
| ax.scatter(motion[1:, 0, index], motion[1:, 1, index],
|
| motion[1:, 2, index], c="red")
|
| ax.scatter(motion[:1, 0, index], motion[:1, 1, index],
|
| motion[:1, 2, index], c="blue")
|
|
|
| wraped_title = '\n'.join(wrap(title, 20))
|
| ax.set_title(wraped_title)
|
|
|
| ani = FuncAnimation(fig, update, frames=length, interval=interval, repeat=False, init_func=init)
|
|
|
| plt.tight_layout()
|
|
|
|
|
|
|
| ani.save(save_path, writer='pillow', fps=1000/interval)
|
| plt.close()
|
|
|
|
|
| def plot_3d_motion_dico(x):
|
| motion, length, save_path, params, kargs = x
|
| plot_3d_motion(motion, length, save_path, params, **kargs)
|
|
|