Files
L'électron rare aedcb0f01b feat(data-only-viz): action-head v2 fingers+face
Extend action-head to 32 joints (body22 + 10 fingertips),
10 SMPL-X expression PCA scalars, and mouth_open distance.
FEATURE_DIM 201→302. MIRROR_MAP extended to 32. Dataset,
augment, training, publisher, offline extractor all updated.
2026-05-13 23:15:12 +02:00

47 lines
1.4 KiB
Python

"""Tests for j3d augmentations."""
from __future__ import annotations
import numpy as np
WINDOW_LEN = 16
def _sample_stack(seed: int = 0) -> np.ndarray:
rng = np.random.default_rng(seed)
return rng.normal(size=(WINDOW_LEN, 32, 3)).astype(np.float32)
def test_mirror_swap_left_right_joints() -> None:
from data_only_viz.training.augment import mirror_x, MIRROR_MAP
x = _sample_stack(0)
y = mirror_x(x)
# Check output shape
assert y.shape == (WINDOW_LEN, 32, 3)
# x-coords are negated after reindexing
assert np.allclose(y[..., 0], -x[:, list(MIRROR_MAP), :][:, :, 0], atol=1e-6)
def test_noise_within_sigma() -> None:
from data_only_viz.training.augment import add_noise
rng = np.random.default_rng(0)
x = _sample_stack(0)
y = add_noise(x, sigma=0.01, rng=rng)
diff = y - x
assert np.allclose(diff.std(), 0.01, atol=2e-3)
def test_time_stretch_keeps_shape() -> None:
from data_only_viz.training.augment import time_stretch
x = _sample_stack(0)
y = time_stretch(x, factor=0.9, rng=None)
assert y.shape == x.shape
def test_rotate_y_preserves_distances() -> None:
from data_only_viz.training.augment import rotate_y
x = _sample_stack(0)
y = rotate_y(x, angle_rad=0.3)
d_x = np.linalg.norm(x[0, 0] - x[0, 1])
d_y = np.linalg.norm(y[0, 0] - y[0, 1])
assert abs(d_x - d_y) < 1e-5