ashawkey commited on
Commit
30e1aa8
·
1 Parent(s): dca1681

fix: background net should condition on rays_d

Browse files
nerf/network.py CHANGED
@@ -52,7 +52,7 @@ class NeRFNetwork(NeRFRenderer):
52
  if self.bg_radius > 0:
53
  self.num_layers_bg = num_layers_bg
54
  self.hidden_dim_bg = hidden_dim_bg
55
- self.encoder_bg, self.in_dim_bg = get_encoder('frequency', input_dim=2)
56
  self.bg_net = MLP(self.in_dim_bg, 3, hidden_dim_bg, num_layers_bg, bias=True)
57
 
58
  else:
@@ -80,7 +80,7 @@ class NeRFNetwork(NeRFRenderer):
80
  return sigma, albedo
81
 
82
  # ref: https://github.com/zhaofuq/Instant-NSR/blob/main/nerf/network_sdf.py#L192
83
- def finite_difference_normal(self, x, epsilon=5e-4):
84
  # x: [N, 3]
85
  dx_pos, _ = self.common_forward((x + torch.tensor([[epsilon, 0.00, 0.00]], device=x.device)).clamp(-self.bound, self.bound))
86
  dx_neg, _ = self.common_forward((x + torch.tensor([[-epsilon, 0.00, 0.00]], device=x.device)).clamp(-self.bound, self.bound))
@@ -148,10 +148,9 @@ class NeRFNetwork(NeRFRenderer):
148
  }
149
 
150
 
151
- def background(self, x, d):
152
- # x: [N, 2], in [-1, 1]
153
 
154
- h = self.encoder_bg(x) # [N, C]
155
 
156
  h = self.bg_net(h)
157
 
 
52
  if self.bg_radius > 0:
53
  self.num_layers_bg = num_layers_bg
54
  self.hidden_dim_bg = hidden_dim_bg
55
+ self.encoder_bg, self.in_dim_bg = get_encoder('frequency', input_dim=3)
56
  self.bg_net = MLP(self.in_dim_bg, 3, hidden_dim_bg, num_layers_bg, bias=True)
57
 
58
  else:
 
80
  return sigma, albedo
81
 
82
  # ref: https://github.com/zhaofuq/Instant-NSR/blob/main/nerf/network_sdf.py#L192
83
+ def finite_difference_normal(self, x, epsilon=1e-2):
84
  # x: [N, 3]
85
  dx_pos, _ = self.common_forward((x + torch.tensor([[epsilon, 0.00, 0.00]], device=x.device)).clamp(-self.bound, self.bound))
86
  dx_neg, _ = self.common_forward((x + torch.tensor([[-epsilon, 0.00, 0.00]], device=x.device)).clamp(-self.bound, self.bound))
 
148
  }
149
 
150
 
151
+ def background(self, d):
 
152
 
153
+ h = self.encoder_bg(d) # [N, C]
154
 
155
  h = self.bg_net(h)
156
 
nerf/network_grid.py CHANGED
@@ -57,7 +57,7 @@ class NeRFNetwork(NeRFRenderer):
57
 
58
  # use a very simple network to avoid it learning the prompt...
59
  # self.encoder_bg, self.in_dim_bg = get_encoder('tiledgrid', input_dim=2, num_levels=4, desired_resolution=2048)
60
- self.encoder_bg, self.in_dim_bg = get_encoder('frequency', input_dim=2)
61
 
62
  self.bg_net = MLP(self.in_dim_bg, 3, hidden_dim_bg, num_layers_bg, bias=True)
63
 
@@ -87,7 +87,7 @@ class NeRFNetwork(NeRFRenderer):
87
  return sigma, albedo
88
 
89
  # ref: https://github.com/zhaofuq/Instant-NSR/blob/main/nerf/network_sdf.py#L192
90
- def finite_difference_normal(self, x, epsilon=5e-4):
91
  # x: [N, 3]
92
  dx_pos, _ = self.common_forward((x + torch.tensor([[epsilon, 0.00, 0.00]], device=x.device)).clamp(-self.bound, self.bound))
93
  dx_neg, _ = self.common_forward((x + torch.tensor([[-epsilon, 0.00, 0.00]], device=x.device)).clamp(-self.bound, self.bound))
@@ -155,10 +155,9 @@ class NeRFNetwork(NeRFRenderer):
155
  }
156
 
157
 
158
- def background(self, x, d):
159
- # x: [N, 2], in [-1, 1]
160
 
161
- h = self.encoder_bg(x) # [N, C]
162
 
163
  h = self.bg_net(h)
164
 
 
57
 
58
  # use a very simple network to avoid it learning the prompt...
59
  # self.encoder_bg, self.in_dim_bg = get_encoder('tiledgrid', input_dim=2, num_levels=4, desired_resolution=2048)
60
+ self.encoder_bg, self.in_dim_bg = get_encoder('frequency', input_dim=3)
61
 
62
  self.bg_net = MLP(self.in_dim_bg, 3, hidden_dim_bg, num_layers_bg, bias=True)
63
 
 
87
  return sigma, albedo
88
 
89
  # ref: https://github.com/zhaofuq/Instant-NSR/blob/main/nerf/network_sdf.py#L192
90
+ def finite_difference_normal(self, x, epsilon=1e-2):
91
  # x: [N, 3]
92
  dx_pos, _ = self.common_forward((x + torch.tensor([[epsilon, 0.00, 0.00]], device=x.device)).clamp(-self.bound, self.bound))
