NeuralBody / lib /utils /if_nerf /if_nerf_net_utils.py
pengsida
initial commit
1ba539f
import torch
import numpy as np
import os
from lib.config import cfg
import trimesh
def update_loss_img(output, batch):
mse = torch.mean((output['rgb_map'] - batch['rgb'])**2, dim=2)[0]
mse = mse.detach().cpu().numpy().astype(np.float32)
# load the loss img
img_path = batch['meta']['img_path'][0]
paths = img_path.split('/')
paths[-1] = os.path.basename(img_path).replace('.jpg', '.npy')
loss_img_path = os.path.join(paths[0], 'loss', *paths[1:])
if os.path.exists(loss_img_path):
loss_img = np.load(loss_img_path)
else:
os.system("mkdir -p '{}'".format(os.path.dirname(loss_img_path)))
H, W = int(cfg.H * cfg.ratio), int(cfg.W * cfg.ratio)
loss_img = mse.mean() * np.ones([H, W]).astype(np.float32)
coord = batch['img_coord'][0]
coord = coord.detach().cpu().numpy()
loss_img[coord[:, 0], coord[:, 1]] = mse
np.save(loss_img_path, loss_img)
def init_smpl(smpl):
data_root = 'data/light_stage'
smpl_dir = os.path.join(data_root, cfg.smpl, cfg.human)
for i in range(cfg.ni):
smpl_path = os.path.join(smpl_dir, '{}.ply'.format(i + 1))
ply = trimesh.load(smpl_path)
xyz = np.array(ply.vertices).ravel()
smpl.weight.data[i] = torch.FloatTensor(xyz)
return smpl
def pts_to_can_pts(pts, batch):
"""transform pts from the world coordinate to the smpl coordinate"""
Th = batch['Th']
pts = pts - Th
R = batch['R']
pts = torch.matmul(pts, batch['R'])
return pts
def pts_to_coords(pts, min_xyz):
pts = pts.clone().detach()
# convert xyz to the voxel coordinate dhw
dhw = pts[..., [2, 1, 0]]
min_dhw = min_xyz[:, [2, 1, 0]]
dhw = dhw - min_dhw[:, None]
dhw = dhw / torch.tensor(cfg.voxel_size).to(dhw)
return dhw