Source code for nerfstudio.data.dataparsers.sdfstudio_dataparser
# Copyright 2022 the Regents of the University of California, Nerfstudio Team and contributors. 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."""Datapaser for sdfstudio formatted data"""from__future__importannotationsfromdataclassesimportdataclass,fieldfrompathlibimportPathfromtypingimportTypeimporttorchfromnerfstudio.camerasimportcamera_utilsfromnerfstudio.cameras.camerasimportCameras,CameraTypefromnerfstudio.data.dataparsers.base_dataparserimportDataParser,DataParserConfig,DataparserOutputsfromnerfstudio.data.scene_boximportSceneBoxfromnerfstudio.utils.ioimportload_from_json
[docs]@dataclassclassSDFStudioDataParserConfig(DataParserConfig):"""Scene dataset parser config"""_target:Type=field(default_factory=lambda:SDFStudio)"""target class to instantiate"""data:Path=Path("data/DTU/scan65")"""Directory specifying location of data."""include_mono_prior:bool=False"""whether or not to load monocular depth and normal """depth_unit_scale_factor:float=1e-3"""Scales the depth values to meters. Default value is 0.001 for a millimeter to meter conversion."""include_foreground_mask:bool=False"""whether or not to load foreground mask"""downscale_factor:int=1scene_scale:float=2.0""" Sets the bounding cube to have edge length of this size. The longest dimension of the axis-aligned bbox will be scaled to this value. """skip_every_for_val_split:int=1"""sub sampling validation images"""auto_orient:bool=True
[docs]@dataclassclassSDFStudio(DataParser):"""SDFStudio Dataset"""config:SDFStudioDataParserConfigdef_generate_dataparser_outputs(self,split="train"):# load meta datameta=load_from_json(self.config.data/"meta_data.json")indices=list(range(len(meta["frames"])))# subsample to avoid out-of-memory for validation setifsplit!="train"andself.config.skip_every_for_val_split>=1:indices=indices[::self.config.skip_every_for_val_split]image_filenames=[]depth_filenames=[]normal_filenames=[]transform=Nonefx=[]fy=[]cx=[]cy=[]camera_to_worlds=[]fori,frameinenumerate(meta["frames"]):ifinotinindices:continueimage_filename=self.config.data/frame["rgb_path"]depth_filename=frame.get("mono_depth_path")normal_filename=frame.get("mono_normal_path")intrinsics=torch.tensor(frame["intrinsics"])camtoworld=torch.tensor(frame["camtoworld"])# append dataimage_filenames.append(image_filename)ifdepth_filenameisnotNoneandnormal_filenameisnotNone:depth_filenames.append(self.config.data/depth_filename)normal_filenames.append(self.config.data/normal_filename)fx.append(intrinsics[0,0])fy.append(intrinsics[1,1])cx.append(intrinsics[0,2])cy.append(intrinsics[1,2])camera_to_worlds.append(camtoworld)fx=torch.stack(fx)fy=torch.stack(fy)cx=torch.stack(cx)cy=torch.stack(cy)c2w_colmap=torch.stack(camera_to_worlds)camera_to_worlds=torch.stack(camera_to_worlds)# Convert from COLMAP's/OPENCV's camera coordinate system to nerfstudiocamera_to_worlds[:,0:3,1:3]*=-1ifself.config.auto_orient:camera_to_worlds,transform=camera_utils.auto_orient_and_center_poses(camera_to_worlds,method="up",center_method="none",)# scene box from meta datameta_scene_box=meta["scene_box"]aabb=torch.tensor(meta_scene_box["aabb"],dtype=torch.float32)scene_box=SceneBox(aabb=aabb,)height,width=meta["height"],meta["width"]cameras=Cameras(fx=fx,fy=fy,cx=cx,cy=cy,height=height,width=width,camera_to_worlds=camera_to_worlds[:,:3,:4],camera_type=CameraType.PERSPECTIVE,)# TODO supports downsample# cameras.rescale_output_resolution(scaling_factor=1.0 / self.config.downscale_factor)ifself.config.include_mono_prior:assertmeta["has_mono_prior"],f"no mono prior in {self.config.data}"dataparser_outputs=DataparserOutputs(image_filenames=image_filenames,cameras=cameras,scene_box=scene_box,metadata={"depth_filenames":depth_filenamesiflen(depth_filenames)>0elseNone,"normal_filenames":normal_filenamesiflen(normal_filenames)>0elseNone,"transform":transform,# required for normal maps, these are in colmap format so they require c2w before conversion"camera_to_worlds":c2w_colmapiflen(c2w_colmap)>0elseNone,"include_mono_prior":self.config.include_mono_prior,"depth_unit_scale_factor":self.config.depth_unit_scale_factor,},)returndataparser_outputs