93
  dx_neg, _ = self.common_forward((x + torch.tensor([[-epsilon, 0.00, 0.00]], device=x.device)).clamp(-self.bound, self.bound))
 
155
  }
156
 
157
 
158
+ def background(self, d):
 
159
 
160
+ h = self.encoder_bg(d) # [N, C]
161
 
162
  h = self.bg_net(h)
163
 
nerf/network_tcnn.py CHANGED
@@ -4,6 +4,7 @@ import torch.nn.functional as F
4
 
5
  from activation import trunc_exp
6
  from .renderer import NeRFRenderer
 
7
 
8
  import numpy as np
9
  import tinycudann as tcnn
@@ -65,19 +66,9 @@ class NeRFNetwork(NeRFRenderer):
65
  self.num_layers_bg = num_layers_bg
66
  self.hidden_dim_bg = hidden_dim_bg
67
 
68
- self.encoder_bg = tcnn.Encoding(
69
- n_input_dims=2,
70
- encoding_config={
71
- "otype": "HashGrid",
72
- "n_levels": 4,
73
- "n_features_per_level": 2,
74
- "log2_hashmap_size": 16,
75
- "base_resolution": 16,
76
- "per_level_scale": 1.5,
77
- },
78
- )
79
-
80
- self.bg_net = MLP(8, 3, hidden_dim_bg, num_layers_bg, bias=True)
81
 
82
  else:
83
  self.bg_net = None
@@ -156,11 +147,10 @@ class NeRFNetwork(NeRFRenderer):
156
  }
157
 
158
 
159
- def background(self, x, d):
160
  # x: [N, 2], in [-1, 1]
161
 
162
- h = (x + 1) / (2 * 1) # to [0, 1]
163
- h = self.encoder_bg(h) # [N, C]
164
 
165
  h = self.bg_net(h)
166
 
 
4
 
5
  from activation import trunc_exp
6
  from .renderer import NeRFRenderer
7
+ from encoding import get_encoder
8
 
9
  import numpy as np
10
  import tinycudann as tcnn
 
66
  self.num_layers_bg = num_layers_bg
67
  self.hidden_dim_bg = hidden_dim_bg
68
 
69
+ self.encoder_bg, self.in_dim_bg = get_encoder('frequency', input_dim=3)
70
+
71
+ self.bg_net = MLP(self.in_dim_bg, 3, hidden_dim_bg, num_layers_bg, bias=True)
 
 
 
 
 
 
 
 
 
 
72
 
73
  else:
74
  self.bg_net = None
 
147
  }
148
 
149
 
150
+ def background(self, d):
151
  # x: [N, 2], in [-1, 1]
152
 
153
+ h = self.encoder_bg(d) # [N, C]
 
154
 
155
  h = self.bg_net(h)
156
 
nerf/renderer.py CHANGED
@@ -420,8 +420,8 @@ class NeRFRenderer(nn.Module):
420
  # mix background color
421
  if self.bg_radius > 0:
422
  # use the bg model to calculate bg_color
423
- sph = raymarching.sph_from_ray(rays_o, rays_d, self.bg_radius) # [N, 2] in [-1, 1]
424
- bg_color = self.background(sph, rays_d.reshape(-1, 3)) # [N, 3]
425
  elif bg_color is None:
426
  bg_color = 1
427
 
@@ -526,8 +526,8 @@ class NeRFRenderer(nn.Module):
526
  if self.bg_radius > 0:
527
 
528
  # use the bg model to calculate bg_color
529
- sph = raymarching.sph_from_ray(rays_o, rays_d, self.bg_radius) # [N, 2] in [-1, 1]
530
- bg_color = self.background(sph, rays_d) # [N, 3]
531
 
532
  elif bg_color is None:
533
  bg_color = 1
 
420
  # mix background color
421
  if self.bg_radius > 0:
422
  # use the bg model to calculate bg_color
423
+ # sph = raymarching.sph_from_ray(rays_o, rays_d, self.bg_radius) # [N, 2] in [-1, 1]
424
+ bg_color = self.background(rays_d.reshape(-1, 3)) # [N, 3]
425
  elif bg_color is None:
426
  bg_color = 1
427
 
 
526
  if self.bg_radius > 0:
527
 
528
  # use the bg model to calculate bg_color
529
+ # sph = raymarching.sph_from_ray(rays_o, rays_d, self.bg_radius) # [N, 2] in [-1, 1]
530
+ bg_color = self.background(rays_d) # [N, 3]
531
 
532
  elif bg_color is None:
533
  bg_color = 1
nerf/utils.py CHANGED
@@ -343,6 +343,9 @@ class Trainer(object):
343
  pred_rgb = outputs['image'].reshape(B, H, W, 3).permute(0, 3, 1, 2).contiguous() # [1, 3, H, W]
344
  # torch.cuda.synchronize(); print(f'[TIME] nerf render {time.time() - _t:.4f}s')
345
 
 
 
 
346
  # text embeddings
347
  if self.opt.dir_text:
348
  dirs = data['dir'] # [B,]
 
343
  pred_rgb = outputs['image'].reshape(B, H, W, 3).permute(0, 3, 1, 2).contiguous() # [1, 3, H, W]
344
  # torch.cuda.synchronize(); print(f'[TIME] nerf render {time.time() - _t:.4f}s')
345
 
346
+ # print(shading)
347
+ # torch_vis_2d(pred_rgb[0])
348
+
349
  # text embeddings
350
  if self.opt.dir_text:
351
  dirs = data['dir'] # [B,]