Files
liyang ae28d55f81 Update to 2026-09-17 pipeline snapshot; add weights, L20 assets and recording via Git LFS
Source: RGB-D -> Dyn-HaMR -> L20 retargeting -> FoundationPose -> reference repair -> SPIDER,
documented in docs/PIPELINE_LATEST.md and docs/SETUP_AND_WEIGHTS.md. Adds FoundationPose and
nvdiffrast upstream snapshots, requirements/pipeline_venv.txt and the FoundationPose weight
manifest/downloader.

Assets (Git LFS): weights/ (WiLoR detector, HandFlow denoiser, UniDepth-L), FoundationPose
checkpoints, HaMeR checkpoint, Dyn-HaMR HMP model and BMC constraints, L20 URDF/meshes, the
20260915_171525 D405 recording and the two box CADs. MANO models are not redistributed
(third_party/hamer/_DATA/data/mano/README.txt). Environments, caches and run outputs excluded.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 11:43:37 +08:00

48 lines
2.7 KiB
Python

"""Resume the 20260915_171525 RGB-D right-hand reconstruction."""
import os
from pathlib import Path
import subprocess
import json
import time
import argparse
import numpy as np
parser=argparse.ArgumentParser()
parser.add_argument('--left',action='store_true')
args=parser.parse_args()
ROOT=Path(__file__).resolve().parents[1]
SOURCE=ROOT/'docs/20260915_171525'
OUT=ROOT/('output/20260915_171525/handflow_left_mirrored' if args.left else 'output/20260915_171525/handflow')
OUT.mkdir(parents=True,exist_ok=True)
meta=json.loads((SOURCE/'intrinsics.json').read_text())
env=os.environ.copy()
env.update(PYTHONPATH=str(ROOT),LD_LIBRARY_PATH='',OMP_NUM_THREADS='4',MKL_NUM_THREADS='4',
OPENBLAS_NUM_THREADS='4',TORCH_HOME=str(ROOT/'.torch_cache'),HF_HOME=str(ROOT/'.hf_cache'),
HF_HUB_OFFLINE='1',TRANSFORMERS_OFFLINE='1',TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD='1',
PYTHONUNBUFFERED='1',VIPE_PYTHON=str(ROOT/'.venv/bin/python'),
HAMER_CKPT=str(ROOT/'third_party/hamer/_DATA/hamer_ckpts/checkpoints/hamer.ckpt'),
DETECTOR_CKPT=str(ROOT/'weights/detector.pt'),
MANO_ROOT=str(ROOT/'third_party/hamer/_DATA/data/mano'),
HANDFLOW_NORMALIZATION_STATS=str(ROOT/'weights/normalization_stats.npz'))
cmd=[str(ROOT/'.venv/bin/python'),'-u','scripts/demo.py','--input',str(SOURCE/'color.mp4'),
'--fm_ckpt',str(ROOT/'weights/handflow_denoiser.pt'),'--intrinsics',
','.join(str(meta[k]) for k in ['fx','fy','cx','cy']),'--side','right',
'--rotation_smooth_window','5','--output_dir',str(OUT),'--save_npz',str(OUT/'handflow_results.npz')]
if args.left:
cmd[cmd.index('--input')+1]=str(OUT.parent/'left_mirrored.mkv')
intr=np.array([meta[k] for k in ['fx','fy','cx','cy']]);intr[2]=meta['width']-1-intr[2]
c=np.load(OUT.parent/'rgbd_camera.npz');reflection=np.diag([-1.,1.,1.,1.])
np.savez(OUT/'camera_slam.npz',intrinsics=intr,c2w=reflection@c['c2w']@reflection)
status=OUT.parent/'status.json'
for attempt in range(2):
if (OUT/'handflow_results.npz').exists():break
status.write_text(json.dumps(dict(stage='RECONSTRUCTION_RUNNING',attempt=attempt,command=cmd,time=time.time()),indent=2))
with (OUT/'inference.log').open('a') as log:
result=subprocess.run(cmd,cwd=ROOT,env=env,stdout=log,stderr=subprocess.STDOUT)
if result.returncode:
status.write_text(json.dumps(dict(stage='RECONSTRUCTION_FAILED',returncode=result.returncode,time=time.time()),indent=2))
raise SystemExit(result.returncode)
if not (OUT/'handflow_results.npz').exists():raise RuntimeError('No final reconstruction arrays')
status.write_text(json.dumps(dict(stage='RECONSTRUCTION_DONE_PENDING_DEPTH_AND_RETARGET',time=time.time()),indent=2))