Spaces:
Running
on
Zero
Running
on
Zero
File size: 5,107 Bytes
916d528 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
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,
)
|