Files
nerfstudio/tests/pipelines/test_vanilla_pipeline.py
b17268e83b [WIP] dreamfusion implementation (#1008)
* starting the framework for dreamfusion

* Removed view direction from RGB to calculate albedo

* Started diffusion

* Added dreamfusion to CLI, removed direction embeddings

* Normals in dreamfusion

* Lambertian shading added

* Train normals in Dreamfusion

* Stable diffusion from Stable Dreamfusion

* Fix normal orientation loss

* Configurable light direction sampling

* adding density initalization at origin

* V1 datamanager

* Don't train normals for first 1k iters

* SDS loss added to dreamfusion

* Dreamfusion pipeline

* Background MLP and SphereCollider

* Normals prediction training fixed

* Sigmoid on background, prompt in config

* Shading hyperparameter adjustements

* Shading hyperparameter tuning

* Location based prompting, density initialization fades, LR change

* Cleaned imports, more config options

* Tuning, more config changes

* remove unused sampler, normalize predicted normals from network

* change position encoding to direction encoding for background color mlp

* Updating dreamfusion to use custom trainer, fixed bug, multi-gpu support (put diffusion on one specific device), merged with main

* Hard coding less, offloading to config

* Appeasing the linter

* First pass opacity / sparsity losses

* Small patches and configs

* Accidentally pushed logs

* Removing logs for real this time

* Transmittance loss bug fix

* 12 GB Dreamfusion!

* Lint

* Remove unecissary collider changes

* Start SD cleanup

* Cleanup SD code

* adding overhead location prompting

* Use lambertian renderer

* turn grad accum off by default, decrease background mlp size, add overhead text embedding

* Cleanup

* Fix normals vis

* change uniform sampler to prediction network, add option to jit unet for faster sds_loss

* Use shaders

* cleaning up jit code

* add warning if using non jit unet

* add proposal network optimizer to config

* speed up render and cleanup code

* Clean up datamanager

* Add distortion loss

* fix wanb

* adding interpolated location sampling

* Update configs

* interpolated location prompting option, lowering init density, transmittance loss interpolation flipped

* rename alphas mult to alphas loss mult

* Mess around with normals

* add option to use random bg color + bg mlp

* Remove Dreamfusion Trainer (#1423)

* Dreamfusion trainer no longer needed

* Added typing for grad scaler

* SDS return loss

* Fix CFG

* Cleanup

* Update configs

* Fix opacity loss, use unform sampling first round of prop

* add prompt edditing to viewer

* Choose your own diffusion

* remove dreamfusion pipeline file

* merging + remove dreamfusion pipeline file

* Update configs

* add stable diff utils

* cleanup

* cleanup

* Fix test

* positional prompting bugfix

* Warmups

* tune

* lint

* Remove dataparser

* merging + text embedding bugfix

* Set data path to launch viewer for DreamFusion (#1776)

* Set data path to launch viewer for DreamFusion

* Apply formatter

* Fallback to 'base_dir' if data manager has no path

* Make if statement non-inline

* Reformat

---------

Co-authored-by: Matthew Tancik <mattt4001@gmail.com>

* add deepfloyd option first try

* merging

* merging from main

* merging

* removing comments, cleaning code, making stable diff utils usable for deepfloyd, remove deepfloyd text encoder after use

* undo chagnes in data folder

* cleaning code, removing unneccesary changes from main, removed normals prediction network

* remove old scripts files, rename generative pipeline flag to no_input_data, revert to default histogram padding in proposal sampler

* changing pipeline flag

* move no input data flag from pipeline to datamanager

* undo config and merge in deepfloyd from main

* merging grad scaler pipeline addition

* merging + setting proposal net scheduler

* revert nerfacto config change

* typing + linting

* rename dreamfusion datamanager to random camras datamanager, check datamanager typing in pipeline and trainer

* fix test import

* fix test import

* changing datamanager check in trainer, add typing in random cameras datamanager

* add Tensor to randomcamerasdatamanager

* remove old comments

* resolve tyro warning

* update fields to use tcnn

* lint

* add packages for deepfloyd

* add versions

* docs first draft

* rename to generfacto, clean docs

* fix import error

* minor changes

* fix orientation loss bug, retune params

* cleanup

* typing

* trying docs fix

* fixing generative package imports

* fix pyright

* docs fix

* merge w main

* docs minor change

* tuning + bugfixes

* remove torch.backends

---------

Co-authored-by: Abhik Ahuja <ahujaabhik@berkeley.edu>
Co-authored-by: David McAllister <davidrmc2@gmail.com>
Co-authored-by: Jake Austin <jake-austin@berkeley.edu>
Co-authored-by: Matthew Tancik <tancik@berkeley.edu>
Co-authored-by: Matt Tancik <mattt4001@gmail.com>
Co-authored-by: SeungWoo Yoo <dreamy1534@gmail.com>
Co-authored-by: ayaanzhaque <ayaanzhaque@gmail.com>
Co-authored-by: Ayaan Haque <ayaanzhaque@berkeley.edu>
2023-06-17 23:34:04 -07:00

95 lines
2.9 KiB
Python

"""
Test pipeline
"""
from pathlib import Path
import torch
from torch import nn
from nerfstudio.cameras.cameras import Cameras
from nerfstudio.data.datasets.base_dataset import DataparserOutputs, InputDataset
from nerfstudio.pipelines.base_pipeline import (
Model,
ModelConfig,
VanillaPipeline,
VanillaPipelineConfig,
)
from nerfstudio.data.datamanagers.base_datamanager import VanillaDataManagerConfig
class MockedDataManager:
"""Mocked data manager"""
def __init__(self, *args, **kwargs):
num_images = 0
self.train_dataset = InputDataset(
DataparserOutputs(
image_filenames=[Path("filename.png")] * num_images,
cameras=Cameras(
camera_to_worlds=torch.ones([num_images, 3, 4], dtype=torch.float32),
fx=1.0,
fy=1.0,
cx=1.0,
cy=1.0,
width=2,
height=2,
),
)
)
def to(self, *args, **kwargs):
"Mocked to"
return self
def test_load_state_dict():
"""Test pipeline load_state_dict calls model's load_state_dict"""
was_called = False
class MockedModel(Model): #
"""Mocked model"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.register_parameter("param", nn.Parameter(torch.ones((3,))))
self.register_module(
"module", Model(*args, **kwargs)
) # make sure that non-DDP checkpoint won't be processed as DDP one
def load_state_dict(self, state_dict, strict=True):
"""Mocked load_state_dict"""
nonlocal was_called
was_called = True
assert strict
assert "param" in state_dict
assert "module.device_indicator_param" in state_dict
config = VanillaPipelineConfig(
datamanager=VanillaDataManagerConfig(
_target=MockedDataManager,
),
model=ModelConfig(_target=MockedModel),
)
pipeline = VanillaPipeline(config, "cpu")
state_dict = pipeline.state_dict()
state_dict["_model.param"].mul_(2)
pipeline.load_pipeline(state_dict, 0)
assert was_called
assert getattr(pipeline.model, "param")[0].item() == 2
# preparation for another test
state_dict["_model.param"].mul_(2)
was_called = False
# pretends to be a DDP checkpoint
ddp_state_dict = {}
for key, value in state_dict.items():
if key.startswith("_model."):
# replace the prefix "_model" with "_model.module"
ddp_state_dict["_model.module." + key[len("_model.") :]] = value
else:
ddp_state_dict[key] = value
# load DDP checkpoint
pipeline.load_pipeline(ddp_state_dict, 0)
assert was_called
assert getattr(pipeline.model, "param")[0].item() == 4