Commit 5699ccbf authored by Nianchen Deng's avatar Nianchen Deng
Browse files

sync

parent 338ae906
{
"model": "SNeRFAdvance",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"density_net": {
"nf": 256,
"n_layers": 2,
"act": "relu",
"skips": []
},
"color_net": {
"nf": 256,
"n_layers": 3,
"act": "relu",
"skips": []
},
"specular_net": {
"nf": 128,
"n_layers": 1,
"act": "relu"
},
"n_featdim": 0,
"space": "voxels",
"steps": [16, 64, 32],
"n_samples": 64,
"perturb_sample": true,
"raymarching_tolerance": 0,
"raymarching_chunk_size": -1,
"density_regularization_weight": 1e-4,
"density_regularization_scale": 1e4
}
}
\ No newline at end of file
{
"model": "SNeRFAdvance",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"density_net": {
"nf": 256,
"n_layers": 4,
"act": "relu",
"skips": []
},
"color_net": {
"nf": 256,
"n_layers": 3,
"act": "relu",
"skips": []
},
"specular_net": {
"nf": 128,
"n_layers": 1,
"act": "relu"
},
"n_featdim": 0,
"space": "voxels",
"steps": [4, 16, 8],
"n_samples": 16,
"perturb_sample": true,
"appearance": "newtype",
"density_color_connection": true,
"density_regularization_weight": 1e-4,
"density_regularization_scale": 1e4,
"specular_regularization_weight": 1e-1,
"specular_regularization_scale": 1e4
}
}
\ No newline at end of file
{
"model": "SNeRFAdvance",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"density_net": {
"nf": 256,
"n_layers": 4,
"act": "relu",
"skips": []
},
"color_net": {
"nf": 256,
"n_layers": 3,
"act": "relu",
"skips": []
},
"specular_net": {
"nf": 128,
"n_layers": 1,
"act": "relu"
},
"n_featdim": 0,
"space": "voxels",
"steps": [4, 16, 8],
"n_samples": 16,
"perturb_sample": true,
"appearance": "combined",
"density_regularization_weight": 1e-4,
"density_regularization_scale": 1e4
}
}
\ No newline at end of file
{
"model": "SNeRFAdvance",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"density_net": {
"nf": 256,
"n_layers": 5,
"act": "relu",
"skips": []
},
"color_net": {
"nf": 256,
"n_layers": 2,
"act": "relu",
"skips": []
},
"specular_net": {
"nf": 128,
"n_layers": 1,
"act": "relu"
},
"n_featdim": 0,
"space": "voxels",
"steps": [4, 16, 8],
"n_samples": 16,
"perturb_sample": true,
"appearance": "combined",
"density_color_connection": true,
"density_regularization_weight": 1e-4,
"density_regularization_scale": 1e4
}
}
\ No newline at end of file
{
"model": "SNeRFAdvance",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"density_net": {
"nf": 256,
"n_layers": 4,
"act": "relu",
"skips": []
},
"color_net": {
"nf": 256,
"n_layers": 3,
"act": "relu",
"skips": []
},
"specular_net": {
"nf": 128,
"n_layers": 1,
"act": "relu"
},
"n_featdim": 0,
"space": "voxels",
"steps": [4, 16, 8],
"n_samples": 16,
"perturb_sample": true,
"appearance": "combined",
"density_color_connection": true,
"density_regularization_weight": 1e-4,
"density_regularization_scale": 1e4
}
}
\ No newline at end of file
{
"model": "SNeRFAdvance",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"density_net": {
"nf": 256,
"n_layers": 3,
"act": "relu",
"skips": []
},
"color_net": {
"nf": 256,
"n_layers": 4,
"act": "relu",
"skips": []
},
"specular_net": {
"nf": 128,
"n_layers": 1,
"act": "relu"
},
"n_featdim": 0,
"space": "voxels",
"steps": [4, 16, 8],
"n_samples": 16,
"perturb_sample": true,
"appearance": "combined",
"density_color_connection": true,
"density_regularization_weight": 1e-4,
"density_regularization_scale": 1e4
}
}
\ No newline at end of file
{
"model": "SNeRFAdvance",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"density_net": {
"nf": 256,
"n_layers": 2,
"act": "relu",
"skips": []
},
"color_net": {
"nf": 256,
"n_layers": 5,
"act": "relu",
"skips": []
},
"specular_net": {
"nf": 128,
"n_layers": 1,
"act": "relu"
},
"n_featdim": 0,
"space": "voxels",
"steps": [4, 16, 8],
"n_samples": 16,
"perturb_sample": true,
"appearance": "combined",
"density_color_connection": true,
"density_regularization_weight": 1e-4,
"density_regularization_scale": 1e4
}
}
\ No newline at end of file
{
"model": "SNeRFAdvance",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"density_net": {
"nf": 256,
"n_layers": 8,
"act": "relu",
"skips": []
},
"color_net": {
"nf": 256,
"n_layers": 6,
"act": "relu",
"skips": []
},
"specular_net": {
"nf": 128,
"n_layers": 2,
"act": "relu"
},
"n_featdim": 0,
"space": "voxels",
"steps": [4, 16, 8],
"n_samples": 16,
"perturb_sample": true,
"appearance": "combined",
"density_color_connection": true,
"density_regularization_weight": 1e-4,
"density_regularization_scale": 1e4
}
}
\ No newline at end of file
{
"model": "SNeRFAdvance",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"density_net": {
"nf": 512,
"n_layers": 4,
"act": "relu",
"skips": []
},
"color_net": {
"nf": 512,
"n_layers": 3,
"act": "relu",
"skips": []
},
"specular_net": {
"nf": 256,
"n_layers": 1,
"act": "relu"
},
"n_featdim": 0,
"space": "voxels",
"steps": [4, 16, 8],
"n_samples": 16,
"perturb_sample": true,
"appearance": "combined",
"density_color_connection": true,
"density_regularization_weight": 1e-4,
"density_regularization_scale": 1e4
}
}
\ No newline at end of file
{
"model": "SNeRFAdvanceX",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"density_net": {
"nf": 128,
"n_layers": 4,
"act": "relu",
"skips": []
},
"color_net": {
"nf": 128,
"n_layers": 3,
"act": "relu",
"skips": []
},
"specular_net": {
"nf": 128,
"n_layers": 1,
"act": "relu"
},
"n_featdim": 0,
"space": "_nets/hr_r0.8s/snerfadv_voxels+ls6/checkpoint_50.tar",
"n_samples": 256,
"perturb_sample": true,
"appearance": "combined",
"density_color_connection": true,
"density_regularization_weight": 1e-4,
"density_regularization_scale": 1e4,
"multi_nets": 16
}
}
\ No newline at end of file
{
"model": "SNeRFAdvanceX",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"density_net": {
"nf": 128,
"n_layers": 4,
"act": "relu",
"skips": []
},
"color_net": {
"nf": 128,
"n_layers": 3,
"act": "relu",
"skips": []
},
"specular_net": {
"nf": 128,
"n_layers": 1,
"act": "relu"
},
"n_featdim": 0,
"space": "_nets/train_t0.3/snerfadv_voxels+ls2/checkpoint_50.tar",
"n_samples": 256,
"perturb_sample": true,
"appearance": "combined",
"density_color_connection": true,
"density_regularization_weight": 1e-4,
"density_regularization_scale": 1e4,
"multi_nets": 4
}
}
\ No newline at end of file
{
"model": "SNeRFAdvanceX",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"density_net": {
"nf": 128,
"n_layers": 4,
"act": "relu",
"skips": []
},
"color_net": {
"nf": 128,
"n_layers": 3,
"act": "relu",
"skips": []
},
"specular_net": {
"nf": 128,
"n_layers": 1,
"act": "relu"
},
"n_featdim": 0,
"space": "_nets/hr_t1.0s/snerfadv_voxels+ls2/checkpoint_50.tar",
"n_samples": 256,
"perturb_sample": true,
"appearance": "combined",
"density_color_connection": true,
"density_regularization_weight": 1e-4,
"density_regularization_scale": 1e4,
"multi_nets": 8
}
}
\ No newline at end of file
{
"model": "SNeRFX",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"fc_params": {
"nf": 128,
"n_layers": 4,
"activation": "relu",
"skips": []
},
"n_featdim": 0,
"space": "nets/train1/snerf_voxels/checkpoint_50.tar",
"n_samples": 256,
"perturb_sample": true,
"raymarching_tolerance": 0,
"raymarching_chunk_size": -1,
"multi_nets": 4
}
}
\ No newline at end of file
{
"model": "SNeRFX",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"fc_params": {
"nf": 128,
"n_layers": 4,
"activation": "relu",
"skips": []
},
"n_featdim": 0,
"space": "nets/train_t0.3/snerf_voxels/checkpoint_50.tar",
"n_samples": 256,
"perturb_sample": true,
"raymarching_tolerance": 0,
"raymarching_chunk_size": -1,
"multi_nets": 8
}
}
\ No newline at end of file
{
"model": "SNeRFX",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"fc_params": {
"nf": 128,
"n_layers": 8,
"activation": "relu",
"skips": [4]
},
"n_featdim": 0,
"space": "nets/train_t0.3/snerf_voxels/checkpoint_50.tar",
"n_samples": 256,
"perturb_sample": true,
"raymarching_tolerance": 0,
"raymarching_chunk_size": -1,
"multi_nets": 4
}
}
\ No newline at end of file
{
"model": "SNeRFX",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"fc_params": {
"nf": 256,
"n_layers": 4,
"activation": "relu",
"skips": []
},
"n_featdim": 0,
"space": "nets/train1/snerf_voxels/checkpoint_50.tar",
"n_samples": 256,
"perturb_sample": true,
"raymarching_tolerance": 0,
"raymarching_chunk_size": -1,
"multi_nets": 4
}
}
\ No newline at end of file
{
"model": "SNeRFX",
"args": {
"color": "rgb",
"n_pot_encode": 10,
"n_dir_encode": 4,
"fc_params": {
"nf": 256,
"n_layers": 4,
"activation": "relu",
"skips": []
},
"n_featdim": 0,
"space": "voxels",
"steps": [4, 16, 8],
"n_samples": 16,
"perturb_sample": true,
"raymarching_tolerance": 0,
"raymarching_chunk_size": -1,
"multi_nets": 4
}
}
\ No newline at end of file
import os import os
import argparse
import torch import torch
import json import json
import dash import dash
import dash_core_components as dcc import dash_core_components as dcc
import dash_html_components as html import dash_html_components as html
import plotly.express as px import plotly.express as px
import pandas as pd
import numpy as np import numpy as np
# from skimage import data # from skimage import data
from pathlib import Path
from dash.dependencies import Input, Output from dash.dependencies import Input, Output
from dash.exceptions import PreventUpdate from dash.exceptions import PreventUpdate
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--device', type=int, default=0,
help='Which CUDA device to use.')
opt = parser.parse_args()
# Select device
torch.cuda.set_device(opt.device)
print("Set CUDA:%d as current device." % torch.cuda.current_device())
torch.autograd.set_grad_enabled(False) torch.autograd.set_grad_enabled(False)
from data.spherical_view_syn import *
from configs.spherical_view_syn import SphericalViewSynConfig
from utils import netio
from utils import device from utils import device
from utils import view from utils import view
from utils import img from utils import img
from utils import misc from utils import misc
from nets.modules import AlphaComposition, Sampler import model as mdl
from modules import AlphaComposition, Sampler
datadir = 'data/__new/lobby_fovea_r360x80_t1.0/' datadir = Path('data/__new/classroom_fovea_r360x80_t0.6')
data_desc_file = 'train1.json' data_desc_file = 'r120x80.json'
net_config = 'fovea@snerffast4-rgb_e6_fc512x4_d2.00-50.00_s64_~p' net_config = 'fovea@snerffast4-rgb_e6_fc512x4_d2.00-50.00_s64_~p'
net_path = datadir + net_config + '/model-epoch_200.pth' model_path = datadir / 'snerf_voxels/checkpoint_50.tar'
fov = 40 fov = 40
res = (256, 256) res = (256, 256)
pix_img_res = (256, 256) pix_img_res = (256, 256)
center = (0, 0) center = (0, 0)
def load_net(path):
print(path)
config = SphericalViewSynConfig()
config.from_id(net_config)
config.sa['perturb_sample'] = False
net = config.create_net().to(device.default())
netio.load(path, net)
return net
def load_net_by_name(name):
for path in os.listdir(datadir):
if path.startswith(name + '@'):
return load_net(datadir + path)
return None
def load_data_desc(data_desc_file) -> view.Trans: def load_data_desc(data_desc_file) -> view.Trans:
with open(datadir + data_desc_file, 'r', encoding='utf-8') as file: with open(datadir + data_desc_file, 'r', encoding='utf-8') as file:
data_desc = json.loads(file.read()) data_desc = json.loads(file.read())
...@@ -85,7 +56,10 @@ cam = view.CameraParam({ ...@@ -85,7 +56,10 @@ cam = view.CameraParam({
'cy': 0.5, 'cy': 0.5,
'normalized': True 'normalized': True
}, res, device=device.default()) }, res, device=device.default())
net = load_net(net_path) model, _ = mdl.load(model_path, {
"perturb_sample": False
})
# Global states # Global states
x = y = None x = y = None
...@@ -159,7 +133,7 @@ app.layout = html.Div([ ...@@ -159,7 +133,7 @@ app.layout = html.Div([
def plot_alpha_and_density(ray_o, ray_d): def plot_alpha_and_density(ray_o, ray_d):
# colors, densities, depths = net.sample_and_infer(ray_o, ray_d, sampler=sampler) # colors, densities, depths = net.sample_and_infer(ray_o, ray_d, sampler=sampler)
ret = net(ray_o, ray_d, ret_depth=True, debug=True) ret = model(ray_o, ray_d, extra_outputs=['depth', 'layers'])
colors = ret['layers'][..., : 3] colors = ret['layers'][..., : 3]
densities = ret['sample_densities'] densities = ret['sample_densities']
depths = ret['sample_depths'] depths = ret['sample_depths']
...@@ -202,7 +176,7 @@ def plot_pixel_image(ray_o, ray_d, r=1): ...@@ -202,7 +176,7 @@ def plot_pixel_image(ray_o, ray_d, r=1):
], dim=-1).to(device.default()) ], dim=-1).to(device.default())
rays_d = pixel_point - rays_o rays_d = pixel_point - rays_o
rays_d /= rays_d.norm(dim=-1, keepdim=True) rays_d /= rays_d.norm(dim=-1, keepdim=True)
image = net(rays_o.view(-1, 3), rays_d.view(-1, 3))['color'] \ image = model(rays_o.view(-1, 3), rays_d.view(-1, 3))['color'] \
.view(1, *pix_img_res, -1).permute(0, 3, 1, 2) .view(1, *pix_img_res, -1).permute(0, 3, 1, 2)
fig = px.imshow(img.torch2np(image)[0]) fig = px.imshow(img.torch2np(image)[0])
return fig return fig
...@@ -230,10 +204,10 @@ def render_view(tx, ty, tz, rx, ry): ...@@ -230,10 +204,10 @@ def render_view(tx, ty, tz, rx, ry):
torch.tensor(view.euler_to_matrix([ry, rx, 0]), device=device.default()).view(-1, 3, 3) torch.tensor(view.euler_to_matrix([ry, rx, 0]), device=device.default()).view(-1, 3, 3)
) )
rays_o, rays_d = cam.get_global_rays(test_view, True) rays_o, rays_d = cam.get_global_rays(test_view, True)
ret = net(rays_o.view(-1, 3), rays_d.view(-1, 3), debug=True) ret = model(rays_o.view(-1, 3), rays_d.view(-1, 3), extra_outputs=['layers', 'weights'])
image = ret['color'].view(1, res[0], res[1], 3).permute(0, 3, 1, 2) image = ret['color'].view(1, *res, 3).permute(0, 3, 1, 2)
layers = ret['layers'].view(res[0], res[1], -1, 4) layers = ret['layers'].view(*res, -1, 4)
layer_weights = ret['weight'].view(res[0], res[1], -1) layer_weights = ret['weight'].view(*res, -1)
fig = px.imshow(img.torch2np(image)[0]) fig = px.imshow(img.torch2np(image)[0])
return fig return fig
...@@ -241,17 +215,13 @@ def render_view(tx, ty, tz, rx, ry): ...@@ -241,17 +215,13 @@ def render_view(tx, ty, tz, rx, ry):
def render_layer(layer): def render_layer(layer):
if layer is None: if layer is None:
return None return None
layer_data = torch.sum(layers[..., range(*layer), :3] * layer_weights[..., range(*layer), None], layer_data = torch.sum((layers * layer_weights)[..., range(*layer), :3], dim=-2)
dim=-2)
#layer_data = layer_data[..., :3] * layer_data[..., 3:]
fig = px.imshow(img.torch2np(layer_data)) fig = px.imshow(img.torch2np(layer_data))
return fig return fig
def view_pixel(fig, x, y, samples): def view_pixel(fig, x, y, samples):
sampler = Sampler(depth_range=(1, 50), n_samples=samples, sampler = model.sampler
perturb_sample=False, spherical=True,
lindisp=True, inverse_r=True)
if x is None or y is None: if x is None or y is None:
return None return None
p = torch.tensor([x, y], device=device.default()) p = torch.tensor([x, y], device=device.default())
......
import os
import json import json
import os
from pathlib import Path
from typing import Union
import utils.device import utils.device
from .pano_dataset import PanoDataset from .pano_dataset import PanoDataset
from .view_dataset import ViewDataset from .view_dataset import ViewDataset
...@@ -8,16 +11,26 @@ from .view_dataset import ViewDataset ...@@ -8,16 +11,26 @@ from .view_dataset import ViewDataset
class DatasetFactory(object): class DatasetFactory(object):
@staticmethod @staticmethod
def load(path, device=None, **kwargs): def get_dataset_desc_path(path: Union[Path, str]):
if isinstance(path, str):
path = Path(path)
if path.suffix != ".json":
if os.path.exists(f"{path}.json"):
path = Path(f"{path}.json")
else:
path = path / "train.json"
return path
@staticmethod
def load(path: Path, device=None, **kwargs):
device = device or utils.device.default() device = device or utils.device.default()
data_dir = os.path.dirname(path) path = DatasetFactory.get_dataset_desc_path(path)
with open(path, 'r', encoding='utf-8') as file: with open(path, 'r', encoding='utf-8') as file:
data_desc = json.loads(file.read()) data_desc: dict = json.loads(file.read())
cwd = os.getcwd() if data_desc.get('type') == 'pano':
os.chdir(data_dir) dataset_class = PanoDataset
if 'type' in data_desc and data_desc['type'] == 'pano':
dataset = PanoDataset(data_desc, device=device, **kwargs)
else: else:
dataset = ViewDataset(data_desc, device=device, **kwargs) dataset_class = ViewDataset
os.chdir(cwd) dataset = dataset_class(data_desc, root=path.absolute().parent, name=path.stem,
device=device, **kwargs)
return dataset return dataset
from doctest import debug_script
from logging import *
import threading import threading
import torch import torch
import math import math
from logging import *
from typing import Dict
class Preloader(object): class Preloader(object):
...@@ -75,17 +75,18 @@ class DataLoader(object): ...@@ -75,17 +75,18 @@ class DataLoader(object):
self.chunk_idx += 1 self.chunk_idx += 1
self.current_chunk = self.chunks[self.chunk_idx] self.current_chunk = self.chunks[self.chunk_idx]
self.offset = 0 self.offset = 0
self.indices = torch.randperm(len(self.current_chunk), device=self.device) \ self.indices = torch.randperm(len(self.current_chunk)).to(device=self.device) \
if self.shuffle else None if self.shuffle else None
if self.preloader is not None: if self.preloader is not None:
self.preloader.preload_chunk(self.chunks[(self.chunk_idx + 1) % len(self.chunks)]) self.preloader.preload_chunk(self.chunks[(self.chunk_idx + 1) % len(self.chunks)])
def __init__(self, dataset, batch_size, *, def __init__(self, dataset, batch_size, *,
chunk_max_items=None, shuffle=False, enable_preload=True): chunk_max_items=None, shuffle=False, enable_preload=True, **chunk_args):
super().__init__() super().__init__()
self.dataset = dataset self.dataset = dataset
self.batch_size = batch_size self.batch_size = batch_size
self.shuffle = shuffle self.shuffle = shuffle
self.chunk_args = chunk_args
self.preloader = Preloader(self.dataset.device) if enable_preload else None self.preloader = Preloader(self.dataset.device) if enable_preload else None
self._init_chunks(chunk_max_items) self._init_chunks(chunk_max_items)
...@@ -97,20 +98,18 @@ class DataLoader(object): ...@@ -97,20 +98,18 @@ class DataLoader(object):
return sum(math.ceil(len(chunk) / self.batch_size) for chunk in self.chunks) return sum(math.ceil(len(chunk) / self.batch_size) for chunk in self.chunks)
def _init_chunks(self, chunk_max_items): def _init_chunks(self, chunk_max_items):
data = self.dataset.get_data() data: Dict[str, torch.Tensor] = self.dataset.get_data()
if self.shuffle: if self.shuffle:
rand_seq = torch.randperm(self.dataset.n_views, device=self.dataset.device) rand_seq = torch.randperm(self.dataset.n_views).to(device=self.dataset.device)
for key in data: data = {key: val[rand_seq] for key, val in data.items()}
data[key] = data[key][rand_seq]
self.chunks = [] self.chunks = []
n_chunks = 1 if chunk_max_items is None else \ n_chunks = 1 if chunk_max_items is None else \
math.ceil(self.dataset.n_pixels / chunk_max_items) math.ceil(self.dataset.n_pixels / chunk_max_items)
views_per_chunk = math.ceil(self.dataset.n_views / n_chunks) views_per_chunk = math.ceil(self.dataset.n_views / n_chunks)
for offset in range(0, self.dataset.n_views, views_per_chunk): for offset in range(0, self.dataset.n_views, views_per_chunk):
sel = slice(offset, offset + views_per_chunk) sel = slice(offset, offset + views_per_chunk)
chunk_data = {} chunk_data = {key: val[sel] for key, val in data.items()}
for key in data: self.chunks.append(self.dataset.Chunk(len(self.chunks), self.dataset,
chunk_data[key] = data[key][sel] chunk_data=chunk_data, **self.chunk_args))
self.chunks.append(self.dataset.Chunk(len(self.chunks), self.dataset, **chunk_data))
if self.preloader is not None: if self.preloader is not None:
self.preloader.preload_chunk(self.chunks[0]) self.preloader.preload_chunk(self.chunks[0])
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment