mirror of
https://github.com/ruvnet/RuView
synced 2026-07-22 17:23:19 +00:00
docs(adr-187): deprecate archive/v1 + honest three-tier model-weights labeling
Add archive/v1/DEPRECATED.md tombstone and a loud deprecation notice atop archive/v1/README.md: DensePoseHead is architecture-only (random kaiming_normal_ init, zero committed checkpoints under archive/v1/), superseded by the v2/ workspace and the wifi-densepose 2.x / ruview pip wheel. Add a 'Model weights: what's real, what's not' three-tier table to README.md and docs/user-guide.md distinguishing real+validated (presence 82.3%, MM-Fi pose 82.69% torso-PCK@20, count_v1), real-but-weak (committed pose_v1 at PCK@20=3.0%, runtime confidence=0 stub, below ADR-079 target), and architecture-only (archive/v1). Caveat the live single-ESP32 17-keypoint cog advertisement and answer #509 SISO / #1125. Refs #509, #1125
This commit is contained in:
@@ -58,7 +58,7 @@ RuView turns ordinary WiFi into a contactless sensor. A $9 ESP32 board reads the
|
|||||||
> | 💓 **Heart rate** | Bandpass 0.8–2.0 Hz, zero-crossing BPM | 40–120 BPM, real-time |
|
> | 💓 **Heart rate** | Bandpass 0.8–2.0 Hz, zero-crossing BPM | 40–120 BPM, real-time |
|
||||||
> | 👤 **Presence detection** | Trained head on Hugging Face ([`ruvnet/wifi-densepose-pretrained`](https://huggingface.co/ruvnet/wifi-densepose-pretrained); v2 encoder = 82.3% held-out temporal-triplet acc, honestly re-benchmarked) + a phase-variance fallback that needs no model | < 1 ms, ~30 s ambient calibration |
|
> | 👤 **Presence detection** | Trained head on Hugging Face ([`ruvnet/wifi-densepose-pretrained`](https://huggingface.co/ruvnet/wifi-densepose-pretrained); v2 encoder = 82.3% held-out temporal-triplet acc, honestly re-benchmarked) + a phase-variance fallback that needs no model | < 1 ms, ~30 s ambient calibration |
|
||||||
> | 🧬 **CSI embeddings** | 128-dim contrastive encoder shipped on Hugging Face, 4-bit quantised variant fits in 8 KB | **164,183 emb/s** on M4 Pro |
|
> | 🧬 **CSI embeddings** | 128-dim contrastive encoder shipped on Hugging Face, 4-bit quantised variant fits in 8 KB | **164,183 emb/s** on M4 Pro |
|
||||||
> | 🦴 **17-keypoint pose estimation** | `cog-pose-estimation` Cog v0.0.1 — signed aarch64 + x86_64 binaries on GCS, loads `pose_v1.safetensors` via Candle. Train your own from paired data in 2.1 s on an RTX 5080 ([ADR-101](docs/adr/ADR-101-pose-estimation-cog.md), [benchmarks](docs/benchmarks/pose-estimation-cog.md)). **SOTA on MM-Fi:** [`ruvnet/wifi-densepose-mmfi-pose`](https://huggingface.co/ruvnet/wifi-densepose-mmfi-pose) hits **82.69% torso-PCK@20** (ensemble 83.59%), beating MultiFormer (72.25%) and CSI2Pose (68.41%) on the matched MM-Fi `random_split` protocol — self-corrected and auditable on [AetherArena](https://huggingface.co/spaces/ruvnet/aether-arena) | 8.4 ms cold-start on a Pi 5 |
|
> | 🦴 **17-keypoint pose estimation** | `cog-pose-estimation` Cog v0.0.1 — signed aarch64 + x86_64 binaries on GCS, loads `pose_v1.safetensors` via Candle (the committed `pose_v1` is a **first-cut** on-device model: PCK@20 = 3.0%, below the ADR-079 ≥35% target, and its runtime path is still a `confidence=0` stub — see [Model weights: what's real, what's not](#model-weights-whats-real-whats-not); the **82.69%** figure below is the separate published MM-Fi benchmark, not this live cog). Train your own from paired data in 2.1 s on an RTX 5080 ([ADR-101](docs/adr/ADR-101-pose-estimation-cog.md), [benchmarks](docs/benchmarks/pose-estimation-cog.md)). **SOTA on MM-Fi:** [`ruvnet/wifi-densepose-mmfi-pose`](https://huggingface.co/ruvnet/wifi-densepose-mmfi-pose) hits **82.69% torso-PCK@20** (ensemble 83.59%), beating MultiFormer (72.25%) and CSI2Pose (68.41%) on the matched MM-Fi `random_split` protocol — self-corrected and auditable on [AetherArena](https://huggingface.co/spaces/ruvnet/aether-arena) | 8.4 ms cold-start on a Pi 5 |
|
||||||
> | 🚶 **Motion / activity** | Motion-band power + phase acceleration | Real-time |
|
> | 🚶 **Motion / activity** | Motion-band power + phase acceleration | Real-time |
|
||||||
> | 🤸 **Fall detection** | Phase-acceleration threshold + 3-frame debounce + 5 s cooldown ([#263](https://github.com/ruvnet/RuView/issues/263)) | < 200 ms |
|
> | 🤸 **Fall detection** | Phase-acceleration threshold + 3-frame debounce + 5 s cooldown ([#263](https://github.com/ruvnet/RuView/issues/263)) | < 200 ms |
|
||||||
> | 🧮 **Multi-person count** | Adaptive P95 normalisation + runtime-tunable dedup factor (`/api/v1/config/dedup-factor`, [#491](https://github.com/ruvnet/RuView/pull/491)). Six specialised learned counters available as Cogs: `occupancy-zones`, `elevator-count`, `queue-length`, `customer-flow`, `clean-room`, `person-matching` | Real-time, self-calibrating |
|
> | 🧮 **Multi-person count** | Adaptive P95 normalisation + runtime-tunable dedup factor (`/api/v1/config/dedup-factor`, [#491](https://github.com/ruvnet/RuView/pull/491)). Six specialised learned counters available as Cogs: `occupancy-zones`, `elevator-count`, `queue-length`, `customer-flow`, `clean-room`, `person-matching` | Real-time, self-calibrating |
|
||||||
@@ -204,7 +204,26 @@ The separate **17-keypoint pose-estimation model** is now published at [`ruvnet/
|
|||||||
python archive/v1/data/proof/verify.py
|
python archive/v1/data/proof/verify.py
|
||||||
```
|
```
|
||||||
|
|
||||||
Tracked in [#509](https://github.com/ruvnet/RuView/issues/509); see [ADR-079](docs/adr/ADR-079-camera-supervised-pose-finetune.md) phases P7–P9 for the camera-supervised fine-tune path.
|
Tracked in [#509](https://github.com/ruvnet/RuView/issues/509); see [ADR-079](docs/adr/ADR-079-camera-ground-truth-training.md) phases P7–P9 for the camera-supervised fine-tune path.
|
||||||
|
|
||||||
|
### Model weights: what's real, what's not
|
||||||
|
|
||||||
|
"WiFi → pose" means three different things in this repo, at three different maturity
|
||||||
|
levels. Read the label, not the headline ([ADR-187](docs/adr/ADR-187-archive-v1-deprecation-honest-labeling.md)):
|
||||||
|
|
||||||
|
| Tier | Checkpoint(s) | Honest status |
|
||||||
|
|------|---------------|---------------|
|
||||||
|
| **Real & validated** | [`ruvnet/wifi-densepose-pretrained`](https://huggingface.co/ruvnet/wifi-densepose-pretrained) (CSI encoder + presence head) · [`ruvnet/wifi-densepose-mmfi-pose`](https://huggingface.co/ruvnet/wifi-densepose-mmfi-pose) (17-keypoint pose) · `cog-person-count/count_v1` | **MEASURED / published.** Presence = 82.3% held-out temporal-triplet accuracy (the old "100% presence" figure was retracted); MM-Fi pose = 82.69% torso-PCK@20 on the `random_split` protocol. These are the pose/presence numbers the project stands behind today. |
|
||||||
|
| **Real but weak (honestly labeled)** | committed `v2/crates/cog-pose-estimation/cog/artifacts/pose_v1.safetensors` | First-cut on-device model. **PCK@20 = 3.0% / PCK@50 = 18.5%** on a 217-sample holdout — **below the ADR-079 target of ≥ 35%.** Learns coarse structure (`r_hip` 77% PCK@50); distal/face joints near-random. Its runtime path in `cog-pose-estimation/src/inference.rs` is still a centred-skeleton **stub returning `confidence=0`** — the weights are not yet wired in. Full disclosure in the [cog README](v2/crates/cog-pose-estimation/cog/README.md). |
|
||||||
|
| **Architecture only, no weights** | `archive/v1` `DensePoseHead` | Random `kaiming_normal_` init, **no checkpoint of any kind** (zero `.pth`/`.onnx`/`.safetensors` files under `archive/v1/`). Deprecated and superseded — see [`archive/v1/DEPRECATED.md`](archive/v1/DEPRECATED.md). Do not expect real pose output from it. |
|
||||||
|
|
||||||
|
**On the ESP32-SISO question ([#509](https://github.com/ruvnet/RuView/issues/509)):** a
|
||||||
|
single-antenna, 56-subcarrier CSI stream at a 20-frame window does *not* carry the
|
||||||
|
fine-grained spatial information the multi-antenna NIC research relies on — the cog
|
||||||
|
measurements above show distal/face joints near-random. The shippable pose accuracy the
|
||||||
|
project can stand behind today is the **MM-Fi benchmark number**, not a live single-ESP32
|
||||||
|
number. The path to a first *reproducible* on-device baseline (PCK@20 ≥ 35%) is tracked in
|
||||||
|
[ADR-079](docs/adr/ADR-079-camera-ground-truth-training.md) / [#645](https://github.com/ruvnet/RuView/issues/645) — do not advertise the live single-ESP32 17-keypoint feature without the "first-cut, below-target, runtime-stub" caveat until that baseline is measured.
|
||||||
|
|
||||||
|
|
||||||
## 🧩 Edge Module Catalog
|
## 🧩 Edge Module Catalog
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# ⚠️ DEPRECATED — `archive/v1` is unmaintained and superseded
|
||||||
|
|
||||||
|
**Do not build new work on this tree.** `archive/v1` is the original pure-Python
|
||||||
|
implementation of WiFi-DensePose. It is kept only as a research archive
|
||||||
|
(per [ADR-117 §1.3](../../docs/adr/ADR-117-pip-wifi-densepose-modernization.md)) and
|
||||||
|
as the host of one still-live deterministic proof (see "What still lives here" below).
|
||||||
|
Everything else in this directory is frozen and receives no fixes, reviews, or support.
|
||||||
|
|
||||||
|
Governed by [ADR-187](../../docs/adr/ADR-187-archive-v1-deprecation-honest-labeling.md).
|
||||||
|
|
||||||
|
## The one honest fact that trips people up
|
||||||
|
|
||||||
|
`archive/v1/src/models/densepose_head.py` defines a `DensePoseHead` neural-network
|
||||||
|
architecture (segmentation + UV-regression heads). **It ships no trained weights.** Its
|
||||||
|
`_initialize_weights()` uses `kaiming_normal_` **random initialization only** — there is
|
||||||
|
no checkpoint-loading path in the class, and there are **zero** `.pth` / `.onnx` /
|
||||||
|
`.safetensors` / `.pt` / `.ckpt` / `.bin` files anywhere under `archive/v1/`.
|
||||||
|
|
||||||
|
So: the architecture is *defined*, but it is **architecture-only**. Running it produces
|
||||||
|
random output, not real pose accuracy. This matches the technical review in
|
||||||
|
[#509](https://github.com/ruvnet/RuView/issues/509) — for *this tree*, the "network
|
||||||
|
defined, no pre-trained weights" observation is TRUE.
|
||||||
|
|
||||||
|
Real, trained, benchmarked weights **do** exist — just not here. They live in the
|
||||||
|
maintained `v2/` workspace and on Hugging Face (see next section).
|
||||||
|
|
||||||
|
## Use the maintained path instead
|
||||||
|
|
||||||
|
| You want… | Go here |
|
||||||
|
|-----------|---------|
|
||||||
|
| The maintained implementation | The **`v2/` Rust workspace** (repo root `../../v2/`) |
|
||||||
|
| A pip install | `pip install ruview` **or** `pip install wifi-densepose` (2.x) — the compiled PyO3 wheel ([ADR-117](../../docs/adr/ADR-117-pip-wifi-densepose-modernization.md)). The `wifi-densepose` **1.x** line is tombstoned on PyPI: `1.99.0` raises an `ImportError` telling you to migrate. |
|
||||||
|
| Real trained presence/encoder weights | [`ruvnet/wifi-densepose-pretrained`](https://huggingface.co/ruvnet/wifi-densepose-pretrained) — 82.3% held-out temporal-triplet accuracy |
|
||||||
|
| A real 17-keypoint pose model | [`ruvnet/wifi-densepose-mmfi-pose`](https://huggingface.co/ruvnet/wifi-densepose-mmfi-pose) — 82.69% torso-PCK@20 on MM-Fi `random_split` |
|
||||||
|
| The honest three-tier weights picture | The "Model weights: what's real, what's not" table in the root [`README.md`](../../README.md) and [`docs/user-guide.md`](../../docs/user-guide.md) |
|
||||||
|
|
||||||
|
## What still lives here (intentionally)
|
||||||
|
|
||||||
|
Only one thing under `archive/v1/` is still a live, cited signal: the deterministic
|
||||||
|
reference-pipeline proof —
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python archive/v1/data/proof/verify.py # must print VERDICT: PASS
|
||||||
|
```
|
||||||
|
|
||||||
|
This is the ADR-028 "Trust Kill Switch": it feeds a fixed reference signal through the
|
||||||
|
signal-processing pipeline and checks the SHA-256 of the output against a published hash.
|
||||||
|
It is a legitimate reproducibility witness and is **not** deprecated. Everything else in
|
||||||
|
this tree is.
|
||||||
@@ -1,3 +1,19 @@
|
|||||||
|
> ## ⚠️ DEPRECATED — unmaintained and superseded
|
||||||
|
>
|
||||||
|
> This tree is the **original pure-Python implementation** and is kept only as a research
|
||||||
|
> archive. It receives no fixes, reviews, or support. **Read [`DEPRECATED.md`](DEPRECATED.md) before using anything below.**
|
||||||
|
>
|
||||||
|
> - Its `DensePoseHead` is **architecture-only with random-initialized weights and ships no
|
||||||
|
> trained checkpoint** — running it produces random output, not real pose accuracy.
|
||||||
|
> - The maintained path is the **`v2/` Rust workspace** and the `wifi-densepose 2.x` / `ruview`
|
||||||
|
> pip wheel ([ADR-117](../../docs/adr/ADR-117-pip-wifi-densepose-modernization.md)). The
|
||||||
|
> `wifi-densepose` 1.x line is tombstoned on PyPI (1.99.0 raises `ImportError`).
|
||||||
|
> - Real trained weights live elsewhere: [`ruvnet/wifi-densepose-pretrained`](https://huggingface.co/ruvnet/wifi-densepose-pretrained)
|
||||||
|
> (presence, 82.3%) and [`ruvnet/wifi-densepose-mmfi-pose`](https://huggingface.co/ruvnet/wifi-densepose-mmfi-pose)
|
||||||
|
> (17-keypoint pose, 82.69% torso-PCK@20).
|
||||||
|
> - The only still-live artifact here is the deterministic proof `data/proof/verify.py`
|
||||||
|
> (ADR-028), which stays. See [ADR-187](../../docs/adr/ADR-187-archive-v1-deprecation-honest-labeling.md).
|
||||||
|
|
||||||
# WiFi-DensePose v1 (Python Implementation)
|
# WiFi-DensePose v1 (Python Implementation)
|
||||||
|
|
||||||
This directory contains the original Python implementation of WiFi-DensePose.
|
This directory contains the original Python implementation of WiFi-DensePose.
|
||||||
|
|||||||
+14
-1
@@ -1141,7 +1141,20 @@ What it ships (and what it does not):
|
|||||||
| Presence detection (occupied / empty) | ✅ Trained head — v2 encoder reports 82.3% held-out temporal-triplet acc (v1's "100% on validation" was a single-class recording — retracted, [#882](https://github.com/ruvnet/RuView/issues/882)) |
|
| Presence detection (occupied / empty) | ✅ Trained head — v2 encoder reports 82.3% held-out temporal-triplet acc (v1's "100% on validation" was a single-class recording — retracted, [#882](https://github.com/ruvnet/RuView/issues/882)) |
|
||||||
| 128-dim CSI embeddings (re-ID, similarity, downstream training) | ✅ Trained encoder |
|
| 128-dim CSI embeddings (re-ID, similarity, downstream training) | ✅ Trained encoder |
|
||||||
| Single-person breathing / heart-rate | ⚠️ Server still uses heuristic DSP — model does not replace this yet |
|
| Single-person breathing / heart-rate | ⚠️ Server still uses heuristic DSP — model does not replace this yet |
|
||||||
| 17-keypoint full-body pose | 🔬 No keypoint weights shipped yet — pose pipeline runs but without a learned head |
|
| 17-keypoint full-body pose | 🔬 This HF bundle ships no keypoint head — but real pose weights exist elsewhere; see the tier table below |
|
||||||
|
|
||||||
|
### Model weights: what's real, what's not
|
||||||
|
|
||||||
|
"WiFi → pose" means three different things in this repo, at three different maturity
|
||||||
|
levels. Read the label, not the headline ([ADR-187](adr/ADR-187-archive-v1-deprecation-honest-labeling.md)):
|
||||||
|
|
||||||
|
| Tier | Checkpoint(s) | Honest status |
|
||||||
|
|------|---------------|---------------|
|
||||||
|
| **Real & validated** | [`ruvnet/wifi-densepose-pretrained`](https://huggingface.co/ruvnet/wifi-densepose-pretrained) (encoder + presence head) · [`ruvnet/wifi-densepose-mmfi-pose`](https://huggingface.co/ruvnet/wifi-densepose-mmfi-pose) (17-keypoint pose) · `cog-person-count/count_v1` | **MEASURED / published.** Presence = 82.3% held-out temporal-triplet accuracy (the old "100% presence" figure was retracted); MM-Fi pose = 82.69% torso-PCK@20 on the `random_split` protocol. |
|
||||||
|
| **Real but weak (honestly labeled)** | committed `v2/crates/cog-pose-estimation/cog/artifacts/pose_v1.safetensors` | First-cut on-device model. **PCK@20 = 3.0% / PCK@50 = 18.5%** on a 217-sample holdout — **below the ADR-079 target of ≥ 35%.** Learns coarse structure (`r_hip` 77% PCK@50); distal/face joints near-random. Its runtime path in `cog-pose-estimation/src/inference.rs` is still a centred-skeleton **stub returning `confidence=0`**. Full disclosure in the [cog README](../v2/crates/cog-pose-estimation/cog/README.md). Do not advertise the live single-ESP32 17-keypoint feature without this caveat. |
|
||||||
|
| **Architecture only, no weights** | `archive/v1` `DensePoseHead` | Random `kaiming_normal_` init, **no checkpoint of any kind** (zero `.pth`/`.onnx`/`.safetensors` files under `archive/v1/`). Deprecated and superseded — see [`archive/v1/DEPRECATED.md`](../archive/v1/DEPRECATED.md). Do not expect real pose output from it. |
|
||||||
|
|
||||||
|
**Does it actually run, and can a single ESP32 do pose? ([#509](https://github.com/ruvnet/RuView/issues/509), [#1125](https://github.com/ruvnet/RuView/issues/1125))** Yes, it runs, and the results are reproducible: the deterministic signal-pipeline proof (`python archive/v1/data/proof/verify.py`, must print `VERDICT: PASS`), the committed pose training dump (`v2/crates/cog-pose-estimation/cog/artifacts/train_results.json`), and the auditable MM-Fi arena all back specific numbers. But a single-antenna, 56-subcarrier CSI stream at a 20-frame window does *not* carry the fine-grained spatial information the multi-antenna NIC research relies on — so the shippable pose accuracy the project stands behind today is the **MM-Fi benchmark number**, not a live single-ESP32 number. The path to a first reproducible on-device baseline (PCK@20 ≥ 35%) is tracked in [ADR-079](adr/ADR-079-camera-ground-truth-training.md) / [#645](https://github.com/ruvnet/RuView/issues/645).
|
||||||
|
|
||||||
### Download
|
### Download
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user