From 2a62d8a14e08242987339f8eab0a73ae45760190 Mon Sep 17 00:00:00 2001 From: Ethan Weber Date: Mon, 5 Dec 2022 15:37:49 -0800 Subject: [PATCH 01/24] Update mipnerf defaults (#1092) update mipnerf defaults --- nerfstudio/configs/method_configs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nerfstudio/configs/method_configs.py b/nerfstudio/configs/method_configs.py index f666b5ed1..6fb532e14 100644 --- a/nerfstudio/configs/method_configs.py +++ b/nerfstudio/configs/method_configs.py @@ -116,13 +116,13 @@ method_configs["instant-ngp"] = Config( method_configs["mipnerf"] = Config( method_name="mipnerf", pipeline=VanillaPipelineConfig( - datamanager=VanillaDataManagerConfig(dataparser=BlenderDataParserConfig(), train_num_rays_per_batch=8192), + datamanager=VanillaDataManagerConfig(dataparser=NerfstudioDataParserConfig(), train_num_rays_per_batch=1024), model=VanillaModelConfig( _target=MipNerfModel, loss_coefficients={"rgb_loss_coarse": 0.1, "rgb_loss_fine": 1.0}, num_coarse_samples=128, num_importance_samples=128, - eval_num_rays_per_chunk=8192, + eval_num_rays_per_chunk=1024, ), ), optimizers={ From f3442c8b7b21218364000ef88c17a86afd7d0700 Mon Sep 17 00:00:00 2001 From: machenmusik Date: Mon, 5 Dec 2022 19:03:09 -0500 Subject: [PATCH 02/24] Use max resolution when not moving or training (#1091) use max resolution when not moving or training --- nerfstudio/viewer/server/viewer_utils.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/nerfstudio/viewer/server/viewer_utils.py b/nerfstudio/viewer/server/viewer_utils.py index 05be19ea0..ce70426f6 100644 --- a/nerfstudio/viewer/server/viewer_utils.py +++ b/nerfstudio/viewer/server/viewer_utils.py @@ -672,9 +672,12 @@ class ViewerState: aspect_ratio = camera_object["aspect"] - image_height = (num_vis_rays / aspect_ratio) ** 0.5 - image_height = int(round(image_height, -1)) - image_height = min(self.max_resolution, image_height) + if not self.camera_moving and not is_training: + image_height = self.max_resolution + else: + image_height = (num_vis_rays / aspect_ratio) ** 0.5 + image_height = int(round(image_height, -1)) + image_height = min(self.max_resolution, image_height) image_width = int(image_height * aspect_ratio) if image_width > self.max_resolution: image_width = self.max_resolution From 6896028fc503b00947d04b7ed142a8dbd685749d Mon Sep 17 00:00:00 2001 From: Nicolas Zunhammer Date: Tue, 6 Dec 2022 02:04:40 +0100 Subject: [PATCH 03/24] Fix mask filenames misaligned after splitting set into train and eval (#1093) * Added Dockerfile to build docker image including all dependencies and nerfstudio, added description on how to user docker. * Move docker description to Installation.md. * Fix mask_filename indices after splitting train set. Co-authored-by: Nicolas Zunhammer --- nerfstudio/data/dataparsers/nerfstudio_dataparser.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nerfstudio/data/dataparsers/nerfstudio_dataparser.py b/nerfstudio/data/dataparsers/nerfstudio_dataparser.py index e2b86bd6d..6dd41738b 100644 --- a/nerfstudio/data/dataparsers/nerfstudio_dataparser.py +++ b/nerfstudio/data/dataparsers/nerfstudio_dataparser.py @@ -196,6 +196,7 @@ class Nerfstudio(DataParser): # Choose image_filenames and poses based on split, but after auto orient and scaling the poses. image_filenames = [image_filenames[i] for i in indices] + mask_filenames = [mask_filenames[i] for i in indices] poses = poses[indices] # in x,y,z order From 006703bb64b729ffedd3c991dcf612e31c3fcb3d Mon Sep 17 00:00:00 2001 From: Matthew Tancik Date: Mon, 5 Dec 2022 17:35:12 -0800 Subject: [PATCH 04/24] Fix crash on camera delete (#1094) --- .../app/src/modules/SidePanel/CameraPanel/CameraPanel.jsx | 7 ++++++- nerfstudio/viewer/server/utils.py | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/nerfstudio/viewer/app/src/modules/SidePanel/CameraPanel/CameraPanel.jsx b/nerfstudio/viewer/app/src/modules/SidePanel/CameraPanel/CameraPanel.jsx index b71266d4a..6a741d156 100644 --- a/nerfstudio/viewer/app/src/modules/SidePanel/CameraPanel/CameraPanel.jsx +++ b/nerfstudio/viewer/app/src/modules/SidePanel/CameraPanel/CameraPanel.jsx @@ -612,6 +612,11 @@ export default function CameraPanel(props) { sceneTree.delete(['Camera Path', 'Cameras']); // delete old cameras, which is important if (cameras.length < 1) { + dispatch({ + type: 'write', + path: 'renderingState/camera_choice', + data: 'Main Camera', + }); camera_render_helper.set_visibility(false); } else { camera_render_helper.set_visibility(true); @@ -625,7 +630,7 @@ export default function CameraPanel(props) { labelDiv.className = 'label'; labelDiv.textContent = camera.properties.get('NAME'); labelDiv.style.color = 'black'; - labelDiv.style.backgroundColor = "rgba(255, 255, 255, 0.61)"; + labelDiv.style.backgroundColor = 'rgba(255, 255, 255, 0.61)'; labelDiv.style.backdropFilter = 'blur(5px)'; labelDiv.style.padding = '6px'; labelDiv.style.borderRadius = '6px'; diff --git a/nerfstudio/viewer/server/utils.py b/nerfstudio/viewer/server/utils.py index 92ccc0ef7..6d13f9378 100644 --- a/nerfstudio/viewer/server/utils.py +++ b/nerfstudio/viewer/server/utils.py @@ -54,6 +54,9 @@ def three_js_perspective_camera_focal_length(fov: float, image_height: int): fov: the field of view of the camera in degrees. image_height: the height of the image in pixels. """ + if fov is None: + print("Warning: fov is None, using default value") + return 50 pp_h = image_height / 2.0 focal_length = pp_h / np.tan(fov * (np.pi / 180.0) / 2.0) return focal_length From e605b3344ac623fd96e2458ef98f8fbc7a97d718 Mon Sep 17 00:00:00 2001 From: ksnzh Date: Tue, 6 Dec 2022 14:10:55 +0800 Subject: [PATCH 05/24] Fix IndexError if ther is no mask filenames (#1095) --- nerfstudio/data/dataparsers/nerfstudio_dataparser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nerfstudio/data/dataparsers/nerfstudio_dataparser.py b/nerfstudio/data/dataparsers/nerfstudio_dataparser.py index 6dd41738b..347a292a5 100644 --- a/nerfstudio/data/dataparsers/nerfstudio_dataparser.py +++ b/nerfstudio/data/dataparsers/nerfstudio_dataparser.py @@ -196,7 +196,7 @@ class Nerfstudio(DataParser): # Choose image_filenames and poses based on split, but after auto orient and scaling the poses. image_filenames = [image_filenames[i] for i in indices] - mask_filenames = [mask_filenames[i] for i in indices] + mask_filenames = [mask_filenames[i] for i in indices] if len(mask_filenames) > 0 else [] poses = poses[indices] # in x,y,z order From 90447ab2236946f2e22477b53001f17af1392d9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Darmon?= Date: Wed, 7 Dec 2022 18:40:53 +0100 Subject: [PATCH 06/24] Bug correction auto_orient_and_center_poses (#1098) When using auto_orient_and_center_poses with method="none" the returned pose if 4x4 (contrary to up and pca) which triggers an assertion error later. This modification solves it. --- nerfstudio/cameras/camera_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nerfstudio/cameras/camera_utils.py b/nerfstudio/cameras/camera_utils.py index 30d755596..97599d239 100644 --- a/nerfstudio/cameras/camera_utils.py +++ b/nerfstudio/cameras/camera_utils.py @@ -457,7 +457,7 @@ def auto_orient_and_center_poses( transform = torch.cat([rotation, rotation @ -translation[..., None]], dim=-1) oriented_poses = transform @ poses elif method == "none": - oriented_poses = poses - poses[:, :3, 3] -= translation + oriented_poses = poses[:, :3] + oriented_poses[..., 3] -= translation return oriented_poses From b41ce8060ac38113ea0d940e3f17f3cecb0f43e2 Mon Sep 17 00:00:00 2001 From: Matthew Tancik Date: Sun, 11 Dec 2022 13:02:50 -0800 Subject: [PATCH 07/24] Save out dataparser transforms (#1105) * Save out dataparser transforms * Make missing folder --- nerfstudio/cameras/camera_utils.py | 12 +- .../data/datamanagers/base_datamanager.py | 7 +- .../data/dataparsers/base_dataparser.py | 21 +++ .../data/dataparsers/blender_dataparser.py | 1 + .../data/dataparsers/dnerf_dataparser.py | 6 +- .../data/dataparsers/friends_dataparser.py | 1 + .../dataparsers/instant_ngp_dataparser.py | 1 + .../data/dataparsers/nerfstudio_dataparser.py | 9 +- .../dataparsers/phototourism_dataparser.py | 9 +- .../data/dataparsers/record3d_dataparser.py | 160 ------------------ nerfstudio/engine/trainer.py | 4 + 11 files changed, 56 insertions(+), 175 deletions(-) delete mode 100644 nerfstudio/data/dataparsers/record3d_dataparser.py diff --git a/nerfstudio/cameras/camera_utils.py b/nerfstudio/cameras/camera_utils.py index 97599d239..d3b0ca619 100644 --- a/nerfstudio/cameras/camera_utils.py +++ b/nerfstudio/cameras/camera_utils.py @@ -409,7 +409,7 @@ def rotation_matrix(a: TensorType[3], b: TensorType[3]) -> TensorType[3, 3]: def auto_orient_and_center_poses( poses: TensorType["num_poses":..., 4, 4], method: Literal["pca", "up", "none"] = "up", center_poses: bool = True -) -> TensorType["num_poses":..., 3, 4]: +) -> Tuple[TensorType["num_poses":..., 3, 4], TensorType[4, 4]]: """Orients and centers the poses. We provide two methods for orientation: pca and up. pca: Orient the poses so that the principal component of the points is aligned with the axes. @@ -424,7 +424,7 @@ def auto_orient_and_center_poses( center_poses: If True, the poses are centered around the origin. Returns: - The oriented poses. + Tuple of the oriented poses and the transform matrix. """ translation = poses[..., :3, 3] @@ -457,7 +457,9 @@ def auto_orient_and_center_poses( transform = torch.cat([rotation, rotation @ -translation[..., None]], dim=-1) oriented_poses = transform @ poses elif method == "none": - oriented_poses = poses[:, :3] - oriented_poses[..., 3] -= translation + transform = torch.eye(4) + transform[:3, 3] = -translation + transform = transform[:3, :] + oriented_poses = transform @ poses - return oriented_poses + return oriented_poses, transform diff --git a/nerfstudio/data/datamanagers/base_datamanager.py b/nerfstudio/data/datamanagers/base_datamanager.py index 7adf8cd05..7f1282c87 100644 --- a/nerfstudio/data/datamanagers/base_datamanager.py +++ b/nerfstudio/data/datamanagers/base_datamanager.py @@ -35,6 +35,7 @@ from nerfstudio.cameras.camera_optimizers import CameraOptimizerConfig from nerfstudio.cameras.cameras import CameraType from nerfstudio.cameras.rays import RayBundle from nerfstudio.configs.base_config import InstantiateConfig +from nerfstudio.data.dataparsers.base_dataparser import DataparserOutputs from nerfstudio.data.dataparsers.blender_dataparser import BlenderDataParserConfig from nerfstudio.data.dataparsers.dnerf_dataparser import DNeRFDataParserConfig from nerfstudio.data.dataparsers.friends_dataparser import FriendsDataParserConfig @@ -46,7 +47,6 @@ from nerfstudio.data.dataparsers.nuscenes_dataparser import NuScenesDataParserCo from nerfstudio.data.dataparsers.phototourism_dataparser import ( PhototourismDataParserConfig, ) -from nerfstudio.data.dataparsers.record3d_dataparser import Record3DDataParserConfig from nerfstudio.data.datasets.base_dataset import InputDataset from nerfstudio.data.pixel_samplers import EquirectangularPixelSampler, PixelSampler from nerfstudio.data.utils.dataloaders import ( @@ -69,7 +69,6 @@ AnnotatedDataParserUnion = tyro.conf.OmitSubcommandPrefixes[ # Omit prefixes of "friends-data": FriendsDataParserConfig(), "instant-ngp-data": InstantNGPDataParserConfig(), "nuscenes-data": NuScenesDataParserConfig(), - "record3d-data": Record3DDataParserConfig(), "dnerf-data": DNeRFDataParserConfig(), "phototourism-data": PhototourismDataParserConfig(), }, @@ -296,6 +295,7 @@ class VanillaDataManager(DataManager): # pylint: disable=abstract-method config: VanillaDataManagerConfig train_dataset: InputDataset eval_dataset: InputDataset + train_dataparser_outputs: DataparserOutputs def __init__( self, @@ -321,8 +321,9 @@ class VanillaDataManager(DataManager): # pylint: disable=abstract-method def create_train_dataset(self) -> InputDataset: """Sets up the data loaders for training""" + self.train_dataparser_outputs = self.dataparser.get_dataparser_outputs(split="train") return InputDataset( - dataparser_outputs=self.dataparser.get_dataparser_outputs(split="train"), + dataparser_outputs=self.train_dataparser_outputs, scale_factor=self.config.camera_res_scale_factor, ) diff --git a/nerfstudio/data/dataparsers/base_dataparser.py b/nerfstudio/data/dataparsers/base_dataparser.py index 3b99f274e..0caf24cea 100644 --- a/nerfstudio/data/dataparsers/base_dataparser.py +++ b/nerfstudio/data/dataparsers/base_dataparser.py @@ -16,6 +16,7 @@ from __future__ import annotations +import json from abc import abstractmethod from dataclasses import dataclass, field from pathlib import Path @@ -63,11 +64,31 @@ class DataparserOutputs: """Dictionary of any metadata that be required for the given experiment. Will be processed by the InputDataset to create any additional tensors that may be required. """ + dataparser_transform: TensorType[3, 4] = torch.eye(4)[:3, :] + """Transform applied by the dataparser.""" + dataparser_scale: float = 1.0 + """Scale applied by the dataparser.""" def as_dict(self) -> dict: """Returns the dataclass as a dictionary.""" return vars(self) + def save_dataparser_transform(self, path: Path): + """Save dataparser transform to json file. Some dataparsers will apply a transform to the poses, + this method allows the transform to be saved so that it can be used in other applications. + + Args: + path: path to save transform to + """ + data = { + "transform": self.dataparser_transform.tolist(), + "scale": self.dataparser_scale, + } + if not path.parent.exists(): + path.parent.mkdir(parents=True) + with open(path, "w", encoding="UTF-8") as file: + json.dump(data, file, indent=4) + @dataclass class DataParserConfig(cfg.InstantiateConfig): diff --git a/nerfstudio/data/dataparsers/blender_dataparser.py b/nerfstudio/data/dataparsers/blender_dataparser.py index 0f31acff1..f1044e826 100644 --- a/nerfstudio/data/dataparsers/blender_dataparser.py +++ b/nerfstudio/data/dataparsers/blender_dataparser.py @@ -104,6 +104,7 @@ class Blender(DataParser): cameras=cameras, alpha_color=alpha_color_tensor, scene_box=scene_box, + dataparser_scale=self.scale_factor, ) return dataparser_outputs diff --git a/nerfstudio/data/dataparsers/dnerf_dataparser.py b/nerfstudio/data/dataparsers/dnerf_dataparser.py index 56a9f232b..c26621e92 100644 --- a/nerfstudio/data/dataparsers/dnerf_dataparser.py +++ b/nerfstudio/data/dataparsers/dnerf_dataparser.py @@ -102,7 +102,11 @@ class DNeRF(DataParser): ) dataparser_outputs = DataparserOutputs( - image_filenames=image_filenames, cameras=cameras, alpha_color=alpha_color_tensor, scene_box=scene_box + image_filenames=image_filenames, + cameras=cameras, + alpha_color=alpha_color_tensor, + scene_box=scene_box, + dataparser_scale=self.scale_factor, ) return dataparser_outputs diff --git a/nerfstudio/data/dataparsers/friends_dataparser.py b/nerfstudio/data/dataparsers/friends_dataparser.py index 06fceef3c..604dbd7c0 100644 --- a/nerfstudio/data/dataparsers/friends_dataparser.py +++ b/nerfstudio/data/dataparsers/friends_dataparser.py @@ -146,5 +146,6 @@ class Friends(DataParser): cameras=cameras, scene_box=scene_box, metadata={"semantics": semantics} if self.config.include_semantics else {}, + dataparser_scale=scale, ) return dataparser_outputs diff --git a/nerfstudio/data/dataparsers/instant_ngp_dataparser.py b/nerfstudio/data/dataparsers/instant_ngp_dataparser.py index 1e5a69b99..289e23d55 100644 --- a/nerfstudio/data/dataparsers/instant_ngp_dataparser.py +++ b/nerfstudio/data/dataparsers/instant_ngp_dataparser.py @@ -115,6 +115,7 @@ class InstantNGP(DataParser): image_filenames=image_filenames, cameras=cameras, scene_box=scene_box, + dataparser_scale=self.config.scene_scale, ) return dataparser_outputs diff --git a/nerfstudio/data/dataparsers/nerfstudio_dataparser.py b/nerfstudio/data/dataparsers/nerfstudio_dataparser.py index 347a292a5..d2c8c2d2e 100644 --- a/nerfstudio/data/dataparsers/nerfstudio_dataparser.py +++ b/nerfstudio/data/dataparsers/nerfstudio_dataparser.py @@ -181,7 +181,7 @@ class Nerfstudio(DataParser): orientation_method = self.config.orientation_method poses = torch.from_numpy(np.array(poses).astype(np.float32)) - poses = camera_utils.auto_orient_and_center_poses( + poses, transform_matrix = camera_utils.auto_orient_and_center_poses( poses, method=orientation_method, center_poses=self.config.center_poses, @@ -190,9 +190,10 @@ class Nerfstudio(DataParser): # Scale poses scale_factor = 1.0 if self.config.auto_scale_poses: - scale_factor /= torch.max(torch.abs(poses[:, :3, 3])) + scale_factor /= float(torch.max(torch.abs(poses[:, :3, 3]))) + scale_factor *= self.config.scale_factor - poses[:, :3, 3] *= scale_factor * self.config.scale_factor + poses[:, :3, 3] *= scale_factor # Choose image_filenames and poses based on split, but after auto orient and scaling the poses. image_filenames = [image_filenames[i] for i in indices] @@ -252,6 +253,8 @@ class Nerfstudio(DataParser): cameras=cameras, scene_box=scene_box, mask_filenames=mask_filenames if len(mask_filenames) > 0 else None, + dataparser_scale=scale_factor, + dataparser_transform=transform_matrix, ) return dataparser_outputs diff --git a/nerfstudio/data/dataparsers/phototourism_dataparser.py b/nerfstudio/data/dataparsers/phototourism_dataparser.py index f0f6987e0..bb401d9dc 100644 --- a/nerfstudio/data/dataparsers/phototourism_dataparser.py +++ b/nerfstudio/data/dataparsers/phototourism_dataparser.py @@ -137,16 +137,17 @@ class Phototourism(DataParser): else: raise ValueError(f"Unknown dataparser split {split}") - poses = camera_utils.auto_orient_and_center_poses( + poses, transform_matrix = camera_utils.auto_orient_and_center_poses( poses, method=self.config.orientation_method, center_poses=self.config.center_poses ) # Scale poses scale_factor = 1.0 if self.config.auto_scale_poses: - scale_factor /= torch.max(torch.abs(poses[:, :3, 3])) + scale_factor /= float(torch.max(torch.abs(poses[:, :3, 3]))) + scale_factor *= self.config.scale_factor - poses[:, :3, 3] *= scale_factor * self.config.scale_factor + poses[:, :3, 3] *= scale_factor # in x,y,z order # assumes that the scene is centered at the origin @@ -175,6 +176,8 @@ class Phototourism(DataParser): image_filenames=image_filenames, cameras=cameras, scene_box=scene_box, + dataparser_scale=scale_factor, + dataparser_transform=transform_matrix, ) return dataparser_outputs diff --git a/nerfstudio/data/dataparsers/record3d_dataparser.py b/nerfstudio/data/dataparsers/record3d_dataparser.py deleted file mode 100644 index 099470d01..000000000 --- a/nerfstudio/data/dataparsers/record3d_dataparser.py +++ /dev/null @@ -1,160 +0,0 @@ -# Copyright 2022 The Nerfstudio Team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Data parser for record3d dataset""" -from __future__ import annotations - -from dataclasses import dataclass, field -from pathlib import Path -from typing import Type - -import numpy as np -import torch -from rich.console import Console -from scipy.spatial.transform import Rotation -from typing_extensions import Literal - -from nerfstudio.cameras import camera_utils -from nerfstudio.cameras.cameras import Cameras, CameraType -from nerfstudio.data.dataparsers.base_dataparser import ( - DataParser, - DataParserConfig, - DataparserOutputs, -) -from nerfstudio.data.scene_box import SceneBox -from nerfstudio.utils import poses as pose_utils -from nerfstudio.utils.io import load_from_json - -CONSOLE = Console(width=120) - - -@dataclass -class Record3DDataParserConfig(DataParserConfig): - """Record3D dataset config""" - - _target: Type = field(default_factory=lambda: Record3D) - """target class to instantiate""" - data: Path = Path("data/record3d/bear") - """Location of data""" - val_skip: int = 8 - """1/val_skip images to use for validation.""" - aabb_scale: float = 4.0 - """Scene scale.""" - orientation_method: Literal["pca", "up"] = "up" - """The method to use for orientation""" - max_dataset_size: int = 300 - """Max number of images to train on. If the dataset has more, images will be sampled approximately evenly. If -1, - use all images.""" - - -@dataclass -class Record3D(DataParser): - """Record3D Dataset""" - - config: Record3DDataParserConfig - - def _generate_dataparser_outputs(self, split: str = "train") -> DataparserOutputs: - - CONSOLE.print( - "[bold red]DEPRECATION WARNING: The Record3D dataparser will be deprecated in future versions. " - "Use `ns-data-process record3d` to convert the data into the nerfstudio format instead." - ) - - image_dir = self.config.data / "rgb" - - if not image_dir.exists(): - raise ValueError(f"Image directory {image_dir} doesn't exist") - - image_filenames = [] - for f in image_dir.iterdir(): - if f.stem.isdigit(): # removes possible duplicate images (for example, 123(3).jpg) - image_filenames.append(f) - - image_filenames = sorted(image_filenames, key=lambda fn: int(fn.stem)) - image_filenames = np.array(image_filenames) - num_images = len(image_filenames) - - metadata_path = self.config.data / "metadata.json" - metadata_dict = load_from_json(metadata_path) - - poses_data = np.array(metadata_dict["poses"]) - # (N, 3, 4) - poses = np.concatenate( - [Rotation.from_quat(poses_data[:, :4]).as_matrix(), poses_data[:, 4:, None]], - axis=-1, - ).astype(np.float32) - - if self.config.max_dataset_size != -1 and num_images > self.config.max_dataset_size: - # Evenly select max_dataset_size images from dataset, including first - # and last indices. - idx = np.round(np.linspace(0, num_images - 1, self.config.max_dataset_size)).astype(int) - poses = poses[idx] - image_filenames = image_filenames[idx] - num_images = len(image_filenames) - - idx_test = np.arange(num_images)[:: self.config.val_skip] - idx_train = np.array([i for i in np.arange(num_images) if i not in idx_test]) - idx = idx_train if split == "train" else idx_test - if num_images != poses.shape[0]: - raise RuntimeError(f"Different number of images ({num_images}), and poses ({poses.shape[0]})") - - image_filenames = image_filenames[idx] - poses = poses[idx] - - # convert to Tensors - poses = torch.from_numpy(poses[:, :3, :4]) - - poses = camera_utils.auto_orient_and_center_poses( - pose_utils.to4x4(poses), method=self.config.orientation_method - )[:, :3, :4] - - # Centering poses - poses[:, :3, 3] = poses[:, :3, 3] - torch.mean(poses[:, :3, 3], dim=0) - poses = pose_utils.normalize(poses) - - # Camera intrinsics - K = np.array(metadata_dict["K"]).reshape((3, 3)).T - focal_length = K[0, 0] - - H = metadata_dict["h"] - W = metadata_dict["w"] - - # TODO(akristoffersen): The metadata dict comes with principle points, - # but caused errors in image coord indexing. Should update once that is fixed. - cx, cy = W / 2, H / 2 - - num_cameras = len(image_filenames) - num_intrinsics_params = 3 - intrinsics = torch.ones((num_cameras, num_intrinsics_params), dtype=torch.float32) - intrinsics *= torch.tensor([cx, cy, focal_length]) - - aabb = torch.tensor([[-1, -1, -1], [1, 1, 1]], dtype=torch.float32) * self.config.aabb_scale - scene_box = SceneBox(aabb=aabb) - - cameras = Cameras( - fx=focal_length, - fy=focal_length, - cx=cx, - cy=cy, - camera_to_worlds=poses, - camera_type=CameraType.PERSPECTIVE, - ) - - dataparser_outputs = DataparserOutputs( - image_filenames=image_filenames, - cameras=cameras, - scene_box=scene_box, - ) - - return dataparser_outputs diff --git a/nerfstudio/engine/trainer.py b/nerfstudio/engine/trainer.py index ae9da1ec2..445788fbf 100644 --- a/nerfstudio/engine/trainer.py +++ b/nerfstudio/engine/trainer.py @@ -132,6 +132,10 @@ class Trainer: """Train the model.""" assert self.pipeline.datamanager.train_dataset is not None, "Missing DatsetInputs" + self.pipeline.datamanager.train_dataparser_outputs.save_dataparser_transform( + self.base_dir / "dataparser_transforms.json" + ) + self._init_viewer_state() with TimeWriter(writer, EventName.TOTAL_TRAIN_TIME): num_iterations = self.config.trainer.max_num_iterations From 676f816156d05b581562774410381e811e9d69c1 Mon Sep 17 00:00:00 2001 From: Matthew Tancik Date: Sun, 11 Dec 2022 13:03:35 -0800 Subject: [PATCH 08/24] Bump max res default (#1106) --- nerfstudio/fields/nerfacto_field.py | 2 +- nerfstudio/models/nerfacto.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nerfstudio/fields/nerfacto_field.py b/nerfstudio/fields/nerfacto_field.py index da51f417a..95ed66c1e 100644 --- a/nerfstudio/fields/nerfacto_field.py +++ b/nerfstudio/fields/nerfacto_field.py @@ -91,7 +91,7 @@ class TCNNNerfactoField(Field): hidden_dim: int = 64, geo_feat_dim: int = 15, num_levels: int = 16, - max_res: int = 1024, + max_res: int = 2048, log2_hashmap_size: int = 19, num_layers_color: int = 3, num_layers_transient: int = 2, diff --git a/nerfstudio/models/nerfacto.py b/nerfstudio/models/nerfacto.py index b1e772b03..11adadbd7 100644 --- a/nerfstudio/models/nerfacto.py +++ b/nerfstudio/models/nerfacto.py @@ -71,7 +71,7 @@ class NerfactoModelConfig(ModelConfig): """Whether to randomize the background color.""" num_levels: int = 16 """Number of levels of the hashmap for the base mlp.""" - max_res: int = 1024 + max_res: int = 2048 """Maximum resolution of the hashmap for the base mlp.""" log2_hashmap_size: int = 19 """Size of the hashmap for the base mlp""" From 910e7bfb0558767670920c80aa9b705173a81f0d Mon Sep 17 00:00:00 2001 From: Matthew Tancik Date: Sun, 11 Dec 2022 13:05:03 -0800 Subject: [PATCH 09/24] v0.1.13 (#1107) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 064ff1cf8..fe908f8c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "nerfstudio" -version = "0.1.12" +version = "0.1.13" description = "All-in-one repository for state-of-the-art NeRFs" readme = "README.md" license = { text="Apache 2.0"} From 986f3a565d601b977a881bd2da22594259043de4 Mon Sep 17 00:00:00 2001 From: Alexander Kristoffersen Date: Mon, 12 Dec 2022 11:47:09 -0800 Subject: [PATCH 10/24] Colab working with Python3.8 (#1109) changed away from the wheel, couldn't get it to work --- colab/demo.ipynb | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/colab/demo.ipynb b/colab/demo.ipynb index c47045b48..9609a6db4 100644 --- a/colab/demo.ipynb +++ b/colab/demo.ipynb @@ -3,11 +3,11 @@ { "cell_type": "markdown", "metadata": { - "colab_type": "text", - "id": "view-in-github" + "id": "view-in-github", + "colab_type": "text" }, "source": [ - "\"Open" + "\"Open" ] }, { @@ -63,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "cellView": "form", "colab": { @@ -103,7 +103,7 @@ }, "outputs": [], "source": [ - "#@markdown

Install Nerfstudio and Dependencies (~10 min)

\n", + "#@markdown

Install Nerfstudio and Dependencies (~15 min)

\n", "\n", "%cd /content/\n", "!pip install --upgrade pip\n", @@ -111,8 +111,9 @@ "\n", "# Installing TinyCuda\n", "%cd /content/\n", - "!gdown \"https://drive.google.com/u/1/uc?id=1q8fuc-Mqiev5GTBTRA5UPgCaQDzuqKqj\" \n", - "!pip install tinycudann-1.6-cp37-cp37m-linux_x86_64.whl\n", + "# !gdown \"https://drive.google.com/u/1/uc?id=1wglEFPbI4BjWMFYaKk7gHCNsWCZphKjs\" \n", + "# !pip install tinycudann-1.6-cp38-cp38-linux_x86_64.whl\n", + "!pip install git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch\n", "\n", "# Installing COLMAP\n", "%cd /content/\n", @@ -202,7 +203,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": { "cellView": "form", "colab": { @@ -362,9 +363,8 @@ "metadata": { "accelerator": "GPU", "colab": { - "collapsed_sections": [], - "include_colab_link": true, - "provenance": [] + "provenance": [], + "include_colab_link": true }, "gpuClass": "standard", "kernelspec": { @@ -384,4 +384,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} +} \ No newline at end of file From 98f13cbed48bb5e7cf7d11fe1f5e2f935820680d Mon Sep 17 00:00:00 2001 From: Nikhil Mohan <47728081+nikmo33@users.noreply.github.com> Date: Tue, 13 Dec 2022 18:09:31 +0000 Subject: [PATCH 11/24] Fix circular imports (#1115) * wip * remove bad changes * update dmeo * cleanup * change name * cleanup --- nerfstudio/configs/base_config.py | 101 +------------------ nerfstudio/configs/experiment_config.py | 123 ++++++++++++++++++++++++ nerfstudio/configs/method_configs.py | 27 +++--- nerfstudio/engine/optimizers.py | 23 ----- nerfstudio/engine/trainer.py | 27 +++++- nerfstudio/exporter/exporter_utils.py | 1 - nerfstudio/utils/eval_utils.py | 9 +- nerfstudio/utils/writer.py | 6 +- scripts/render.py | 1 - scripts/train.py | 14 +-- tests/test_train.py | 4 +- 11 files changed, 175 insertions(+), 161 deletions(-) create mode 100644 nerfstudio/configs/experiment_config.py diff --git a/nerfstudio/configs/base_config.py b/nerfstudio/configs/base_config.py index 53bc7b4c4..a74f07ed7 100644 --- a/nerfstudio/configs/base_config.py +++ b/nerfstudio/configs/base_config.py @@ -20,23 +20,14 @@ from __future__ import annotations import warnings from dataclasses import dataclass -from datetime import datetime from pathlib import Path -from typing import Any, Dict, List, Optional, Tuple, Type - -import yaml -from rich.console import Console -from typing_extensions import Literal - -from nerfstudio.configs.config_utils import to_immutable_dict +from typing import Any, List, Optional, Tuple, Type # model instances from nerfstudio.utils import writer warnings.filterwarnings("ignore", module="torchvision") -CONSOLE = Console(width=120) - # Pretty printing class class PrintableConfig: # pylint: disable=too-few-public-methods """Printable Config defining str function""" @@ -186,93 +177,3 @@ class ViewerConfig(PrintableConfig): skip_openrelay: bool = False """Avoid using openrelay to communicate with the viewer. Try disabling if you have trouble connecting to the viewer""" - - -from nerfstudio.engine.optimizers import OptimizerConfig -from nerfstudio.engine.schedulers import SchedulerConfig -from nerfstudio.pipelines.base_pipeline import VanillaPipelineConfig - - -@dataclass -class Config(PrintableConfig): - """Full config contents""" - - output_dir: Path = Path("outputs") - """relative or absolute output directory to save all checkpoints and logging""" - method_name: Optional[str] = None - """Method name. Required to set in python or via cli""" - experiment_name: Optional[str] = None - """Experiment name. If None, will automatically be set to dataset name""" - timestamp: str = "{timestamp}" - """Experiment timestamp.""" - machine: MachineConfig = MachineConfig() - """Machine configuration""" - logging: LoggingConfig = LoggingConfig() - """Logging configuration""" - viewer: ViewerConfig = ViewerConfig() - """Viewer configuration""" - trainer: TrainerConfig = TrainerConfig() - """Trainer configuration""" - pipeline: VanillaPipelineConfig = VanillaPipelineConfig() - """Pipeline configuration""" - optimizers: Dict[str, Any] = to_immutable_dict( - { - "fields": { - "optimizer": OptimizerConfig(), - "scheduler": SchedulerConfig(), - } - } - ) - """Dictionary of optimizer groups and their schedulers""" - vis: Literal["viewer", "wandb", "tensorboard"] = "wandb" - """Which visualizer to use.""" - data: Optional[Path] = None - """Alias for --pipeline.datamanager.dataparser.data""" - - def is_viewer_enabled(self) -> bool: - """Checks if a viewer is enabled.""" - return "viewer" == self.vis - - def is_wandb_enabled(self) -> bool: - """Checks if wandb is enabled.""" - return "wandb" == self.vis - - def is_tensorboard_enabled(self) -> bool: - """Checks if tensorboard is enabled.""" - return "tensorboard" == self.vis - - def set_timestamp(self) -> None: - """Dynamically set the experiment timestamp""" - if self.timestamp == "{timestamp}": - self.timestamp = datetime.now().strftime("%Y-%m-%d_%H%M%S") - - def set_experiment_name(self) -> None: - """Dynamically set the experiment name""" - if self.experiment_name is None: - self.experiment_name = str(self.pipeline.datamanager.dataparser.data).replace("../", "").replace("/", "-") - - def get_base_dir(self) -> Path: - """Retrieve the base directory to set relative paths""" - # check the experiment and method names - assert self.method_name is not None, "Please set method name in config or via the cli" - self.set_experiment_name() - return Path(f"{self.output_dir}/{self.experiment_name}/{self.method_name}/{self.timestamp}") - - def get_checkpoint_dir(self) -> Path: - """Retrieve the checkpoint directory""" - return Path(self.get_base_dir() / self.trainer.relative_model_dir) - - def print_to_terminal(self) -> None: - """Helper to pretty print config to terminal""" - CONSOLE.rule("Config") - CONSOLE.print(self) - CONSOLE.rule("") - - def save_config(self) -> None: - """Save config to base directory""" - base_dir = self.get_base_dir() - assert base_dir is not None - base_dir.mkdir(parents=True, exist_ok=True) - config_yaml_path = base_dir / "config.yml" - CONSOLE.log(f"Saving config to: {config_yaml_path}") - config_yaml_path.write_text(yaml.dump(self), "utf8") diff --git a/nerfstudio/configs/experiment_config.py b/nerfstudio/configs/experiment_config.py new file mode 100644 index 000000000..e78c8de59 --- /dev/null +++ b/nerfstudio/configs/experiment_config.py @@ -0,0 +1,123 @@ +# Copyright 2022 The Nerfstudio Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Config used for running an experiment""" + +from dataclasses import dataclass +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, Optional + +import yaml +from rich.console import Console +from typing_extensions import Literal + +from nerfstudio.configs.base_config import ( + LoggingConfig, + MachineConfig, + PrintableConfig, + TrainerConfig, + ViewerConfig, +) +from nerfstudio.configs.config_utils import to_immutable_dict +from nerfstudio.engine.optimizers import OptimizerConfig +from nerfstudio.engine.schedulers import SchedulerConfig +from nerfstudio.pipelines.base_pipeline import VanillaPipelineConfig + +CONSOLE = Console(width=120) + + +@dataclass +class ExperimentConfig(PrintableConfig): + """Full config contents""" + + output_dir: Path = Path("outputs") + """relative or absolute output directory to save all checkpoints and logging""" + method_name: Optional[str] = None + """Method name. Required to set in python or via cli""" + experiment_name: Optional[str] = None + """Experiment name. If None, will automatically be set to dataset name""" + timestamp: str = "{timestamp}" + """Experiment timestamp.""" + machine: MachineConfig = MachineConfig() + """Machine configuration""" + logging: LoggingConfig = LoggingConfig() + """Logging configuration""" + viewer: ViewerConfig = ViewerConfig() + """Viewer configuration""" + trainer: TrainerConfig = TrainerConfig() + """Trainer configuration""" + pipeline: VanillaPipelineConfig = VanillaPipelineConfig() + """Pipeline configuration""" + optimizers: Dict[str, Any] = to_immutable_dict( + { + "fields": { + "optimizer": OptimizerConfig(), + "scheduler": SchedulerConfig(), + } + } + ) + """Dictionary of optimizer groups and their schedulers""" + vis: Literal["viewer", "wandb", "tensorboard"] = "wandb" + """Which visualizer to use.""" + data: Optional[Path] = None + """Alias for --pipeline.datamanager.dataparser.data""" + + def is_viewer_enabled(self) -> bool: + """Checks if a viewer is enabled.""" + return "viewer" == self.vis + + def is_wandb_enabled(self) -> bool: + """Checks if wandb is enabled.""" + return "wandb" == self.vis + + def is_tensorboard_enabled(self) -> bool: + """Checks if tensorboard is enabled.""" + return "tensorboard" == self.vis + + def set_timestamp(self) -> None: + """Dynamically set the experiment timestamp""" + if self.timestamp == "{timestamp}": + self.timestamp = datetime.now().strftime("%Y-%m-%d_%H%M%S") + + def set_experiment_name(self) -> None: + """Dynamically set the experiment name""" + if self.experiment_name is None: + self.experiment_name = str(self.pipeline.datamanager.dataparser.data).replace("../", "").replace("/", "-") + + def get_base_dir(self) -> Path: + """Retrieve the base directory to set relative paths""" + # check the experiment and method names + assert self.method_name is not None, "Please set method name in config or via the cli" + self.set_experiment_name() + return Path(f"{self.output_dir}/{self.experiment_name}/{self.method_name}/{self.timestamp}") + + def get_checkpoint_dir(self) -> Path: + """Retrieve the checkpoint directory""" + return Path(self.get_base_dir() / self.trainer.relative_model_dir) + + def print_to_terminal(self) -> None: + """Helper to pretty print config to terminal""" + CONSOLE.rule("Config") + CONSOLE.print(self) + CONSOLE.rule("") + + def save_config(self) -> None: + """Save config to base directory""" + base_dir = self.get_base_dir() + assert base_dir is not None + base_dir.mkdir(parents=True, exist_ok=True) + config_yaml_path = base_dir / "config.yml" + CONSOLE.log(f"Saving config to: {config_yaml_path}") + config_yaml_path.write_text(yaml.dump(self), "utf8") diff --git a/nerfstudio/configs/method_configs.py b/nerfstudio/configs/method_configs.py index 6fb532e14..b02d782b9 100644 --- a/nerfstudio/configs/method_configs.py +++ b/nerfstudio/configs/method_configs.py @@ -23,12 +23,8 @@ from typing import Dict import tyro from nerfstudio.cameras.camera_optimizers import CameraOptimizerConfig -from nerfstudio.configs.base_config import ( - Config, - SchedulerConfig, - TrainerConfig, - ViewerConfig, -) +from nerfstudio.configs.base_config import TrainerConfig, ViewerConfig +from nerfstudio.configs.experiment_config import ExperimentConfig from nerfstudio.data.datamanagers.base_datamanager import VanillaDataManagerConfig from nerfstudio.data.datamanagers.semantic_datamanager import SemanticDataManagerConfig from nerfstudio.data.datamanagers.variable_res_datamanager import ( @@ -42,6 +38,7 @@ from nerfstudio.data.dataparsers.phototourism_dataparser import ( PhototourismDataParserConfig, ) from nerfstudio.engine.optimizers import AdamOptimizerConfig, RAdamOptimizerConfig +from nerfstudio.engine.schedulers import SchedulerConfig from nerfstudio.field_components.temporal_distortions import TemporalDistortionKind from nerfstudio.models.instant_ngp import InstantNGPModelConfig from nerfstudio.models.mipnerf import MipNerfModel @@ -52,7 +49,7 @@ from nerfstudio.models.vanilla_nerf import NeRFModel, VanillaModelConfig from nerfstudio.pipelines.base_pipeline import VanillaPipelineConfig from nerfstudio.pipelines.dynamic_batch import DynamicBatchPipelineConfig -method_configs: Dict[str, Config] = {} +method_configs: Dict[str, ExperimentConfig] = {} descriptions = { "nerfacto": "Recommended real-time model tuned for real captures. This model will be continually updated.", "instant-ngp": "Implementation of Instant-NGP. Recommended real-time model for bounded synthetic data.", @@ -64,7 +61,7 @@ descriptions = { "phototourism": "Uses the Phototourism data.", } -method_configs["nerfacto"] = Config( +method_configs["nerfacto"] = ExperimentConfig( method_name="nerfacto", trainer=TrainerConfig( steps_per_eval_batch=500, steps_per_save=2000, max_num_iterations=30000, mixed_precision=True @@ -94,7 +91,7 @@ method_configs["nerfacto"] = Config( vis="viewer", ) -method_configs["instant-ngp"] = Config( +method_configs["instant-ngp"] = ExperimentConfig( method_name="instant-ngp", trainer=TrainerConfig( steps_per_eval_batch=500, steps_per_save=2000, max_num_iterations=30000, mixed_precision=True @@ -113,7 +110,7 @@ method_configs["instant-ngp"] = Config( vis="viewer", ) -method_configs["mipnerf"] = Config( +method_configs["mipnerf"] = ExperimentConfig( method_name="mipnerf", pipeline=VanillaPipelineConfig( datamanager=VanillaDataManagerConfig(dataparser=NerfstudioDataParserConfig(), train_num_rays_per_batch=1024), @@ -133,7 +130,7 @@ method_configs["mipnerf"] = Config( }, ) -method_configs["semantic-nerfw"] = Config( +method_configs["semantic-nerfw"] = ExperimentConfig( method_name="semantic-nerfw", trainer=TrainerConfig( steps_per_eval_batch=500, steps_per_save=2000, max_num_iterations=30000, mixed_precision=True @@ -158,7 +155,7 @@ method_configs["semantic-nerfw"] = Config( vis="viewer", ) -method_configs["vanilla-nerf"] = Config( +method_configs["vanilla-nerf"] = ExperimentConfig( method_name="vanilla-nerf", pipeline=VanillaPipelineConfig( datamanager=VanillaDataManagerConfig( @@ -178,7 +175,7 @@ method_configs["vanilla-nerf"] = Config( }, ) -method_configs["tensorf"] = Config( +method_configs["tensorf"] = ExperimentConfig( method_name="tensorf", trainer=TrainerConfig(mixed_precision=False), pipeline=VanillaPipelineConfig( @@ -199,7 +196,7 @@ method_configs["tensorf"] = Config( }, ) -method_configs["dnerf"] = Config( +method_configs["dnerf"] = ExperimentConfig( method_name="dnerf", pipeline=VanillaPipelineConfig( datamanager=VanillaDataManagerConfig(dataparser=DNeRFDataParserConfig()), @@ -221,7 +218,7 @@ method_configs["dnerf"] = Config( }, ) -method_configs["phototourism"] = Config( +method_configs["phototourism"] = ExperimentConfig( method_name="phototourism", trainer=TrainerConfig( steps_per_eval_batch=500, steps_per_save=2000, max_num_iterations=30000, mixed_precision=True diff --git a/nerfstudio/engine/optimizers.py b/nerfstudio/engine/optimizers.py index 5bae109d0..c97b10580 100644 --- a/nerfstudio/engine/optimizers.py +++ b/nerfstudio/engine/optimizers.py @@ -61,29 +61,6 @@ class RAdamOptimizerConfig(OptimizerConfig): _target: Type = torch.optim.RAdam -def setup_optimizers(config: base_config.Config, param_groups: Dict[str, List[Parameter]]) -> "Optimizers": - """Helper to set up the optimizers - - Args: - config: The trainer configuration object. - param_groups: A dictionary of parameter groups to optimize. - - Returns: - The optimizers object. - """ - optimizer_config = config.optimizers.copy() - - # Add the camera optimizer if enabled. - camera_optimizer_config = config.pipeline.datamanager.camera_optimizer - if camera_optimizer_config.mode != "off": - assert camera_optimizer_config.param_group not in optimizer_config - optimizer_config[camera_optimizer_config.param_group] = { - "optimizer": config.pipeline.datamanager.camera_optimizer.optimizer, - "scheduler": config.pipeline.datamanager.camera_optimizer.scheduler, - } - return Optimizers(optimizer_config, param_groups) - - class Optimizers: """A set of optimizers. diff --git a/nerfstudio/engine/trainer.py b/nerfstudio/engine/trainer.py index 445788fbf..513fb194e 100644 --- a/nerfstudio/engine/trainer.py +++ b/nerfstudio/engine/trainer.py @@ -28,13 +28,13 @@ from rich.console import Console from torch.cuda.amp.grad_scaler import GradScaler from typing_extensions import Literal -from nerfstudio.configs import base_config as cfg +from nerfstudio.configs.experiment_config import ExperimentConfig from nerfstudio.engine.callbacks import ( TrainingCallback, TrainingCallbackAttributes, TrainingCallbackLocation, ) -from nerfstudio.engine.optimizers import Optimizers, setup_optimizers +from nerfstudio.engine.optimizers import Optimizers from nerfstudio.pipelines.base_pipeline import VanillaPipeline from nerfstudio.utils import profiler, writer from nerfstudio.utils.decorators import ( @@ -71,7 +71,7 @@ class Trainer: optimizers: Optimizers callbacks: List[TrainingCallback] - def __init__(self, config: cfg.Config, local_rank: int = 0, world_size: int = 1): + def __init__(self, config: ExperimentConfig, local_rank: int = 0, world_size: int = 1): self.config = config self.local_rank = local_rank self.world_size = world_size @@ -96,7 +96,7 @@ class Trainer: self._check_viewer_warnings() # set up writers/profilers if enabled writer_log_path = self.base_dir / config.logging.relative_log_dir - writer.setup_event_writer(config, log_dir=writer_log_path) + writer.setup_event_writer(config.is_wandb_enabled(), config.is_tensorboard_enabled(), log_dir=writer_log_path) writer.setup_local_writer( config.logging, max_iter=config.trainer.max_num_iterations, banner_messages=banner_messages ) @@ -115,7 +115,7 @@ class Trainer: self.pipeline = self.config.pipeline.setup( device=self.device, test_mode=test_mode, world_size=self.world_size, local_rank=self.local_rank ) - self.optimizers = setup_optimizers(self.config, self.pipeline.get_param_groups()) + self.optimizers = self.setup_optimizers() self._load_checkpoint() @@ -128,6 +128,23 @@ class Trainer: ) ) + def setup_optimizers(self) -> Optimizers: + """Helper to set up the optimizers + + Returns: + The optimizers object given the experiment config. + """ + optimizer_config = self.config.optimizers.copy() + camera_optimizer_config = self.config.pipeline.datamanager.camera_optimizer + param_groups = self.pipeline.get_param_groups() + if camera_optimizer_config.mode != "off": + assert camera_optimizer_config.param_group not in optimizer_config + optimizer_config[camera_optimizer_config.param_group] = { + "optimizer": camera_optimizer_config.optimizer, + "scheduler": camera_optimizer_config.scheduler, + } + return Optimizers(optimizer_config, param_groups) + def train(self) -> None: """Train the model.""" assert self.pipeline.datamanager.train_dataset is not None, "Missing DatsetInputs" diff --git a/nerfstudio/exporter/exporter_utils.py b/nerfstudio/exporter/exporter_utils.py index c3db219ed..3e5f4425e 100644 --- a/nerfstudio/exporter/exporter_utils.py +++ b/nerfstudio/exporter/exporter_utils.py @@ -39,7 +39,6 @@ from rich.progress import ( from torchtyping import TensorType from nerfstudio.cameras.cameras import Cameras -from nerfstudio.configs.base_config import Config # pylint: disable=unused-import from nerfstudio.pipelines.base_pipeline import Pipeline from nerfstudio.utils.rich_utils import ItersPerSecColumn diff --git a/nerfstudio/utils/eval_utils.py b/nerfstudio/utils/eval_utils.py index 7401a916c..8d780cc82 100644 --- a/nerfstudio/utils/eval_utils.py +++ b/nerfstudio/utils/eval_utils.py @@ -27,13 +27,14 @@ import yaml from rich.console import Console from typing_extensions import Literal -from nerfstudio.configs import base_config as cfg +from nerfstudio.configs.base_config import TrainerConfig +from nerfstudio.configs.experiment_config import ExperimentConfig from nerfstudio.pipelines.base_pipeline import Pipeline CONSOLE = Console(width=120) -def eval_load_checkpoint(config: cfg.TrainerConfig, pipeline: Pipeline) -> Path: +def eval_load_checkpoint(config: TrainerConfig, pipeline: Pipeline) -> Path: ## TODO: ideally eventually want to get this to be the same as whatever is used to load train checkpoint too """Helper function to load checkpointed pipeline @@ -68,7 +69,7 @@ def eval_setup( config_path: Path, eval_num_rays_per_chunk: Optional[int] = None, test_mode: Literal["test", "val", "inference"] = "test", -) -> Tuple[cfg.Config, Pipeline, Path]: +) -> Tuple[ExperimentConfig, Pipeline, Path]: """Shared setup for loading a saved pipeline for evaluation. Args: @@ -85,7 +86,7 @@ def eval_setup( """ # load save config config = yaml.load(config_path.read_text(), Loader=yaml.Loader) - assert isinstance(config, cfg.Config) + assert isinstance(config, ExperimentConfig) if eval_num_rays_per_chunk: config.pipeline.model.eval_num_rays_per_chunk = eval_num_rays_per_chunk diff --git a/nerfstudio/utils/writer.py b/nerfstudio/utils/writer.py index 76d7a3aa9..d85c75bcf 100644 --- a/nerfstudio/utils/writer.py +++ b/nerfstudio/utils/writer.py @@ -188,7 +188,7 @@ def setup_local_writer(config: cfg.LoggingConfig, max_iter: int, banner_messages @check_main_thread -def setup_event_writer(config: cfg.Config, log_dir: Path) -> None: +def setup_event_writer(is_wandb_enabled: bool, is_tensorboard_enabled: bool, log_dir: Path) -> None: """Initialization of all event writers specified in config Args: @@ -197,11 +197,11 @@ def setup_event_writer(config: cfg.Config, log_dir: Path) -> None: banner_messages: list of messages to always display at bottom of screen """ using_event_writer = False - if config.is_wandb_enabled(): + if is_wandb_enabled: curr_writer = WandbWriter(log_dir=log_dir) EVENT_WRITERS.append(curr_writer) using_event_writer = True - if config.is_tensorboard_enabled(): + if is_tensorboard_enabled: curr_writer = TensorboardWriter(log_dir=log_dir) EVENT_WRITERS.append(curr_writer) using_event_writer = True diff --git a/scripts/render.py b/scripts/render.py index 60154f8b7..c8bb4fdae 100644 --- a/scripts/render.py +++ b/scripts/render.py @@ -26,7 +26,6 @@ from typing_extensions import Literal, assert_never from nerfstudio.cameras.camera_paths import get_path_from_json, get_spiral_path from nerfstudio.cameras.cameras import Cameras -from nerfstudio.configs.base_config import Config # pylint: disable=unused-import from nerfstudio.pipelines.base_pipeline import Pipeline from nerfstudio.utils import install_checks from nerfstudio.utils.eval_utils import eval_setup diff --git a/scripts/train.py b/scripts/train.py index 37717a11c..910dbff1c 100755 --- a/scripts/train.py +++ b/scripts/train.py @@ -45,8 +45,8 @@ import tyro import yaml from rich.console import Console -from nerfstudio.configs import base_config as cfg from nerfstudio.configs.config_utils import convert_markup_to_ansi +from nerfstudio.configs.experiment_config import ExperimentConfig from nerfstudio.configs.method_configs import AnnotatedBaseConfigUnion from nerfstudio.engine.trainer import Trainer from nerfstudio.utils import comms, profiler @@ -74,7 +74,7 @@ def _set_random_seed(seed) -> None: torch.manual_seed(seed) -def train_loop(local_rank: int, world_size: int, config: cfg.Config, global_rank: int = 0): +def train_loop(local_rank: int, world_size: int, config: ExperimentConfig, global_rank: int = 0): """Main training function that sets up and runs the trainer per process Args: @@ -95,7 +95,7 @@ def _distributed_worker( num_gpus_per_machine: int, machine_rank: int, dist_url: str, - config: cfg.Config, + config: ExperimentConfig, timeout: timedelta = DEFAULT_TIMEOUT, ) -> Any: """Spawned distributed worker that handles the initialization of process group and handles the @@ -110,7 +110,7 @@ def _distributed_worker( dist_url: URL to connect to for distributed jobs, including protocol E.g., "tcp://127.0.0.1:8686". It can be set to "auto" to automatically select a free port on localhost. - config: Config specifying training regimen. + config: ExperimentConfig specifying training regimen. timeout: Timeout of the distributed workers. Raises: @@ -150,7 +150,7 @@ def launch( num_machines: int = 1, machine_rank: int = 0, dist_url: str = "auto", - config: Optional[cfg.Config] = None, + config: Optional[ExperimentConfig] = None, timeout: timedelta = DEFAULT_TIMEOUT, ) -> None: """Function that spawns muliple processes to call on main_func @@ -161,7 +161,7 @@ def launch( num_machines (int, optional): total number of machines machine_rank (int, optional): rank of this machine. dist_url (str, optional): url to connect to for distributed jobs. - config (Config, optional): config file specifying training regimen. + config (ExperimentConfig, optional): config file specifying training regimen. timeout (timedelta, optional): timeout of the distributed workers. """ assert config is not None @@ -215,7 +215,7 @@ def launch( profiler.flush_profiler(config.logging) -def main(config: cfg.Config) -> None: +def main(config: ExperimentConfig) -> None: """Main function.""" config.set_timestamp() diff --git a/tests/test_train.py b/tests/test_train.py index 6332ba260..dfc2d651e 100644 --- a/tests/test_train.py +++ b/tests/test_train.py @@ -9,7 +9,7 @@ from pathlib import Path import pytest -from nerfstudio.configs.base_config import Config +from nerfstudio.configs.experiment_config import ExperimentConfig from nerfstudio.configs.method_configs import method_configs from nerfstudio.data.dataparsers.blender_dataparser import BlenderDataParserConfig from scripts.train import train_loop @@ -17,7 +17,7 @@ from scripts.train import train_loop BLACKLIST = ["base", "semantic-nerfw", "instant-ngp", "nerfacto", "phototourism"] -def set_reduced_config(config: Config): +def set_reduced_config(config: ExperimentConfig): """Reducing the config settings to speedup test""" config.machine.num_gpus = 0 config.trainer.max_num_iterations = 2 From 1a70665e76bfbc71ef193cc6d3429efa582ddaff Mon Sep 17 00:00:00 2001 From: Tao Date: Wed, 14 Dec 2022 02:16:34 +0800 Subject: [PATCH 12/24] Fix slow training issue when using mask (#1114) --- nerfstudio/data/pixel_samplers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nerfstudio/data/pixel_samplers.py b/nerfstudio/data/pixel_samplers.py index 1066155c7..b76d39f16 100644 --- a/nerfstudio/data/pixel_samplers.py +++ b/nerfstudio/data/pixel_samplers.py @@ -38,7 +38,7 @@ def collate_image_dataset_batch(batch: Dict, num_rays_per_batch: int, keep_full_ # only sample within the mask, if the mask is in the batch if "mask" in batch: - nonzero_indices = torch.nonzero(batch["mask"][..., 0].to(device), as_tuple=False) + nonzero_indices = torch.nonzero(batch["mask"][..., 0], as_tuple=False) chosen_indices = random.sample(range(len(nonzero_indices)), k=num_rays_per_batch) indices = nonzero_indices[chosen_indices] else: From 008cc8f144b65272645471c6748ac3fe2af1427c Mon Sep 17 00:00:00 2001 From: Terrance Wang Date: Tue, 13 Dec 2022 12:39:41 -0800 Subject: [PATCH 13/24] change normals grad calculation (#1108) * change normals grad calculation * changing normal calc --- nerfstudio/fields/base_field.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/nerfstudio/fields/base_field.py b/nerfstudio/fields/base_field.py index 043a29e01..c24d9659c 100644 --- a/nerfstudio/fields/base_field.py +++ b/nerfstudio/fields/base_field.py @@ -74,10 +74,15 @@ class Field(nn.Module): self._sample_locations.shape[:-1] == self._density_before_activation.shape[:-1] ), "Sample locations and density must have the same shape besides the last dimension." - self._density_before_activation.backward( - gradient=torch.ones_like(self._density_before_activation), inputs=self._sample_locations, retain_graph=True - ) - normals = -torch.nn.functional.normalize(self._sample_locations.grad, dim=-1) + normals = torch.autograd.grad( + self._density_before_activation, + self._sample_locations, + grad_outputs=torch.ones_like(self._density_before_activation), + retain_graph=True, + )[0] + + normals = -torch.nn.functional.normalize(normals, dim=-1) + return normals @abstractmethod From 21e0ec6cd8e880265fe5644802dfd3ef2b0e1ed5 Mon Sep 17 00:00:00 2001 From: Matthew Tancik Date: Tue, 13 Dec 2022 12:50:12 -0800 Subject: [PATCH 14/24] Log start iter (#1119) log start iter --- nerfstudio/utils/writer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nerfstudio/utils/writer.py b/nerfstudio/utils/writer.py index d85c75bcf..d90e13b92 100644 --- a/nerfstudio/utils/writer.py +++ b/nerfstudio/utils/writer.py @@ -382,12 +382,12 @@ class LocalWriter: Args: step: current train step """ - valid_step = step > 0 and step % GLOBAL_BUFFER["steps_per_log"] == 0 + valid_step = step % GLOBAL_BUFFER["steps_per_log"] == 0 if valid_step: if not self.has_printed and self.config.max_log_size: CONSOLE.log( f"Printing max of {self.config.max_log_size} lines. " - "Set flag çççç[yellow]--logging.local-writer.max-log-size=0[/yellow] " + "Set flag [yellow]--logging.local-writer.max-log-size=0[/yellow] " "to disable line wrapping." ) latest_map, new_key = self._consolidate_events() From 96f269cc1a5313dc5bc4ce742006305e4f68dfb6 Mon Sep 17 00:00:00 2001 From: dozeri83 <109915435+dozeri83@users.noreply.github.com> Date: Tue, 13 Dec 2022 23:05:48 +0200 Subject: [PATCH 15/24] instant-ngp-bounded model (#1116) * inerted a new model configuration instant-ngp-bounded * added more remarks and small fixes * went back to old near plane * added the oprtion to get a file as well as directory in nerfstudio data parser * pretify prev commit * review fixes * more clear explanation in README.md * reverted readme changes * fixed merge bug * review changes. update config.data docs support for json files inputs Co-authored-by: dror --- nerfstudio/configs/method_configs.py | 35 +++++++++- .../dataparsers/instant_ngp_dataparser.py | 64 ++++++++++++++----- .../data/dataparsers/nerfstudio_dataparser.py | 32 +++++++--- nerfstudio/model_components/ray_samplers.py | 3 +- nerfstudio/models/instant_ngp.py | 10 ++- scripts/benchmarking/launch_train_blender.sh | 11 +++- tests/test_train.py | 2 +- 7 files changed, 123 insertions(+), 34 deletions(-) diff --git a/nerfstudio/configs/method_configs.py b/nerfstudio/configs/method_configs.py index b02d782b9..3d4b694d9 100644 --- a/nerfstudio/configs/method_configs.py +++ b/nerfstudio/configs/method_configs.py @@ -21,6 +21,7 @@ from __future__ import annotations from typing import Dict import tyro +from nerfacc import ContractionType from nerfstudio.cameras.camera_optimizers import CameraOptimizerConfig from nerfstudio.configs.base_config import TrainerConfig, ViewerConfig @@ -33,6 +34,9 @@ from nerfstudio.data.datamanagers.variable_res_datamanager import ( from nerfstudio.data.dataparsers.blender_dataparser import BlenderDataParserConfig from nerfstudio.data.dataparsers.dnerf_dataparser import DNeRFDataParserConfig from nerfstudio.data.dataparsers.friends_dataparser import FriendsDataParserConfig +from nerfstudio.data.dataparsers.instant_ngp_dataparser import ( + InstantNGPDataParserConfig, +) from nerfstudio.data.dataparsers.nerfstudio_dataparser import NerfstudioDataParserConfig from nerfstudio.data.dataparsers.phototourism_dataparser import ( PhototourismDataParserConfig, @@ -52,7 +56,8 @@ from nerfstudio.pipelines.dynamic_batch import DynamicBatchPipelineConfig method_configs: Dict[str, ExperimentConfig] = {} descriptions = { "nerfacto": "Recommended real-time model tuned for real captures. This model will be continually updated.", - "instant-ngp": "Implementation of Instant-NGP. Recommended real-time model for bounded synthetic data.", + "instant-ngp": "Implementation of Instant-NGP. Recommended real-time model for unbounded scenes.", + "instant-ngp-bounded": "Implementation of Instant-NGP. Recommended for bounded real and synthetic scenes", "mipnerf": "High quality model for bounded scenes. (slow)", "semantic-nerfw": "Predicts semantic segmentations and filters out transient objects.", "vanilla-nerf": "Original NeRF model. (slow)", @@ -110,6 +115,34 @@ method_configs["instant-ngp"] = ExperimentConfig( vis="viewer", ) + +method_configs["instant-ngp-bounded"] = ExperimentConfig( + method_name="instant-ngp-bounded", + trainer=TrainerConfig( + steps_per_eval_batch=500, steps_per_save=2000, max_num_iterations=30000, mixed_precision=True + ), + pipeline=DynamicBatchPipelineConfig( + datamanager=VanillaDataManagerConfig(dataparser=InstantNGPDataParserConfig(), train_num_rays_per_batch=8192), + model=InstantNGPModelConfig( + eval_num_rays_per_chunk=8192, + contraction_type=ContractionType.AABB, + render_step_size=0.001, + max_num_samples_per_ray=48, + near_plane=0.01, + background_color="black", + ), + ), + optimizers={ + "fields": { + "optimizer": AdamOptimizerConfig(lr=1e-2, eps=1e-15), + "scheduler": None, + } + }, + viewer=ViewerConfig(num_rays_per_chunk=64000), + vis="viewer", +) + + method_configs["mipnerf"] = ExperimentConfig( method_name="mipnerf", pipeline=VanillaPipelineConfig( diff --git a/nerfstudio/data/dataparsers/instant_ngp_dataparser.py b/nerfstudio/data/dataparsers/instant_ngp_dataparser.py index 289e23d55..6a3478749 100644 --- a/nerfstudio/data/dataparsers/instant_ngp_dataparser.py +++ b/nerfstudio/data/dataparsers/instant_ngp_dataparser.py @@ -20,6 +20,7 @@ from dataclasses import dataclass, field from pathlib import Path from typing import Dict, Tuple, Type +import imageio import numpy as np import torch from rich.console import Console @@ -44,10 +45,10 @@ class InstantNGPDataParserConfig(DataParserConfig): _target: Type = field(default_factory=lambda: InstantNGP) """target class to instantiate""" data: Path = Path("data/ours/posterv2") - """Directory specifying location of data.""" + """Directory or explicit json file path specifying location of data.""" scale_factor: float = 1.0 """How much to scale the camera origins by.""" - scene_scale: float = 0.33 + scene_scale: float = 0.3333 """How much to scale the scene.""" @@ -58,16 +59,34 @@ class InstantNGP(DataParser): config: InstantNGPDataParserConfig def _generate_dataparser_outputs(self, split="train"): + if self.config.data.suffix == ".json": + meta = load_from_json(self.config.data) + data_dir = self.config.data.parent + else: + meta = load_from_json(self.config.data / "transforms.json") + data_dir = self.config.data - meta = load_from_json(self.config.data / "transforms.json") image_filenames = [] poses = [] num_skipped_image_filenames = 0 for frame in meta["frames"]: - fname = self.config.data / Path(frame["file_path"]) - if not fname: + fname = data_dir / Path(frame["file_path"]) + # search for png file + if not fname.exists(): + fname = data_dir / Path(frame["file_path"] + ".png") + if not fname.exists(): + CONSOLE.log(f"couldnt find {fname} image") num_skipped_image_filenames += 1 else: + if "w" not in meta: + img_0 = imageio.imread(fname) + h, w = img_0.shape[:2] + meta["w"] = w + if "h" in meta: + meta_h = meta["h"] + assert meta_h == h, f"height of image dont not correspond metadata {h} != {meta_h}" + else: + meta["h"] = h image_filenames.append(fname) poses.append(np.array(frame["transform_matrix"])) if num_skipped_image_filenames >= 0: @@ -84,12 +103,18 @@ class InstantNGP(DataParser): camera_to_world = torch.from_numpy(poses[:, :3]) # camera to world transform distortion_params = camera_utils.get_distortion_params( - k1=float(meta["k1"]), k2=float(meta["k2"]), p1=float(meta["p1"]), p2=float(meta["p2"]) + k1=float(meta.get("k1", 0)), + k2=float(meta.get("k2", 0)), + k3=float(meta.get("k3", 0)), + k4=float(meta.get("k4", 0)), + p1=float(meta.get("p1", 0)), + p2=float(meta.get("p2", 0)), ) # in x,y,z order # assumes that the scene is centered at the origin - aabb_scale = meta["aabb_scale"] + aabb_scale = 0.5 * meta.get("aabb_scale", 1) + scene_box = SceneBox( aabb=torch.tensor( [[-aabb_scale, -aabb_scale, -aabb_scale], [aabb_scale, aabb_scale, aabb_scale]], dtype=torch.float32 @@ -98,14 +123,16 @@ class InstantNGP(DataParser): fl_x, fl_y = InstantNGP.get_focal_lengths(meta) + w, h = meta["w"], meta["h"] + cameras = Cameras( fx=float(fl_x), fy=float(fl_y), - cx=float(meta["cx"]), - cy=float(meta["cy"]), + cx=float(meta.get("cx", 0.5 * w)), + cy=float(meta.get("cy", 0.5 * h)), distortion_params=distortion_params, - height=int(meta["h"]), - width=int(meta["w"]), + height=int(h), + width=int(w), camera_to_worlds=camera_to_world, camera_type=CameraType.PERSPECTIVE, ) @@ -140,12 +167,15 @@ class InstantNGP(DataParser): elif "camera_angle_x" in meta: fl_x = fov_to_focal_length(meta["camera_angle_x"], meta["w"]) - if "fl_y" in meta: - fl_y = meta["fl_y"] - elif "y_fov" in meta: - fl_y = fov_to_focal_length(np.deg2rad(meta["y_fov"]), meta["h"]) - elif "camera_angle_y" in meta: - fl_y = fov_to_focal_length(meta["camera_angle_y"], meta["h"]) + if "camera_angle_y" not in meta or "y_fov" not in meta: + fl_y = fl_x + else: + if "fl_y" in meta: + fl_y = meta["fl_y"] + elif "y_fov" in meta: + fl_y = fov_to_focal_length(np.deg2rad(meta["y_fov"]), meta["h"]) + elif "camera_angle_y" in meta: + fl_y = fov_to_focal_length(meta["camera_angle_y"], meta["h"]) if fl_x == 0 or fl_y == 0: raise AttributeError("Focal length cannot be calculated from transforms.json (missing fields).") diff --git a/nerfstudio/data/dataparsers/nerfstudio_dataparser.py b/nerfstudio/data/dataparsers/nerfstudio_dataparser.py index d2c8c2d2e..e311a08cc 100644 --- a/nerfstudio/data/dataparsers/nerfstudio_dataparser.py +++ b/nerfstudio/data/dataparsers/nerfstudio_dataparser.py @@ -47,7 +47,7 @@ class NerfstudioDataParserConfig(DataParserConfig): _target: Type = field(default_factory=lambda: Nerfstudio) """target class to instantiate""" data: Path = Path("data/nerfstudio/poster") - """Directory specifying location of data.""" + """Directory or explicit json file path specifying location of data.""" scale_factor: float = 1.0 """How much to scale the camera origins by.""" downscale_factor: Optional[int] = None @@ -74,7 +74,13 @@ class Nerfstudio(DataParser): def _generate_dataparser_outputs(self, split="train"): # pylint: disable=too-many-statements - meta = load_from_json(self.config.data / "transforms.json") + if self.config.data.suffix == ".json": + meta = load_from_json(self.config.data) + data_dir = self.config.data.parent + else: + meta = load_from_json(self.config.data / "transforms.json") + data_dir = self.config.data + image_filenames = [] mask_filenames = [] poses = [] @@ -101,7 +107,7 @@ class Nerfstudio(DataParser): for frame in meta["frames"]: filepath = PurePath(frame["file_path"]) - fname = self._get_fname(filepath) + fname = self._get_fname(filepath, data_dir) if not fname.exists(): num_skipped_image_filenames += 1 continue @@ -140,7 +146,11 @@ class Nerfstudio(DataParser): poses.append(np.array(frame["transform_matrix"])) if "mask_path" in frame: mask_filepath = PurePath(frame["mask_path"]) - mask_fname = self._get_fname(mask_filepath, downsample_folder_prefix="masks_") + mask_fname = self._get_fname( + mask_filepath, + data_dir, + downsample_folder_prefix="masks_", + ) mask_filenames.append(mask_fname) if num_skipped_image_filenames >= 0: CONSOLE.log(f"Skipping {num_skipped_image_filenames} files in dataset split {split}.") @@ -258,21 +268,25 @@ class Nerfstudio(DataParser): ) return dataparser_outputs - def _get_fname(self, filepath: PurePath, downsample_folder_prefix="images_") -> Path: + def _get_fname(self, filepath: PurePath, data_dir: PurePath, downsample_folder_prefix="images_") -> Path: """Get the filename of the image file. downsample_folder_prefix can be used to point to auxillary image data, e.g. masks + + filepath: the base file name of the transformations. + data_dir: the directory of the data that contains the transform file + downsample_folder_prefix: prefix of the newly generated downsampled images """ if self.downscale_factor is None: if self.config.downscale_factor is None: - test_img = Image.open(self.config.data / filepath) + test_img = Image.open(data_dir / filepath) h, w = test_img.size max_res = max(h, w) df = 0 while True: if (max_res / 2 ** (df)) < MAX_AUTO_RESOLUTION: break - if not (self.config.data / f"{downsample_folder_prefix}{2**(df+1)}" / filepath.name).exists(): + if not (data_dir / f"{downsample_folder_prefix}{2**(df+1)}" / filepath.name).exists(): break df += 1 @@ -282,5 +296,5 @@ class Nerfstudio(DataParser): self.downscale_factor = self.config.downscale_factor if self.downscale_factor > 1: - return self.config.data / f"{downsample_folder_prefix}{self.downscale_factor}" / filepath.name - return self.config.data / filepath + return data_dir / f"{downsample_folder_prefix}{self.downscale_factor}" / filepath.name + return data_dir / filepath diff --git a/nerfstudio/model_components/ray_samplers.py b/nerfstudio/model_components/ray_samplers.py index a65bd2128..4bc16fc05 100644 --- a/nerfstudio/model_components/ray_samplers.py +++ b/nerfstudio/model_components/ray_samplers.py @@ -460,7 +460,8 @@ class VolumetricSampler(Sampler): rays_d=rays_d, scene_aabb=self.scene_aabb, grid=self.occupancy_grid, - sigma_fn=self.get_sigma_fn(rays_o, rays_d), + # this is a workaround - using density causes crash and damage quality. should be fixed + sigma_fn=None, # self.get_sigma_fn(rays_o, rays_d), render_step_size=render_step_size, near_plane=near_plane, far_plane=far_plane, diff --git a/nerfstudio/models/instant_ngp.py b/nerfstudio/models/instant_ngp.py index f30d2ad9a..a67c1ec7d 100644 --- a/nerfstudio/models/instant_ngp.py +++ b/nerfstudio/models/instant_ngp.py @@ -28,6 +28,7 @@ from torch.nn import Parameter from torchmetrics import PeakSignalNoiseRatio from torchmetrics.functional import structural_similarity_index_measure from torchmetrics.image.lpip import LearnedPerceptualImagePatchSimilarity +from typing_extensions import Literal from nerfstudio.cameras.rays import RayBundle from nerfstudio.engine.callbacks import ( @@ -76,8 +77,8 @@ class InstantNGPModelConfig(ModelConfig): """How far along ray to stop sampling.""" use_appearance_embedding: bool = False """Whether to use an appearance embedding.""" - randomize_background: bool = True - """Whether to randomize the background color.""" + background_color: Literal["random", "black", "white"] = "random" + """The color that is given to untrained areas.""" class NGPModel(Model): @@ -122,7 +123,10 @@ class NGPModel(Model): ) # renderers - background_color = "random" if self.config.randomize_background else colors.WHITE + background_color = "random" + if self.config.background_color in ["white", "black"]: + background_color = colors.COLORS_DICT[self.config.background_color] + self.renderer_rgb = RGBRenderer(background_color=background_color) self.renderer_accumulation = AccumulationRenderer() self.renderer_depth = DepthRenderer(method="expected") diff --git a/scripts/benchmarking/launch_train_blender.sh b/scripts/benchmarking/launch_train_blender.sh index e57561e02..332ec95ef 100755 --- a/scripts/benchmarking/launch_train_blender.sh +++ b/scripts/benchmarking/launch_train_blender.sh @@ -62,6 +62,13 @@ timestamp=$(date "+%Y-%m-%d_%H%M%S") # kill all the background jobs if terminated: trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT +dataparser="blender-data" +trans_file="" +if [ "$method_name" = "instant-ngp-bounded" ]; then + dataparser="" + trans_file="/transforms_train.json" +fi + for dataset in "${DATASETS[@]}"; do if "$single" && [ -n "${GPU_PID[$idx]+x}" ]; then echo "Waiting for GPU ${GPU_IDX[$idx]}" @@ -70,7 +77,7 @@ for dataset in "${DATASETS[@]}"; do fi export CUDA_VISIBLE_DEVICES="${GPU_IDX[$idx]}" ns-train "${method_name}" "${method_opts[@]}" \ - --data="data/blender/${dataset}" \ + --data="data/blender/${dataset}${trans_file}" \ --experiment-name="blender_${dataset}_${tag}" \ --trainer.relative-model-dir=nerfstudio_models/ \ --trainer.steps-per-save=1000 \ @@ -79,7 +86,7 @@ for dataset in "${DATASETS[@]}"; do --logging.enable-profiler=False \ --vis "${vis}" \ --timestamp "$timestamp" \ - blender-data & GPU_PID[$idx]=$! + ${dataparser} & GPU_PID[$idx]=$! echo "Launched ${method_name} ${dataset} on gpu ${GPU_IDX[$idx]}, ${tag}" # update gpu diff --git a/tests/test_train.py b/tests/test_train.py index dfc2d651e..f7e860275 100644 --- a/tests/test_train.py +++ b/tests/test_train.py @@ -14,7 +14,7 @@ from nerfstudio.configs.method_configs import method_configs from nerfstudio.data.dataparsers.blender_dataparser import BlenderDataParserConfig from scripts.train import train_loop -BLACKLIST = ["base", "semantic-nerfw", "instant-ngp", "nerfacto", "phototourism"] +BLACKLIST = ["base", "semantic-nerfw", "instant-ngp", "instant-ngp-bounded", "nerfacto", "phototourism"] def set_reduced_config(config: ExperimentConfig): From c8daa1a1d756128a2bbdba4ee39d49ffbf4a2325 Mon Sep 17 00:00:00 2001 From: Matthew Tancik Date: Tue, 13 Dec 2022 13:24:22 -0800 Subject: [PATCH 16/24] Missing images error warning (#1122) --- nerfstudio/process_data/process_data_utils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nerfstudio/process_data/process_data_utils.py b/nerfstudio/process_data/process_data_utils.py index e291d898a..e028bf1c0 100644 --- a/nerfstudio/process_data/process_data_utils.py +++ b/nerfstudio/process_data/process_data_utils.py @@ -167,6 +167,10 @@ def copy_images(data: Path, image_dir: Path, verbose) -> int: allowed_exts = [".jpg", ".jpeg", ".png", ".tif", ".tiff"] image_paths = sorted([p for p in data.glob("[!.]*") if p.suffix.lower() in allowed_exts]) + if len(image_paths) == 0: + CONSOLE.log("[bold red]:skull: No usable images in the data folder.") + sys.exit(1) + num_frames = len(copy_images_list(image_paths, image_dir, verbose)) return num_frames From a0a3def1623c8849776d4c03c6ffc448726492a2 Mon Sep 17 00:00:00 2001 From: Matthew Tancik Date: Tue, 13 Dec 2022 13:53:09 -0800 Subject: [PATCH 17/24] Fix datamanager dataparser_outputs (#1123) * Fix datamanager dataparser_outputs * Cast to float --- nerfstudio/data/datamanagers/base_datamanager.py | 2 +- nerfstudio/data/datamanagers/semantic_datamanager.py | 2 +- nerfstudio/data/dataparsers/base_dataparser.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nerfstudio/data/datamanagers/base_datamanager.py b/nerfstudio/data/datamanagers/base_datamanager.py index 7f1282c87..140d018ba 100644 --- a/nerfstudio/data/datamanagers/base_datamanager.py +++ b/nerfstudio/data/datamanagers/base_datamanager.py @@ -314,6 +314,7 @@ class VanillaDataManager(DataManager): # pylint: disable=abstract-method self.test_mode = test_mode self.test_split = "test" if test_mode in ["test", "inference"] else "val" self.dataparser = self.config.dataparser.setup() + self.train_dataparser_outputs = self.dataparser.get_dataparser_outputs(split="train") self.train_dataset = self.create_train_dataset() self.eval_dataset = self.create_eval_dataset() @@ -321,7 +322,6 @@ class VanillaDataManager(DataManager): # pylint: disable=abstract-method def create_train_dataset(self) -> InputDataset: """Sets up the data loaders for training""" - self.train_dataparser_outputs = self.dataparser.get_dataparser_outputs(split="train") return InputDataset( dataparser_outputs=self.train_dataparser_outputs, scale_factor=self.config.camera_res_scale_factor, diff --git a/nerfstudio/data/datamanagers/semantic_datamanager.py b/nerfstudio/data/datamanagers/semantic_datamanager.py index b3cc223ae..188c7f6c3 100644 --- a/nerfstudio/data/datamanagers/semantic_datamanager.py +++ b/nerfstudio/data/datamanagers/semantic_datamanager.py @@ -42,7 +42,7 @@ class SemanticDataManager(VanillaDataManager): # pylint: disable=abstract-metho def create_train_dataset(self) -> SemanticDataset: return SemanticDataset( - dataparser_outputs=self.dataparser.get_dataparser_outputs(split="train"), + dataparser_outputs=self.train_dataparser_outputs, scale_factor=self.config.camera_res_scale_factor, ) diff --git a/nerfstudio/data/dataparsers/base_dataparser.py b/nerfstudio/data/dataparsers/base_dataparser.py index 0caf24cea..89c7c4e21 100644 --- a/nerfstudio/data/dataparsers/base_dataparser.py +++ b/nerfstudio/data/dataparsers/base_dataparser.py @@ -82,7 +82,7 @@ class DataparserOutputs: """ data = { "transform": self.dataparser_transform.tolist(), - "scale": self.dataparser_scale, + "scale": float(self.dataparser_scale), } if not path.parent.exists(): path.parent.mkdir(parents=True) From 6f85d7118fc3b317e926515497c4cf5de7650039 Mon Sep 17 00:00:00 2001 From: Matthew Tancik Date: Tue, 13 Dec 2022 18:37:31 -0800 Subject: [PATCH 18/24] Add docs for KIRI Engine (#1124) Add docs for KIRI engine --- README.md | 17 +++---- docs/quickstart/custom_dataset.md | 65 ++++++++++++++++++++++---- docs/quickstart/imgs/kiri_capture.png | Bin 0 -> 74639 bytes docs/quickstart/imgs/kiri_setup.png | Bin 0 -> 135526 bytes 4 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 docs/quickstart/imgs/kiri_capture.png create mode 100644 docs/quickstart/imgs/kiri_setup.png diff --git a/README.md b/README.md index 3050b80dd..edef31622 100644 --- a/README.md +++ b/README.md @@ -184,14 +184,15 @@ ns-export pointcloud --help Using an existing dataset is great, but likely you want to use your own data! We support various methods for using your own data. Before it can be used in nerfstudio, the camera location and orientations must be determined and then converted into our format using `ns-process-data`. We rely on external tools for this, instructions and information can be found in the documentation. -| Data | Requirements | Preprocessing Speed | -| ------------------------------------------------------------------------------------------------- | ---------------- | ------------------- | -| 📷 [Images](https://docs.nerf.studio/en/latest/quickstart/custom_dataset.html#images-or-video) | COLMAP | 🐢 | -| 📹 [Video](https://docs.nerf.studio/en/latest/quickstart/custom_dataset.html#images-or-video) | COLMAP | 🐢 | -| 📱 [Polycam](https://docs.nerf.studio/en/latest/quickstart/custom_dataset.html#polycam-capture) | LiDAR iOS Device | 🐇 | -| 📱 [Record3D](https://docs.nerf.studio/en/latest/quickstart/custom_dataset.html#record3d-capture) | LiDAR iOS Device | 🐇 | -| 🖥 [Metashape](https://docs.nerf.studio/en/latest/quickstart/custom_dataset.html#metashape) | | 🐢 | -| 🛠 [Custom](https://docs.nerf.studio/en/latest/quickstart/data_conventions.html) | Poses | 🐇 | +| Data | Capture Device | Requirements | `ns-process-data` Speed | +| ------------------------------------------------------------------------------------------------- | -------------- | ----------------------------------------------- | ----------------------- | +| 📷 [Images](https://docs.nerf.studio/en/latest/quickstart/custom_dataset.html#images-and-video) | Any | [COLMAP](https://colmap.github.io/install.html) | 🐢 | +| 📹 [Video](https://docs.nerf.studio/en/latest/quickstart/custom_dataset.html#images-and-video) | Any | [COLMAP](https://colmap.github.io/install.html) | 🐢 | +| 📱 [Polycam](https://docs.nerf.studio/en/latest/quickstart/custom_dataset.html#polycam-capture) | IOS with LiDAR | [Polycam App](https://poly.cam/) | 🐇 | +| 📱 [KIRI Engine](https://docs.nerf.studio/en/latest/quickstart/custom_dataset.html#kiri-capture) | IOS or Android | [KIRI Engine App](https://www.kiriengine.com/) | 🐇 | +| 📱 [Record3D](https://docs.nerf.studio/en/latest/quickstart/custom_dataset.html#record3d-capture) | IOS with LiDAR | [Record3D app](https://record3d.app/) | 🐇 | +| 🖥 [Metashape](https://docs.nerf.studio/en/latest/quickstart/custom_dataset.html#metashape) | Any | [Metashape](https://www.agisoft.com/) | 🐇 | +| 🛠 [Custom](https://docs.nerf.studio/en/latest/quickstart/data_conventions.html) | Any | Camera Poses | 🐇 | ## 5. Advanced Options diff --git a/docs/quickstart/custom_dataset.md b/docs/quickstart/custom_dataset.md index e883560d8..ea508a661 100644 --- a/docs/quickstart/custom_dataset.md +++ b/docs/quickstart/custom_dataset.md @@ -11,14 +11,14 @@ ns-process-data {video,images,polycam,insta360,record3d} --data {DATA_PATH} --ou A full set of arguments can be found {doc}`here`. We Currently support the following custom data types: -| Data | Requirements | Preprocessing Speed | -| -------- | ----------------------- | ------------------- | -| 📷 [Images](images_and_video) | COLMAP | 🐢 | -| 📹 [Video](images_and_video) | COLMAP | 🐢 | -| 📱 [Polycam](polycam) | LiDAR iOS Device | 🐇 | -| 📱 [Record3D](record3d) | LiDAR iOS Device | 🐇 | -| 🖥 [Metashape](metashape) | | 🐢 | -| 📷 Insta360 | 2 Sensor camera, COLMAP | 🐢 | +| Data | Capture Device | Requirements | `ns-process-data` Speed | +| ----------------------------- | -------------- | ----------------------------------------------- | ----------------------- | +| 📷 [Images](images_and_video) | Any | [COLMAP](https://colmap.github.io/install.html) | 🐢 | +| 📹 [Video](images_and_video) | Any | [COLMAP](https://colmap.github.io/install.html) | 🐢 | +| 📱 [Polycam](polycam) | IOS with LiDAR | [Polycam App](https://poly.cam/) | 🐇 | +| 📱 [KIRI Engine](kiri) | IOS or Android | [KIRI Engine App](https://www.kiriengine.com/) | 🐇 | +| 📱 [Record3D](record3d) | IOS with LiDAR | [Record3D app](https://record3d.app/) | 🐇 | +| 🖥 [Metashape](metashape) | Any | [Metashape](https://www.agisoft.com/) | 🐇 | (images_and_video)= @@ -175,11 +175,58 @@ ns-process-data polycam --data {OUTPUT_FILE.zip} --output-dir {output directory} ns-train nerfacto --data {output directory} ``` +(kiri)= + +## KIRI Engine Capture + +Nerfstudio can trained from data processed by the [KIRI Engine app](https://www.kiriengine.com/). This works for both Android and iPhone and does not require a LiDAR supported device. + +:::{admonition} Note +:class: info +`ns-process-data` does not need to be run when using KIRI Engine. +::: + +### Setting up KIRI Engine + +```{image} imgs/kiri_setup.png +:width: 400 +:align: center +:alt: KIRI Engine setup +``` + +After downloading the app, `Developer Mode` needs to be enabled. A toggle can be found in the settings menu. + +### Process data + +```{image} imgs/kiri_capture.png +:width: 400 +:align: center +:alt: KIRI Engine setup +``` + +1. Navigate to captures window. + +2. Select `Dev.` tab. + +3. Tap the `+` button to create a new capture. + +4. Choose `Camera pose` as the capture option + +5. Capture the scene and provide a name. + +6. After processing is complete, export the scene. It will be sent to your email. + +7. Unzip the file and run the training script (`ns-process-data` is not necessary). + +``` +ns-train nerfacto --data {kiri output directory} +``` + (record3d)= ## Record3D Capture -Nerfstudio can also be trained directly from >=iPhone 12 Pro captures from the [Record3D app](https://record3d.app/). This uses the iPhone's LiDAR sensors to calculate camera poses, so COLMAP is not needed. +Nerfstudio can be trained directly from >=iPhone 12 Pro captures from the [Record3D app](https://record3d.app/). This uses the iPhone's LiDAR sensors to calculate camera poses, so COLMAP is not needed. Click on the image down below 👇 for a 1-minute tutorial on how to run nerfstudio with Record3D from start to finish. diff --git a/docs/quickstart/imgs/kiri_capture.png b/docs/quickstart/imgs/kiri_capture.png new file mode 100644 index 0000000000000000000000000000000000000000..64f1531b0854335a6a5eb18d1c5a0ac0a56ecbe9 GIT binary patch literal 74639 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 literal 0 HcmV?d00001 From 5630148c50c776fbf1fa16b69784408949697781 Mon Sep 17 00:00:00 2001 From: Alexander Kristoffersen Date: Tue, 13 Dec 2022 23:04:17 -0800 Subject: [PATCH 19/24] Changed tinycudann to wheel to work with py3.8 (#1126) Created using Colaboratory --- colab/demo.ipynb | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/colab/demo.ipynb b/colab/demo.ipynb index 9609a6db4..148da3b88 100644 --- a/colab/demo.ipynb +++ b/colab/demo.ipynb @@ -7,7 +7,7 @@ "colab_type": "text" }, "source": [ - "\"Open" + "\"Open" ] }, { @@ -63,25 +63,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "cellView": "form", "colab": { "base_uri": "https://localhost:8080/" }, "id": "RGr33zHaHak0", - "outputId": "2641dce6-cd57-4d31-d8b1-860bc1adf17f" + "outputId": "6ad38334-22d2-4675-bffb-0bae91b17577" }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "⏬ Downloading https://github.com/jaimergp/miniforge/releases/latest/download/Mambaforge-colab-Linux-x86_64.sh...\n", "📦 Installing...\n", "📌 Adjusting configuration...\n", "🩹 Patching environment...\n", - "⏲ Done in 0:00:27\n", + "⏲ Done in 0:00:18\n", "🔁 Restarting kernel...\n" ] } @@ -111,9 +111,8 @@ "\n", "# Installing TinyCuda\n", "%cd /content/\n", - "# !gdown \"https://drive.google.com/u/1/uc?id=1wglEFPbI4BjWMFYaKk7gHCNsWCZphKjs\" \n", - "# !pip install tinycudann-1.6-cp38-cp38-linux_x86_64.whl\n", - "!pip install git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch\n", + "!gdown \"https://drive.google.com/u/0/uc?id=1mB3IxcpmTVmQN-So0t2lxjxbHvqWr2zf\" \n", + "!pip install tinycudann-1.5-cp38-cp38-linux_x86_64.whl\n", "\n", "# Installing COLMAP\n", "%cd /content/\n", From d51718ec2bc411b6a0ac16d017f80ae96d3aceb0 Mon Sep 17 00:00:00 2001 From: Matthew Tancik Date: Wed, 14 Dec 2022 16:26:05 -0800 Subject: [PATCH 20/24] Immediately update viewer when output or cmap changes (#1131) * Immediately update viewer when output or cmap changes * lint --- nerfstudio/viewer/server/viewer_utils.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/nerfstudio/viewer/server/viewer_utils.py b/nerfstudio/viewer/server/viewer_utils.py index ce70426f6..c3ebb950e 100644 --- a/nerfstudio/viewer/server/viewer_utils.py +++ b/nerfstudio/viewer/server/viewer_utils.py @@ -454,6 +454,19 @@ class ViewerState: else: self.prev_camera_matrix = camera_object["matrix"] self.camera_moving = True + + output_type = self.vis["renderingState/output_choice"].read() + if output_type is None: + output_type = OutputTypes.INIT + if self.prev_output_type != output_type: + self.camera_moving = True + + colormap_type = self.vis["renderingState/colormap_choice"].read() + if colormap_type is None: + colormap_type = ColormapTypes.INIT + if self.prev_colormap_type != colormap_type: + self.camera_moving = True + return camera_object def _apply_colormap(self, outputs: Dict[str, Any], colors: torch.Tensor = None, eps=1e-6): From bc690632bbffee4d21dd504985e13bca2510bf13 Mon Sep 17 00:00:00 2001 From: Penn Date: Thu, 15 Dec 2022 13:24:31 -0800 Subject: [PATCH 21/24] Use `torch.where` for faster contract (#1132) use where for faster contract --- nerfstudio/field_components/spatial_distortions.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/nerfstudio/field_components/spatial_distortions.py b/nerfstudio/field_components/spatial_distortions.py index 449f4b5b9..02da548a3 100644 --- a/nerfstudio/field_components/spatial_distortions.py +++ b/nerfstudio/field_components/spatial_distortions.py @@ -65,12 +65,8 @@ class SceneContraction(SpatialDistortion): def forward(self, positions): def contract(x): - mag = torch.linalg.norm(x, ord=self.order, dim=-1) - mask = mag >= 1 - x_new = x.clone() - x_new[mask] = (2 - (1 / mag[mask][..., None])) * (x[mask] / mag[mask][..., None]) - - return x_new + mag = torch.linalg.norm(x, ord=self.order, dim=-1)[..., None] + return torch.where(mag < 1, x, (2 - (1 / mag)) * (x / mag)) if isinstance(positions, Gaussians): means = contract(positions.mean.clone()) From 3da0ca727d560e264cfaa4425c8818fab62601bf Mon Sep 17 00:00:00 2001 From: Matthew Tancik Date: Thu, 15 Dec 2022 14:18:23 -0800 Subject: [PATCH 22/24] Update render ui to use leva (#1133) --- nerfstudio/viewer/app/src/index.scss | 29 +++- .../SidePanel/CameraPanel/CameraPanel.jsx | 144 ++++-------------- .../SidePanel/CameraPanel/CameraPropPanel.jsx | 73 +++++++++ 3 files changed, 124 insertions(+), 122 deletions(-) create mode 100644 nerfstudio/viewer/app/src/modules/SidePanel/CameraPanel/CameraPropPanel.jsx diff --git a/nerfstudio/viewer/app/src/index.scss b/nerfstudio/viewer/app/src/index.scss index 194c5ac2e..98e968795 100644 --- a/nerfstudio/viewer/app/src/index.scss +++ b/nerfstudio/viewer/app/src/index.scss @@ -242,18 +242,37 @@ $sidebar-width: 100% !default; // ------------------------------------ // Camera Pane -.CameraPanel { +.CameraPanel-props { + margin-top: 10px; + margin-bottom: 10px; + margin-left: 20px; + margin-right: 20px; +} + +.CameraPanel-path-row { + display: inline-block; + width: 45%; + margin-top: 8px; + margin-bottom: 8px; + margin-left: 4px; + margin-right: 4px; +} + +.CameraPanel-row { + display: inline-block; + margin-top: 8px; + margin-bottom: 8px; + margin-left: 4px; + margin-right: 4px; } .CameraPanel-top-button { - display: inline-block; - margin: 4px; - margin-top: 8px; + width: 100%; } .CameraPanel-render-button { display: inline-block; - width: 70%; + width: 92%; margin: 4px; margin-top: 8px; } diff --git a/nerfstudio/viewer/app/src/modules/SidePanel/CameraPanel/CameraPanel.jsx b/nerfstudio/viewer/app/src/modules/SidePanel/CameraPanel/CameraPanel.jsx index 6a741d156..9958ea7b1 100644 --- a/nerfstudio/viewer/app/src/modules/SidePanel/CameraPanel/CameraPanel.jsx +++ b/nerfstudio/viewer/app/src/modules/SidePanel/CameraPanel/CameraPanel.jsx @@ -37,6 +37,7 @@ import { useDispatch, useSelector } from 'react-redux'; import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer'; import AddAPhotoIcon from '@mui/icons-material/AddAPhoto'; import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; +import { LevaPanel, LevaStoreProvider, useCreateStore } from 'leva'; import FileUploadOutlinedIcon from '@mui/icons-material/FileUploadOutlined'; import { Stack } from '@mui/system'; import TextField from '@mui/material/TextField'; @@ -46,6 +47,8 @@ import { CameraHelper } from './CameraHelper'; import { get_curve_object_from_cameras, get_transform_matrix } from './curve'; import { WebSocketContext } from '../../WebSocket/WebSocket'; import RenderModal from '../../RenderModal'; +import CameraPropPanel from './CameraPropPanel'; +import LevaTheme from '../../../themes/leva_theme.json'; const msgpack = require('msgpack-lite'); @@ -460,6 +463,9 @@ export default function CameraPanel(props) { const [animate, setAnimate] = React.useState(new Set()); const [globalFov, setGlobalFov] = React.useState(DEFAULT_FOV); + // leva store + const cameraPropsStore = useCreateStore(); + const scene_state = sceneTree.get_scene_state(); // Template for sharing state between Vanilla JS Three.js and React components @@ -496,10 +502,6 @@ export default function CameraPanel(props) { }; // ui state - const [ui_render_height, setUIRenderHeight] = React.useState(render_height); - const [ui_render_width, setUIRenderWidth] = React.useState(render_width); - const [ui_seconds, setUISeconds] = React.useState(seconds); - const [ui_fps, setUIfps] = React.useState(fps); const [fovLabel, setFovLabel] = React.useState(FOV_LABELS.FOV); // nonlinear render option @@ -868,15 +870,10 @@ export default function CameraPanel(props) { const new_properties = new Map(cameraProperties); setRenderHeight(camera_path_object.render_height); - setUIRenderHeight(camera_path_object.render_height); setRenderWidth(camera_path_object.render_width); - setUIRenderWidth(camera_path_object.render_width); setFps(camera_path_object.fps); - setUIfps(camera_path_object.fps); - setSeconds(camera_path_object.seconds); - setUISeconds(camera_path_object.seconds); set_smoothness_value(camera_path_object.smoothness_value); setIsCycle(camera_path_object.is_cycle); @@ -968,7 +965,7 @@ export default function CameraPanel(props) { return (
-
+
-
+
-
- { - if (e.target.validity.valid) { - setUIRenderHeight(e.target.value); - } - }} - onBlur={(e) => { - if (e.target.validity.valid) { - if (e.target.value !== '') { - setRenderHeight(parseInt(e.target.value, 10)); - } else { - setUIRenderHeight(render_height); - } - } - }} - value={ui_render_height} - error={ui_render_height <= 0} - helperText={ui_render_height <= 0 ? 'Required' : ''} - variant="standard" - /> - { - if (e.target.validity.valid) { - setUIRenderWidth(e.target.value); - } - }} - onBlur={(e) => { - if (e.target.validity.valid) { - if (e.target.value !== '') { - setRenderWidth(parseInt(e.target.value, 10)); - } else { - setUIRenderWidth(render_width); - } - } - }} - value={ui_render_width} - error={ui_render_width <= 0} - helperText={ui_render_width <= 0 ? 'Required' : ''} - variant="standard" - /> -
-
- { - if (e.target.validity.valid) { - setUISeconds(e.target.value); - } - }} - onBlur={(e) => { - if (e.target.validity.valid) { - if (e.target.value !== '') { - setSeconds(parseInt(e.target.value, 10)); - } else { - setUISeconds(seconds); - } - } - }} - value={ui_seconds} - error={ui_seconds <= 0} - helperText={ui_seconds <= 0 ? 'Required' : ''} - variant="standard" - /> - { - if (e.target.validity.valid) { - setUIfps(e.target.value); - } - }} - onBlur={(e) => { - if (e.target.validity.valid) { - if (e.target.value !== '') { - setFps(parseInt(e.target.value, 10)); - } else { - setUIfps(fps); - } - } - }} - value={ui_fps} - error={ui_fps <= 0} - helperText={ui_fps <= 0 ? 'Required' : ''} - variant="standard" +
+ + + +
@@ -1161,7 +1071,7 @@ export default function CameraPanel(props) { />
-
+
-
+
-
+
@@ -115,7 +119,8 @@ export default function StatusPanel(props: StatusPanelProps) { set_is_images_visible(!is_images_visible); }} style={{ textTransform: 'none' }} - startIcon={} + startIcon={} + disabled={camera_choice === 'Render Camera'} > {cameras_button} diff --git a/nerfstudio/viewer/app/src/modules/ViewerWindow/ViewerWindow.jsx b/nerfstudio/viewer/app/src/modules/ViewerWindow/ViewerWindow.jsx index 90fe975e0..94990f2d9 100644 --- a/nerfstudio/viewer/app/src/modules/ViewerWindow/ViewerWindow.jsx +++ b/nerfstudio/viewer/app/src/modules/ViewerWindow/ViewerWindow.jsx @@ -9,6 +9,8 @@ import OpenWithIcon from '@mui/icons-material/OpenWith'; import PublicOffSharpIcon from '@mui/icons-material/PublicOffSharp'; import PublicSharpIcon from '@mui/icons-material/PublicSharp'; import SyncOutlinedIcon from '@mui/icons-material/SyncOutlined'; +import ThreeDRotationIcon from '@mui/icons-material/ThreeDRotation'; +import VideoCameraBackIcon from '@mui/icons-material/VideoCameraBackOutlined'; import WebRtcWindow from '../WebRtcWindow/WebRtcWindow'; import { WebSocketContext } from '../WebSocket/WebSocket'; @@ -19,27 +21,36 @@ function CameraToggle() { const camera_choice = useSelector( (state) => state.renderingState.camera_choice, ); - const set_camera_choice = (event: SelectChangeEvent) => { - const value = event.target.value; - dispatch({ - type: 'write', - path: 'renderingState/camera_choice', - data: value, - }); + const set_camera_choice = (event: SelectChangeEvent, value: string[]) => { + if (value != null) { + dispatch({ + type: 'write', + path: 'renderingState/camera_choice', + data: value, + }); + } }; return ( - Viewport - Render View + + + Viewport + + + + Render View + ); } diff --git a/nerfstudio/viewer/app/src/themes/theme.ts b/nerfstudio/viewer/app/src/themes/theme.ts index 554445561..4a973209e 100644 --- a/nerfstudio/viewer/app/src/themes/theme.ts +++ b/nerfstudio/viewer/app/src/themes/theme.ts @@ -126,10 +126,13 @@ export const appTheme = createTheme({ styleOverrides: { root: { color: '#eeeeee', - backgroundColor: '#393e46', + backgroundColor: 'FFD369', '&.Mui-selected': { - color: '#FFD369', - backgroundColor: '#555555', + color: '#222831', + backgroundColor: '#FFD369', + ':hover': { + backgroundColor: '#FFD369', + }, }, '&.Mui-disabled': { color: '#999999', From 3bf490e845897a74db278e027f085967758082a2 Mon Sep 17 00:00:00 2001 From: Ethan Weber Date: Thu, 15 Dec 2022 17:29:41 -0800 Subject: [PATCH 24/24] adding data subset (#1135) * adding nerfstudio-dataset * removed file --- scripts/downloads/download_data.py | 68 +++++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/scripts/downloads/download_data.py b/scripts/downloads/download_data.py index c444991a9..12a0a0227 100755 --- a/scripts/downloads/download_data.py +++ b/scripts/downloads/download_data.py @@ -15,6 +15,7 @@ from rich.console import Console from typing_extensions import Annotated from nerfstudio.configs.base_config import PrintableConfig +from nerfstudio.utils.scripts import run_command CONSOLE = Console(width=120) @@ -84,17 +85,39 @@ def grab_file_id(zip_url: str) -> str: return s.split("/")[0] +nerfstudio_dataset = [ + "Egypt", + "person", + "kitchen", + "plane", + "dozer", + "floating-tree", + "aspen", + "stump", + "sculpture", + "Giannini-Hall", +] nerfstudio_file_ids = { "bww_entrance": grab_file_id("https://drive.google.com/file/d/1ylkRHtfB3n3IRLf2wplpfxzPTq7nES9I/view?usp=sharing"), "campanile": grab_file_id("https://drive.google.com/file/d/13aOfGJRRH05pOOk9ikYGTwqFc2L1xskU/view?usp=sharing"), "desolation": grab_file_id("https://drive.google.com/file/d/14IzOOQm9KBJ3kPbunQbUTHPnXnmZus-f/view?usp=sharing"), - "dozer": grab_file_id("https://drive.google.com/file/d/1-OR5F_V5S4s-yzxohbwTylaXjzYLu8ZR/view?usp=sharing"), "library": grab_file_id("https://drive.google.com/file/d/1Hjbh_-BuaWETQExn2x2qGD74UwrFugHx/view?usp=sharing"), "poster": grab_file_id("https://drive.google.com/file/d/1dmjWGXlJnUxwosN6MVooCDQe970PkD-1/view?usp=sharing"), "redwoods2": grab_file_id("https://drive.google.com/file/d/1rg-4NoXT8p6vkmbWxMOY6PSG4j3rfcJ8/view?usp=sharing"), "storefront": grab_file_id("https://drive.google.com/file/d/16b792AguPZWDA_YC4igKCwXJqW0Tb21o/view?usp=sharing"), "vegetation": grab_file_id("https://drive.google.com/file/d/1wBhLQ2odycrtU39y2akVurXEAt9SsVI3/view?usp=sharing"), + "Egypt": "https://data.nerf.studio/nerfstudio/Egypt.zip", + "person": "https://data.nerf.studio/nerfstudio/person.zip", + "kitchen": "https://data.nerf.studio/nerfstudio/kitchen.zip", + "plane": "https://data.nerf.studio/nerfstudio/plane.zip", + "dozer": "https://data.nerf.studio/nerfstudio/dozer.zip", + "floating-tree": "https://data.nerf.studio/nerfstudio/floating-tree.zip", + "aspen": "https://data.nerf.studio/nerfstudio/aspen.zip", + "stump": "https://data.nerf.studio/nerfstudio/stump.zip", + "sculpture": "https://data.nerf.studio/nerfstudio/sculpture.zip", + "Giannini-Hall": "https://data.nerf.studio/nerfstudio/Giannini-Hall.zip", "all": None, + "nerfstudio-dataset": nerfstudio_dataset, } NerfstudioCaptureName = tyro.extras.literal_type_from_choices(nerfstudio_file_ids.keys()) @@ -103,14 +126,33 @@ NerfstudioCaptureName = tyro.extras.literal_type_from_choices(nerfstudio_file_id def download_capture_name(save_dir: Path, dataset_name: str, capture_name: str, capture_name_to_file_id: dict): """Download specific captures a given dataset and capture name.""" - url = f"https://drive.google.com/uc?id={capture_name_to_file_id[capture_name]}" - target_path = str(save_dir / f"{dataset_name}/{capture_name}") - os.makedirs(target_path, exist_ok=True) - download_path = Path(f"{target_path}.zip") - tmp_path = str(save_dir / ".temp") - shutil.rmtree(tmp_path, ignore_errors=True) - os.makedirs(tmp_path, exist_ok=True) - gdown.download(url, output=str(download_path)) + file_id_or_zip_url = capture_name_to_file_id[capture_name] + if file_id_or_zip_url.endswith(".zip"): + url = file_id_or_zip_url # zip url + target_path = str(save_dir / f"{dataset_name}/{capture_name}") + os.makedirs(target_path, exist_ok=True) + download_path = Path(f"{target_path}.zip") + tmp_path = str(save_dir / ".temp") + shutil.rmtree(tmp_path, ignore_errors=True) + os.makedirs(tmp_path, exist_ok=True) + try: + os.remove(download_path) + except OSError: + pass + run_command(f"wget {url} -O {download_path}", verbose=True) + else: + url = f"https://drive.google.com/uc?id={file_id_or_zip_url}" # file id + target_path = str(save_dir / f"{dataset_name}/{capture_name}") + os.makedirs(target_path, exist_ok=True) + download_path = Path(f"{target_path}.zip") + tmp_path = str(save_dir / ".temp") + shutil.rmtree(tmp_path, ignore_errors=True) + os.makedirs(tmp_path, exist_ok=True) + try: + os.remove(download_path) + except OSError: + pass + gdown.download(url, output=str(download_path)) with zipfile.ZipFile(download_path, "r") as zip_ref: zip_ref.extractall(tmp_path) inner_folders = os.listdir(tmp_path) @@ -132,7 +174,13 @@ class NerfstudioDownload(DatasetDownload): """Download the nerfstudio dataset.""" if self.capture_name == "all": for capture_name in nerfstudio_file_ids: - if capture_name != "all": + if capture_name not in ("all", "nerfstudio-dataset"): + download_capture_name(save_dir, "nerfstudio", capture_name, nerfstudio_file_ids) + return + + if self.capture_name == "nerfstudio-dataset": + for capture_name in nerfstudio_dataset: + if capture_name not in ("all", "nerfstudio-dataset"): download_capture_name(save_dir, "nerfstudio", capture_name, nerfstudio_file_ids) return