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>
This commit is contained in:
liyang
2026-09-17 11:27:46 +08:00
parent 7e4ef6f98b
commit ae28d55f81
761 changed files with 55598 additions and 59 deletions
+13 -7
View File
@@ -39,9 +39,12 @@ def main():
reason = 'symlink: restore dependency explicitly'
elif any(p in EXCLUDE_PARTS for p in relative.parts):
reason = 'runtime/data/cache directory'
elif relative.parts[0] == 'third_party' and ('build' in relative.parts or '.cache' in relative.parts or src.suffix == '.part' or any(x.endswith('.egg-info') for x in relative.parts)):
reason = 'build artifact or partial download'
elif relative.name == '.gitmodules' or (relative.parts[0] == 'third_party' and relative.name in {'.gitignore','.gitattributes'}):
reason = 'vendored snapshot: omit nested Git filters and metadata'
elif src.suffix not in EXTENSIONS and src.name not in SPECIAL and not src.name.startswith(('LICENSE','COPYING','NOTICE')):
elif src.suffix not in EXTENSIONS and src.name not in SPECIAL and not src.name.startswith(('LICENSE','COPYING','NOTICE')) \
and not (relative.parts[0] == 'docs' and src.suffix.lower() == '.stl' and src.stat().st_size < 1024*1024):
reason = 'non-source file; restore separately when needed'
elif src.stat().st_size > 5*1024*1024:
reason = 'file exceeds 5 MiB source limit'
@@ -49,7 +52,7 @@ def main():
excluded.append({'path':relative.as_posix(),'reason':reason})
return
raw = src.read_bytes()
if b'\0' in raw:
if b'\0' in raw and src.suffix.lower() != '.stl':
excluded.append({'path':relative.as_posix(),'reason':'binary contents'})
return
target = dest/relative
@@ -57,7 +60,7 @@ def main():
shutil.copy2(src,target)
if src.suffix in {'.py','.sh','.yaml','.yml','.json','.toml'}:
for i,line in enumerate(raw.decode('utf-8',errors='replace').splitlines(),1):
if re.search(r'/home/|/tmp/|2047635068|15886123',line):
if re.search(r'/home/|/tmp/|2047635068|15886123|20260915_171525|20260916_104026',line):
portability.append({'path':relative.as_posix(),'line':i,
'kind':'machine path or fixed example identifier'})
@@ -97,7 +100,7 @@ def main():
copy_file(src,src.relative_to(ROOT))
for name in ['README.md','LICENSE','.gitignore','requirements.txt','setup_env.sh','setup_vipe_env.sh']:
copy_file(ROOT/name,Path(name))
for name in ['hamer','vipe','Dyn-HaMR','spider']:
for name in ['hamer','vipe','Dyn-HaMR','spider','FoundationPose','nvdiffrast']:
snapshot(ROOT/'third_party'/name,Path('third_party')/name)
repos.insert(0,{'path':'.','commit':git(ROOT,'rev-parse','HEAD'),
'origin':git(ROOT,'remote','get-url','origin'),
@@ -107,10 +110,13 @@ def main():
'# Source snapshot: runtime exclusions anchored to repository root.\n'
'/output/\n/results/\n/logs/\n/weights/\n/dist/\n/.venv/\n/venv/\n'
'/.dex/\n/.spider/\n/.cuda/\n/.hf_cache/\n/.torch_cache/\n/.spider_cache/\n'
'/.uv_cache_spider/\n/.env\n__pycache__/\n*.pyc\n')
'/.uv_cache_spider/\n/.env\n__pycache__/\n*.pyc\n'
'/third_party/FoundationPose/weights/\n/third_party/*/build/\n/.cache/\n*.part\n'
'/docs/20260915_171525/\n/docs/20260916_104026/\n')
assets=[]
for name in ['l20_assets','bottle_model_parametric','dex-assets']:
folder=ROOT/'third_party'/name
for rel in ['third_party/l20_assets','third_party/bottle_model_parametric','third_party/dex-assets',
'third_party/FoundationPose/weights','docs/20260915_171525']:
folder=ROOT/rel
files=[{'path':p.relative_to(ROOT).as_posix(),'bytes':p.stat().st_size,
'sha256':hashlib.sha256(p.read_bytes()).hexdigest()}
for p in sorted(folder.rglob('*')) if p.is_file() and not p.is_symlink()]