| |
| |
| |
| |
| |
| |
| |
| |
| import os.path as osp |
| import os |
| os.environ["OPENCV_IO_ENABLE_OPENEXR"] = "1" |
| import cv2 |
| import numpy as np |
| from PIL import Image |
| import json |
|
|
| from dust3r.datasets.base.base_stereo_view_dataset import BaseStereoViewDataset |
|
|
|
|
| class Habitat(BaseStereoViewDataset): |
| def __init__(self, size, *args, ROOT, **kwargs): |
| self.ROOT = ROOT |
| super().__init__(*args, **kwargs) |
| assert self.split is not None |
| |
| with open(osp.join(self.ROOT, f'Habitat_{size}_scenes_{self.split}.txt')) as f: |
| self.scenes = f.read().splitlines() |
| self.instances = list(range(1, 5)) |
|
|
| def filter_scene(self, label, instance=None): |
| if instance: |
| subscene, instance = instance.split('_') |
| label += '/' + subscene |
| self.instances = [int(instance) - 1] |
| valid = np.bool_([scene.startswith(label) for scene in self.scenes]) |
| assert sum(valid), 'no scene was selected for {label=} {instance=}' |
| self.scenes = [scene for i, scene in enumerate(self.scenes) if valid[i]] |
|
|
| def _get_views(self, idx, resolution, rng): |
| scene = self.scenes[idx] |
| data_path, key = osp.split(osp.join(self.ROOT, scene)) |
| views = [] |
| two_random_views = [0, rng.choice(self.instances)] |
| for view_index in two_random_views: |
| |
| for ii in range(view_index, view_index + 5): |
| image, depthmap, intrinsics, camera_pose = self._load_one_view(data_path, key, ii % 5, resolution, rng) |
| if np.isfinite(camera_pose).all(): |
| break |
| views.append(dict( |
| img=image, |
| depthmap=depthmap, |
| camera_pose=camera_pose, |
| camera_intrinsics=intrinsics, |
| dataset='Habitat', |
| label=osp.relpath(data_path, self.ROOT), |
| instance=f"{key}_{view_index}")) |
| return views |
|
|
| def _load_one_view(self, data_path, key, view_index, resolution, rng): |
| view_index += 1 |
| impath = osp.join(data_path, f"{key}_{view_index}.jpeg") |
| image = Image.open(impath) |
|
|
| depthmap_filename = osp.join(data_path, f"{key}_{view_index}_depth.exr") |
| depthmap = cv2.imread(depthmap_filename, cv2.IMREAD_GRAYSCALE | cv2.IMREAD_ANYDEPTH) |
|
|
| camera_params_filename = osp.join(data_path, f"{key}_{view_index}_camera_params.json") |
| with open(camera_params_filename, 'r') as f: |
| camera_params = json.load(f) |
|
|
| intrinsics = np.float32(camera_params['camera_intrinsics']) |
| camera_pose = np.eye(4, dtype=np.float32) |
| camera_pose[:3, :3] = camera_params['R_cam2world'] |
| camera_pose[:3, 3] = camera_params['t_cam2world'] |
|
|
| image, depthmap, intrinsics = self._crop_resize_if_necessary( |
| image, depthmap, intrinsics, resolution, rng, info=impath) |
| return image, depthmap, intrinsics, camera_pose |
|
|
|
|
| if __name__ == "__main__": |
| from dust3r.datasets.base.base_stereo_view_dataset import view_name |
| from dust3r.viz import SceneViz, auto_cam_size |
| from dust3r.utils.image import rgb |
|
|
| dataset = Habitat(1_000_000, split='train', ROOT="data/habitat_processed", |
| resolution=224, aug_crop=16) |
|
|
| for idx in np.random.permutation(len(dataset)): |
| views = dataset[idx] |
| assert len(views) == 2 |
| print(view_name(views[0]), view_name(views[1])) |
| viz = SceneViz() |
| poses = [views[view_idx]['camera_pose'] for view_idx in [0, 1]] |
| cam_size = max(auto_cam_size(poses), 0.001) |
| for view_idx in [0, 1]: |
| pts3d = views[view_idx]['pts3d'] |
| valid_mask = views[view_idx]['valid_mask'] |
| colors = rgb(views[view_idx]['img']) |
| viz.add_pointcloud(pts3d, colors, valid_mask) |
| viz.add_camera(pose_c2w=views[view_idx]['camera_pose'], |
| focal=views[view_idx]['camera_intrinsics'][0, 0], |
| color=(idx * 255, (1 - idx) * 255, 0), |
| image=colors, |
| cam_size=cam_size) |
| viz.show() |
|
|