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
+1
View File
@@ -0,0 +1 @@
../dyn-hamr/optim/BMC
+1
View File
@@ -0,0 +1 @@
../../../hamer/_DATA/data/mano
+1
View File
@@ -0,0 +1 @@
../../../hamer/_DATA/data/mano_mean_params.npz
+1
View File
@@ -0,0 +1 @@
../../../hamer/_DATA/hamer_ckpts/checkpoints
@@ -0,0 +1,42 @@
COCOW-TRAIN:
TYPE: ImageDataset
URLS: hamer_training_data/dataset_tars/cocow-train/{000000..000036}.tar
epoch_size: 78666
DEX-TRAIN:
TYPE: ImageDataset
URLS: hamer_training_data/dataset_tars/dex-train/{000000..000406}.tar
epoch_size: 406888
FREIHAND-MOCAP:
DATASET_FILE: hamer_training_data/freihand_mocap.npz
FREIHAND-TRAIN:
TYPE: ImageDataset
URLS: hamer_training_data/dataset_tars/freihand-train/{000000..000130}.tar
epoch_size: 130240
H2O3D-TRAIN:
TYPE: ImageDataset
URLS: hamer_training_data/dataset_tars/h2o3d-train/{000000..000060}.tar
epoch_size: 121996
HALPE-TRAIN:
TYPE: ImageDataset
URLS: hamer_training_data/dataset_tars/halpe-train/{000000..000022}.tar
epoch_size: 34289
HO3D-TRAIN:
TYPE: ImageDataset
URLS: hamer_training_data/dataset_tars/ho3d-train/{000000..000083}.tar
epoch_size: 83325
INTERHAND26M-TRAIN:
TYPE: ImageDataset
URLS: hamer_training_data/dataset_tars/interhand26m-train/{000000..001056}.tar
epoch_size: 1424632
MPIINZSL-TRAIN:
TYPE: ImageDataset
URLS: hamer_training_data/dataset_tars/mpiinzsl-train/{000000..000015}.tar
epoch_size: 15184
MTC-TRAIN:
TYPE: ImageDataset
URLS: hamer_training_data/dataset_tars/mtc-train/{000000..000306}.tar
epoch_size: 363947
RHD-TRAIN:
TYPE: ImageDataset
URLS: hamer_training_data/dataset_tars/rhd-train/{000000..000041}.tar
epoch_size: 61705
+111
View File
@@ -0,0 +1,111 @@
task_name: train
tags:
- dev
train: true
test: false
ckpt_path: null
seed: null
DATASETS:
TRAIN:
FREIHAND-TRAIN:
WEIGHT: 0.25
INTERHAND26M-TRAIN:
WEIGHT: 0.25
MTC-TRAIN:
WEIGHT: 0.1
RHD-TRAIN:
WEIGHT: 0.05
COCOW-TRAIN:
WEIGHT: 0.1
HALPE-TRAIN:
WEIGHT: 0.05
MPIINZSL-TRAIN:
WEIGHT: 0.05
HO3D-TRAIN:
WEIGHT: 0.05
H2O3D-TRAIN:
WEIGHT: 0.05
DEX-TRAIN:
WEIGHT: 0.05
VAL:
FREIHAND-TRAIN:
WEIGHT: 1.0
MOCAP: FREIHAND-MOCAP
BETAS_REG: true
CONFIG:
SCALE_FACTOR: 0.3
ROT_FACTOR: 30
TRANS_FACTOR: 0.02
COLOR_SCALE: 0.2
ROT_AUG_RATE: 0.6
TRANS_AUG_RATE: 0.5
DO_FLIP: false
FLIP_AUG_RATE: 0.0
EXTREME_CROP_AUG_RATE: 0.0
EXTREME_CROP_AUG_LEVEL: 1
extras:
ignore_warnings: false
enforce_tags: true
print_config: true
exp_name: hamer
MANO:
DATA_DIR: _DATA/data/
MODEL_PATH: data/mano
GENDER: neutral
NUM_HAND_JOINTS: 15
MEAN_PARAMS: data/mano_mean_params.npz
CREATE_BODY_POSE: false
EXTRA:
FOCAL_LENGTH: 5000
NUM_LOG_IMAGES: 4
NUM_LOG_SAMPLES_PER_IMAGE: 8
PELVIS_IND: 0
GENERAL:
TOTAL_STEPS: 1000000
LOG_STEPS: 1000
VAL_STEPS: 1000
CHECKPOINT_STEPS: 10000
CHECKPOINT_SAVE_TOP_K: 1
NUM_WORKERS: 8
PREFETCH_FACTOR: 2
TRAIN:
LR: 1.0e-05
WEIGHT_DECAY: 0.0001
BATCH_SIZE: 32
LOSS_REDUCTION: mean
NUM_TRAIN_SAMPLES: 2
NUM_TEST_SAMPLES: 64
POSE_2D_NOISE_RATIO: 0.01
SMPL_PARAM_NOISE_RATIO: 0.005
MODEL:
IMAGE_SIZE: 256
IMAGE_MEAN:
- 0.485
- 0.456
- 0.406
IMAGE_STD:
- 0.229
- 0.224
- 0.225
BACKBONE:
TYPE: vit
PRETRAINED_WEIGHTS: hamer_training_data/vitpose_backbone.pth
MANO_HEAD:
TYPE: transformer_decoder
IN_CHANNELS: 2048
TRANSFORMER_DECODER:
depth: 6
heads: 8
mlp_dim: 1024
dim_head: 64
dropout: 0.0
emb_dropout: 0.0
norm: layer
context_dim: 1280
LOSS_WEIGHTS:
KEYPOINTS_3D: 0.05
KEYPOINTS_2D: 0.01
GLOBAL_ORIENT: 0.001
HAND_POSE: 0.001
BETAS: 0.0005
ADVERSARIAL: 0.0005
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+6 -1
View File
@@ -1037,6 +1037,11 @@ def batch_rodrigues(param):
def smooth_global_rot_matrix(pred_rots, OE_filter):
rot_mat = batch_rodrigues(pred_rots[None]).squeeze(0)
smoothed_rot_mat = OE_filter.process(rot_mat)
# Elementwise filtering leaves SO(3); project back before axis-angle conversion.
u, _, vh = torch.linalg.svd(smoothed_rot_mat)
correction = torch.eye(3, dtype=u.dtype, device=u.device)
correction[-1, -1] = torch.det(u @ vh)
smoothed_rot_mat = u @ correction @ vh
smoothed_rot = rotation_matrix_to_angle_axis(smoothed_rot_mat.reshape(1,3,3)).reshape(-1)
return smoothed_rot
@@ -1106,4 +1111,4 @@ class OneEuroFilter:
cutoff = self.mincutoff + self.beta * torch.abs(edx)
if print_inter:
print(self.compute_alpha(cutoff))
return self.x_filter.process(x, self.compute_alpha(cutoff))
return self.x_filter.process(x, self.compute_alpha(cutoff))
+2
View File
@@ -177,6 +177,8 @@ class AnimationBase(object):
"""
Add a single camera marker node that we move around when we animate
"""
if os.environ.get("DYNHAMR_HIDE_CAMERA_MARKERS") == "1":
return
print("ADDING CAMERA MARKERS")
if self.cam_marker_node is None:
cam_marker = make_camera_marker(up="y")
@@ -0,0 +1 @@
../../../../../weights/detector.pt