diff --git a/ddp_run_nerf.py b/ddp_run_nerf.py index c1fdbe3..c9f14f5 100644 --- a/ddp_run_nerf.py +++ b/ddp_run_nerf.py @@ -224,7 +224,6 @@ def render_single_image(rank, world_size, models, ray_sampler, chunk_size): for key in ret_merge_chunk[m]: torch.distributed.gather(ret_merge_chunk[m][key]) - # only rank 0 program returns if rank == 0: return ret_merge_rank @@ -488,36 +487,30 @@ def config_parser(): parser.add_argument('--config', is_config_file=True, help='config file path') parser.add_argument("--expname", type=str, help='experiment name') parser.add_argument("--basedir", type=str, default='./logs/', help='where to store ckpts and logs') - # dataset options parser.add_argument("--datadir", type=str, default=None, help='input data directory') parser.add_argument("--scene", type=str, default=None, help='scene name') parser.add_argument("--testskip", type=int, default=8, help='will load 1/N images from test/val sets, useful for large datasets like deepvoxels') - # model size parser.add_argument("--netdepth", type=int, default=8, help='layers in coarse network') parser.add_argument("--netwidth", type=int, default=256, help='channels per layer in coarse network') parser.add_argument("--use_viewdirs", action='store_true', help='use full 5D input instead of 3D') - # checkpoints parser.add_argument("--no_reload", action='store_true', help='do not reload weights from saved ckpt') parser.add_argument("--ckpt_path", type=str, default=None, help='specific weights npy file to reload for coarse network') - # batch size parser.add_argument("--N_rand", type=int, default=32 * 32 * 2, help='batch size (number of random rays per gradient step)') parser.add_argument("--chunk_size", type=int, default=1024 * 8, help='number of rays processed in parallel, decrease if running out of memory') - # iterations parser.add_argument("--N_iters", type=int, default=250001, help='number of iterations') - + # render only parser.add_argument("--render_splits", type=str, default='test', help='splits to render') - # cascade training parser.add_argument("--cascade_level", type=int, default=2, help='number of cascade levels') @@ -527,26 +520,15 @@ def config_parser(): help='cuda device for each level') parser.add_argument("--bg_devices", type=str, default='0,2', help='cuda device for the background of each level') - + # multiprocess learning parser.add_argument("--world_size", type=int, default='-1', help='number of processes') - - # mixed precison training - parser.add_argument("--opt_level", type=str, default='O1', - help='mixed precison training') - - parser.add_argument("--near_depth", type=float, default=0.1, - help='near depth plane') - parser.add_argument("--far_depth", type=float, default=50., - help='far depth plane') - # learning rate options parser.add_argument("--lrate", type=float, default=5e-4, help='learning rate') parser.add_argument("--lrate_decay_factor", type=float, default=0.1, help='decay learning rate by a factor every specified number of steps') parser.add_argument("--lrate_decay_steps", type=int, default=5000, help='decay learning rate by a factor every specified number of steps') - # rendering options parser.add_argument("--inv_uniform", action='store_true', help='if True, will uniformly sample inverse depths') @@ -555,36 +537,11 @@ def config_parser(): help='log2 of max freq for positional encoding (3D location)') parser.add_argument("--max_freq_log2_viewdirs", type=int, default=4, help='log2 of max freq for positional encoding (2D direction)') - parser.add_argument("--N_iters_perturb", type=int, default=1000, - help='perturb and center-crop at first 1000 iterations to prevent training from getting stuck') - parser.add_argument("--raw_noise_std", type=float, default=1., - help='std dev of noise added to regularize sigma output, 1e0 recommended') - parser.add_argument("--white_bkgd", action='store_true', - help='apply the trick to avoid fitting to white background') - - # use implicit parser.add_argument("--load_min_depth", action='store_true', help='whether to load min depth') - - # no training; render only - parser.add_argument("--render_only", action='store_true', - help='do not optimize, reload weights and render out render_poses path') - parser.add_argument("--render_train", action='store_true', help='render the training set') - parser.add_argument("--render_test", action='store_true', help='render the test set instead of render_poses path') - - # no training; extract mesh only - parser.add_argument("--mesh_only", action='store_true', - help='do not optimize, extract mesh from pretrained model') - parser.add_argument("--N_pts", type=int, default=256, - help='voxel resolution; N_pts * N_pts * N_pts') - parser.add_argument("--mesh_thres", type=str, default='10,20,30,40,50', - help='threshold(s) for mesh extraction; can use multiple thresholds') - # logging/saving options parser.add_argument("--i_print", type=int, default=100, help='frequency of console printout and metric loggin') parser.add_argument("--i_img", type=int, default=500, help='frequency of tensorboard image logging') parser.add_argument("--i_weights", type=int, default=10000, help='frequency of weight ckpt saving') - parser.add_argument("--i_testset", type=int, default=50000, help='frequency of testset saving') - parser.add_argument("--i_video", type=int, default=50000, help='frequency of render_poses video saving') return parser diff --git a/nerf_sample_ray_split.py b/nerf_sample_ray_split.py index e76e12a..c3baac6 100644 --- a/nerf_sample_ray_split.py +++ b/nerf_sample_ray_split.py @@ -180,70 +180,3 @@ class RaySamplerSingleImage(object): ret[k] = torch.from_numpy(ret[k]) return ret - - # def random_sample_patches(self, N_patch, r_patch=16, center_crop=False): - # ''' - # :param N_patch: number of patches to be sampled - # :param r_patch: patch size will be (2*r_patch+1)*(2*r_patch+1) - # :return: - # ''' - # # even size patch - # # offsets to center pixels - # u, v = np.meshgrid(np.arange(-r_patch, r_patch), - # np.arange(-r_patch, r_patch)) - # u = u.reshape(-1) - # v = v.reshape(-1) - # offsets = v * self.W + u - - # # center pixel coordinates - # u_min = r_patch - # u_max = self.W - r_patch - # v_min = r_patch - # v_max = self.H - r_patch - # if center_crop: - # u_min = self.W // 4 + r_patch - # u_max = self.W - self.W // 4 - r_patch - # v_min = self.H // 4 + r_patch - # v_max = self.H - self.H // 4 - r_patch - - # u, v = np.meshgrid(np.arange(u_min, u_max, r_patch), - # np.arange(v_min, v_max, r_patch)) - # u = u.reshape(-1) - # v = v.reshape(-1) - - # select_inds = np.random.choice(u.shape[0], size=(N_patch,), replace=False) - # # Convert back to original image - # select_inds = v[select_inds] * self.W + u[select_inds] - - # # pick patches - # select_inds = np.stack([select_inds + shift for shift in offsets], axis=1) - # select_inds = select_inds.reshape(-1) - - # rays_o = self.rays_o[select_inds, :] # [N_rand, 3] - # rays_d = self.rays_d[select_inds, :] # [N_rand, 3] - # depth = self.depth[select_inds] # [N_rand, ] - - # if self.img is not None: - # rgb = self.img[select_inds, :] # [N_rand, 3] - - # # ### debug - # # import imageio - # # imgs = rgb.reshape((N_patch, r_patch*2, r_patch*2, -1)) - # # for kk in range(imgs.shape[0]): - # # imageio.imwrite('./debug_{}.png'.format(kk), imgs[kk]) - # # ### - # else: - # rgb = None - - # ret = OrderedDict([ - # ('ray_o', rays_o), - # ('ray_d', rays_d), - # ('depth', depth), - # ('rgb', rgb) - # ]) - - # # return torch tensors - # for k in ret: - # ret[k] = torch.from_numpy(ret[k]) - - # return ret