xrg
commited on
Commit
•
16da407
1
Parent(s):
5357224
separate generation process
Browse files- app.py +22 -14
- core/models.py +0 -133
- core/tensorBase.py +1 -29
app.py
CHANGED
@@ -35,7 +35,6 @@ GRADIO_OBJ_SHADING_PATH = 'gradio_output_shading.obj'
|
|
35 |
#opt = tyro.cli(AllConfigs)
|
36 |
|
37 |
ckpt_path = hf_hub_download(repo_id="rgxie/LDM", filename="LDM6v01.ckpt")
|
38 |
-
#ckpt_path = '/ssd3/xrg/tensor23d/pretrained/last_6view_0610_14.ckpt'
|
39 |
|
40 |
opt = Options(
|
41 |
input_size=512,
|
@@ -83,8 +82,6 @@ if opt.resume is not None:
|
|
83 |
print(f'[INFO] load resume success!')
|
84 |
|
85 |
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
86 |
-
print('first device')
|
87 |
-
print(device)
|
88 |
model = model.half().to(device)
|
89 |
model.eval()
|
90 |
|
@@ -141,18 +138,14 @@ pipe_image_plus = pipe_image_plus.to(device)
|
|
141 |
# load rembg
|
142 |
bg_remover = rembg.new_session()
|
143 |
|
144 |
-
# process function
|
145 |
-
@spaces.GPU
|
146 |
-
def process(condition_input_image, prompt, prompt_neg='', input_elevation=0, input_num_steps=30, input_seed=42, mv_moedl_option=None):
|
147 |
|
|
|
|
|
148 |
# seed
|
149 |
kiui.seed_everything(input_seed)
|
150 |
|
151 |
os.makedirs(os.path.join(opt.workspace, "gradio"), exist_ok=True)
|
152 |
output_video_path = os.path.join(opt.workspace,"gradio", GRADIO_VIDEO_PATH)
|
153 |
-
output_obj_rgb_path = os.path.join(opt.workspace,"gradio", GRADIO_OBJ_PATH)
|
154 |
-
output_obj_albedo_path = os.path.join(opt.workspace,"gradio", GRADIO_OBJ_ALBEDO_PATH)
|
155 |
-
output_obj_shading_path = os.path.join(opt.workspace,"gradio", GRADIO_OBJ_SHADING_PATH)
|
156 |
|
157 |
# text-conditioned
|
158 |
if condition_input_image is None:
|
@@ -199,7 +192,15 @@ def process(condition_input_image, prompt, prompt_neg='', input_elevation=0, inp
|
|
199 |
mv_image_grid = rearrange(mv_image, 'c (n h) (m w) -> (m h) (n w) c', n=3, m=2).numpy()
|
200 |
mv_image = rearrange(mv_image, 'c (n h) (m w) -> (n m) h w c', n=3, m=2).numpy()
|
201 |
input_image = mv_image
|
202 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
203 |
# generate gaussians
|
204 |
# [4, 256, 256, 3], float32
|
205 |
input_image = torch.from_numpy(input_image).permute(0, 3, 1, 2).float().to(device) # [4, 3, 256, 256]
|
@@ -274,7 +275,8 @@ def process(condition_input_image, prompt, prompt_neg='', input_elevation=0, inp
|
|
274 |
save_obj(vertices, faces, vertex_colors[2], output_obj_shading_path)
|
275 |
|
276 |
|
277 |
-
return
|
|
|
278 |
|
279 |
# gradio UI
|
280 |
|
@@ -385,7 +387,13 @@ with block:
|
|
385 |
)
|
386 |
|
387 |
|
388 |
-
|
389 |
-
|
390 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
391 |
block.launch(server_name="0.0.0.0", share=False)
|
|
|
35 |
#opt = tyro.cli(AllConfigs)
|
36 |
|
37 |
ckpt_path = hf_hub_download(repo_id="rgxie/LDM", filename="LDM6v01.ckpt")
|
|
|
38 |
|
39 |
opt = Options(
|
40 |
input_size=512,
|
|
|
82 |
print(f'[INFO] load resume success!')
|
83 |
|
84 |
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
|
|
|
|
85 |
model = model.half().to(device)
|
86 |
model.eval()
|
87 |
|
|
|
138 |
# load rembg
|
139 |
bg_remover = rembg.new_session()
|
140 |
|
|
|
|
|
|
|
141 |
|
142 |
+
@spaces.GPU
|
143 |
+
def generate_mv(condition_input_image, prompt, prompt_neg='', input_elevation=0, input_num_steps=30, input_seed=42, mv_moedl_option=None):
|
144 |
# seed
|
145 |
kiui.seed_everything(input_seed)
|
146 |
|
147 |
os.makedirs(os.path.join(opt.workspace, "gradio"), exist_ok=True)
|
148 |
output_video_path = os.path.join(opt.workspace,"gradio", GRADIO_VIDEO_PATH)
|
|
|
|
|
|
|
149 |
|
150 |
# text-conditioned
|
151 |
if condition_input_image is None:
|
|
|
192 |
mv_image_grid = rearrange(mv_image, 'c (n h) (m w) -> (m h) (n w) c', n=3, m=2).numpy()
|
193 |
mv_image = rearrange(mv_image, 'c (n h) (m w) -> (n m) h w c', n=3, m=2).numpy()
|
194 |
input_image = mv_image
|
195 |
+
return mv_image_grid, processed_image, input_image
|
196 |
+
|
197 |
+
@spaces.GPU
|
198 |
+
def generate_3d(input_image, condition_input_image, mv_moedl_option=None, input_seed=42):
|
199 |
+
kiui.seed_everything(input_seed)
|
200 |
+
|
201 |
+
output_obj_rgb_path = os.path.join(opt.workspace,"gradio", GRADIO_OBJ_PATH)
|
202 |
+
output_obj_albedo_path = os.path.join(opt.workspace,"gradio", GRADIO_OBJ_ALBEDO_PATH)
|
203 |
+
output_obj_shading_path = os.path.join(opt.workspace,"gradio", GRADIO_OBJ_SHADING_PATH)
|
204 |
# generate gaussians
|
205 |
# [4, 256, 256, 3], float32
|
206 |
input_image = torch.from_numpy(input_image).permute(0, 3, 1, 2).float().to(device) # [4, 3, 256, 256]
|
|
|
275 |
save_obj(vertices, faces, vertex_colors[2], output_obj_shading_path)
|
276 |
|
277 |
|
278 |
+
return output_obj_rgb_path, output_obj_albedo_path, output_obj_shading_path
|
279 |
+
|
280 |
|
281 |
# gradio UI
|
282 |
|
|
|
387 |
)
|
388 |
|
389 |
|
390 |
+
input_image = gr.State()
|
391 |
+
button_gen.click(fn=generate_mv, inputs=[condition_input_image, input_text, input_neg_text, input_elevation, input_num_steps, input_seed, mv_moedl_option],
|
392 |
+
outputs=[mv_image_grid, processed_image, input_image],).success(
|
393 |
+
fn=generate_3d,
|
394 |
+
inputs=[input_image, condition_input_image, mv_moedl_option, input_seed],
|
395 |
+
outputs=[output_obj_rgb_path, output_obj_albedo_path, output_obj_shading_path] ,
|
396 |
+
)
|
397 |
+
|
398 |
+
|
399 |
block.launch(server_name="0.0.0.0", share=False)
|
core/models.py
CHANGED
@@ -50,13 +50,9 @@ class LTRFM_NeRF(nn.Module):
|
|
50 |
)
|
51 |
|
52 |
aabb = torch.tensor([[-1, -1, -1], [1, 1, 1]]).cuda()
|
53 |
-
print(aabb.device)
|
54 |
grid_size = torch.tensor([opt.splat_size, opt.splat_size, opt.splat_size]).cuda()
|
55 |
near_far =torch.tensor([opt.znear, opt.zfar]).cuda()
|
56 |
|
57 |
-
print(device)
|
58 |
-
print('aabb')
|
59 |
-
print(aabb.device)
|
60 |
# tensorf Renderer
|
61 |
self.tensorRF = TensorVMSplit_NeRF(aabb, grid_size, density_n_comp=opt.density_n_comp,appearance_n_comp=opt.app_n_comp,app_dim=opt.app_dim,\
|
62 |
density_dim=opt.density_dim,near_far=near_far, shadingMode=opt.shadingMode, pos_pe=opt.pos_pe, view_pe=opt.view_pe, fea_pe=opt.fea_pe)
|
@@ -127,9 +123,6 @@ class LTRFM_NeRF(nn.Module):
|
|
127 |
xyz_samples=xyz_samples.permute(0,2,3,4,1)
|
128 |
xyz_samples=xyz_samples.view(1,-1,1,3)
|
129 |
|
130 |
-
print("app and xyz")
|
131 |
-
print(planes['app_planes'].device)
|
132 |
-
print(xyz_samples.device)
|
133 |
|
134 |
grid_out = self.tensorRF.predict_sdf(planes,xyz_samples)
|
135 |
grid_out['sigma']=grid_out['sigma'].view(grid_size,grid_size,grid_size).float()
|
@@ -191,68 +184,6 @@ class LTRFM_NeRF(nn.Module):
|
|
191 |
return vertices, faces, uvs, mesh_tex_idx, [texture_map,texture_map_albedo]
|
192 |
|
193 |
|
194 |
-
def forward(self, data, step_ratio=1):
|
195 |
-
# data: output of the dataloader
|
196 |
-
# return: loss
|
197 |
-
#self.set_beta(data['t'])
|
198 |
-
results = {}
|
199 |
-
loss = 0
|
200 |
-
|
201 |
-
images = data['input'] # [B, 4, 9, h, W], input features
|
202 |
-
|
203 |
-
# use the first view to predict gaussians
|
204 |
-
svd_volume = self.forward_svd_volume(images,data) # [B, N, 14]
|
205 |
-
|
206 |
-
results['svd_volume'] = svd_volume
|
207 |
-
|
208 |
-
# always use white bg
|
209 |
-
bg_color = torch.ones(3, dtype=torch.float32).to(device)
|
210 |
-
|
211 |
-
# use the other views for rendering and supervision
|
212 |
-
results = self.tensorRF(svd_volume, data['all_rays_o'], data['all_rays_d'],is_train=True, bg_color=bg_color, N_samples=self.opt.n_sample)
|
213 |
-
pred_shading = results['image'] # [B, V, C, output_size, output_size]
|
214 |
-
pred_alphas = results['alpha'] # [B, V, 1, output_size, output_size]
|
215 |
-
pred_albedos = results['albedo'] # [B, V, C, output_size, output_size]
|
216 |
-
|
217 |
-
pred_images = pred_shading*pred_albedos
|
218 |
-
|
219 |
-
results['images_pred'] = pred_images
|
220 |
-
results['alphas_pred'] = pred_alphas
|
221 |
-
results['pred_albedos'] = pred_albedos
|
222 |
-
results['pred_shading'] = pred_shading
|
223 |
-
|
224 |
-
|
225 |
-
gt_images = data['images_output'] # [B, V, 3, output_size, output_size], ground-truth novel views
|
226 |
-
gt_albedos = data['albedos_output'] # [B, V, 3, output_size, output_size], ground-truth novel views
|
227 |
-
gt_masks = data['masks_output'] # [B, V, 1, output_size, output_size], ground-truth masks
|
228 |
-
|
229 |
-
gt_images = gt_images * gt_masks + bg_color.view(1, 1, 3, 1, 1) * (1 - gt_masks)
|
230 |
-
gt_albedos = gt_albedos * gt_masks + bg_color.view(1, 1, 3, 1, 1) * (1 - gt_masks)
|
231 |
-
|
232 |
-
loss_mse = F.mse_loss(pred_images, gt_images) + F.mse_loss(pred_alphas, gt_masks) + F.mse_loss(pred_albedos, gt_albedos)
|
233 |
-
loss = loss + loss_mse
|
234 |
-
|
235 |
-
# eikonal_loss = ((results['eik_grads'].norm(2, dim=1) - 1) ** 2).mean()
|
236 |
-
# loss = loss+ 0.1*eikonal_loss
|
237 |
-
|
238 |
-
if self.opt.lambda_lpips > 0:
|
239 |
-
loss_lpips = self.lpips_loss(
|
240 |
-
F.interpolate(gt_images.view(-1, 3, self.opt.output_size, self.opt.output_size) * 2 - 1, (256, 256), mode='bilinear', align_corners=False),
|
241 |
-
F.interpolate(pred_images.view(-1, 3, self.opt.output_size, self.opt.output_size) * 2 - 1, (256, 256), mode='bilinear', align_corners=False),
|
242 |
-
).mean()
|
243 |
-
results['loss_lpips'] = loss_lpips
|
244 |
-
loss = loss + self.opt.lambda_lpips * loss_lpips
|
245 |
-
|
246 |
-
results['loss'] = loss
|
247 |
-
|
248 |
-
# metric
|
249 |
-
with torch.no_grad():
|
250 |
-
psnr = -10 * torch.log10(torch.mean((pred_images.detach() - gt_images) ** 2))
|
251 |
-
results['psnr'] = psnr
|
252 |
-
|
253 |
-
return results
|
254 |
-
|
255 |
-
|
256 |
def render_frame(self, data):
|
257 |
# data: output of the dataloader
|
258 |
# return: loss
|
@@ -631,70 +562,6 @@ class LTRFM_Mesh(nn.Module):
|
|
631 |
}
|
632 |
return out
|
633 |
|
634 |
-
def forward(self, data, step_ratio=1):
|
635 |
-
# data: output of the dataloader
|
636 |
-
# return: loss
|
637 |
-
|
638 |
-
results = {}
|
639 |
-
loss = 0
|
640 |
-
|
641 |
-
images = data['input'] # [B, 4, 9, h, W], input features
|
642 |
-
|
643 |
-
# use the first view to predict gaussians
|
644 |
-
svd_volume = self.forward_svd_volume(images,data) # [B, N, 14]
|
645 |
-
|
646 |
-
results['svd_volume'] = svd_volume
|
647 |
-
|
648 |
-
# return the rendered images
|
649 |
-
results = self.forward_geometry(svd_volume, data['w2c'], self.opt.output_size)
|
650 |
-
|
651 |
-
|
652 |
-
# always use white bg
|
653 |
-
bg_color = torch.ones(3, dtype=torch.float32).to(device)
|
654 |
-
|
655 |
-
# use the other views for rendering and supervision
|
656 |
-
#results = self.tensorRF(svd_volume, data['all_rays_o'], data['all_rays_d'],is_train=True, bg_color=bg_color, N_samples=self.opt.n_sample)
|
657 |
-
|
658 |
-
|
659 |
-
pred_shading = results['image'] # [B, V, C, output_size, output_size]
|
660 |
-
pred_alphas = results['mask'] # [B, V, 1, output_size, output_size]
|
661 |
-
pred_albedos = results['albedo'] # [B, V, C, output_size, output_size]
|
662 |
-
|
663 |
-
pred_images=pred_shading*pred_albedos
|
664 |
-
|
665 |
-
results['images_pred'] = pred_images
|
666 |
-
results['alphas_pred'] = pred_alphas
|
667 |
-
results['pred_albedos'] = pred_albedos
|
668 |
-
results['pred_shading'] = pred_shading
|
669 |
-
|
670 |
-
|
671 |
-
gt_images = data['images_output'] # [B, V, 3, output_size, output_size], ground-truth novel views
|
672 |
-
gt_albedos = data['albedos_output'] # [B, V, 3, output_size, output_size], ground-truth novel views
|
673 |
-
gt_masks = data['masks_output'] # [B, V, 1, output_size, output_size], ground-truth masks
|
674 |
-
|
675 |
-
gt_images = gt_images * gt_masks + bg_color.view(1, 1, 3, 1, 1) * (1 - gt_masks)
|
676 |
-
gt_albedos = gt_albedos * gt_masks + bg_color.view(1, 1, 3, 1, 1) * (1 - gt_masks)
|
677 |
-
|
678 |
-
loss_mse = F.mse_loss(pred_images, gt_images) + F.mse_loss(pred_alphas, gt_masks) + F.mse_loss(pred_albedos, gt_albedos)
|
679 |
-
loss = loss + loss_mse
|
680 |
-
|
681 |
-
if self.opt.lambda_lpips > 0:
|
682 |
-
loss_lpips = self.lpips_loss(
|
683 |
-
F.interpolate(gt_images.view(-1, 3, self.opt.output_size, self.opt.output_size) * 2 - 1, (256, 256), mode='bilinear', align_corners=False),
|
684 |
-
F.interpolate(pred_images.view(-1, 3, self.opt.output_size, self.opt.output_size) * 2 - 1, (256, 256), mode='bilinear', align_corners=False),
|
685 |
-
).mean()
|
686 |
-
results['loss_lpips'] = loss_lpips
|
687 |
-
loss = loss + self.opt.lambda_lpips * loss_lpips
|
688 |
-
|
689 |
-
results['loss'] = loss
|
690 |
-
|
691 |
-
# metric
|
692 |
-
with torch.no_grad():
|
693 |
-
psnr = -10 * torch.log10(torch.mean((pred_images.detach() - gt_images) ** 2))
|
694 |
-
results['psnr'] = psnr
|
695 |
-
|
696 |
-
return results
|
697 |
-
|
698 |
|
699 |
def render_frame(self, data):
|
700 |
# data: output of the dataloader
|
|
|
50 |
)
|
51 |
|
52 |
aabb = torch.tensor([[-1, -1, -1], [1, 1, 1]]).cuda()
|
|
|
53 |
grid_size = torch.tensor([opt.splat_size, opt.splat_size, opt.splat_size]).cuda()
|
54 |
near_far =torch.tensor([opt.znear, opt.zfar]).cuda()
|
55 |
|
|
|
|
|
|
|
56 |
# tensorf Renderer
|
57 |
self.tensorRF = TensorVMSplit_NeRF(aabb, grid_size, density_n_comp=opt.density_n_comp,appearance_n_comp=opt.app_n_comp,app_dim=opt.app_dim,\
|
58 |
density_dim=opt.density_dim,near_far=near_far, shadingMode=opt.shadingMode, pos_pe=opt.pos_pe, view_pe=opt.view_pe, fea_pe=opt.fea_pe)
|
|
|
123 |
xyz_samples=xyz_samples.permute(0,2,3,4,1)
|
124 |
xyz_samples=xyz_samples.view(1,-1,1,3)
|
125 |
|
|
|
|
|
|
|
126 |
|
127 |
grid_out = self.tensorRF.predict_sdf(planes,xyz_samples)
|
128 |
grid_out['sigma']=grid_out['sigma'].view(grid_size,grid_size,grid_size).float()
|
|
|
184 |
return vertices, faces, uvs, mesh_tex_idx, [texture_map,texture_map_albedo]
|
185 |
|
186 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
187 |
def render_frame(self, data):
|
188 |
# data: output of the dataloader
|
189 |
# return: loss
|
|
|
562 |
}
|
563 |
return out
|
564 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
565 |
|
566 |
def render_frame(self, data):
|
567 |
# data: output of the dataloader
|
core/tensorBase.py
CHANGED
@@ -205,23 +205,7 @@ class TensorBase(torch.nn.Module):
|
|
205 |
self.near_far = near_far
|
206 |
self.step_ratio = 0.9 #step_ratio原作0.5
|
207 |
|
208 |
-
|
209 |
-
print("grid size", gridSize)
|
210 |
-
self.aabbSize = self.aabb[1] - self.aabb[0]
|
211 |
-
print(self.aabbSize.device)
|
212 |
-
self.invaabbSize = 2.0/self.aabbSize
|
213 |
-
print(self.invaabbSize.device)
|
214 |
-
# self.invaabbSize = self.invaabbSize.to(self.aabb.device)
|
215 |
-
# print(self.invaabbSize.device)
|
216 |
-
self.gridSize= gridSize.float()
|
217 |
-
self.units=self.aabbSize / (self.gridSize-1)
|
218 |
-
self.stepSize=torch.mean(self.units)*self.step_ratio # TBD step_ratio? why so small 0.5
|
219 |
-
self.aabbDiag = torch.sqrt(torch.sum(torch.square(self.aabbSize)))
|
220 |
-
self.nSamples=int((self.aabbDiag / self.stepSize).item()) + 1
|
221 |
-
print("sampling step size: ", self.stepSize)
|
222 |
-
print("sampling number: ", self.nSamples)
|
223 |
-
|
224 |
-
# self.update_stepSize(gridSize)
|
225 |
|
226 |
self.matMode = [[0,1], [0,2], [1,2]]
|
227 |
self.vecMode = [2, 1, 0]
|
@@ -252,14 +236,8 @@ class TensorBase(torch.nn.Module):
|
|
252 |
print(self.renderModule)
|
253 |
|
254 |
def update_stepSize(self, gridSize):
|
255 |
-
print("aabb", self.aabb.view(-1))
|
256 |
-
print("grid size", gridSize)
|
257 |
self.aabbSize = self.aabb[1] - self.aabb[0]
|
258 |
-
print(self.aabbSize.device)
|
259 |
self.invaabbSize = 2.0/self.aabbSize
|
260 |
-
print(self.invaabbSize.device)
|
261 |
-
# self.invaabbSize = self.invaabbSize.to(self.aabb.device)
|
262 |
-
# print(self.invaabbSize.device)
|
263 |
self.gridSize= gridSize.float()
|
264 |
self.units=self.aabbSize / (self.gridSize-1)
|
265 |
self.stepSize=torch.mean(self.units)*self.step_ratio # TBD step_ratio? why so small 0.5
|
@@ -281,14 +259,8 @@ class TensorBase(torch.nn.Module):
|
|
281 |
pass
|
282 |
|
283 |
def normalize_coord(self, xyz_sampled):
|
284 |
-
print("debug")
|
285 |
-
|
286 |
-
print(xyz_sampled.device)
|
287 |
-
print(self.aabb[0].device)
|
288 |
-
print(self.invaabbSize.device)
|
289 |
if xyz_sampled.device!=self.invaabbSize.device:
|
290 |
self.invaabbSize=self.invaabbSize.to(xyz_sampled.device)
|
291 |
-
|
292 |
return (xyz_sampled-self.aabb[0]) * self.invaabbSize - 1
|
293 |
|
294 |
def get_optparam_groups(self, lr_init_spatial = 0.02, lr_init_network = 0.001):
|
|
|
205 |
self.near_far = near_far
|
206 |
self.step_ratio = 0.9 #step_ratio原作0.5
|
207 |
|
208 |
+
self.update_stepSize(gridSize)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
209 |
|
210 |
self.matMode = [[0,1], [0,2], [1,2]]
|
211 |
self.vecMode = [2, 1, 0]
|
|
|
236 |
print(self.renderModule)
|
237 |
|
238 |
def update_stepSize(self, gridSize):
|
|
|
|
|
239 |
self.aabbSize = self.aabb[1] - self.aabb[0]
|
|
|
240 |
self.invaabbSize = 2.0/self.aabbSize
|
|
|
|
|
|
|
241 |
self.gridSize= gridSize.float()
|
242 |
self.units=self.aabbSize / (self.gridSize-1)
|
243 |
self.stepSize=torch.mean(self.units)*self.step_ratio # TBD step_ratio? why so small 0.5
|
|
|
259 |
pass
|
260 |
|
261 |
def normalize_coord(self, xyz_sampled):
|
|
|
|
|
|
|
|
|
|
|
262 |
if xyz_sampled.device!=self.invaabbSize.device:
|
263 |
self.invaabbSize=self.invaabbSize.to(xyz_sampled.device)
|
|
|
264 |
return (xyz_sampled-self.aabb[0]) * self.invaabbSize - 1
|
265 |
|
266 |
def get_optparam_groups(self, lr_init_spatial = 0.02, lr_init_network = 0.001):
|