Skip to content

feat: adaptive CSI classifier with signal smoothing (ADR-048)#144

Merged
ruvnet merged 1 commit intomainfrom
feat/adr-048-adaptive-classifier
Mar 5, 2026
Merged

feat: adaptive CSI classifier with signal smoothing (ADR-048)#144
ruvnet merged 1 commit intomainfrom
feat/adr-048-adaptive-classifier

Conversation

@ruvnet
Copy link
Owner

@ruvnet ruvnet commented Mar 5, 2026

Summary

  • Adaptive classifier (adaptive_classifier.rs): Pure Rust 15-feature multiclass logistic regression trained from labeled JSONL recordings, with softmax inference and JSON model persistence
  • Three-stage smoothing pipeline in main.rs: adaptive baseline subtraction (α=0.003), EMA+median motion scoring, hysteresis debounce (4 frames) — stabilizes noisy ESP32 CSI data
  • Vital signs smoothing: 21-frame trimmed mean, EMA α=0.02, dead-bands (HR±2 BPM, BR±0.5 BPM), outlier rejection — eliminates frame-to-frame jitter
  • Observatory UI improvements: lerp factor 0.04 for smooth HUD updates, auto-detect live server on startup
  • User guide: new sections for Observatory, adaptive classifier workflow, recording/training API, troubleshooting
  • ADR-048: documents the full adaptive classifier architecture

Closes #143

Test plan

  • Start sensing server with --source auto, verify ESP32 data flows
  • Record 4 labeled sessions (train_empty_*, train_still_*, train_walking_*, train_active_*)
  • Train via POST /api/v1/adaptive/train, check accuracy via GET /api/v1/adaptive/status
  • Verify smooth classification transitions in dashboard (no flickering)
  • Verify vital signs hold steady for 5-10+ seconds in Observatory
  • Verify POST /api/v1/adaptive/unload reverts to threshold-based classification

🤖 Generated with claude-flow

Add environment-tuned activity classification that learns from labeled
ESP32 CSI recordings, replacing brittle static thresholds.

- Adaptive classifier: 15-feature logistic regression trained from JSONL
  recordings (variance, motion band, subcarrier stats: skew, kurtosis,
  entropy, IQR). Trains in <1s, persists as JSON, auto-loads on restart.
- Three-stage signal smoothing: adaptive baseline subtraction (α=0.003),
  EMA + trimmed-mean median filter (21-frame window), hysteresis debounce
  (4 frames). Motion classification now stable across seconds, not frames.
- Vital signs stabilization: outlier rejection (±8 BPM HR, ±2 BPM BR),
  trimmed mean, dead-band (±2 BPM HR), EMA α=0.02. HR holds steady for
  10+ seconds instead of jumping 50 BPM every frame.
- Observatory auto-detect: always probes /health on startup, connects
  WebSocket to live ESP32 data automatically.
- New API endpoints: POST /api/v1/adaptive/train, GET /adaptive/status,
  POST /adaptive/unload for runtime model management.
- Updated user guide with Observatory, adaptive classifier tutorial,
  signal smoothing docs, and new troubleshooting entries.

Co-Authored-By: claude-flow <ruv@ruv.net>
@ruvnet ruvnet merged commit 5fa61ba into main Mar 5, 2026
@ruvnet ruvnet deleted the feat/adr-048-adaptive-classifier branch March 5, 2026 15:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tutorial: Train an Adaptive CSI Activity Classifier

1 participant