import argparse import random import gzip import json import os import os.path as osp import torch import PIL.Image from PIL import Image import numpy as np import cv2 import multiprocessing from tqdm import tqdm import matplotlib.pyplot as plt import shutil import path_to_root # noqa import datasets_preprocess.utils.cropping as cropping # noqa def get_parser(): parser = argparse.ArgumentParser() parser.add_argument("--scannet_dir", default="data/data_scannet") parser.add_argument("--output_dir", default="data/dust3r_data/processed_scannet") return parser def process_scene(args): rootdir, outdir, split, scene = args frame_dir = osp.join(rootdir, split, scene) rgb_dir = osp.join(frame_dir, "color") depth_dir = osp.join(frame_dir, "depth") pose_dir = osp.join(frame_dir, "pose") depth_intrinsic = np.loadtxt( osp.join(frame_dir, "intrinsic", "intrinsic_depth.txt") )[:3, :3].astype(np.float32) color_intrinsic = np.loadtxt( osp.join(frame_dir, "intrinsic", "intrinsic_color.txt") )[:3, :3].astype(np.float32) if not np.isfinite(depth_intrinsic).all() or not np.isfinite(color_intrinsic).all(): return os.makedirs(osp.join(outdir, split, scene), exist_ok=True) frame_num = len(os.listdir(rgb_dir)) assert frame_num == len(os.listdir(depth_dir)) == len(os.listdir(pose_dir)) out_rgb_dir = osp.join(outdir, split, scene, "color") out_depth_dir = osp.join(outdir, split, scene, "depth") out_cam_dir = osp.join(outdir, split, scene, "cam") os.makedirs(out_rgb_dir, exist_ok=True) os.makedirs(out_depth_dir, exist_ok=True) os.makedirs(out_cam_dir, exist_ok=True) for i in tqdm(range(frame_num)): rgb_path = osp.join(rgb_dir, f"{i}.jpg") depth_path = osp.join(depth_dir, f"{i}.png") pose_path = osp.join(pose_dir, f"{i}.txt") rgb = Image.open(rgb_path) depth = cv2.imread(depth_path, cv2.IMREAD_UNCHANGED) rgb = rgb.resize(depth.shape[::-1], resample=Image.Resampling.LANCZOS) pose = np.loadtxt(pose_path).reshape(4, 4).astype(np.float32) if not np.isfinite(pose).all(): continue out_rgb_path = osp.join(out_rgb_dir, f"{i:05d}.jpg") out_depth_path = osp.join(out_depth_dir, f"{i:05d}.png") out_cam_path = osp.join(out_cam_dir, f"{i:05d}.npz") np.savez(out_cam_path, intrinsics=depth_intrinsic, pose=pose) rgb.save(out_rgb_path) cv2.imwrite(out_depth_path, depth) def main(rootdir, outdir): os.makedirs(outdir, exist_ok=True) splits = ["scans_test", "scans_train"] pool = multiprocessing.Pool(processes=multiprocessing.cpu_count()) for split in splits: scenes = [ f for f in os.listdir(os.path.join(rootdir, split)) if os.path.isdir(osp.join(rootdir, split, f)) ] pool.map(process_scene, [(rootdir, outdir, split, scene) for scene in scenes]) pool.close() pool.join() if __name__ == "__main__": parser = get_parser() args = parser.parse_args() main(args.scannet_dir, args.output_dir)