|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import os |
|
import random |
|
import json |
|
from utils.system_utils import searchForMaxIteration |
|
from scene.dataset_readers import sceneLoadTypeCallbacks |
|
from scene.gaussian_model import GaussianModel |
|
from arguments import ModelParams |
|
from utils.camera_utils import cameraList_from_camInfos, camera_to_JSON |
|
import open3d as o3d |
|
|
|
class Scene: |
|
|
|
gaussians : GaussianModel |
|
|
|
def __init__(self, args : ModelParams, gaussians : GaussianModel, load_iteration=None, opt=None, shuffle=True, resolution_scales=[1.0]): |
|
"""b |
|
:param path: Path to colmap scene main folder. |
|
""" |
|
self.model_path = args.model_path |
|
self.loaded_iter = None |
|
self.gaussians = gaussians |
|
|
|
if load_iteration: |
|
if load_iteration == -1: |
|
self.loaded_iter = searchForMaxIteration(os.path.join(self.model_path, "point_cloud")) |
|
else: |
|
self.loaded_iter = load_iteration |
|
print("Loading trained model at iteration {}".format(self.loaded_iter)) |
|
|
|
self.train_cameras = {} |
|
self.test_cameras = {} |
|
|
|
if os.path.exists(os.path.join(args.source_path, "sparse")): |
|
scene_info = sceneLoadTypeCallbacks["Colmap"](args.source_path, args.images, args.eval, args, opt) |
|
|
|
elif os.path.exists(os.path.join(args.source_path, "transforms_train.json")): |
|
print("Found transforms_train.json file, assuming Blender data set!") |
|
scene_info = sceneLoadTypeCallbacks["Blender"](args.source_path, args.white_background, args.eval) |
|
else: |
|
assert False, "Could not recognize scene type!" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if shuffle: |
|
random.shuffle(scene_info.train_cameras) |
|
random.shuffle(scene_info.test_cameras) |
|
|
|
self.cameras_extent = scene_info.nerf_normalization["radius"] |
|
|
|
for resolution_scale in resolution_scales: |
|
print("Loading Training Cameras") |
|
self.train_cameras[resolution_scale] = cameraList_from_camInfos(scene_info.train_cameras, resolution_scale, args) |
|
print('train_camera_num: ', len(self.train_cameras[resolution_scale])) |
|
print("Loading Test Cameras") |
|
self.test_cameras[resolution_scale] = cameraList_from_camInfos(scene_info.test_cameras, resolution_scale, args) |
|
print('test_camera_num: ', len(self.test_cameras[resolution_scale])) |
|
|
|
if self.loaded_iter: |
|
self.gaussians.load_ply(os.path.join(self.model_path, |
|
"point_cloud", |
|
"iteration_" + str(self.loaded_iter), |
|
"point_cloud.ply")) |
|
else: |
|
if scene_info.point_cloud is None: |
|
self.gaussians.create_from_cameras(self.train_cameras, self.cameras_extent) |
|
else: |
|
self.gaussians.create_from_pcd(scene_info.point_cloud, self.cameras_extent) |
|
self.gaussians.init_RT_seq(self.train_cameras) |
|
self.gaussians.init_fov(self.train_cameras) |
|
self.gaussians.init_test_RT_seq(self.test_cameras) |
|
|
|
|
|
def save(self, iteration): |
|
point_cloud_path = os.path.join(self.model_path, "point_cloud/iteration_{}".format(iteration)) |
|
self.gaussians.save_ply(os.path.join(point_cloud_path, "point_cloud.ply")) |
|
|
|
def getTrainCameras(self, scale=1.0): |
|
return self.train_cameras[scale] |
|
|
|
def getTestCameras(self, scale=1.0): |
|
return self.test_cameras[scale] |