Vega - radar micro-Doppler activity & fall detection (CfC)
Liquid Neural Network (CfC) that classifies six human activities from raw FMCW radar, including falls. No camera, no wearable, works in the dark.
Input: a 10-second FMCW recording. Output: walking, sitting down, standing up,
pick up object, drink water, or fall.
Shipped model is a 3-seed ensemble of the 112K-parameter CfC (3 x 112,134 parameters).
Results
Subject-wise split: 63 train / 21 validation / 22 test participants, 358 test recordings. No participant appears in more than one split.
Note: this differs from the split used in the previous revision of this card (74 / 15 / 17 participants, 276 test recordings), so the numbers are not directly comparable to that table.
| model | test acc | balanced acc | macro F1 | test loss |
|---|---|---|---|---|
| CfC, single seed (best of 3) | 0.844 | 0.845 | 0.848 | 0.745 |
| CfC, single seed (worst of 3) | 0.793 | 0.796 | 0.807 | 0.772 |
| CfC 3-seed ensemble | 0.880 | 0.880 | 0.887 | 0.504 |
| + fall threshold 0.30 (shipped) | 0.883 | 0.885 | 0.891 | - |
Per class, shipped configuration:
| class | precision | recall | F1 | support |
|---|---|---|---|---|
| walking | 0.985 | 1.000 | 0.992 | 64 |
| sitting down | 0.984 | 0.954 | 0.969 | 65 |
| standing up | 0.966 | 0.862 | 0.911 | 65 |
| pick up object | 0.735 | 0.781 | 0.758 | 64 |
| drink water | 0.722 | 0.800 | 0.759 | 65 |
| fall | 1.000 | 0.914 | 0.955 | 35 |
Fall operating point
Plain argmax over the ensemble gives fall recall 0.886 at precision 1.000. Because missing a
fall costs more than a false alarm, the shipped configuration predicts fall whenever the
ensemble's fall probability reaches 0.30. On this test set that raises fall recall to 0.914
while precision stays at 1.000, and overall accuracy rises slightly (0.880 to 0.883).
Lowering the threshold further does not recover more falls - recall plateaus at 0.914 - and starts costing precision (0.941 at 0.25, 0.889 at 0.15). Three of 35 falls are missed at every threshold tested.
Architecture
Conv1d(128->64, k5, s2) + BN + GELU x2 -> CfC(64) -> mean-pool + last step -> Linear(6).
The readout matters: with last-step-only readout both CfC and LSTM collapse to a single class (0.355 accuracy) on identical data.
Training recipe: OneCycleLR (max lr 1.2e-3), AdamW (weight decay 1e-2), 140 epochs, batch 64, label smoothing 0.05. Augmentation: time roll +/-25 frames, Doppler roll +/-4 bins, Gaussian noise (sigma 0.02), per-sample amplitude scaling +/-5%, and mixup (beta 0.3) on 30% of batches. Seeds 0, 1, 2; softmax probabilities averaged.
Ensembling is where the gain is - single seeds land at 0.79-0.84, the ensemble at 0.88.
Input pipeline
prep_glasgow.py: raw .dat I/Q -> range FFT -> MTI clutter removal -> sum range bins 2-40
-> STFT (nperseg 256, hop 32) -> 300 frames x 128 Doppler bins scaled to [0, 1].
Tied to the training radar configuration: 5.8 GHz carrier, 1 ms sweep (1 kHz PRF), 128 samples per sweep, 400 MHz bandwidth. Other sensors need retraining; the pipeline transfers.
Training data
University of Glasgow, Radar signatures of human activities, CC BY 4.0, https://researchdata.gla.ac.uk/848/ - 1,752 recordings, 6 classes, 106 participant-sessions.
Licence verified from the repository's own EPrints JSON export, where every file carries
cc_by_4, not from a third-party mirror.
No other dataset is used. Four open-licence radar datasets were evaluated as additional training data and all were rejected on practical grounds:
- Glasgow 2031 (IAA micro-Doppler, CC BY 4.0) - the ~35 GB data file is not directly downloadable; the repository requires a data request.
- OPERAnet (CC0 1.0, figshare) - downloads return HTTP 202 with an empty body; only 6 participants.
- Glasgow 1354 / NodeNS (CC BY 4.0) - raw 60 GHz TI mmWave RX cubes, ~4 scene configurations, 101 samples per class; not mergeable with 5.8 GHz FMCW spectrograms.
- RadHAR (BSD-3-Clause) - mmWave point clouds, a different representation entirely.
Usage
pip install torch scipy ncps
# defaults: 3-seed ensemble (vega_cfc_s0/1/2.pt) + fall threshold 0.30
python fall_detect.py --alert-only *.dat
# single seed, plain argmax
python fall_detect.py --model vega_cfc_s2.pt --fall-thresh 1.1 *.dat
Limits
pick up objectanddrink waterremain the weak pair (F1 0.758 and 0.759) - both are low-amplitude torso movements with similar Doppler signatures.- Three of 35 falls are missed at every threshold tested. Do not deploy this as the sole safety mechanism for an at-risk person.
- Single-radar, single-room, single-hardware. Accuracy on a different carrier frequency, sweep rate, or room geometry is unknown and likely much lower.
- 106 participant-sessions is a small population. Generalisation to ages, body types and mobility levels outside the Glasgow cohort is unverified.
ncpspatch required:ncps/torch/cfc.pysqueezestimespans[:, t]to shape(B,), which breaks broadcasting. Reinstallingncpsundoes the fix.