SplatAtlas / scripts /phase2_counterfactual /fix_resolutions.py
KCBtheone's picture
Upload SplatAtlas benchmark pipeline code
23e73f9 verified
Raw
History Blame Contribute Delete
2.16 kB
import os
from PIL import Image
from concurrent.futures import ThreadPoolExecutor
from tqdm import tqdm
DATASETS = [
"/root/autodl-tmp/dataset/360",
"/root/autodl-tmp/dataset/tnt"
]
def process_image(src_path, dst_path, scale):
if os.path.exists(dst_path):
return
try:
with Image.open(src_path) as img:
new_size = (int(img.width / scale), int(img.height / scale))
resized_img = img.resize(new_size, Image.Resampling.LANCZOS)
resized_img.save(dst_path)
except Exception as e:
print(f"Error processing {src_path}: {e}")
def downsample_scene(scene_dir):
img_dir = os.path.join(scene_dir, "images")
if not os.path.exists(img_dir):
return
images = [f for f in os.listdir(img_dir) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
# ้œ€่ฆ็”Ÿๆˆ็š„้™้‡‡ๆ ทๅฑ‚็บง
scales = [2, 4]
tasks = []
for scale in scales:
target_dir = os.path.join(scene_dir, f"images_{scale}")
os.makedirs(target_dir, exist_ok=True)
for img_name in images:
src_path = os.path.join(img_dir, img_name)
dst_path = os.path.join(target_dir, img_name)
tasks.append((src_path, dst_path, scale))
return tasks
if __name__ == "__main__":
all_tasks = []
print("[Preprocessing] Scanning datasets for missing resolution folders...")
for ds_root in DATASETS:
if not os.path.exists(ds_root): continue
for scene in os.listdir(ds_root):
scene_dir = os.path.join(ds_root, scene)
if os.path.isdir(scene_dir):
tasks = downsample_scene(scene_dir)
if tasks: all_tasks.extend(tasks)
if not all_tasks:
print("[Preprocessing] All resolution folders exist. Nothing to do.")
else:
print(f"[Preprocessing] Generating {len(all_tasks)} downsampled images. This will use all CPU cores...")
with ThreadPoolExecutor() as executor:
list(tqdm(executor.map(lambda p: process_image(*p), all_tasks), total=len(all_tasks)))
print("[Preprocessing] Done!")