DepthCrafter / benchmark /dataset_extract_bonn.py
sdsdsdadasd3's picture
[Add] Add scripts for preparing benchmark datasets.
c186cfb
raw
history blame
No virus
5.11 kB
import os
import numpy as np
import os.path as osp
from PIL import Image
from tqdm import tqdm
import imageio
import csv
def depth_read(filename):
# loads depth map D from png file
# and returns it as a numpy array
depth_png = np.asarray(Image.open(filename))
# make sure we have a proper 16bit depth map here.. not 8bit!
assert np.max(depth_png) > 255
depth = depth_png.astype(np.float64) / 5000.0
depth[depth_png == 0] = -1.0
return depth
def extract_bonn(
root,
depth_root,
sample_len=-1,
csv_save_path="",
datatset_name="",
saved_rgb_dir="",
saved_disp_dir="",
start_frame=0,
end_frame=110,
):
scenes_names = os.listdir(depth_root)
all_samples = []
for i, seq_name in enumerate(tqdm(scenes_names)):
# load all images
all_img_names = os.listdir(osp.join(depth_root, seq_name, "rgb"))
all_img_names = [x for x in all_img_names if x.endswith(".png")]
print(f"sequence frame number: {len(all_img_names)}")
# for not zero padding image name
all_img_names.sort()
all_img_names = sorted(all_img_names, key=lambda x: int(x.split(".")[0][-4:]))
all_img_names = all_img_names[start_frame:end_frame]
all_depth_names = os.listdir(osp.join(depth_root, seq_name, "depth"))
all_depth_names = [x for x in all_depth_names if x.endswith(".png")]
print(f"sequence depth number: {len(all_depth_names)}")
# for not zero padding image name
all_depth_names.sort()
all_depth_names = sorted(
all_depth_names, key=lambda x: int(x.split(".")[0][-4:])
)
all_depth_names = all_depth_names[start_frame:end_frame]
seq_len = len(all_img_names)
step = sample_len if sample_len > 0 else seq_len
for ref_idx in range(0, seq_len, step):
print(f"Progress: {seq_name}, {ref_idx // step + 1} / {seq_len//step}")
video_imgs = []
video_depths = []
if (ref_idx + step) <= seq_len:
ref_e = ref_idx + step
else:
continue
# for idx in range(ref_idx, ref_idx + step):
for idx in range(ref_idx, ref_e):
im_path = osp.join(root, seq_name, "rgb", all_img_names[idx])
depth_path = osp.join(
depth_root, seq_name, "depth", all_depth_names[idx]
)
depth = depth_read(depth_path)
disp = depth
video_depths.append(disp)
video_imgs.append(np.array(Image.open(im_path)))
disp_video = np.array(video_depths)[:, None] # [:, 0:1, :, :, 0]
img_video = np.array(video_imgs)[..., 0:3] # [:, 0, :, :, 0:3]
print(disp_video.max(), disp_video.min())
def even_or_odd(num):
if num % 2 == 0:
return num
else:
return num - 1
# print(disp_video.shape)
# print(img_video.shape)
height = disp_video.shape[-2]
width = disp_video.shape[-1]
height = even_or_odd(height)
width = even_or_odd(width)
disp_video = disp_video[:, :, 0:height, 0:width]
img_video = img_video[:, 0:height, 0:width]
data_root = saved_rgb_dir + datatset_name
disp_root = saved_disp_dir + datatset_name
os.makedirs(data_root, exist_ok=True)
os.makedirs(disp_root, exist_ok=True)
img_video_dir = data_root
disp_video_dir = disp_root
img_video_path = os.path.join(img_video_dir, f"{seq_name}_rgb_left.mp4")
disp_video_path = os.path.join(disp_video_dir, f"{seq_name}_disparity.npz")
imageio.mimsave(
img_video_path, img_video, fps=15, quality=9, macro_block_size=1
)
np.savez(disp_video_path, disparity=disp_video)
sample = {}
sample["filepath_left"] = os.path.join(
f"{datatset_name}/{seq_name}_rgb_left.mp4"
) # img_video_path
sample["filepath_disparity"] = os.path.join(
f"{datatset_name}/{seq_name}_disparity.npz"
) # disp_video_path
all_samples.append(sample)
# save csv file
filename_ = csv_save_path
os.makedirs(os.path.dirname(filename_), exist_ok=True)
fields = ["filepath_left", "filepath_disparity"]
with open(filename_, "w") as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fields)
writer.writeheader()
writer.writerows(all_samples)
print(f"{filename_} has been saved.")
if __name__ == "__main__":
extract_bonn(
root="path/to/Bonn-RGBD",
depth_root="path/to/Bonn-RGBD",
saved_rgb_dir="./benchmark/datasets/",
saved_disp_dir="./benchmark/datasets/",
csv_save_path=f"./benchmark/datasets/bonn.csv",
sample_len=-1,
datatset_name="bonn",
start_frame=30,
end_frame=140,
)