Asking the fleet what it is doing…
monad-knowledge Wi-Fi sensing lab · FIIT STU
Campaign

Sim-to-real count transfer: does synthetic-impaired CSI pretraining beat real-only at a small real budget?

c-sim2real-count-transfer · exp-csi-crowd

Archive snapshot, as of 18 h ago — the run corpus is rebuilt once a day, so this page is not a live reading. The fleet panel is the live one; it refreshes every 30 s.

Sessions

state
Session State Runs Synthesis Criticism Figures Verdict
9RQJP9Z8 2026-07-12T19:30 finished 0 Preflight resolved the prior BLOCKED session's dependency chain; corpus recipe validated on a probe cell (both hdf5 artefacts land); full 24-cell corpus + criteria 2/3 unresolved due to supervisor budget exhaustion — hand off to a fresh session with the recorded working grid.
1W5RD4M5 2026-07-12T18:54 finished 0 BLOCKED at preflight — no runs launched. Transfer reduction csi_sim2real_count_transfer.py is unwritten (blocks criteria 2 & 3 structurally); csi_impaired.hdf5 impairment contract (criterion 1) is undeclared in the brief params and unverifiable via any cheap MCP probe. Prerequisites must be met before a corpus session is worth CPU.

Brief

Question

Does a crowd-count model pretrained on synthetic (impaired) CSI — JuPedSim occupancy → Sionna RT channels with CFO/STO/phase-noise (IP-110) — and fine-tuned on a small real WiMANS budget beat a real-only model trained on the same small budget, on held-out real measurements (WiMANS leave-one-environment-out)?

This reactivates the deferred meta-hypothesis synthetic-csi-sim-to-real-transfer — the premise that licenses the whole simulation programme — now that a validated real count anchor exists. On 2026-07-12 the WiMANS leave-one-environment-out bake-off (monad_knowledge/notebooks/python/csi_wimans_count_feature_locus.py) confirmed count-signal-in-temporal-doppler: the transferable count signal lives in the Doppler/temporal structure (LOEO R²≈0.47), not the static amplitude level (LOEO R²=−0.11). That gives both the representation the transfer model should use and the real-only baseline to beat.

Why this framing (and not posture→Dataset B)

The alternative sim-to-real target considered was sitting/standing on csi-wifi-human-movement-detection (Dataset B). Rejected as the primary: the Sionna scene models a human as a coarse scatterer (body identifiable only from per-band attenuation, csi-body-em-fidelity), so it cannot render a faithful sitting-vs-standing geometry, whereas it does render crowd occupancy well (exp-csi-crowd, 0–N agents) — the sim's actual strength. WiMANS is also the stronger real anchor (multi-subject, multi-environment, labelled counts) validated in ①. Posture→B remains an exploratory secondary arm if the count-transfer lands.

Phase 2a — generate the synthetic corpus

Recommended: the plain sweep (no LLM supervisor — corpus generation is deterministic, so react-agent just burns token budget). The sim sweep CLI merges a base: config, so the whole base is folded automatically (the sim_sweep_launch MCP tool does NOT — session 01KXBWYQH23670XAGB9RQJP9Z8 found it starts from the simulator default floor a_seminar). Grid + base authored at monad_knowledge/sim/exp_csi_crowd/sweeps/sim2real-corpus.{grid,base}.yaml (24 cells = n_agents 0–5 × seed 0–3, 5 GHz, impairment on):

gh workflow run sim-sweep.yml \
  -f sim_id=exp-csi-crowd \
  -f grid_path=monad_knowledge/sim/exp_csi_crowd/sweeps/sim2real-corpus.grid.yaml \
  -f where=local

where=local is requiredsionna-csi-runner isn't on GHCR and MONAD_SIM_REMOTE_HOST is unset on the runner; the runner builds/runs it locally (~1 CPU-min/cell). The impairment/artefact contract is already verified (probe run 01KXBX1WN7WHKRQ04WKJPYA4M6: csi.hdf5 80 KB + csi_impaired.hdf5 673 KB + links.parquet). The sweep opens a PR with the synced run notes; harvest the run ids for the Phase 2b --sim-index.

Supervised alternative (sim-campaign.yml -f campaign_id=c-sim2real-count-transfer -f where=local -f supervisor=react-agent) resolves criteria 2/3 (sim_reduction_run multi_seed_ci / mann_kendall) via the analysis-writer, but needs a raised budget.llm_tokens — the 2026-07-12 session exhausted supervisor budget after the probe and sealed partial before the 24-cell corpus. Prior blockers are all fixed: impairment_profile present (criterion 1 passable), criteria now corpus-verification-only.

Phase 2b — the transfer test (separate reduction, after the corpus lands)

