ae28d55f81
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>
48 lines
2.7 KiB
Python
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))
|