def untransform(self, points): points = ensure_homogeneous(points, d=3) if len(self.shuffle_indices) > 0: inv_shuffle_indices = list(range(len(self.shuffle_indices))) for i, j in enumerate(self.shuffle_indices): inv_shuffle_indices[j] = i points = points[..., inv_shuffle_indices, :] return points @ cast_array(np.linalg.inv(self.matrix).T, points)
def test_normalise_points(self, points, camera, z_ref, skeleton): denorm_pose = ensure_homogeneous(points.copy(), d=3) denorm_pose[:, :2] -= denorm_pose[skeleton.root_joint_id, :2] norm_pose = normalise_points(denorm_pose, z_ref, camera, 2048, 2048) assert_allclose(norm_pose[skeleton.root_joint_id], np.asarray([0.0, 0.0, 0.0, 1.0])) actual = norm_pose[1] expected = torch.as_tensor([0.0215, -0.1514, -0.0127, 1.0000]) assert_allclose(actual, expected, rtol=0, atol=1e-4)
def test_infer_z_depth(self, points, camera, z_ref, skeleton): denorm_pose = ensure_homogeneous(points.copy(), d=3) denorm_pose[:, :2] -= denorm_pose[skeleton.root_joint_id, :2] norm_pose = normalise_points(denorm_pose, z_ref, camera, 2048, 2048) right_wrist = skeleton.joint_index('right_wrist') right_elbow = skeleton.joint_index('right_elbow') target_forearm_length = np.linalg.norm(denorm_pose[right_wrist] - denorm_pose[right_elbow]) def eval_scale(skel): forearm_length = np.linalg.norm(skel[right_wrist] - skel[right_elbow]) return forearm_length / target_forearm_length inferred = infer_z_depth(norm_pose, eval_scale, camera, 2048, 2048) assert inferred == pytest.approx(z_ref, rel=0, abs=1e-2)
def project_cartesian(self, coords): coords = ensure_homogeneous(coords, d=3) return to_cartesian(self.project(coords))
def test_denormalise_points(self, points, camera, z_ref, skeleton): denorm_pose = ensure_homogeneous(points.copy(), d=3) denorm_pose[:, :2] -= denorm_pose[skeleton.root_joint_id, :2] norm_pose = normalise_points(denorm_pose, z_ref, camera, 2048, 2048) recons_pose = denormalise_points(norm_pose, z_ref, camera, 2048, 2048) assert_allclose(recons_pose, denorm_pose, rtol=0, atol=1e-4)
def transform(self, points): points = ensure_homogeneous(points, d=3) if len(self.shuffle_indices) > 0: points = points[..., self.shuffle_indices, :] return points @ cast_array(self.matrix.T, points)