|
|
--- |
|
|
license: cc-by-nd-4.0 |
|
|
language: |
|
|
- en |
|
|
model-index: |
|
|
- name: TinyMyo |
|
|
results: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- task: |
|
|
type: gesture-classification |
|
|
dataset: |
|
|
type: ninapro_db5 |
|
|
name: Ninapro DB5 |
|
|
metrics: |
|
|
- name: acc@1 |
|
|
type: acc@1 |
|
|
value: 0.8941 |
|
|
verified: false |
|
|
- name: f1 |
|
|
type: f1 |
|
|
value: 0.7797 |
|
|
verified: false |
|
|
|
|
|
- task: |
|
|
type: gesture-classification |
|
|
dataset: |
|
|
type: epn612 |
|
|
name: EPN-612 |
|
|
metrics: |
|
|
- name: acc@1 |
|
|
type: acc@1 |
|
|
value: 0.9674 |
|
|
verified: false |
|
|
- name: f1 |
|
|
type: f1 |
|
|
value: 0.9674 |
|
|
verified: false |
|
|
|
|
|
- task: |
|
|
type: gesture-classification |
|
|
dataset: |
|
|
type: uci_emg |
|
|
name: UCI-EMG |
|
|
metrics: |
|
|
- name: acc@1 |
|
|
type: acc@1 |
|
|
value: 0.9756 |
|
|
verified: false |
|
|
- name: f1 |
|
|
type: f1 |
|
|
value: 0.9755 |
|
|
verified: false |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- task: |
|
|
type: gesture-classification |
|
|
dataset: |
|
|
type: gni_meta_rl |
|
|
name: Generic Neuromotor Interface (Discrete Gesture) |
|
|
metrics: |
|
|
- name: CLER |
|
|
type: classification-error-rate |
|
|
value: 0.153 |
|
|
verified: false |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- task: |
|
|
type: kinematic-regression |
|
|
dataset: |
|
|
type: ninapro_db8 |
|
|
name: Ninapro DB8 |
|
|
metrics: |
|
|
- name: MAE |
|
|
type: mean-absolute-error |
|
|
value: 8.77 |
|
|
verified: false |
|
|
- name: RMSE |
|
|
type: root-mean-square-error |
|
|
value: 13.35 |
|
|
verified: false |
|
|
- name: R2 |
|
|
type: r2 |
|
|
value: 0.62 |
|
|
verified: false |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- task: |
|
|
type: speech-synthesis |
|
|
dataset: |
|
|
type: gaddy_silent_speech |
|
|
name: Gaddy Silent Speech (MFCC to Audio) |
|
|
metrics: |
|
|
- name: WER |
|
|
type: word-error-rate |
|
|
value: 0.3354 |
|
|
verified: false |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- task: |
|
|
type: speech-recognition |
|
|
dataset: |
|
|
type: gaddy_silent_speech |
|
|
name: Gaddy Silent Speech (EMG to Text) |
|
|
metrics: |
|
|
- name: WER |
|
|
type: word-error-rate |
|
|
value: 0.3395 |
|
|
verified: false |
|
|
--- |
|
|
|
|
|
<div align="center"> |
|
|
<img src="https://raw.githubusercontent.com/MatteoFasulo/BioFoundation/refs/heads/TinyMyo/docs/model/logo/TinyMyo_logo.png" alt="TinyMyo Logo" width="400" /> |
|
|
<h1>TinyMyo: a Tiny Foundation Model for Flexible EMG Signal Processing at the Edge</h1> |
|
|
</div> |
|
|
<p align="center"> |
|
|
<a href="https://github.com/pulp-bio/BioFoundation"> |
|
|
<img src ="https://img.shields.io/github/stars/pulp-bio/BioFoundation?color=ccf" alt="Github"> |
|
|
</a> |
|
|
<a href="https://creativecommons.org/licenses/by-nd/4.0/"> |
|
|
<img src="https://img.shields.io/badge/License-CC_BY--ND_4.0-lightgrey.svg" alt="License"> |
|
|
</a> |
|
|
<a href="https://arxiv.org/abs/2512.15729"> |
|
|
<img src="https://img.shields.io/badge/arXiv-2512.15729-b31b1b.svg" alt="Paper"> |
|
|
</a> |
|
|
</p> |
|
|
|
|
|
**TinyMyo** is a **3.6M-parameter** Transformer-based **foundation model for surface EMG (sEMG)**. |
|
|
It is pretrained on >480 GB of EMG data and optimized for **ultra-low-power, real-time deployment**, including **microcontrollers (GAP9)** where it achieves an inference time of **0.785 s**, energy of **44.91 mJ** and power envelope of **57.18 mW**. |
|
|
|
|
|
TinyMyo is built for **broad generalization** across datasets, sensor configurations, movement tasks, subjects, and domains (gesture, kinematics, speech). |
|
|
|
|
|
--- |
|
|
|
|
|
# π License & Usage (Model Weights) |
|
|
|
|
|
The released TinyMyo weights are licensed under **CC BY-ND 4.0**. |
|
|
This summary is not legal adviceβplease read the full license. |
|
|
|
|
|
### β
You may |
|
|
|
|
|
* **Use** and **redistribute** the **unmodified** TinyMyo weights (including commercially) **with attribution**. |
|
|
* **Fine-tune/modify internally** for research or production without redistributing modified weights. |
|
|
* **Publish code, configs, evaluations, and papers** using TinyMyo. |
|
|
|
|
|
### π« You may not |
|
|
|
|
|
* **Share or host modified weights** in any form (including LoRA/adapter deltas, pruned/quantized models). |
|
|
* **Claim endorsement** from the TinyMyo authors without permission. |
|
|
* **Use the TinyMyo name** for derivative models. |
|
|
|
|
|
### π€ Contributing Improvements |
|
|
|
|
|
To upstream improvements, submit a **PR** to the |
|
|
**[BioFoundation repository](https://github.com/pulp-bio/BioFoundation)** with: |
|
|
|
|
|
1. Full reproducibility artifacts (configs, logs, seeds, environment). |
|
|
2. Evaluation on standard protocols (e.g., DB5, EPN-612, UCI EMG, DB8, Silent Speech). |
|
|
3. Comparison to TinyMyoβs reported metrics. |
|
|
|
|
|
Approved PRs will be retrained and released as **official TinyMyo** checkpoints under CC BY-ND. |
|
|
|
|
|
--- |
|
|
|
|
|
# π 1. Default Input & Preprocessing |
|
|
|
|
|
Unless specified otherwise, TinyMyo expects: |
|
|
|
|
|
* **Channels:** 16 |
|
|
* **Sampling rate:** 2000 Hz |
|
|
* **Segment length:** 1000 samples (0.5 s) |
|
|
* **Windowing:** 50% overlap (pretraining) |
|
|
* **Preprocessing:** |
|
|
|
|
|
* 4th-order **20β450 Hz bandpass** |
|
|
* **50 Hz notch filter** |
|
|
* **Minβmax normalization** (pretraining) |
|
|
* **Z-score normalization** (downstream) |
|
|
|
|
|
Datasets with <16 channels are **zero-padded (pretraining only)**. |
|
|
|
|
|
--- |
|
|
|
|
|
# π¬ 2. Pretraining Overview |
|
|
|
|
|
TinyMyo is pretrained via masked reconstruction on **three large-scale EMG datasets**: |
|
|
|
|
|
| Dataset | Subjects | fs | Channels | Size | |
|
|
| ----------- | -------- | ------- | -------- | ------- | |
|
|
| Ninapro DB6 | 10 | 2000 Hz | 14 | 20.3 GB | |
|
|
| Ninapro DB7 | 22 | 2000 Hz | 12 | 30.9 GB | |
|
|
| EMG2Pose | 192 | 2000 Hz | 16 | 431 GB | |
|
|
|
|
|
## Tokenization: Channel-Independent Patches |
|
|
|
|
|
Unlike EEG FMs that mix channels early, TinyMyo uses **per-channel patching**: |
|
|
|
|
|
* Patch length: **20 samples** |
|
|
* Patch stride: **20 samples** |
|
|
* Tokens/channel: **50** |
|
|
* Total seq length: **800 tokens** (16 x 50) |
|
|
* Positional encoding: **RoPE (rotary)** |
|
|
|
|
|
This preserves electrode-specific structure while allowing attention to learn cross-channel relationships. |
|
|
|
|
|
## Transformer Encoder |
|
|
|
|
|
* **8 layers**, **3 heads** |
|
|
* Embedding dim: **192** |
|
|
* Pre-LayerNorm |
|
|
* Dropout & drop-path: **0.1** |
|
|
|
|
|
## Lightweight Decoder |
|
|
|
|
|
A **single linear layer** (~3.9k params) reconstructs masked patches. |
|
|
Following SimMIM, this forces the encoder to learn robust latent structure. |
|
|
|
|
|
## Masking Objective |
|
|
|
|
|
* **50% random masking** with a learnable `[MASK]` token |
|
|
* Loss: **Smooth L1** with small penalty on visible patches |
|
|
$$ |
|
|
\mathcal{L} = \mathcal{L}*{\text{masked}} + 0.1,\mathcal{L}*{\text{visible}} |
|
|
$$ |
|
|
|
|
|
## Training Setup |
|
|
|
|
|
* Optimizer: **AdamW** (Ξ²=(0.9,0.98), wd=0.01) |
|
|
* LR: **1e-4** with cosine decay |
|
|
* Batch size: **512** (with grad accumulation) |
|
|
* Epochs: **50**, warm-up: 10 |
|
|
* Hardware: **4Γ NVIDIA GH200 GPUs** |
|
|
|
|
|
--- |
|
|
|
|
|
# π§ 3. Architecture Summary |
|
|
|
|
|
### Model Variant |
|
|
|
|
|
| Variant | Params | (Layers, Dim) | |
|
|
| ------- | -------- | ------------- | |
|
|
| TinyMyo | **3.6M** | (8, 192) | |
|
|
|
|
|
--- |
|
|
|
|
|
# π― 4. Downstream Tasks |
|
|
|
|
|
TinyMyo generalizes across **gesture classification**, **kinematic regression**, and **speech EMG**βwith state-of-the-art or competitive results. |
|
|
|
|
|
--- |
|
|
|
|
|
## 4.1 Hand Gesture Classification |
|
|
|
|
|
Evaluated on: |
|
|
|
|
|
* **Ninapro DB5** (52 classes, 10 subjects) |
|
|
* **EPN-612** (5 classes, 612 subjects) |
|
|
* **UCI EMG** (6 classes, 36 subjects) |
|
|
* **Meta Neuromotor Interface** (9 gestures) |
|
|
|
|
|
### Preprocessing |
|
|
|
|
|
* EMG filtering: **20β90 Hz bandpass + 50 Hz notch** |
|
|
* Window sizes: |
|
|
|
|
|
* **200 ms** (best for DB5) |
|
|
* **1000 ms** (best for EPN, UCI) |
|
|
|
|
|
### Linear Classification Head |
|
|
|
|
|
* Input: **C Γ 192** |
|
|
* Params: **<40k** |
|
|
|
|
|
### Performance (Fine-tuned) |
|
|
|
|
|
| Dataset | Metric | Result | |
|
|
| ------------------------ | ------ | ----------------- | |
|
|
| **Ninapro DB5** (200 ms) | Acc | **89.41 Β± 0.16%** | |
|
|
| **EPN-612** (1000 ms) | Acc | **96.74 Β± 0.09%** | |
|
|
| **UCI EMG** (1000 ms) | Acc | **97.56 Β± 0.32%** | |
|
|
| **Neuromotor** | CLER | **0.153 Β± 0.006** | |
|
|
|
|
|
TinyMyo achieves **new state-of-the-art** on DB5, EPN-612, and UCI. |
|
|
|
|
|
--- |
|
|
|
|
|
## 4.2 Hand Kinematic Regression (Ninapro DB8) |
|
|
|
|
|
* Predict **5 joint angles** |
|
|
* Windows: **200 ms** or **1000 ms** |
|
|
* Normalization: z-score only |
|
|
|
|
|
### Regression Head (~788k params) |
|
|
|
|
|
* Depthwise + pointwise convs |
|
|
* Upsampling |
|
|
* Global average pooling |
|
|
* Linear projection to 5 outputs |
|
|
|
|
|
### Performance |
|
|
|
|
|
* **MAE = 8.77 Β± 0.12Β°** (1000 ms) |
|
|
|
|
|
Note: Prior works reporting ~6.9Β° MAE are **subject-specific**; TinyMyo trains a **single cross-subject model**, a significantly harder setting. |
|
|
|
|
|
--- |
|
|
|
|
|
## 4.3 Speech Production & Recognition (Silent Speech) |
|
|
|
|
|
Dataset: **Gaddy Silent Speech** |
|
|
(8 channels, 1000 Hz, face/neck EMG) |
|
|
|
|
|
### Speech Production (EMG β MFCC β HiFi-GAN β Audio) |
|
|
|
|
|
Pipeline: |
|
|
|
|
|
1. Residual downsampling |
|
|
2. TinyMyo encoder |
|
|
3. Linear projection β **26-dim MFCC** |
|
|
4. HiFi-GAN vocoder |
|
|
|
|
|
**WER:** **33.54 Β± 1.12%** |
|
|
β state-of-the-art with **>90% fewer params** in the transduction model. |
|
|
|
|
|
### Speech Recognition (EMG β Text) |
|
|
|
|
|
* TinyMyo encoder |
|
|
* Linear projection β **37 characters** |
|
|
* **CTC** loss |
|
|
* 4-gram LM + beam search |
|
|
|
|
|
**WER:** **33.95 Β± 0.97%** |
|
|
|
|
|
TinyMyo is EMG-only, unlike multimodal systems like MONA-LISA. |
|
|
|
|
|
--- |
|
|
|
|
|
# β‘ 5. Edge Deployment (GAP9 MCU) |
|
|
|
|
|
TinyMyo runs efficiently on **GAP9 (RISC-V)** via: |
|
|
|
|
|
* **INT8 quantization**, including attention |
|
|
* Multi-level streaming (L3 to L2 to L1) |
|
|
* Integer LayerNorm, GELU, softmax |
|
|
* Static memory arena via liveness analysis |
|
|
|
|
|
### Runtime (DB5 pipeline) |
|
|
|
|
|
* **Inference time**: **0.785 s** |
|
|
* **Energy**: **44.91 mJ** |
|
|
* **Average power**: **57.18 mW** |
|
|
|
|
|
This is the **first EMG foundation model demonstrated on a microcontroller**. |
|
|
|
|
|
--- |
|
|
|
|
|
# π 6. Results Summary |
|
|
|
|
|
### Pretraining |
|
|
|
|
|
* Smooth L1 reconstruction with high fidelity |
|
|
* Total compute β **4.0 GFLOPs** |
|
|
|
|
|
### Downstream Highlights |
|
|
|
|
|
* **DB5:** 89.41% |
|
|
* **EPN-612:** 96.74% |
|
|
* **UCI EMG:** 97.56% |
|
|
* **Neuromotor:** 0.153 CLER |
|
|
* **DB8 Regression:** MAE 8.77Β° |
|
|
* **Silent Speech Production:** 33.54% WER |
|
|
* **Silent Speech Recognition:** 33.95% WER |
|
|
|
|
|
TinyMyo matches or exceeds state-of-the-art performance, while being smaller and more efficient than all prior EMG foundation models. |
|
|
|
|
|
--- |
|
|
|
|
|
# π οΈ Code & Usage |
|
|
|
|
|
To fine-tune TinyMyo on downstream tasks, follow the examples in the |
|
|
**[BioFoundation repository](https://github.com/pulp-bio/BioFoundation)**. |
|
|
|
|
|
```bash |
|
|
python -u run_train.py +experiment=TinyMyo_finetune \ |
|
|
pretrained_safetensors_path=/path/to/model.safetensors |
|
|
``` |
|
|
|
|
|
Environment variables: |
|
|
|
|
|
* `DATA_PATH` β dataset path |
|
|
* `CHECKPOINT_DIR` β checkpoint to load |
|
|
|
|
|
--- |
|
|
|
|
|
## π Resources |
|
|
|
|
|
- **Code:** https://github.com/pulp-bio/BioFoundation |
|
|
|
|
|
--- |
|
|
|
|
|
# π Citation |
|
|
|
|
|
Please cite TinyMyo using: |
|
|
|
|
|
```bibtex |
|
|
@misc{fasulo2025tinymyotinyfoundationmodel, |
|
|
title={TinyMyo: a Tiny Foundation Model for Flexible EMG Signal Processing at the Edge}, |
|
|
author={Matteo Fasulo and Giusy Spacone and Thorir Mar Ingolfsson and Yawei Li and Luca Benini and Andrea Cossettini}, |
|
|
year={2025}, |
|
|
eprint={2512.15729}, |
|
|
archivePrefix={arXiv}, |
|
|
primaryClass={eess.SP}, |
|
|
url={https://arxiv.org/abs/2512.15729}, |
|
|
} |
|
|
``` |
|
|
|
|
|
--- |
|
|
|
|
|
# π§ Contact & Support |
|
|
|
|
|
* Questions or issues? |
|
|
Open an issue on the **BioFoundation GitHub repository**. |