Compare commits

..
2 Commits
Author SHA1 Message Date
luni b17baf157b move functions 2023-01-16 16:38:08 +00:00
luni 4dee8e4106 fix smpl trans handling 2023-01-16 16:37:11 +00:00
4 changed files with 58 additions and 47 deletions
+2 -2
View File
@@ -57,11 +57,11 @@ class DataReader:
- V: human mesh vertices - V: human mesh vertices
- F: mesh faces - F: mesh faces
""" """
def read_human(self, sample, frame, trans, zrot): def read_human(self, sample, frame, zrot, use_trans=True):
# SMPL parameters # SMPL parameters
gender, pose, shape, trans = self.read_smpl_params(sample, frame) gender, pose, shape, trans = self.read_smpl_params(sample, frame)
# Compute SMPL # Compute SMPL
V, J = self.smpl[gender].set_params(pose=pose, beta=shape, trans=trans) V, J = self.smpl[gender].set_params(pose=pose, beta=shape, trans=trans if use_trans else None)
V -= J[0:1] V -= J[0:1]
# Apply rotation on z-axis # Apply rotation on z-axis
zRot = zRotMatrix(zrot) zRot = zRotMatrix(zrot)
+1 -1
View File
@@ -19,7 +19,7 @@ from torch.utils.data import Dataset
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..') sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..')
from data.render import Render, DepthRenderer from data.render import Render, DepthRenderer
from superSMPL.IO import readPC2Frame, writePC2 from superSMPL.IO import readPC2Frame, writePC2
from utils.data_utils import Frame, read_frames_file, mask_faces, get_normals_from_depth from utils.data_utils import Frame, read_frames_file, mask_faces, get_normals_from_depth, get_camera
from cloth3d.read import DataReader from cloth3d.read import DataReader
from cloth3d.util import quads2tris from cloth3d.util import quads2tris
+5 -43
View File
@@ -10,7 +10,7 @@ from deodr.pytorch.differentiable_renderer_pytorch import Scene3DPytorch, Camera
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..') sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..')
from cloth3d.util import proj from cloth3d.util import proj
from utils.data_utils import intrinsic, extrinsic, get_camera
class RenderCore: class RenderCore:
def __init__(self, max_depth=0, depth_scale=1): def __init__(self, max_depth=0, depth_scale=1):
@@ -70,45 +70,6 @@ class RenderCore:
return depth return depth
""" CAMERA """
def intrinsic():
RES_X = 640
RES_Y = 480
f_mm = 50 # blender default
sensor_w_mm = 36 # blender default
sensor_h_mm = sensor_w_mm * RES_Y / RES_X
fx_px = f_mm * RES_X / sensor_w_mm
fy_px = f_mm * RES_Y / sensor_h_mm
u = RES_X / 2
v = RES_Y / 2
return np.array([[fx_px, 0, u],
[0, fy_px, v],
[0, 0, 1]], np.float32)
def extrinsic(camLoc):
R_w2bc = np.array([[0, 1, 0],
[0, 0, 1],
[1, 0, 0]], np.float32)
T_w2bc = -1 * R_w2bc.dot(camLoc)
R_bc2cv = np.array([[1, 0, 0],
[0, -1, 0],
[0, 0, -1]], np.float32)
R_w2cv = R_bc2cv.dot(R_w2bc)
T_w2cv = R_bc2cv.dot(T_w2bc)
return np.concatenate((R_w2cv, T_w2cv[:,None]), axis=1)
def proj(camLoc):
return intrinsic().dot(extrinsic(camLoc))
class Render: class Render:
def __init__(self, max_depth=0, depth_scale=1, size=(640, 480)): def __init__(self, max_depth=0, depth_scale=1, size=(640, 480)):
self.render_core = RenderCore(max_depth=max_depth) self.render_core = RenderCore(max_depth=max_depth)
@@ -161,16 +122,17 @@ class DepthRenderer(nn.Module):
# R, T = look_at_view_transform(2.7, 0, 0) # R, T = look_at_view_transform(2.7, 0, 0)
# cameras = FoVPerspectiveCameras(device='cuda', R=R, T=T) # cameras = FoVPerspectiveCameras(device='cuda', R=R, T=T)
ext = torch.tensor(extrinsic(cam).astype(np.float32), device='cuda') # ext = torch.tensor(extrinsic(cam).astype(np.float32), device='cuda')
# ext = proj(cam) # ext = proj(cam)
# fp = np.array([240 * (480 / 36), 320 * (640 / 36)], dtype=np.float32) # fp = np.array([240 * (480 / 36), 320 * (640 / 36)], dtype=np.float32)
img_size = np.array([480, 640], dtype=np.float32) img_size = np.array([480, 640], dtype=np.float32)
# K = np.eye(4, dtype=np.float32) # K = np.eye(4, dtype=np.float32)
# K[:3,:3] = intrinsic() # K[:3,:3] = intrinsic()
K = torch.tensor(intrinsic()[None, :, :], device='cuda') # K = torch.tensor(intrinsic()[None, :, :], device='cuda')
# cameras = PerspectiveCameras(device='cuda', R=ext[None, :, :3], T=ext[None, :, 3], focal_length=1,)# principal_point=fp[None, :], image_size=img_size[None, :]) # cameras = PerspectiveCameras(device='cuda', R=ext[None, :, :3], T=ext[None, :, 3], focal_length=1,)# principal_point=fp[None, :], image_size=img_size[None, :])
cameras = cameras_from_opencv_projection(R=ext[None, :, :3], tvec=ext[None, :, 3], camera_matrix=K, image_size=torch.tensor(img_size[None, :], device='cuda')) # cameras = cameras_from_opencv_projection(R=ext[None, :, :3], tvec=ext[None, :, 3], camera_matrix=K, image_size=torch.tensor(img_size[None, :], device='cuda'))
cameras, K = get_camera(cam, [480, 640], verts.get_device())
raster_settings = RasterizationSettings( raster_settings = RasterizationSettings(
image_size=(480, 640), image_size=(480, 640),
+50 -1
View File
@@ -5,6 +5,7 @@ import torch
import numpy as np import numpy as np
import scipy.io as sio import scipy.io as sio
from math import cos, sin from math import cos, sin
from pytorch3d.utils import cameras_from_opencv_projection
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..') sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..')
@@ -58,4 +59,52 @@ def get_normals_from_depth(depth_image, depth_mask, camera_intrinsic):
def center_crop_resize(img, new_center, size): def center_crop_resize(img, new_center, size):
pass pass
""" CAMERA """
def intrinsic():
RES_X = 640
RES_Y = 480
f_mm = 50 # blender default
sensor_w_mm = 36 # blender default
sensor_h_mm = sensor_w_mm * RES_Y / RES_X
fx_px = f_mm * RES_X / sensor_w_mm
fy_px = f_mm * RES_Y / sensor_h_mm
u = RES_X / 2
v = RES_Y / 2
return np.array([[fx_px, 0, u],
[0, fy_px, v],
[0, 0, 1]], np.float32)
def extrinsic(camLoc):
R_w2bc = np.array([[0, 1, 0],
[0, 0, 1],
[1, 0, 0]], np.float32)
T_w2bc = -1 * R_w2bc.dot(camLoc)
R_bc2cv = np.array([[1, 0, 0],
[0, -1, 0],
[0, 0, -1]], np.float32)
R_w2cv = R_bc2cv.dot(R_w2bc)
T_w2cv = R_bc2cv.dot(T_w2bc)
return np.concatenate((R_w2cv, T_w2cv[:,None]), axis=1)
def proj(camLoc):
return intrinsic().dot(extrinsic(camLoc))
def get_camera(cam, img_size, device):
size = np.array(img_size, dtype=np.float32)
ext = torch.tensor(extrinsic(cam).astype(np.float32), device=device)
K = torch.tensor(intrinsic()[None, :, :], device=device)
cameras = cameras_from_opencv_projection(R=ext[None, :, :3], tvec=ext[None, :, 3], camera_matrix=K, image_size=torch.tensor(size[None, :], device=device))
return cameras, K