From 7dc7129cf8373fe9c5d16ed40a0e5cd885a9007f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruilong=20Li=28=E6=9D=8E=E7=91=9E=E9=BE=99=29?= Date: Sat, 25 Feb 2023 14:37:10 -0800 Subject: [PATCH] fixes for nerf synthetic dataset (#1507) * fixes for nerf synthetic dataset * restore eval script * fix format with black --- nerfstudio/fields/density_fields.py | 4 ++++ nerfstudio/fields/nerfacto_field.py | 4 ++++ nerfstudio/models/nerfacto.py | 7 ++++++- scripts/benchmarking/launch_train_blender.sh | 2 +- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/nerfstudio/fields/density_fields.py b/nerfstudio/fields/density_fields.py index 1584deedf..9f4fb1571 100644 --- a/nerfstudio/fields/density_fields.py +++ b/nerfstudio/fields/density_fields.py @@ -102,6 +102,9 @@ class HashMLPDensityField(Field): positions = (positions + 2.0) / 4.0 else: positions = SceneBox.get_normalized_positions(ray_samples.frustums.get_positions(), self.aabb) + # Make sure the tcnn gets inputs between 0 and 1. + selector = ((positions > 0.0) & (positions < 1.0)).all(dim=-1) + positions = positions * selector[..., None] positions_flat = positions.view(-1, 3) if not self.use_linear: density_before_activation = ( @@ -115,6 +118,7 @@ class HashMLPDensityField(Field): # softplus, because it enables high post-activation (float32) density outputs # from smaller internal (float16) parameters. density = trunc_exp(density_before_activation) + density = density * selector[..., None] return density, None def get_outputs(self, ray_samples: RaySamples, density_embedding: Optional[TensorType] = None): diff --git a/nerfstudio/fields/nerfacto_field.py b/nerfstudio/fields/nerfacto_field.py index 746a538a1..0ed9069e1 100644 --- a/nerfstudio/fields/nerfacto_field.py +++ b/nerfstudio/fields/nerfacto_field.py @@ -237,6 +237,9 @@ class TCNNNerfactoField(Field): positions = (positions + 2.0) / 4.0 else: positions = SceneBox.get_normalized_positions(ray_samples.frustums.get_positions(), self.aabb) + # Make sure the tcnn gets inputs between 0 and 1. + selector = ((positions > 0.0) & (positions < 1.0)).all(dim=-1) + positions = positions * selector[..., None] self._sample_locations = positions if not self._sample_locations.requires_grad: self._sample_locations.requires_grad = True @@ -249,6 +252,7 @@ class TCNNNerfactoField(Field): # softplus, because it enables high post-activation (float32) density outputs # from smaller internal (float16) parameters. density = trunc_exp(density_before_activation.to(positions)) + density = density * selector[..., None] return density, base_mlp_out def get_outputs(self, ray_samples: RaySamples, density_embedding: Optional[TensorType] = None): diff --git a/nerfstudio/models/nerfacto.py b/nerfstudio/models/nerfacto.py index bf92968da..024e3a7a6 100644 --- a/nerfstudio/models/nerfacto.py +++ b/nerfstudio/models/nerfacto.py @@ -120,6 +120,8 @@ class NerfactoModelConfig(ModelConfig): """Whether use single jitter or not for the proposal networks.""" predict_normals: bool = False """Whether to predict normals or not.""" + disable_scene_contraction: bool = False + """Whether to disable scene contraction or not.""" class NerfactoModel(Model): @@ -135,7 +137,10 @@ class NerfactoModel(Model): """Set the fields and modules.""" super().populate_modules() - scene_contraction = SceneContraction(order=float("inf")) + if self.config.disable_scene_contraction: + scene_contraction = None + else: + scene_contraction = SceneContraction(order=float("inf")) # Fields self.field = TCNNNerfactoField( diff --git a/scripts/benchmarking/launch_train_blender.sh b/scripts/benchmarking/launch_train_blender.sh index 8f7148c03..cbdd7d754 100644 --- a/scripts/benchmarking/launch_train_blender.sh +++ b/scripts/benchmarking/launch_train_blender.sh @@ -28,7 +28,7 @@ fi method_opts=() if [ "$method_name" = "nerfacto" ]; then # https://github.com/nerfstudio-project/nerfstudio/issues/806#issuecomment-1284327844 - method_opts=(--pipeline.model.background-color white --pipeline.model.proposal-initial-sampler uniform --pipeline.model.near-plane 2. --pipeline.model.far-plane 6. --pipeline.datamanager.camera-optimizer.mode off --pipeline.model.use-average-appearance-embedding False) + method_opts=(--pipeline.model.background-color white --pipeline.model.proposal-initial-sampler uniform --pipeline.model.near-plane 2. --pipeline.model.far-plane 6. --pipeline.datamanager.camera-optimizer.mode off --pipeline.model.use-average-appearance-embedding False --pipeline.model.distortion-loss-mult 0 --pipeline.model.disable-scene-contraction True) fi shift $((OPTIND-1))