SOMA-X v0.2 là một bản release đáng chú ý vì nó chạm đúng một nút thắt rất thực tế của robotics hiện đại: làm sao dùng cùng một motion, cùng một rig, cùng một pipeline simulation cho nhiều dạng cơ thể khác nhau. Nếu bạn làm humanoid, digital human, pose estimation, motion generation hoặc retargeting từ dữ liệu người sang robot, bạn sẽ sớm gặp vấn đề này: SMPL, SMPL-X, MHR, Anny và các body model khác đều mô tả con người, nhưng chúng không nói cùng một ngôn ngữ.
Repo chính thức của NVIDIA đặt tên paper là SOMA: Unifying Parametric Human Body Models, project nằm tại NVlabs/SOMA-X, tài liệu API ở SOMA-X docs, package PyPI là py-soma-x. Bản v0.2.1 hiện là release khuyến nghị của nhánh 0.2, thêm corrective-model path cho procedural twist-joint rigs, trong khi v0.2.0 là bản full-body update lớn: procedural twist joints, native SOMA bone scale, pose conversion, extra-low LOD, asset USD mới và public API documentation.
Nói ngắn gọn: SOMA-X không cố thay thế SMPL hay MHR. Nó tạo một canonical body topology và rig làm "hub" chung. Identity có thể đến từ MHR, SMPL, SMPL-X, Anny, GarmentMeasurements hoặc SOMA-shape; pose có thể đến từ SOMA, SMPL, MHR hoặc motion dataset như AMASS; kết quả cuối cùng vẫn chạy qua một animation layer thống nhất bằng Linear Blend Skinning, pose correctives và NVIDIA Warp.

