mapvggt / scripts /zeroshot_tokengs_sample.py
ChenmingWu's picture
Upload folder using huggingface_hub
8cf92b3 verified
Raw
History Blame Contribute Delete
3.83 kB
#!/usr/bin/env python3
"""Zero-shot (NO finetune) TokenGS dl3dv_base PSNR on a few TRAIN clips:
sample 2 clips from av2 train + 2 from waymo train, eval novel-view PSNR/SSIM.
Same 448x768 / n_in=8 / s=s_max protocol as the reported warm-start number."""
import argparse, random, copy
import torch
from safetensors.torch import load_file
from tokengs import options
from mapgs.config import load_config
from mapgs.data import UnifiedClipDataset
from maptokengs import MapTokenGS
import scripts.finetune_maptokengs as F # reuse prep / render_dyn / held_out_psnr
AV2 = "/mnt/william/data/unified/av2"
WAYMO = "/mnt/william/data/unified/waymo"
CKPT = "/mnt/william/tokengs_ckpts/checkpoints/dl3dv_base.safetensors"
def pick(ds, k, seed):
rng = random.Random(seed)
idx = sorted(rng.sample(range(len(ds)), k))
sub = copy.copy(ds)
sub.clips = [ds.clips[i] for i in idx]
return sub, [ds.clips[i].split("/")[-1] for i in idx]
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--height", type=int, default=448)
ap.add_argument("--width", type=int, default=768)
ap.add_argument("--n-in", type=int, default=8)
ap.add_argument("--k", type=int, default=2)
ap.add_argument("--seed", type=int, default=0)
args = ap.parse_args()
dev = "cuda"
H, W = args.height, args.width
opt = options.config_defaults["train_dl3dv_base"]; opt = opt() if callable(opt) else opt
opt.img_size = (H, W)
model = MapTokenGS(opt, s0=0.5, s_max=2.0, max_instances=8, dyn_per_instance=32).to(dev)
miss, unexp = model.load_state_dict(load_file(CKPT), strict=False)
model.eval()
print(f"warm-started dl3dv_base (ZERO-SHOT, no finetune) | fresh {len(miss)} unexpected {len(unexp)} "
f"| res {H}x{W} n_in {args.n_in}", flush=True)
cfg = load_config(overrides=["data.name=unified", f"data.root={AV2},{WAYMO}",
f"data.height={H}", f"data.width={W}",
"model.tokens.n_map=2048", "data.max_instances=8"])
ds_av2 = UnifiedClipDataset(cfg, roots=[AV2], split="train", n_sup_views=4)
ds_way = UnifiedClipDataset(cfg, roots=[WAYMO], split="train", n_sup_views=4)
sub_av2, names_av2 = pick(ds_av2, args.k, args.seed)
sub_way, names_way = pick(ds_way, args.k, args.seed)
print("av2 clips: ", names_av2, flush=True)
print("waymo clips:", names_way, flush=True)
with torch.no_grad():
pa, sa, da, na = F.held_out_psnr(model, sub_av2, args.k, args.n_in, 1.0, dev)
pw, sw, dw, nw = F.held_out_psnr(model, sub_way, args.k, args.n_in, 1.0, dev)
# combined over all clips
ps, ss = [], []
for sub in (sub_av2, sub_way):
for i in range(len(sub.clips)):
d = F.prep(sub[i], args.n_in, 1.0, dev)
g = model.forward_reconstruction_mapped(d["mi"], d["anchors"], d["atype"], d["anormal"])
gg = model.gaussian_group()[0]; ig = model.gaussian_instance()[0]
model.cur_s = model.s_max
rgb, _, _ = F.render_dyn(model, g, gg, ig, d["mi"].decoder.cam_view,
d["mi"].decoder.intrinsics, d["sup_frame"], d["dyn"])
rgb = rgb.clamp(0, 1)
p, s = float(F.psnr(rgb, d["gt"])), float(F.ssim(rgb, d["gt"]))
if p == p and abs(p) != float("inf"):
ps.append(p); ss.append(s)
print(f"\nAV2 (n={na}): PSNR {pa:.2f}+-{da:.2f} SSIM {sa:.3f}")
print(f"Waymo (n={nw}): PSNR {pw:.2f}+-{dw:.2f} SSIM {sw:.3f}")
mp = sum(ps)/len(ps); sd = (sum((x-mp)**2 for x in ps)/len(ps))**0.5
print(f"ALL (n={len(ps)}): PSNR {mp:.2f}+-{sd:.2f} SSIM {sum(ss)/len(ss):.3f}")
print("per-clip PSNR:", [round(x,2) for x in ps])
if __name__ == "__main__":
main()