fix coord for 7 Scenes to align with llff style dataset
(args, train_set, val_set, pose_avg_stats_file='', rescale_coord=True)
| 277 | return train_set, val_set |
| 278 | |
| 279 | def fix_coord(args, train_set, val_set, pose_avg_stats_file='', rescale_coord=True): |
| 280 | ''' fix coord for 7 Scenes to align with llff style dataset ''' |
| 281 | # This is only to store a pre-calculated pose average stats of the dataset |
| 282 | if args.save_pose_avg_stats: |
| 283 | pdb.set_trace() |
| 284 | if pose_avg_stats_file == '': |
| 285 | print('pose_avg_stats_file location unspecified, please double check...') |
| 286 | sys.exit() |
| 287 | |
| 288 | all_poses = train_set.poses |
| 289 | all_poses = all_poses.reshape(all_poses.shape[0], 3, 4) |
| 290 | all_poses, pose_avg = center_poses(all_poses) |
| 291 | |
| 292 | # save pose_avg to pose_avg_stats.txt |
| 293 | np.savetxt(pose_avg_stats_file, pose_avg) |
| 294 | print('pose_avg_stats.txt successfully saved') |
| 295 | sys.exit() |
| 296 | |
| 297 | # get all poses (train+val) |
| 298 | train_poses = train_set.poses |
| 299 | val_poses = val_set.poses |
| 300 | all_poses = np.concatenate([train_poses, val_poses]) |
| 301 | |
| 302 | # Center the poses for ndc |
| 303 | all_poses = all_poses.reshape(all_poses.shape[0], 3, 4) |
| 304 | |
| 305 | # Here we use either pre-stored pose average stats or calculate pose average stats on the flight to center the poses |
| 306 | if args.load_pose_avg_stats: |
| 307 | pose_avg_from_file = np.loadtxt(pose_avg_stats_file) |
| 308 | all_poses, pose_avg = center_poses(all_poses, pose_avg_from_file) |
| 309 | else: |
| 310 | all_poses, pose_avg = center_poses(all_poses) |
| 311 | |
| 312 | ### args.fix_coord, obsolete flag |
| 313 | # Correct axis to LLFF Style y,z -> -y,-z |
| 314 | last_row = np.tile(np.array([0, 0, 0, 1]), (len(all_poses), 1, 1)) # (N_images, 1, 4) |
| 315 | all_poses = np.concatenate([all_poses, last_row], 1) |
| 316 | |
| 317 | # correct rotation matrix from "up left forward" to "up right backward" |
| 318 | flip_M = np.array([[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]) # Mirror matrix that flip y & z direction |
| 319 | flip_M = np.repeat(flip_M[None,:], all_poses.shape[0], axis=0) |
| 320 | |
| 321 | # all_poses = flip_M@all_poses@flip_M.transpose((0,2,1)) # This is correct M*[R|T]*M.T |
| 322 | all_poses = flip_M@(all_poses@flip_M) # bug here M*([R|T]*M) |
| 323 | all_poses = all_poses[:,:3,:4] |
| 324 | |
| 325 | bounds = np.array([train_set.near, train_set.far]) # manual tuned |
| 326 | |
| 327 | if rescale_coord: |
| 328 | sc=train_set.pose_scale # manual tuned factor, align with colmap scale |
| 329 | all_poses[:,:3,3] *= sc |
| 330 | |
| 331 | ### quite ugly ### |
| 332 | # move center of camera pose |
| 333 | if train_set.move_all_cam_vec != [0.,0.,0.]: |
| 334 | all_poses[:, :3, 3] += train_set.move_all_cam_vec |
| 335 | |
| 336 | if train_set.pose_scale2 != 1.0: |
no test coverage detected