# NeuroRVQ: Multi-Scale Biosignal Tokenization for Generative Foundation Models
|
|
|
|
## Downstream Performance
### EEG
| Model | Motor | ERP | Memory | Sleep* | Eyes | Mean | Size |
|-----------|-------|------|---------|---------|-------|--------|-------|
| NeuroGPT | 0.682±0.083 | 0.757±0.048 | **0.597±0.029** | 0.674±0.033 | 0.827±0.036 | 0.707±0.046 | 79.5M |
| CBraMod | 0.614±0.104 | 0.777±0.052 | 0.574±0.038 | 0.635±0.041 | 0.839±0.041 | 0.688±0.055 | 4.9M |
| BIOT | 0.443±0.079 | 0.500±0.000 | 0.510±0.018 | -- | 0.763±0.049 | -- | 3.2M |
| MIRepNet | 0.689±0.086 | -- | -- | -- | -- | -- | -- |
| LaBraM | 0.630±0.076 | 0.822±0.040 | 0.526±0.026 | 0.652±0.037 | 0.799±0.047 | 0.686±0.045 | 5.8M |
| EEGPT | 0.313±0.035 | 0.668±0.146 | 0.520±0.017 | 0.634±0.044 | 0.797±0.037 | 0.587±0.056 | 25.7M |
| **NeuroRVQ** | **0.700±0.073** | **0.876±0.033** | 0.574±0.027 | **0.728±0.028** | **0.869±0.026** | **0.749±0.037** | 5.9M |
We used the benchmark presented in IEEE MLSP 2025 Paper [Assessing the Capabilities of Large Brainwave Foundation Models](https://ieeexplore.ieee.org/document/11204282).
[Open-Source Benchmark Code Available](https://github.com/dykestra/EEG-Benchmarking)
### ECG
| Model | 5-class Accuracy | 5-class BAcc | 43-class Accuracy | 43-class BAcc |
|---|---|---|---|---|
| HuBERT-ECG | 72.60 | 60.23 | 62.49 | 20.71 |
| ECGFounder | **76.55** | **65.39** | 65.51 | 28.96 |
| **NeuroRVQ-ECG** | 70.19 | 64.50 | **79.17** | **58.33** |
[Open-Source Benchmark Code Available](https://github.com/dykestra/Biosignal-Benchmarking)
### EMG
| Model | DG BAcc ↑ | DG CLER ↓ | EPN-612 Acc | EPN-612 F1 | NinaPro DB5 Acc | NinaPro DB5 F1 | UCI-EMG Acc | UCI-EMG F1 |
|---|---|---|---|---|---|---|---|---|
| PhysioWave | 54.70 | 64.20 | 90.30 | 90.35 | 24.91 | 22.95 | 56.52 | 55.76 |
| TinyMyo | 39.70 | 64.20 | 84.68 | 84.68 | 25.26 | 23.29 | 85.99 | 85.66 |
| **NeuroRVQ-EMG** | **70.80** | **27.60** | **94.65** | **94.66** | **41.36** | **38.76** | **89.43** | **89.28** |
## Installation
```bash
conda create -n neurorvq python=3.10
conda activate neurorvq
# Install requirements
pip install -r requirements.txt
```
## Download Models
The models and the sample biosignal for reconstruction demos can be downloaded manually from [HuggingFace]() or using python:
```python
from huggingface_hub import hf_hub_download
hf_hub_download(repo_id="ntinosbarmpas/NeuroRVQ", filename="pretrained_models/tokenizers/NeuroRVQ_EEG_tokenizer_v1.pt", local_dir="./")
hf_hub_download(repo_id="ntinosbarmpas/NeuroRVQ", filename="pretrained_models/foundation_models/NeuroRVQ_EEG_foundation_model_v1.pt", local_dir="./")
hf_hub_download(repo_id="ntinosbarmpas/NeuroRVQ", filename="pretrained_models/tokenizers/NeuroRVQ_EMG_tokenizer_v1.pt", local_dir="./")
hf_hub_download(repo_id="ntinosbarmpas/NeuroRVQ", filename="pretrained_models/foundation_models/NeuroRVQ_EMG_foundation_model_v1.pt", local_dir="./")
hf_hub_download(repo_id="ntinosbarmpas/NeuroRVQ", filename="example_files/eeg_sample/example_eeg_file.xdf", local_dir="./")
hf_hub_download(repo_id="ntinosbarmpas/NeuroRVQ", filename="pretrained_models/tokenizers/NeuroRVQ_ECG_tokenizer_v1.pt", local_dir="./")
hf_hub_download(repo_id="ntinosbarmpas/NeuroRVQ", filename="pretrained_models/foundation_models/NeuroRVQ_ECG_foundation_model_v1.pt", local_dir="./")
hf_hub_download(repo_id="ntinosbarmpas/NeuroRVQ", filename="pretrained_models/tokenizers/NeuroRVQ_PPG_tokenizer_v1.pt", local_dir="./")
```
## Model Loading / Usage
Load EEG tokenizer and see reconstruction results. Example for EEG tokenizer:
```python
from inference.run.NeuroRVQ_EEG_tokenizer_example import load_neurorqv_tokenizer
# Set run_example=True and plot_results=True to see reconstruction results
# Checkout the load_neurorqv_tokenizer() function to load and use tokenizer
load_neurorqv_tokenizer(run_example=True, plot_results=True, verbose=True,
model_path='./pretrained_models/tokenizers/NeuroRVQ_EEG_tokenizer_v1.pt')
```
Load foundation model and see an example for fine-tuning. Example for EEG foundation model:
```python
from inference.run.NeuroRVQ_EEG_FM_example import load_neurorqv_fm
# Checkout the load_neurorqv_fm() function with fine_tuning=False to see the correct model loading
# See the instructions in data.py for your custom dataset before setting fine_tuning=True
load_neurorqv_fm(fine_tuning=False, verbose=True,
model_path = './pretrained_models/foundation_models/NeuroRVQ_EEG_foundation_model_v1.pt')
```
Load EMG tokenizer and see reconstruction results (downloads mini version of emg2pose). Example for EMG tokenizer:
```python
from inference.run.NeuroRVQ_EMG_tokenizer_example import load_neurorqv_tokenizer
# Set run_example=True and plot_results=True to see reconstruction results
# Checkout the load_neurorqv_tokenizer() function to load and use tokenizer
load_neurorqv_tokenizer(run_example=True, plot_results=True, verbose=True,
model_path='./pretrained_models/tokenizers/NeuroRVQ_EMG_tokenizer_v1.pt')
```
Load foundation model and see an example for fine-tuning. Example for EMG foundation model:
```python
from inference.run.NeuroRVQ_EMG_FM_example import load_neurorqv_fm
# Checkout the load_neurorqv_fm() function with fine_tuning=False to see the correct model loading
# See the instructions in data.py for your custom dataset before setting fine_tuning=True
load_neurorqv_fm(fine_tuning=False, verbose=True,
model_path = './pretrained_models/foundation_models/NeuroRVQ_EMG_foundation_model_v1.pt')
```
Load ECG tokenizer and see reconstruction results (downloads and processes ptb-xl dataset). Example for ECG tokenizer:
```python
from inference.run.NeuroRVQ_ECG_tokenizer_example import load_neurorqv_tokenizer
# Set run_example=True and plot_results=True to see reconstruction results
# Checkout the load_neurorqv_tokenizer() function to load and use tokenizer
load_neurorqv_tokenizer(run_example=True, plot_results=True, verbose=True,
model_path='./pretrained_models/tokenizers/NeuroRVQ_ECG_tokenizer_v1.pt')
```
Load foundation model and see an example for fine-tuning. Example for ECG foundation model:
```python
from inference.run.NeuroRVQ_ECG_FM_example import load_neurorqv_fm
# Checkout the load_neurorqv_fm() function with fine_tuning=False to see the correct model loading
# See the instructions in data.py for your custom dataset before setting fine_tuning=True
load_neurorqv_fm(fine_tuning=False, verbose=True,
model_path = './pretrained_models/foundation_models/NeuroRVQ_ECG_foundation_model_v1.pt')
```
Load PPG tokenizer and see reconstruction results (downloads and processes samples from the BIDMC PPG dataset). Example for PPG tokenizer:
```python
from inference.run.NeuroRVQ_PPG_tokenizer_example import load_neurorqv_tokenizer
# Set run_example=True and plot_results=True to see reconstruction results
# Checkout the load_neurorqv_tokenizer() function to load and use tokenizer
load_neurorqv_tokenizer(run_example=True, plot_results=True, verbose=True,
model_path='./pretrained_models/tokenizers/NeuroRVQ_PPG_tokenizer_v1.pt')
```
## Citation
```
@misc{neurorvq,
title={NeuroRVQ: Multi-Scale Biosignal Tokenization for Generative Foundation Models},
author={Konstantinos Barmpas and Na Lee and Dimitrios Chalatsis and William Raftery and Yannis Panagakis and Dimitrios A. Adamos and Nikolaos Laskaris and Alexandros Koliousis and Dario Farina and Stefanos Zafeiriou},
year={2026},
eprint={2510.13068},
archivePrefix={arXiv},
primaryClass={cs.LG},
url={https://arxiv.org/abs/2510.13068},
}
```