Vì sao SOMA-X quan trọng cho robotics?
Trong computer graphics, body model thường dùng để render người ảo. Trong robotics, body model còn là cầu nối giữa human motion và robot motion. Một policy humanoid có thể học từ motion capture người; một retargeter có thể lấy skeleton người rồi chuyển thành joint target cho Unitree G1; một simulator có thể cần hàng nghìn body shape để kiểm tra stability, collision, camera viewpoint hoặc contact behavior.
Vấn đề là mỗi body model có topology, skeleton hierarchy và parameterization riêng. SMPL có 6,890 vertices và shape PCA phổ biến trong research. SMPL-X thêm tay và mặt. MHR tập trung vào bone-length parameterization để mô tả khác biệt xương tốt hơn. Anny dùng anthropometric measurements, có lợi khi cần age, height, weight hoặc body composition rộng từ trẻ em đến người lớn tuổi. GarmentMeasurements lại hữu ích cho proportion liên quan may mặc. Nếu mỗi cặp model phải có adapter riêng, số adapter tăng theo kiểu N x N.
SOMA-X đổi bài toán đó thành N connector: mỗi backend chỉ cần map về SOMA một lần. Sau đó motion, correctives, LOD, pose inversion và downstream robotics code đều làm việc trên cùng chuẩn SOMA. Đây là lý do announcement "One rig, every body" nghe marketing nhưng có nội dung kỹ thuật thật.
Nếu bạn đang đọc các bài về humanoid pipeline trên vnrobo, có thể xem thêm software stack ROS 2, Isaac và LeRobot, GROOT whole-body data thực tế và GEAR SONIC whole-body control. SOMA-X nằm ở tầng dữ liệu hình học/pose, trước khi dữ liệu đó được đưa vào simulation, retargeting hoặc policy training.
Ý tưởng paper: tách identity khỏi pose
Ý tưởng trung tâm của paper là identity-pose decoupling. Identity trả lời câu hỏi "cơ thể này có hình dạng gì": chiều cao, tỉ lệ tay chân, độ rộng vai, surface mesh, bone scale. Pose trả lời câu hỏi "cơ thể đang đứng/ngồi/đi/chuyển động thế nào". Trong nhiều model cũ, hai phần này bị khóa vào cùng một convention. Motion SMPL muốn chạy trên identity Anny thì phải viết conversion riêng.
SOMA-X đưa vào ba lớp abstraction:
- Mesh Topology Abstraction: chuyển rest-shape mesh của backend gốc sang topology SOMA bằng pre-computed barycentric correspondence. Runtime không cần neural network và không cần iterative solver; nó là một phép transfer hình học.
- Skeletal Abstraction: fit SOMA skeleton vào rest shape đã transfer. Paper mô tả bước này dùng RBF joint regression và Procrustes/Kabsch alignment để lấy identity-adapted joint transforms trong một analytical forward pass.
- Pose Abstraction: lấy posed vertices từ model khác rồi khôi phục SOMA skeleton rotations bằng inverse-LBS, Newton-Schulz orthogonalization và tùy chọn autograd FK refinement.
Điểm đáng chú ý là pipeline forward của SOMA có thể differentiable end-to-end. Với robotics, điều này có nghĩa bạn có thể đặt SOMA như một layer trong optimization hoặc ML loop: identity coefficients và pose đi vào, vertices/joints đi ra, loss có thể backprop qua geometry khi cần.
Kiến trúc SOMA-X v0.2
Ở runtime, class quan trọng nhất là SOMALayer. Tài liệu mô tả nó là full-body entry point với 78-joint parametric human model; public pose tensor có 77 joint entries vì root dummy không nằm trong input pose. Input phổ biến gồm:
poses: shape(B, 77, 3)nếu dùng axis-angle, hoặc(B, 77, 3, 3)nếu dùng rotation matricesidentity: shape(B, K), trong đóKtùy backend; SOMA-shape dùng 128 PCA coefficientsscale_params: tùy chọn, dùng cho native SOMA body bone scalestransl: root translation nếu cần đặt người trong world frame
Output là dictionary có vertices, joints, transforms và metadata liên quan. Với LOD, lod="mid" trả 18,056 vertices, lod="low" trả 4,505 vertices, còn lod="xlo" chỉ trả 612 body vertices. Extra-low LOD là phần rất thực dụng cho robotics: khi bạn chỉ cần silhouette, kinematics hoặc fitting nhanh, 612 vertices giúp giảm bandwidth và memory, nhất là khi chạy batch lớn hoặc nhiều agents.
V0.2 cũng chuyển rig asset sang SOMA_template_rig.usda làm source of truth cho joint hierarchy, bind/T-pose, bind-shape và skinning weights. SOMA_neutral.npz trở nên gọn hơn, giữ PCA shape model, topology, UV, LOD maps, semantic segments và metadata. SOMA_procedural_transforms.json là sidecar mô tả procedural twist-joint transform.
Procedural twist joints và correctives
LBS thường tạo artifact ở vai, khuỷu, cổ tay, hông và đầu gối. Khi joint xoay mạnh, mesh có thể bị "kẹo cao su", gãy khúc hoặc mất volume. Các model như SMPL giải quyết bằng pose-dependent correctives, nhưng correctives thường gắn với một topology/model riêng. SOMA-X tận dụng unified topology để train/use correctives một lần rồi áp dụng cho nhiều backend.

Trong v0.2, procedural transforms điều khiển twist joints để cải thiện deformation toàn thân. Sidecar JSON mô tả cách extract twist từ public joint rotations, ví dụ local_x_euler, local_x_swing_twist hoặc aligned_x_swing_twist. Tài liệu cho biết sidecar hiện dùng aligned_x_swing_twist globally, tạo twist helper theo segment alignment, giữ stretch theo identity thay vì tin vào translation fit riêng của helper joints.
V0.2.1 sửa một điểm quan trọng: corrective model path đã aware với procedural twist-joint rigs, gồm corrected bind reposing cho workflow twist-rig. Vì vậy nếu bạn bật procedural transforms, correctives mới có ý nghĩa hơn cho full-body deformation.
Cài đặt nhanh
Với người mới, cách đơn giản nhất là cài từ PyPI:
python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install py-soma-x
Nếu cần SMPL/SMPL-X support:
pip install "py-soma-x[smpl]"
pip install --no-build-isolation chumpy
Lưu ý quan trọng: SMPL và SMPL-X model files có license riêng. Bạn phải tải SMPL_NEUTRAL.pkl hoặc SMPLX_NEUTRAL.npz từ website SMPL/SMPL-X và truyền path vào identity_model_kwargs. Assets mặc định của SOMA-X được tải tự động từ Hugging Face trong lần dùng đầu tiên và cache ở ~/.cache/huggingface/hub/.
Ví dụ minimal:
import torch
from soma import SOMALayer
device = "cuda" if torch.cuda.is_available() else "cpu"
soma = SOMALayer(identity_model_type="mhr", device=device, lod="low")
B = 1
poses = torch.zeros(B, 77, 3, device=device)
identity = torch.zeros(B, soma.num_shape_components, device=device)
out = soma(poses, identity)
vertices = out["vertices"]
joints = out["joints"]
print(vertices.shape, joints.shape)
Trong thực tế, bạn thường không tự tạo zero pose mãi. Bạn sẽ lấy motion từ SMPL, MHR, AMASS hoặc estimator, convert sang SOMA pose, rồi dùng SOMALayer để render, fit, export .npz, hoặc đưa vào retargeter.
Pose inversion: từ posed mesh về SOMA pose
Pose inversion là phần làm SOMA-X đáng giá cho dữ liệu legacy. Bạn có posed vertices trong SMPL hoặc MHR, nhưng muốn output là SOMA-compatible rotations. PoseInversion.fit() nhận vertices ở topology được support, transfer về SOMA topology nếu cần, rồi fit rotations.

