Spaces:
Configuration error
Configuration error
import torch | |
from lib.config import cfg | |
from .nerf_net_utils import * | |
from .. import embedder | |
import numpy as np | |
import mcubes | |
import trimesh | |
from . import if_clight_renderer | |
class Renderer(if_clight_renderer.Renderer): | |
def __init__(self, net): | |
super(Renderer, self).__init__(net) | |
def batchify_rays(self, wpts, alpha_decoder, chunk=1024 * 32): | |
"""Render rays in smaller minibatches to avoid OOM. | |
""" | |
n_batch, n_point = wpts.shape[:2] | |
all_ret = [] | |
for i in range(0, n_point, chunk): | |
ret = alpha_decoder(wpts[:, i:i + chunk]) | |
all_ret.append(ret) | |
all_ret = torch.cat(all_ret, 1) | |
return all_ret | |
def render(self, batch): | |
pts = batch['pts'] | |
sh = pts.shape | |
inside = batch['inside'][0].bool() | |
pts = pts[0][inside][None] | |
# encode neural body | |
sp_input = self.prepare_sp_input(batch) | |
feature_volume = self.net.encode_sparse_voxels(sp_input) | |
alpha_decoder = lambda x: self.net.calculate_density( | |
x, feature_volume, sp_input) | |
alpha = self.batchify_rays(pts, alpha_decoder, 2048 * 64) | |
alpha = alpha[0, :, 0].detach().cpu().numpy() | |
cube = np.zeros(sh[1:-1]) | |
inside = inside.detach().cpu().numpy() | |
cube[inside == 1] = alpha | |
cube = np.pad(cube, 10, mode='constant') | |
vertices, triangles = mcubes.marching_cubes(cube, cfg.mesh_th) | |
# vertices = (vertices - 10) * 0.005 | |
# vertices = vertices + batch['wbounds'][0, 0].detach().cpu().numpy() | |
mesh = trimesh.Trimesh(vertices, triangles) | |
ret = {'cube': cube, 'mesh': mesh} | |
return ret | |