Initial snapshot: hand motion pipeline (Dyn-HaMR + dex-retargeting + SPIDER)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 14:13:49 +08:00
commit 7e4ef6f98b
7002 changed files with 1452249 additions and 0 deletions
@@ -0,0 +1,36 @@
# Copyright (c) OpenMMLab. All rights reserved.
import numpy as np
from mmpose.core.post_processing.one_euro_filter import OneEuroFilter
def test_one_euro_filter():
np.random.seed(1)
kpts = []
frames = 100
for i in range(frames):
kpts.append({
'keypoints': np.tile(np.array([10, 10, 0.9]), [17, 1]),
'area': 100,
'score': 0.9
})
kpts.append({
'keypoints': np.tile(np.array([11, 11, 0.9]), [17, 1]),
'area': 100,
'score': 0.8
})
one_euro_filter = OneEuroFilter(
kpts[0]['keypoints'][:, :2], min_cutoff=1.7, beta=0.3, fps=30)
for i in range(1, len(kpts)):
kpts[i]['keypoints'][:, :2] = one_euro_filter(
kpts[i]['keypoints'][:, :2])
one_euro_filter = OneEuroFilter(
kpts[0]['keypoints'][:, :2], min_cutoff=1.7, beta=0.3)
for i in range(1, len(kpts)):
kpts[i]['keypoints'][:, :2] = one_euro_filter(
kpts[i]['keypoints'][:, :2])
@@ -0,0 +1,72 @@
# Copyright (c) OpenMMLab. All rights reserved.
import torch
from mmpose.core.post_processing.group import HeatmapParser
def test_group():
cfg = {}
cfg['num_joints'] = 17
cfg['detection_threshold'] = 0.1
cfg['tag_threshold'] = 1
cfg['use_detection_val'] = True
cfg['ignore_too_much'] = False
cfg['nms_kernel'] = 5
cfg['nms_padding'] = 2
cfg['tag_per_joint'] = True
cfg['max_num_people'] = 1
parser = HeatmapParser(cfg)
fake_heatmap = torch.zeros(1, 1, 5, 5)
fake_heatmap[0, 0, 3, 3] = 1
fake_heatmap[0, 0, 3, 2] = 0.8
assert parser.nms(fake_heatmap)[0, 0, 3, 2] == 0
fake_heatmap = torch.zeros(1, 17, 32, 32)
fake_tag = torch.zeros(1, 17, 32, 32, 1)
fake_heatmap[0, 0, 10, 10] = 0.8
fake_heatmap[0, 1, 12, 12] = 0.9
fake_heatmap[0, 4, 8, 8] = 0.8
fake_heatmap[0, 8, 6, 6] = 0.9
fake_tag[0, 0, 10, 10] = 0.8
fake_tag[0, 1, 12, 12] = 0.9
fake_tag[0, 4, 8, 8] = 0.8
fake_tag[0, 8, 6, 6] = 0.9
grouped, scores = parser.parse(fake_heatmap, fake_tag, True, True)
assert grouped[0][0, 0, 0] == 10.25
assert abs(scores[0] - 0.2) < 0.001
cfg['tag_per_joint'] = False
parser = HeatmapParser(cfg)
grouped, scores = parser.parse(fake_heatmap, fake_tag, False, False)
assert grouped[0][0, 0, 0] == 10.
grouped, scores = parser.parse(fake_heatmap, fake_tag, False, True)
assert grouped[0][0, 0, 0] == 10.
def test_group_score_per_joint():
cfg = {}
cfg['num_joints'] = 17
cfg['detection_threshold'] = 0.1
cfg['tag_threshold'] = 1
cfg['use_detection_val'] = True
cfg['ignore_too_much'] = False
cfg['nms_kernel'] = 5
cfg['nms_padding'] = 2
cfg['tag_per_joint'] = True
cfg['max_num_people'] = 1
cfg['score_per_joint'] = True
parser = HeatmapParser(cfg)
fake_heatmap = torch.zeros(1, 1, 5, 5)
fake_heatmap[0, 0, 3, 3] = 1
fake_heatmap[0, 0, 3, 2] = 0.8
assert parser.nms(fake_heatmap)[0, 0, 3, 2] == 0
fake_heatmap = torch.zeros(1, 17, 32, 32)
fake_tag = torch.zeros(1, 17, 32, 32, 1)
fake_heatmap[0, 0, 10, 10] = 0.8
fake_heatmap[0, 1, 12, 12] = 0.9
fake_heatmap[0, 4, 8, 8] = 0.8
fake_heatmap[0, 8, 6, 6] = 0.9
fake_tag[0, 0, 10, 10] = 0.8
fake_tag[0, 1, 12, 12] = 0.9
fake_tag[0, 4, 8, 8] = 0.8
fake_tag[0, 8, 6, 6] = 0.9
grouped, scores = parser.parse(fake_heatmap, fake_tag, True, True)
assert len(scores[0]) == 17
@@ -0,0 +1,81 @@
# Copyright (c) OpenMMLab. All rights reserved.
import numpy as np
from mmpose.core.post_processing.nms import nms, oks_iou, oks_nms, soft_oks_nms
def test_soft_oks_nms():
oks_thr = 0.9
kpts = []
kpts.append({
'keypoints': np.tile(np.array([10, 10, 0.9]), [17, 1]),
'area': 100,
'score': 0.9
})
kpts.append({
'keypoints': np.tile(np.array([10, 10, 0.9]), [17, 1]),
'area': 100,
'score': 0.4
})
kpts.append({
'keypoints': np.tile(np.array([100, 100, 0.9]), [17, 1]),
'area': 100,
'score': 0.7
})
keep = soft_oks_nms([kpts[i] for i in range(len(kpts))], oks_thr)
assert (keep == np.array([0, 2, 1])).all()
keep = oks_nms([kpts[i] for i in range(len(kpts))], oks_thr)
assert (keep == np.array([0, 2])).all()
kpts_with_score_joints = []
kpts_with_score_joints.append({
'keypoints':
np.tile(np.array([10, 10, 0.9]), [17, 1]),
'area':
100,
'score':
np.tile(np.array([0.9]), 17)
})
kpts_with_score_joints.append({
'keypoints':
np.tile(np.array([10, 10, 0.9]), [17, 1]),
'area':
100,
'score':
np.tile(np.array([0.4]), 17)
})
kpts_with_score_joints.append({
'keypoints':
np.tile(np.array([100, 100, 0.9]), [17, 1]),
'area':
100,
'score':
np.tile(np.array([0.7]), 17)
})
keep = soft_oks_nms([
kpts_with_score_joints[i] for i in range(len(kpts_with_score_joints))
],
oks_thr,
score_per_joint=True)
assert (keep == np.array([0, 2, 1])).all()
keep = oks_nms([
kpts_with_score_joints[i] for i in range(len(kpts_with_score_joints))
],
oks_thr,
score_per_joint=True)
assert (keep == np.array([0, 2])).all()
def test_func_nms():
result = nms(np.array([[0, 0, 10, 10, 0.9], [0, 0, 10, 8, 0.8]]), 0.5)
assert result == [0]
def test_oks_iou():
result = oks_iou(np.ones([17 * 3]), np.ones([1, 17 * 3]), 1, [1])
assert result[0] == 1.
result = oks_iou(np.zeros([17 * 3]), np.ones([1, 17 * 3]), 1, [1])
assert result[0] < 0.01