fusion-embedding-2-tremor-g1
Tremor-G1 is the Unitree-humanoid specialization of Tremor, the inertial (IMU) sensor pack for the fusion-embedding stack. It maps a window of the robot's head-mounted accelerometer into the Qwen3-VL-Embedding-2B text space, so a Unitree G1/H1's motion becomes searchable and classifiable in plain language: "walking to a door", "picking something up", "adjusting a phone stand".
It is the per-fleet head of Tremor's two-tier design. Where the general Tremor base generalizes zero-shot to sensors it has never seen, Tremor-G1 is trained on one platform's IMU (Humanoid-Everyday, Unitree humanoid) for maximum in-domain accuracy on that platform. Both are built on the same frozen fusion-embedding-2 text space, so their motion embeddings are directly comparable to that model's audio, text, image, and video in one 2048-d space.
General Tremor base | fusion-embedding-2 | Deployment guide
See it in action
A Unitree G1, full-body. The robot performs an activity sequence β sitting, walking, running, climbing β while a window slides across a real, held-out accelerometer stream and Tremor's scores update live, tracking the motion as it changes.
On the robot's own IMU and camera. On a real Unitree humanoid (Humanoid-Everyday), Tremor reads the robot's own IMU as language, live and frame-synced to its egocentric camera β zero simulation. As it switches from adjusting a phone stand to walking to a door, its IMU signature changes from flat to dynamic and Tremor's read tracks the activity.
Model Overview
Tremor-G1 is a frozen UniMTS motion encoder plus a small trained projector. A single accelerometer window is placed at one joint of UniMTS's orientation-invariant skeleton-graph encoder (ST-GCN), producing a 512-d motion feature; a projector of roughly 2.6M parameters maps that into the frozen Qwen base's 2048-d text space. Only the projector is trained β here, on the Unitree humanoid's IMU.
| Feature | Value |
|---|---|
| Parameters | ~2.06B frozen Qwen base + frozen UniMTS encoder; 2.6M trained |
| Specialization | Unitree humanoid (G1/H1), head-mounted IMU |
| Modality | inertial motion (3-axis accelerometer) |
| Supported tasks | activity retrieval, activity classification (in-domain) |
| Input | one accelerometer window [3, T] (any length/rate; resampled to 200 samples @ 20 Hz) |
| Embedding dimension | 2048 |
| Base model | Qwen/Qwen3-VL-Embedding-2B (frozen) |
| Motion encoder | UniMTS ST-GCN, accelerometer-only (frozen) |
| Trained components | projector 2.6M Linear(512,1024) -> GELU -> Dropout -> Linear(1024,2048) |
Training and Evaluation
Tremor-G1 trains the projector with InfoNCE against the frozen base's native chat-template text embeddings, on Humanoid-Everyday β the Unitree humanoid's head-mounted accelerometer paired with task descriptions. Only the projector learns.
The metric is k-way activity classification on held-out episodes and held-out tasks of the platform (chance = 1/k). On 1,915 held-out windows spanning 98 distinct tasks:
| In-domain (Unitree humanoid) | Tremor-G1 | Cross-human ref | chance |
|---|---|---|---|
| 5-way | 0.740 | 0.371 | 0.20 |
| 10-way | 0.610 | 0.230 | 0.10 |
| 20-way | 0.501 | 0.141 | 0.05 |
The cross-human reference is a general human-motion head applied to the same robot data; Tremor-G1's platform specialization roughly doubles in-domain accuracy over it. This is the two-tier lesson: per-fleet specialization buys large in-domain gains but does not improve cross-dataset transfer β for sensors or platforms outside this one, use the general Tremor base (0.545 held-out 5-way, zero-shot to unseen datasets).
Usage
Requirements
torch(CUDA recommended),numpy,transformers>=4.46,huggingface_hub- The frozen UniMTS encoder code and weights (Apache-2.0 code):
Pointgit clone https://github.com/xiyuanzh/UniMTS # provides model.py::ST_GCN_18UNIMTS_REPO(orunimts_repo=) at the clone. The UniMTS weights download automatically. - The frozen Qwen3-VL-Embedding-2B base downloads from its original repository.
import numpy as np
from inference import TremorEmbedder
tr = TremorEmbedder.from_pretrained(
"EximiusLabs/fusion-embedding-2-tremor-g1",
revision="v0.1-preview",
unimts_repo="UniMTS", # path to your git clone of xiyuanzh/UniMTS
)
# accel: a 3-axis accelerometer window from the robot, shape [3, T] (any length / rate)
accel = np.load("window.npy")
for text, score in tr.rank(accel, ["walking to a door", "picking something up",
"adjusting a phone stand", "standing still"]):
print(f"{score:+.3f} {text}")
For the sensor contract, streaming, on-device inference (precompute the activity text bank once so the 2B base is not needed on the robot), and how to train your own per-fleet head, see DEPLOYMENT.md.
License
The trained projector weights in this repository are released under CC-BY-NC-4.0 (non-commercial).
This reflects the model's lineage. Tremor's frozen encoder is UniMTS, pretrained on synthetic IMU derived from the AMASS / HumanML3D motion corpora, which are released under a non-commercial research license, so Tremor ships non-commercial to respect that lineage.
Limitations
- Platform-specialized. Tuned to the Unitree humanoid's IMU; it does not improve β and should not be used for β zero-shot transfer to other sensors or platforms. Use the general base for that.
- Accelerometer only, single IMU mapped to one joint. Gyroscope is not modeled.
- English text only, and the base's chat-template formatting must be used.
- Research preview, not a high-stakes classifier.
Citation
@misc{tremor2026,
title = {Tremor: an inertial-motion sensor pack for the fusion-embedding space},
author = {Tonmoy, Abdul Basit},
year = {2026},
note = {Eximius Labs. Model weights CC-BY-NC-4.0.},
url = {https://huggingface.co/EximiusLabs/fusion-embedding-2-tremor-g1}
}
Tremor's frozen motion encoder is UniMTS (Zhang et al., NeurIPS 2024), pretrained on synthetic IMU derived from AMASS (Mahmood et al., ICCV 2019). The text space is Qwen3-VL-Embedding-2B. Please cite those works as well.
- Downloads last month
- 22
Model tree for EximiusLabs/fusion-embedding-2-tremor-g1
Base model
Qwen/Qwen3-VL-2B-Instruct