Skip to content

Commit f05e727

Browse files
authored
Merge pull request #15 from or4k2l/copilot/document-pvs-validation-results
docs: Document PVS validation failure and update README with honest limitations
2 parents 3d62da8 + faac7f5 commit f05e727

1 file changed

Lines changed: 39 additions & 5 deletions

File tree

README.md

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,9 @@ clf.predict(arr)
9191
|-----------|--------|
9292
| **GPS speed is mandatory** | `velocity` must come from real GPS (e.g. u-blox NEO-M9N). Integrated-acceleration proxies degrade vehicle-class accuracy to near-zero. |
9393
| **IMU-only mode** | Without real GPS speed, only the `human` class is reliably classified (~93%). All vehicle classes (`car`, `truck`, `bicycle`) collapse. |
94-
| **Synthetic training** | The classifier is trained on synthetic data. Cross-domain performance on real-world data depends on GPS availability. |
94+
| **Synthetic training** | The classifier is trained on synthetic data. Cross-domain performance on real-world data depends on GPS availability and road surface conditions. |
95+
| **Dashboard IMU dampens engine frequency** | When the IMU is mounted on the dashboard (not engine mount), motor vibration at 5 Hz (car) and 8 Hz (truck) is attenuated. `vib_freq` becomes unreliable as a car/truck discriminator. |
96+
| **car vs truck on dashboard IMU** | See PVS Validation section below. Without real truck reference windows from the same road surface, car/truck separation is not achievable with synthetic-only training. |
9597

9698
### Real-World Validation — Collecty Dataset
9799

@@ -114,6 +116,38 @@ the `velocity` field.
114116
> of smartphone users — Collecty. *Data in Brief*, 109481.
115117
> <https://doi.org/10.1016/j.dib.2023.109481>
116118
119+
### Real-World Validation — PVS Dataset (Vehicle Classes)
120+
121+
Experiment: SGI-Machine classifier trained on synthetic data (300 samples/class),
122+
evaluated against the [PVS dataset](https://doi.org/10.1016/j.dib.2019.104863)
123+
(Brazil, 100 Hz dashboard IMU + 1 Hz GPS, 1,500 `car` windows, mean speed 34.5 km/h).
124+
125+
| Metric | Value |
126+
|--------|-------|
127+
| Dataset | PVS — Passive Vehicular Sensors (Menegazzo, 2020) |
128+
| IMU position | Dashboard (≈ smartphone in windshield mount) |
129+
| Windows evaluated | 1,500 (all ground-truth `car`) |
130+
| GPS speed | Real — mean 34.5 km/h, std 25.8 km/h |
131+
| Training | Synthetic only — 300 samples/class |
132+
| **car-Accuracy** | **0–21%** (across 8 calibration attempts) |
133+
| truck misclassification | 67–88% of car windows classified as truck |
134+
135+
**Why car/truck separation fails on dashboard IMU:**
136+
137+
1. **No real truck reference.** PVS contains only car windows — there are no real truck examples from the same road surface. Although the classifier was trained on synthetic truck data, it has never seen a real truck IMU recording from Brazilian roads, making it impossible to validate or calibrate the car/truck discrimination for this domain.
138+
139+
2. **Engine frequency is damped.** The dashboard IMU does not reliably capture the 5 Hz (car) vs 8 Hz (truck) engine signature — road surface broadband noise dominates the vertical acceleration PSD.
140+
141+
3. **Heading/yaw encodes road roughness, not dynamics.** On Brazilian roads, `heading_rms` and `omega_rms` reflect road surface irregularities transmitted through the suspension — not the vehicle's actual turning dynamics. This creates a systematic domain gap vs synthetic training data.
142+
143+
**What is needed for reliable car/truck classification:**
144+
- Real truck IMU windows from the same road surface and IMU mounting position, OR
145+
- IMU mounted on engine/drivetrain (not dashboard), OR
146+
- Additional sensor modality (e.g., acoustic, barometric)
147+
148+
> Menegazzo, J., & von Wangenheim, A. (2020). PVS — Passive Vehicular Sensors Datasets.
149+
> *Data in Brief*, 104863. <https://doi.org/10.1016/j.dib.2019.104863>
150+
117151
---
118152

119153
## Object Classes
@@ -122,8 +156,8 @@ the `velocity` field.
122156
|-------|------|----------|---------------|
123157
| `human` | 80 kg | 1.4 m/s | Gait ~1.8 Hz |
124158
| `bicycle` | 90 kg | 4.5 m/s | Cadence ~2.5 Hz |
125-
| `car` | 1500 kg | 13.9 m/s | Engine ~5 Hz |
126-
| `truck` | 15000 kg | 22.2 m/s | Diesel ~8 Hz |
159+
| `car` | 1500 kg | 9.5 m/s | Engine ~5 Hz |
160+
| `truck` | 15000 kg | 11.1 m/s | Diesel ~8 Hz |
127161
| `drone` | 1.5 kg | 8.0 m/s | Rotor ~50 Hz |
128162

129163
---
@@ -135,13 +169,13 @@ sgi/
135169
├── __init__.py ← public API: train, load, predict, predict_proba, info
136170
├── classifier.py ← SGILightClassifier
137171
├── _internal/
138-
│ ├── features.py ← SGIFeatureExtractor (11 features)
172+
│ ├── features.py ← SGIFeatureExtractor (14 features)
139173
│ ├── generator.py ← synthetic GPS+IMU data generator
140174
│ └── physics.py ← SGI-Full: K-field, gap analysis (theoretical)
141175
└── models/
142176
└── sgi_light_v1.pkl ← bundled pretrained model (after sgi.train().save())
143177
tests/
144-
└── test_sgi.py ← 37 tests, all passing
178+
└── test_sgi.py ← 54 tests, all passing
145179
```
146180

147181
---

0 commit comments

Comments
 (0)