Spaces:
Configuration error
Configuration error
""" | |
Useful geometric operations, e.g. Orthographic projection and a differentiable Rodrigues formula | |
Parts of the code are taken from https://github.com/MandyMo/pytorch_HMR | |
""" | |
import torch | |
def rodrigues(theta): | |
"""Convert axis-angle representation to rotation matrix. | |
Args: | |
theta: size = [B, 3] | |
Returns: | |
Rotation matrix corresponding to the quaternion -- size = [B, 3, 3] | |
""" | |
l1norm = torch.norm(theta + 1e-8, p = 2, dim = 1) | |
angle = torch.unsqueeze(l1norm, -1) | |
normalized = torch.div(theta, angle) | |
angle = angle * 0.5 | |
v_cos = torch.cos(angle) | |
v_sin = torch.sin(angle) | |
quat = torch.cat([v_cos, v_sin * normalized], dim = 1) | |
return quat2mat(quat) | |
def quat2mat(quat): | |
"""Convert quaternion coefficients to rotation matrix. | |
Args: | |
quat: size = [B, 4] 4 <===>(w, x, y, z) | |
Returns: | |
Rotation matrix corresponding to the quaternion -- size = [B, 3, 3] | |
""" | |
norm_quat = quat | |
norm_quat = norm_quat/norm_quat.norm(p=2, dim=1, keepdim=True) | |
w, x, y, z = norm_quat[:,0], norm_quat[:,1], norm_quat[:,2], norm_quat[:,3] | |
B = quat.size(0) | |
w2, x2, y2, z2 = w.pow(2), x.pow(2), y.pow(2), z.pow(2) | |
wx, wy, wz = w*x, w*y, w*z | |
xy, xz, yz = x*y, x*z, y*z | |
rotMat = torch.stack([w2 + x2 - y2 - z2, 2*xy - 2*wz, 2*wy + 2*xz, | |
2*wz + 2*xy, w2 - x2 + y2 - z2, 2*yz - 2*wx, | |
2*xz - 2*wy, 2*wx + 2*yz, w2 - x2 - y2 + z2], dim=1).view(B, 3, 3) | |
return rotMat | |
def orthographic_projection(X, camera): | |
"""Perform orthographic projection of 3D points X using the camera parameters | |
Args: | |
X: size = [B, N, 3] | |
camera: size = [B, 3] | |
Returns: | |
Projected 2D points -- size = [B, N, 2] | |
""" | |
camera = camera.view(-1, 1, 3) | |
X_trans = X[:, :, :2] + camera[:, :, 1:] | |
shape = X_trans.shape | |
X_2d = (camera[:, :, 0] * X_trans.view(shape[0], -1)).view(shape) | |
return X_2d | |