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.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support