File size: 2,166 Bytes
0221051
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
"""Unified interface for converting motion features to joint positions."""

import numpy as np

from visualization.HumanML3D263.recovery import recover_joint_positions as recover_joint_positions_263
from visualization.HumanML3D263.recovery import StreamJointRecovery as StreamJointRecovery263
from visualization.MotionStreamer272.recovery import recover_joint_positions as recover_joint_positions_272
from visualization.MotionStreamer272.recovery import StreamJointRecovery as StreamJointRecovery272
from visualization.MEI138.recovery import recover_joint_positions as recover_joint_positions_138
from visualization.MEI138.recovery import StreamJointRecovery as StreamJointRecovery138

def get_stream_joint_recovery(dim: int, **kwargs):
    """Create a StreamJointRecovery instance for the given feature dimension.

    Args:
        dim: feature dimension (263 or 138)
        **kwargs: passed to the constructor (joints_num, smoothing_alpha, ...)

    Returns:
        StreamJointRecovery instance
    """
    if dim == 263:
        return StreamJointRecovery263(**kwargs)
    elif dim == 138:
        return StreamJointRecovery138(**kwargs)
    elif dim == 272:
        return StreamJointRecovery272(**kwargs)
    else:
        raise ValueError(f"No StreamJointRecovery for dim={dim}. Supported: [263, 138, 272]")


def convert_motion_to_joints(
    motion_data: np.ndarray,
    dim: int,
    mean: np.ndarray = None,
    std: np.ndarray = None,
):
    """Convert motion features to 22-joint positions.

    Args:
        motion_data: (K, dim) motion features.
        dim: feature dimension (263, 272, or 138).
        mean, std: normalization statistics (optional).

    Returns:
        joints: (K, 22, 3) joint positions.
    """
    if mean is not None and std is not None:
        motion_data = motion_data * std + mean
    if dim == 263:
        return recover_joint_positions_263(motion_data)
    elif dim == 272:
        return recover_joint_positions_272(motion_data)
    elif dim == 138:
        return recover_joint_positions_138(motion_data)
    else:
        raise ValueError(f"Unsupported motion data dimension: {dim}. Supported: [263, 272, 138]")