import os import numpy as np import torch import trimesh def mkdir_ifnotexists(directory): if not os.path.exists(directory): os.mkdir(directory) def as_mesh(scene_or_mesh): """ Convert a possible scene to a mesh. If conversion occurs, the returned mesh has only vertex and face data. """ if isinstance(scene_or_mesh, trimesh.Scene): if len(scene_or_mesh.geometry) == 0: mesh = None # empty scene else: # we lose texture information here mesh = trimesh.util.concatenate( tuple(trimesh.Trimesh(vertices=g.vertices, faces=g.faces) for g in scene_or_mesh.geometry.values())) else: assert(isinstance(scene_or_mesh, trimesh.Trimesh)) mesh = scene_or_mesh return mesh def concat_home_dir(path): return os.path.join(os.environ['HOME'],'data',path) def get_class(kls): parts = kls.split('.') module = ".".join(parts[:-1]) m = __import__(module) for comp in parts[1:]: m = getattr(m, comp) return m def to_cuda(torch_obj): if torch.cuda.is_available(): return torch_obj.cuda() else: return torch_obj def load_point_cloud_by_file_extension(file_name): ext = file_name.split('.')[-1] if ext == "npz" or ext == "npy": point_set = torch.tensor(np.load(file_name)).float() elif ext == "xyz": point_set = torch.tensor(np.loadtxt(file_name)).float() else: point_set = torch.tensor(trimesh.load(file_name, ext).vertices).float() return point_set def load_feature_mask(file_name): # feature_mask = torch.tensor(np.loadtxt(file_name)).float() feature_mask = torch.tensor(np.loadtxt(file_name), dtype = torch.int64) #temporarily change for max of sdfs: exp 6 7 8 # tmp = np.loadtxt(file_name) # tmp[tmp == 3] = 2 # feature_mask = torch.tensor(tmp).float() return feature_mask class LearningRateSchedule: def get_learning_rate(self, epoch): pass class StepLearningRateSchedule(LearningRateSchedule): def __init__(self, initial, interval, factor): self.initial = initial self.interval = interval self.factor = factor def get_learning_rate(self, epoch): return np.maximum(self.initial * (self.factor ** (epoch // self.interval)), 5.0e-6)