Repo cung cấp tool:
python -m tools.smpl2soma --output-npz out/smpl_soma.npz
python -m tools.mhr2soma --input path/to/parquet_dir --output-npz out/mhr_soma.npz
python -m tools.convert_amass_to_soma --input-dir /data/amass --output-dir out/amass_soma
Solver có hai chế độ chính. Analytical là mặc định: inverse-LBS refinement với Newton-Schulz, rất nhanh và đủ chính xác cho đa số conversion. Autograd FK dùng optimization qua FK + LBS, chậm hơn nhưng cho phép đặt trọng số vào extremities như bàn tay, bàn chân, đầu. Hai chế độ có thể kết hợp: analytical warm-start rồi autograd refine.

Benchmark trong README rất dễ hiểu:
| Conversion | Hardware | Method | Speed | Mean error |
|---|---|---|---|---|
| SMPL to SOMA, 402 frames | RTX 5000 Ada | Analytical | 1279 FPS | 0.65 cm |
| SMPL to SOMA, 402 frames | RTX 5000 Ada | Autograd 100 iters | 18 FPS | 0.49 cm |
| MHR to SOMA, 200 samples | RTX 5000 Ada | Analytical | 342 FPS | 0.61 cm |
| AMASS to SOMA | A100 | Analytical | 17,393 FPS | 0.53 cm |
Với robotics, con số này có nghĩa là bạn có thể preprocess dataset lớn mà không biến pose conversion thành bottleneck. Sau khi convert, output .npz chứa poses, root_translation, joint_names, per_vertex_error, identity_coeffs và scale_params.
Training: SOMA-X train gì và không train gì?
Một điểm beginner dễ nhầm: SOMA-X không phải một neural policy và không cần train mỗi khi bạn dùng một identity. Core pipeline là analytical/parametric. Tuy nhiên project vẫn có các phần được học hoặc fit offline:
- SOMA-shape PCA: paper mô tả shape space được fit từ 9,326 SizeUSA body scans, 303 Triplegangers scans và samples distilled từ GarmentMeasurements với tỉ lệ 40/40/20. Kết quả là 128 PCA coefficients cho identity representation.
- Pose correctives MLP: correctives model được distill từ MHR posed meshes lên SOMA topology, dùng joint rotations để dự đoán per-vertex displacement nhằm giảm artifact LBS.
- Topology correspondences: barycentric correspondence được precompute ở initialization hoặc asset pipeline, không phải train gradient-based mỗi lần inference.
- Downstream training: nếu bạn train humanoid policy, SOMA-X thường đóng vai preprocessing/geometry layer. Bạn convert motion sang SOMA, retarget sang robot, rồi train tracking policy trong simulator như Isaac Lab, ProtoMotions hoặc stack nội bộ.
Một workflow training hợp lý:
AMASS / SAM 3D Body / SMPL motion
-> PoseInversion / pose_converter
-> SOMA pose + identity + scale_params
-> retarget sang humanoid skeleton
-> train motion tracking policy trong simulation
-> evaluate sim-to-real hoặc deploy robot
Nếu dataset của bạn đến từ human video, bài SUGAR: humanoid loco-manipulation from human videos là một ví dụ gần về hướng tận dụng dữ liệu người cho robot. SOMA-X giải quyết lớp representation để dữ liệu đó ít bị khóa vào một body model duy nhất.
Inference và deployment trong robotics
Trong inference, bạn thường làm một trong ba việc.
Thứ nhất là forward body model: chọn identity backend, chọn pose, lấy vertices/joints. Đây là đường dùng cho visualization, collision proxy, dataset generation, camera rendering hoặc quality check.
Thứ hai là pose conversion/inversion: lấy posed vertices hoặc motion từ model khác, xuất SOMA pose. Đây là đường dùng để chuẩn hóa dataset trước khi train policy hoặc motion generator.
Thứ ba là LOD-aware fitting: dùng lod="xlo" hoặc lod="low" khi cần chạy nhanh. Extra-low LOD 612 vertices không thay thế mid mesh khi cần render đẹp, nhưng rất hợp với batch inference, skeleton fitting, quick validation hoặc robot-side lightweight preview.
Ví dụ demo:
python tools/demo_soma_vis.py --data-root ./assets --output-dir ./out --identity-model-type soma,mhr --lod xlo
Với humanoid retargeting, SOMA-X cũng đã có ecosystem liên quan như SOMA Retargeter cho SOMA to G1, BONES-SEED dataset ở SOMA format, ProtoMotions cho simulated humanoids và các project video pose/motion generation. Điều này quan trọng hơn một model đơn lẻ: robotics cần cả chuỗi dữ liệu, simulator, retargeter và policy.
Kết quả và giới hạn
Paper báo cáo forward pass trên A100 đạt 7,033 posed meshes/second ở batch 128 với Warp GPU path; latency batch 1 là 2.1 ms. CPU PyTorch path batch 1 là 12.1 ms. Với cross-model shape-space comparison trên 33 held-out scans, SOMA-Shape 128 components đạt mean reconstruction error 5.82 mm, gần SMPL-X 300 components ở 5.45 mm và tốt hơn SMPL 10 components ở 14.11 mm.
Pose inversion cũng có trade-off rõ. Analytical solver nhanh, còn autograd FK refinement giảm lỗi ở extremities: paper báo cáo trên 200 SAM 3D Body frames, hand error giảm từ 4.7 mm xuống 2.0 mm khi thêm 100 Adam iterations, foot error từ 8.2 mm xuống 5.8 mm, head error từ 6.9 mm xuống 4.8 mm. Nhưng body trunk error chỉ giảm nhẹ và runtime chậm hơn.
Giới hạn thực tế:
- SMPL/SMPL-X vẫn có license riêng, không được bundle tùy tiện.
- Correctives là phần cần dùng đúng asset v0.2 và procedural transforms.
- XLO rất nhanh nhưng quá thưa cho một số fitting chi tiết quanh limbs; tài liệu cho biết skeleton fitting vẫn dùng low-LOD nội bộ để ổn định hơn.
- SOMA-X chuẩn hóa human body representation, nhưng không tự động giải bài toán robot dynamics, foot contact, torque limits hoặc actuator delay.
Kết luận
SOMA-X v0.2 là một bước hạ tầng cho physical AI hơn là một demo hào nhoáng. Nó giải quyết vấn đề nhàm chán nhưng đau: nhiều body model, nhiều topology, nhiều skeleton, nhiều pose convention. Bằng cách đưa chúng về một rig và một topology chung, SOMA-X giúp motion data, pose estimation, simulation và humanoid retargeting dễ nối với nhau hơn.
Với team robotics, giá trị chính không phải "render người đẹp hơn", mà là giảm chi phí chuyển đổi dữ liệu trước khi train và deploy. Khi bạn có một chuẩn SOMA ở giữa, dữ liệu SMPL, MHR, AMASS hoặc body shape khác có thể đi vào cùng pipeline, rồi từ đó nối sang G1, whole-body control hoặc motion policy.
Nguồn chính
- SOMA-X GitHub repo
- SOMA-X stable documentation
- SOMA: Unifying Parametric Human Body Models, arXiv:2603.16858
- py-soma-x trên PyPI
