What it is
OPERAnet is a synchronised multimodal human-sensing dataset from the University of Bristol OPERA project (Bocus et al., Scientific Data 2022). It records the same activities simultaneously through four modalities — WiFi CSI, Passive WiFi Radar (PWR), Ultra-Wideband (UWB, two passive receivers), and Microsoft Kinect v2 skeletons — so CSI-only, radar-only, UWB-only and vision pipelines can be compared on identical ground truth. ~8 hours of annotated measurements, up to 6 participants, two furnished office rooms. Intended for human activity recognition (HAR), device-free/non-collaborative localization, and crowd counting.
Paper (indexed in vault): bocus2022_ce7f ↗.
Verified specs
Confirmed by loading the real files (not just the README) and by the authors' own codes/ plotting scripts.
Experiments. Numbered exp001–exp061 (with gaps; not every modality captured every experiment). Activity/localization/crowd-count experiment types are split by number range (Table 2 in the paper):
exp002–exp018,exp020–exp033,exp056–exp061— activity recognition (one person performing the six activities, random or predefined order).exp028— crowd counting (up to 6 people; one steps out every 5 min).exp035–exp043static device-free localization;exp044–exp048dynamic device-free localization;exp049–exp054device-to-device localization (TX/RX at ±30°/±60°, no human).
Activities (6). Strings in the activity column: walk, sit (sitting down on a chair), stand (standing from chair), laydown/liedown (lying on the floor), standfromlie (standing from floor), bodyrotate (upper-body rotation). Non-activity frames are labelled noactivity.
Common label fields (present as the leading columns/cells of every modality — the basis of cross-modal time sync): timestamp (HH:MM:SS.fff), activity, exp_no, person_id ("One"…"Six"), room_no (1 = left room, 2 = right room), plus ground-truth 2D tag coordinates (tag4422_x/y, tag89b3_x/y, …) from the positioning UWB system.
| Modality | Dir / files | Format | Hardware | Contents (verified) |
|---|---|---|---|---|
| WiFi CSI | wificsi1/, wificsi2/ (one dir per receiver NUC) |
.mat (MATLAB struct) |
3× Intel NUC i5 (Intel 5300 NIC); NUC1/NUC2 = receivers, NUC3 = TX | struct with a timestamp vector + complex CSI vectors named tx<i>rx<j>_sub<k> (3 TX × 3 RX × 30 subcarriers), 40 MHz BW, ~1.6 kHz packet rate. wificsi2_exp001.mat alone is 1.1 GB. |
| PWR | pwr/ — 38 .mat |
.mat, var PWR cell array |
USRP-2945 SDR, 4 phase-coherent channels, 6-dBi directional antennas; illuminated by NUC3 CSI TX @1600 Hz | cell array (Nframes+1) × 8: header + exp_no, timestamp, activity, person_id, room_no, PWR_ch1, PWR_ch2, PWR_ch3. Each PWR_chX frame = 200 Doppler/velocity bins (3 surveillance channels rx2/rx3/rx4). CPI 1 s, 20 MHz/channel sampling; ~10 Hz frame rate. |
| UWB | uwb1/ (40 .csv), uwb2/ (40 .csv) |
.csv, one row per received UWB packet |
Decawave DW1000 (MDEK1001), two passive multi-static networks (uwb1 = yellow nodes, uwb2 = blue nodes) | 29 metadata cols (timestamp, activity, exp_no, person_id, room_no, tag x/y, left/right_arm_tag_id, anchor_node_xy_positions, fp_pow_dbm, rx_pow_dbm, tx_id, rx_id, tx/rx_x/y_coord, tx_rx_dist_meters, fp_index, fp_amp1-3, max_growth_cir, rx_pream_count, max_noise, std_noise) + CIR taps: cir1…cir35 (uwb1, 64 cols total) / cir1…cir50 (uwb2, 79 cols total). CIR sample period ≈ 1.0016 ns; CIR pre-normalised by preamble count. |
| Kinect | kinect/ — 36 .mat |
.mat, var Kinect cell array |
2× Microsoft Kinect v2 (IR depth + skeletal tracking) | cell array (Nframes+1) × 7: header + exp_no, timestamp, activity, person_id, room_no, Kinect1_Markers, Kinect2_Markers. Each KinectN_Markers = 19 skeleton joints × 3D (x,y,z) float64 at 10 Hz frame rate. |
| Ground truth | (in UWB/CSI/Kinect tag columns) | — | Decawave MDEK1001: 11 wall-mounted anchors, DRTLS app | Person wore 2 tags (IDs 4422, 89b3) on either arm; 2D xy logged @10 Hz. exp028 used up to 6 tags. |
| codes | codes/ — 14 files (.m, .py) |
scripts | — | Authors' plotting/demo scripts: plot_wificsi.m, plot_pwr_spectrogram.py, plot_uwb.m, plot_kinect_data.m, stick-figure/skeleton helpers. Useful as ground-truth documentation of each .mat/.csv layout. |
Acquisition & storage
- Provenance: Figshare collection
5551209(7 per-modality zip articles:codes, wificsi1, wificsi2, pwr, uwb1, uwb2, kinect), CC0 1.0 — free to redistribute. - Our copy: mirrored to Hetzner S3 at
s3://monad-knowledge/datasets/operanet/, upstream folder tree preserved (codes/ kinect/ pwr/ uwb1/ uwb2/ wificsi1/ wificsi2/), uncompressed.status: acquired-partial—wificsi1/is not yet uploaded (was still downloading upstream when this note was written); everything else (231 files / ~63.3 GB) is present. - Loading (bounded, S3-only per the datasets contract): read
datasets/operanet/_manifest.jsonfirst, filterfiles[]bymodality/exp_no/ext, thenget_bytes/byte-range the subset you need — never sync the whole 60 GB+ corpus locally..matfiles are classic v7 (scipy.io.loadmat); UWB.csvare plain CSV (CIR columns are complex-valued strings). See.claude/skills/datasets/references/s3_dataset_loader.py.
Why it matters here
- The clean-real anchor the sim corpus lacks. OPERAnet is CC0 real CSI + radar + UWB + vision on shared ground truth — exactly the kind of public, multi-session real data the journal-publication strategy flags as required to counter the "no first-party real CSI" integrity gap, and a natural zero-shot / cross-dataset generalization target.
- Cross-modal calibration. Synchronised CSI + PWR Doppler + UWB CIR against Kinect skeletal ground truth is a direct testbed for the thesis's BLE-calibrated-CSI direction and for cross-modal disagreement→drift detection.
- Crowd counting.
exp028(6→1 people, stepwise) is a real graded-occupancy trace to check the observability/occupancy findings against real hardware rather than ray-traced CSI. - Complements huang2025_060d (multi-user WiFi HAR) as a second, multimodal real benchmark.