S23DR_solution_2026 / training /local_dataset.py
donquicode's picture
Upload folder using huggingface_hub
f2e158e verified
Raw
History Blame Contribute Delete
3.27 kB
"""Read the locally downloaded hoho22k_2026 webdataset tar files directly.
Bypasses the datasets library entirely -- no version conflicts, no network.
Each tar file contains per-scene entries:
{order_id}.{field}_{image_id}.npy -- per-image numpy arrays (K, R, t, pose_only_in_colmap)
{order_id}.{ade|depth|gestalt}_{image_id}.png -- per-image PIL images
{order_id}.colmap.zip -- COLMAP reconstruction bytes
{order_id}.wf_vertices.npy -- (N, 3) float32
{order_id}.wf_edges.npy -- (M, 2) int64
{order_id}.wf_classifications.npy -- (M,) int64
Returns sample dicts compatible with predict_wireframe / convert_entry_to_human_readable.
"""
import glob
import io
import tarfile
import numpy as np
from PIL import Image
VECTOR_FIELDS = {'K', 'R', 't', 'pose_only_in_colmap'}
IMAGE_FIELDS = {'ade', 'depth', 'gestalt'}
GLOBAL_FIELDS = {'colmap', 'wf_vertices', 'wf_edges', 'wf_classifications'}
def _assemble_scene(order_id, raw):
"""raw: {field_key_with_ext: bytes}"""
# Collect image_ids from any per-image field
image_ids = set()
for key in raw:
for prefix in [f'{f}_' for f in VECTOR_FIELDS | IMAGE_FIELDS]:
if key.startswith(prefix):
img_id = key[len(prefix):]
img_id = img_id.rsplit('.', 1)[0] # strip extension
image_ids.add(img_id)
image_ids = sorted(image_ids)
sample = {'order_id': order_id, 'image_ids': image_ids}
for f in VECTOR_FIELDS | IMAGE_FIELDS:
sample[f] = []
for img_id in image_ids:
for field in VECTOR_FIELDS:
key = f'{field}_{img_id}.npy'
if key in raw:
sample[field].append(np.load(io.BytesIO(raw[key])))
for field in IMAGE_FIELDS:
key = f'{field}_{img_id}.png'
if key in raw:
sample[field].append(Image.open(io.BytesIO(raw[key])).copy())
# Global fields
if 'colmap.zip' in raw:
sample['colmap'] = raw['colmap.zip']
for field in ('wf_vertices', 'wf_edges', 'wf_classifications'):
key = f'{field}.npy'
if key in raw:
sample[field] = np.load(io.BytesIO(raw[key])).tolist()
return sample
def iter_tar(tar_path):
"""Yield assembled scene dicts from a single tar file."""
scenes = {}
with tarfile.open(tar_path, 'r') as tf:
for member in tf.getmembers():
if not member.isfile():
continue
name = member.name
dot = name.index('.')
order_id = name[:dot]
field_key = name[dot + 1:]
f = tf.extractfile(member)
if f is None:
continue
if order_id not in scenes:
scenes[order_id] = {}
scenes[order_id][field_key] = f.read()
for order_id, raw in scenes.items():
yield _assemble_scene(order_id, raw)
def iter_split(dataset_dir, split='validation'):
"""Yield all scenes from a dataset split, sorted by tar file name."""
tars = sorted(glob.glob(f'{dataset_dir}/data/{split}/*.tar'))
if not tars:
raise FileNotFoundError(f'No tar files found in {dataset_dir}/data/{split}/')
for tar_path in tars:
yield from iter_tar(tar_path)