Spaces:
Running
Running
import argparse | |
import imagesize | |
import numpy as np | |
import os | |
base_path = "data/megadepth" | |
# Remove the trailing / if need be. | |
if base_path[-1] in ['/', '\\']: | |
base_path = base_path[: - 1] | |
base_depth_path = os.path.join( | |
base_path, 'phoenix/S6/zl548/MegaDepth_v1' | |
) | |
base_undistorted_sfm_path = os.path.join( | |
base_path, 'Undistorted_SfM' | |
) | |
scene_ids = os.listdir(base_undistorted_sfm_path) | |
for scene_id in scene_ids: | |
if os.path.exists(f"{base_path}/prep_scene_info/detections/detections_{scene_id}.npy"): | |
print(f"skipping {scene_id} as it exists") | |
continue | |
undistorted_sparse_path = os.path.join( | |
base_undistorted_sfm_path, scene_id, 'sparse-txt' | |
) | |
if not os.path.exists(undistorted_sparse_path): | |
print("sparse path doesnt exist") | |
continue | |
depths_path = os.path.join( | |
base_depth_path, scene_id, 'dense0', 'depths' | |
) | |
if not os.path.exists(depths_path): | |
print("depths doesnt exist") | |
continue | |
images_path = os.path.join( | |
base_undistorted_sfm_path, scene_id, 'images' | |
) | |
if not os.path.exists(images_path): | |
print("images path doesnt exist") | |
continue | |
# Process cameras.txt | |
if not os.path.exists(os.path.join(undistorted_sparse_path, 'cameras.txt')): | |
print("no cameras") | |
continue | |
with open(os.path.join(undistorted_sparse_path, 'cameras.txt'), 'r') as f: | |
raw = f.readlines()[3 :] # skip the header | |
camera_intrinsics = {} | |
for camera in raw: | |
camera = camera.split(' ') | |
camera_intrinsics[int(camera[0])] = [float(elem) for elem in camera[2 :]] | |
# Process points3D.txt | |
with open(os.path.join(undistorted_sparse_path, 'points3D.txt'), 'r') as f: | |
raw = f.readlines()[3 :] # skip the header | |
points3D = {} | |
for point3D in raw: | |
point3D = point3D.split(' ') | |
points3D[int(point3D[0])] = np.array([ | |
float(point3D[1]), float(point3D[2]), float(point3D[3]) | |
]) | |
# Process images.txt | |
with open(os.path.join(undistorted_sparse_path, 'images.txt'), 'r') as f: | |
raw = f.readlines()[4 :] # skip the header | |
image_id_to_idx = {} | |
image_names = [] | |
raw_pose = [] | |
camera = [] | |
points3D_id_to_2D = [] | |
n_points3D = [] | |
id_to_detections = {} | |
for idx, (image, points) in enumerate(zip(raw[:: 2], raw[1 :: 2])): | |
image = image.split(' ') | |
points = points.split(' ') | |
image_id_to_idx[int(image[0])] = idx | |
image_name = image[-1].strip('\n') | |
image_names.append(image_name) | |
raw_pose.append([float(elem) for elem in image[1 : -2]]) | |
camera.append(int(image[-2])) | |
points_np = np.array(points).astype(np.float32).reshape(len(points)//3, 3) | |
visible_points = points_np[points_np[:,2] != -1] | |
id_to_detections[idx] = visible_points | |
np.save(f"{base_path}/prep_scene_info/detections/detections_{scene_id}.npy", | |
id_to_detections) | |
print(f"{scene_id} done") |