FORGE β FOG Representation via Generative Encoding
Self-supervised spectral-temporal encoders for Freezing of Gait (FOG) detection from a single lower-back accelerometer. Pretrained by masked autoencoding on 11,724 h (~21M windows) of unlabeled at-home recordings from 65 participants, then trained for FOG detection on the 57-participant DeFOG cohort only. Evaluated with no target-cohort training on four external cohorts: FogAtHome-provoking, tDCS-FOG, Stanford and FogAtHome daily living.
Headline: the released MC probe ensemble reaches clinical-grade agreement with expert video annotation on an independent cohort β ICC(%TF) = 0.899 [0.700, 0.970], zero-shot, one IMU.
External results (released detector)
Nine-head MC frozen-probe ensemble (3 participant folds x 3 seeds), evaluated with no target-cohort training and the unchanged DeFOG operating point of 0.35.
| Cohort (N) β shift | AUROC | AP | ICC(%TF) |
|---|---|---|---|
| FogAtHome-provoking (12) β cross-study | 0.887 [0.830, 0.922] | 0.804 [0.573, 0.902] | 0.899 [0.700, 0.970] |
| tDCS-FOG (71) β cross-protocol | 0.917 | 0.812 [0.550, 0.923] | 0.876 |
| Stanford (7) β site / device / med state | 0.734 | 0.400 | -0.119 |
| FogAtHome daily living (11) β naturalistic* | 0.803 [0.737, 0.877] | 0.105 | 0.656 [-0.129, 0.872] |
* Daily living is scored inside a label-independent walking-and-standing domain
(58.18 h of 301.8 h, 2.92% FOG); it is gait-conditioned burden, not whole-recording
%TF. Stanford is negative evidence: discrimination survives the shift, the fixed
threshold does not (its oracle-rule threshold is 0.18). In-distribution reference:
window-level AP 0.730 on held-out DeFOG folds. Full definitions and confidence
intervals are in manifest.yaml under results:.
Released weights
Pretrained FORGE encoders (the backbones)
| Context | Window (frames) | File | Params |
|---|---|---|---|
| LC | 1000 | encoders/lc.ckpt |
14,147,072 |
| MC | 500 | encoders/mc.ckpt |
14,147,072 |
| SC | 200 | encoders/sc.ckpt |
12,918,272 |
Downstream classification checkpoints (57-participant DeFOG, 3-fold participant-level CV)
| File | Context | Phase | Fold |
|---|---|---|---|
classification/lc_probe_fold0.ckpt |
lc | probe | 0 |
classification/lc_probe_fold1.ckpt |
lc | probe | 1 |
classification/lc_probe_fold2.ckpt |
lc | probe | 2 |
classification/mc_probe_fold0.ckpt |
mc | probe | 0 |
classification/mc_probe_fold1.ckpt |
mc | probe | 1 |
classification/mc_probe_fold2.ckpt |
mc | probe | 2 |
classification/sc_probe_fold0.ckpt |
sc | probe | 0 |
classification/sc_probe_fold1.ckpt |
sc | probe | 1 |
classification/sc_probe_fold2.ckpt |
sc | probe | 2 |
classification/lc_finetune_fold0.ckpt |
lc | finetune | 0 |
classification/lc_finetune_fold1.ckpt |
lc | finetune | 1 |
classification/lc_finetune_fold2.ckpt |
lc | finetune | 2 |
classification/mc_finetune_fold0.ckpt |
mc | finetune | 0 |
classification/mc_finetune_fold1.ckpt |
mc | finetune | 1 |
classification/mc_finetune_fold2.ckpt |
mc | finetune | 2 |
classification/sc_finetune_fold0.ckpt |
sc | finetune | 0 |
classification/sc_finetune_fold1.ckpt |
sc | finetune | 1 |
classification/sc_finetune_fold2.ckpt |
sc | finetune | 2 |
classification/lc_supervised_fold0.ckpt |
lc | supervised | 0 |
classification/lc_supervised_fold1.ckpt |
lc | supervised | 1 |
classification/lc_supervised_fold2.ckpt |
lc | supervised | 2 |
classification/mc_supervised_fold0.ckpt |
mc | supervised | 0 |
classification/mc_supervised_fold1.ckpt |
mc | supervised | 1 |
classification/mc_supervised_fold2.ckpt |
mc | supervised | 2 |
classification/sc_supervised_fold0.ckpt |
sc | supervised | 0 |
classification/sc_supervised_fold1.ckpt |
sc | supervised | 1 |
classification/sc_supervised_fold2.ckpt |
sc | supervised | 2 |
What this release contains
All 27 classification heads are the seed-42 runs. The manuscript's released detector
averages nine heads (3 folds x 3 seeds) over one shared frozen encoder; the nine stored
encoder parameter sets are bit-identical, so encoders/mc.ckpt +
classification/mc_probe_fold(0, 1, 2).ckpt rebuild the seed-42 three-fold ensemble.
That is the configuration this project's evaluation scripts run, and it lands within about
0.02 of the nine-head numbers tabled above.
Usage
Checkpoints are slimmed PyTorch Lightning checkpoints (weights + config; optimizer state
stripped). Each keeps the state_dict and the hyper_parameters["config"] Pydantic config
used to rebuild the model β the same fields the evaluation pipeline reads.
import torch
ckpt = torch.load("encoders/mc.ckpt", map_location="cpu", weights_only=False)
state_dict = ckpt["state_dict"] # encoder weights
config = ckpt["hyper_parameters"]["config"] # Config object to rebuild the model
meta = ckpt.get("forge_meta") # name / context / phase / fold
Reproduce every paper number with the companion repo's reproduce-evaluations skill (see
manifest.yaml, shipped in this repo).
Code: github.com/Lior-Nis/forge.
Data: Liornis/fog-dataset.
License: MIT.