csi_sim2real_count_transfer.py is authored against the real corpus S3 paths once Phase 2a completes (writing it against a non-existent corpus is what got the first session blocked). It reads each run's csi_impaired.hdf5 (dataset H, shape [frame, link, rx, tx, sc]), builds an amplitude Doppler spectrogram (STFT over the frame axis, pooled over links/subcarriers — the count-signal-in-temporal-doppler representation), streams WiMANS 5 GHz the same way, and compares held-out real-WiMANS count error (leave-one-environment-out) for: real-only(k) · synthetic-impaired pretrain + k-shot real fine-tune · zero-shot(sim-only) · real-full, for k ∈ {5,10,20}/count. Claim (synthetic-csi-sim-to-real-transfer): pretrain+k-shot beats real-only at small k. Honesty gate: report zero-shot + the clean-vs-impaired ablation so any gain is attributed to transfer, not to the Doppler representation alone (which already reaches LOEO R²≈0.47 on real WiMANS with no sim — the ① 2026-07-12 result).

The reduction is authored + selftest-validated (--selftest fabricates a planted-signal sim+real corpus and confirms the full hdf5→spectrogram→CNN-pretrain/finetune→LOEO pipeline and that it recovers a sim-pretrain-helps-at-small-k effect when present). It runs standalone (not via csi-reduction.yml, which is scoped to the pure-sklearn reductions) with torch+h5py+boto3:

KMP_DUPLICATE_LIB_OK=TRUE OMP_NUM_THREADS=1 uv run --no-project --with numpy --with scipy \
  --with scikit-learn --with torch --with h5py --with boto3 \
  python monad_knowledge/notebooks/python/csi_sim2real_count_transfer.py \
  --sim-index sim_runs.json --band 5 --per-cell 60

where sim_runs.json is [{"csi_impaired": "<s3-key>", "n_agents": N}, ...] built from the Phase 2a campaign run list (sim runs). It streams WiMANS + reads the sim hdf5 from S3, so it is local-executable once the corpus lands (the tunnel permitting) or via a small dedicated CI job.

Statistics block — added 2026-09-04

The block above was absent until the 2026-09-04 session, which the /campaign-curious gate caught. Corpus generation itself is deterministic and needs none of it; the block exists so that criterion 2 is resolved as an exact per-seed trend test at a declared tau, and so that a supervised session cannot pool 24 correlated cells into one interval. The corpus is dispatched as the plain sweep (Phase 2a command above); the block binds whoever reduces it.

Phase 2a executed — 2026-09-04

Sweep 01M1P7DRCTFJN96E7Y8Q3G4YGQ ran locally (native Metal, ~23 s per cell): 20 of 24 cells pass, the four n_agents = 0 cells fail to couple (no trajectory), as the enlargement grid's header already records. Criterion 1 holds on every passing cell. Criterion 2, resolved per the statistics: block: clean channel monotone on 4 of 4 seeds (exact Kendall tau 1.0, p 0.008), impaired channel on 3 of 4 (tau 0.8, p 0.042). Criterion 3: classes 1–5 only. The trend is a discrete occlusion step that saturates by three agents; details and the reduction outputs are on csi-sim2real-transfer and under s3://monad-knowledge/sweeps/01M1P7DRCTFJN96E7Y8Q3G4YGQ/reduction/. Phase 2b has not run.

Phase 2a regenerated with the overlay — 2026-09-04

Decision: the occlusion-only corpus is kept as the baseline and the corpus is regenerated with scene_overrides.occupancy_diffuse ON (values as c-cac-drift), grid n_agents 1–5 × seeds 0–3, files sim2real-corpus-diffuse.{base,grid}.yaml. Phase 2b consumes the overlay corpus; the occlusion-only corpus is its ablation. Executed the same afternoon: sweep 01M1P939H07989R73Z2X1DS8RC, 20 of 20 cells, criterion 2 monotone on 4 of 4 seeds on both channels (tau 1.0, p 0.008), CV 0.37 → 0.56 as a straight line with near-zero seed spread — the designed IP-119 law, so a construction check. Comparison table on csi-sim2real-transfer. Phase 2b consumes 01M1P939H07989R73Z2X1DS8RC; 01M1P7DRCTFJN96E7Y8Q3G4YGQ is the ablation.

Phase 2b executed — 2026-09-04

Run on both corpora (01M1P7DRCTFJN96E7Y8Q3G4YGQ occlusion-only, 01M1P939H07989R73Z2X1DS8RC overlay): sim-pretrain + k-shot fine-tune within +0.006 R² of real-only at every k, intervals overlapping, zero-shot harmful on both. Null, replicated. Table on csi-sim2real-transfer §Phase 2b; the chain marks link 5 a documented negative.