Spaces:
Running
on
Zero
Running
on
Zero
| import torch | |
| from .rotation2xyz import Rotation2xyz | |
| from .rotation_conversions import matrix_to_rotation_6d, axis_angle_to_matrix | |
| class SMPL2Mesh: | |
| def __init__( | |
| self, | |
| device: str = "cpu", | |
| ): | |
| self.rot2xyz = Rotation2xyz(device=device) | |
| self.faces = self.rot2xyz.smpl_model.faces | |
| def convert_smpl_to_mesh(self, new_opt_pose, keypoints_3d, betas=None): | |
| batch_size = keypoints_3d.shape[0] | |
| thetas = new_opt_pose.reshape(batch_size, 24, 3) | |
| thetas = matrix_to_rotation_6d( | |
| axis_angle_to_matrix(thetas) | |
| ) # [bs, 24, 6] | |
| # root_loc = torch.tensor(keypoints_3d[:, 0]) # [bs, 3] | |
| root_loc = keypoints_3d[:, 0].clone() # [bs, 3] | |
| root_loc = torch.cat([root_loc, torch.zeros_like(root_loc)], dim=-1).unsqueeze( | |
| 1 | |
| ) # [bs, 1, 6] | |
| thetas = torch.cat([thetas, root_loc], dim=1).permute(1, 2, 0) # [25, 6, 196] | |
| rot_motions = thetas.detach() | |
| vertices = self.rot2xyz( | |
| rot_motions, | |
| mask=None, | |
| pose_rep="rot6d", | |
| translation=True, | |
| glob=True, | |
| jointstype="vertices", | |
| vertstrans=True, | |
| betas=betas | |
| ) | |
| return vertices.cpu().numpy(), self.faces |