feat(perception): qualify bounded temporal stability
This commit is contained in:
@@ -0,0 +1,217 @@
|
||||
# LAB E22 — Bounded temporal stability
|
||||
|
||||
Date: 2026-07-23
|
||||
State: accepted diagnostic laboratory result
|
||||
Authority: observation only; commands and navigation/safety acceptance disabled
|
||||
|
||||
## 1. Purpose
|
||||
|
||||
LAB E22 tests whether the perception output already qualified by LAB E21 can
|
||||
be made materially calmer without losing the real-time envelope required for
|
||||
an unmanned vehicle.
|
||||
|
||||
This is not another model-quality run in isolation. The experiment adds the
|
||||
missing temporal output stage between AI inference and the operator/autonomy
|
||||
consumer:
|
||||
|
||||
- stabilize tracked 2D boxes without future-frame lookahead;
|
||||
- preserve short detector gaps with explicit, bounded holds;
|
||||
- stabilize map-frame 3D cuboids and their orientation;
|
||||
- reduce unsupported semantic label islands;
|
||||
- retain immutable raw camera, LiDAR, calibration and E21 inference evidence;
|
||||
- measure the added latency and memory bound.
|
||||
|
||||
## 2. Exact source
|
||||
|
||||
| Field | Value |
|
||||
| --- | --- |
|
||||
| Source LAB | `lab-e21-window2-d0201712` |
|
||||
| Source display name | `LAB E21.3 · Real-time 1× · synchronized 60s · d0201712` |
|
||||
| Physical source session | `20260720T065719Z_viewer_live` (`RAVNOVES00`) |
|
||||
| Source result | `e10-integrated-perception-5cbba0b9839ae843c05607cec8448a2b43464eb81edeb11cf7c01cfec8464c75` |
|
||||
| Camera source | `sensor.camera.right`, XGRIDS camera slot `camera_1` |
|
||||
| Resolution | 800 × 600 |
|
||||
| Window | 601 camera frames, 59.962 s |
|
||||
| Semantic masks | 121 |
|
||||
| Source detector | YOLOX-S, COCO-80 |
|
||||
| Source semantic model | EoMT Cityscapes large, FP16 |
|
||||
| Source inference hardware | NVIDIA GeForce RTX 4090 |
|
||||
| Source detector throughput | 9.865 FPS |
|
||||
| Source semantic throughput | 2.010 FPS |
|
||||
| Source world-state age | P95 174.40 ms; P99 289.03 ms |
|
||||
|
||||
The E22 postprocessor ran locally over the immutable E21.3 result. Its
|
||||
implementation is streaming-equivalent: one pass, no future-frame lookahead,
|
||||
bounded state, and no repeated neural inference.
|
||||
|
||||
## 3. Configuration
|
||||
|
||||
Profile:
|
||||
`experiments/perception/e22_temporal_stability_profile.json`
|
||||
|
||||
Profile SHA-256:
|
||||
`3d61b29562a851ec41e504bb175e392be874c4509e6944834a449d2e347022d2`
|
||||
|
||||
### 3.1 2D tracking
|
||||
|
||||
- adaptive center EMA: alpha 0.32–0.78;
|
||||
- adaptive size EMA: alpha 0.22–0.65;
|
||||
- center-velocity EMA: alpha 0.35;
|
||||
- large normalized innovation: reset, not forced smoothing;
|
||||
- missing observation hold: at most two camera frames;
|
||||
- class-consistent tracklet stitch: at most eight frames, IoU/center gated.
|
||||
|
||||
### 3.2 3D cuboids
|
||||
|
||||
- map-frame center EMA: alpha 0.28;
|
||||
- half-size EMA: alpha 0.18;
|
||||
- pi-periodic yaw EMA: alpha 0.18;
|
||||
- velocity EMA: alpha 0.25;
|
||||
- center innovation reset: above 2.0 m;
|
||||
- yaw innovation reset: above 55°;
|
||||
- last-supported cuboid hold: at most 350 ms.
|
||||
|
||||
The complete point cloud is not filtered or reduced by this stage. The ground
|
||||
and all other points remain available to mapping, terrain and traversability
|
||||
consumers.
|
||||
|
||||
### 3.3 Semantic output
|
||||
|
||||
The filter uses one previous mask and accepts a changed pixel immediately when
|
||||
the new label has spatial support. Unsupported isolated changes retain the
|
||||
previous label.
|
||||
|
||||
This is deliberately not called optical-flow propagation. It removes label
|
||||
islands but does not interpolate semantic geometry between the source model's
|
||||
2 FPS updates.
|
||||
|
||||
### 3.4 Hard bounds
|
||||
|
||||
- maximum track states: 128;
|
||||
- observed peak track states: 19;
|
||||
- semantic history: one 800 × 600 `uint8` mask;
|
||||
- estimated upper state bound: 1,004,288 bytes;
|
||||
- future-frame lookahead: zero.
|
||||
|
||||
## 4. Baseline versus E22
|
||||
|
||||
| Metric | E21.3 baseline | E22 | Change |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| 2D normalized acceleration, P95 | 0.5232 | 0.3938 | −24.7% |
|
||||
| 2D normalized size step, P95 | 0.2670 | 0.1520 | −43.1% |
|
||||
| 2D track count | 165 | 160 | −5 stitched identities |
|
||||
| Tracks lasting ≤2 frames | 34 | 0 | −34 |
|
||||
| 3D center step, P95 | 0.8174 m | 0.5698 m | −30.3% |
|
||||
| 3D half-size step, P95 | 0.0542 m | 0.0189 m | −65.1% |
|
||||
| 3D yaw step, P95 | 15.51° | 5.26° | −66.1% |
|
||||
| 3D discontinuity gaps | 174 | 87 | −50.0% |
|
||||
| Unsupported semantic change, mean | 0.03284% | 0.00718% | −78.1% |
|
||||
| Total semantic mask change, mean | 5.3658% | 5.3261% | −0.7% |
|
||||
|
||||
The distinction in the last two rows is important. E22 strongly reduces
|
||||
unsupported semantic noise, but it does not yet solve the larger inter-frame
|
||||
movement of semantic boundaries. That requires confidence-aware propagation
|
||||
or optical flow in a later experiment.
|
||||
|
||||
## 5. Temporal events and provenance
|
||||
|
||||
| Event | Count |
|
||||
| --- | ---: |
|
||||
| Tracklets stitched | 7 |
|
||||
| 2D held presentations | 639 |
|
||||
| 3D held cuboids | 472 |
|
||||
| 2D large-innovation resets | 60 |
|
||||
| 3D large-innovation resets | 69 |
|
||||
|
||||
The rise from 881 source accepted cuboids to 1,353 E22 presented cuboids does
|
||||
not mean 472 new measurements were invented. Those 472 are explicitly marked
|
||||
short holds of the last supported cuboid. Every hold is diagnostic and must
|
||||
not be interpreted as a fresh LiDAR association.
|
||||
|
||||
## 6. Added runtime cost
|
||||
|
||||
Measured on the local deterministic postprocessor:
|
||||
|
||||
| Stage | Mean | P95 | P99 | Max |
|
||||
| --- | ---: | ---: | ---: | ---: |
|
||||
| Per camera frame, 2D/3D/world state | 0.468 ms | 0.821 ms | 0.959 ms | 1.244 ms |
|
||||
| Per semantic frame | 3.463 ms | 3.650 ms | 3.815 ms | 4.054 ms |
|
||||
|
||||
At the source rates of approximately 10 camera frames/s and 2 semantic
|
||||
frames/s, this temporal stage consumes far less than one frame interval. It
|
||||
does not prove the complete live K1 path; it proves that this specific
|
||||
stabilization stage is not the real-time bottleneck.
|
||||
|
||||
## 7. Acceptance
|
||||
|
||||
All gates passed:
|
||||
|
||||
- 2D acceleration P95 reduction ≥20%;
|
||||
- 3D center-step P95 reduction ≥20%;
|
||||
- 3D yaw-step P95 reduction ≥20%;
|
||||
- unsupported semantic change reduction ≥10%;
|
||||
- camera-frame postprocess P95 ≤5 ms;
|
||||
- semantic-frame postprocess P95 ≤30 ms;
|
||||
- track-state bound respected;
|
||||
- source payloads immutable;
|
||||
- diagnostic authority only.
|
||||
|
||||
## 8. Published operator result
|
||||
|
||||
| Field | Value |
|
||||
| --- | --- |
|
||||
| Session ID | `lab-e22-3d61b295` |
|
||||
| Display name | `LAB E22 · Temporal stability · synchronized 60s · 3d61b295` |
|
||||
| Result ID | `e10-integrated-perception-416e8b326ea36e7d534aa9e92b9136c916c7be8cd4e86a1df0feb97bd0d67c71` |
|
||||
| Result size | approximately 7.0 MiB |
|
||||
| Rerun perception overlay | 7,896,401 bytes |
|
||||
| Catalog state | Ready |
|
||||
|
||||
UI acceptance on `http://127.0.0.1:8000/`:
|
||||
|
||||
- LAB E22 appears as a separate saved session;
|
||||
- the replay duration is 59.962 s;
|
||||
- AI overlay endpoint returns HTTP 200 and a valid `RRF2` payload;
|
||||
- `Объекты 2D`, `Сегментация`, and `Кубы 3D` become enabled;
|
||||
- all three layers can be enabled together;
|
||||
- the original point cloud remains visible;
|
||||
- the Mission Core server remained on PID 31145 throughout publication and
|
||||
acceptance.
|
||||
|
||||
## 9. Artifact hashes
|
||||
|
||||
| Artifact | SHA-256 |
|
||||
| --- | --- |
|
||||
| `result.json` | `00ebc409fd09faccd79cfff3342f109cbfba907880cc93cc834026e2ce104764` |
|
||||
| `run-report.json` | `cc1d775ae52d8faa7388ddc0a0c8aba0e53ff3e90ace46b2a3749f02dfeeb912` |
|
||||
| `fusion-frames.jsonl` | `456a7d8b1682b85856cbd036053e61be95a6d3fe18453277bcadde879bc9cb9c` |
|
||||
| `semantic-frames.jsonl` | `d52dfbb03877ec1e50da073a221f20f8b57e5c9669a0de4b16505caa97720e5e` |
|
||||
| `world-state.jsonl` | `281f26e5fd645ed995bf253bd0ff45bbc07476ef84a2c3df9b198bbc02ef44ca` |
|
||||
| `transient-perception.npz` | `84609a59abb437ffabc8ca3769327450da5d5250b16c4e1b5e5f7f2e9f73e90f` |
|
||||
|
||||
Runtime artifacts remain outside Git under `.runtime/`.
|
||||
|
||||
## 10. Honest limitations
|
||||
|
||||
- No ground-truth identities are available; tracklet stitching is evaluated
|
||||
through continuity metrics, not IDF1/HOTA.
|
||||
- Two-frame 2D and 350 ms 3D holds improve continuity but are not fresh sensor
|
||||
evidence.
|
||||
- E22 does not improve detector recall, class taxonomy, fisheye model quality
|
||||
or LiDAR association correctness.
|
||||
- Semantic boundaries are not optical-flow propagated.
|
||||
- The temporal code is streaming-equivalent, but this run consumed a recorded
|
||||
E21 result rather than the physical live K1 transport.
|
||||
- Navigation and safety authority remain disabled.
|
||||
|
||||
## 11. Next gate
|
||||
|
||||
The next experiment should move this exact bounded temporal state machine into
|
||||
the warm worker's live result path and rerun the same 60-second 1× envelope.
|
||||
The acceptance question is no longer “does it look calmer?” but:
|
||||
|
||||
1. does inline E22 preserve detector/semantic throughput and E21 age budgets;
|
||||
2. do real latest-wins replacements remain bounded;
|
||||
3. do operator-visible holds carry freshness state end to end;
|
||||
4. does memory remain flat during a longer replay;
|
||||
5. only after that, does a physical K1 shadow run reproduce the recorded gate.
|
||||
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"schema_version": "missioncore.e22-temporal-stability-profile/v1",
|
||||
"profile_id": "lab-e22-bounded-temporal-stability-v1",
|
||||
"mode": "recorded-streaming-qualification",
|
||||
"source": {
|
||||
"source_id": "sensor.camera.right",
|
||||
"resolution": [
|
||||
800,
|
||||
600
|
||||
],
|
||||
"calibration_slot": "camera_1",
|
||||
"calibration_sha256": "05f3ad9b38b3a4fc95388a8ec83da83c745e217709e51787b3d5aad0969f6fa9"
|
||||
},
|
||||
"tracking_2d": {
|
||||
"center_alpha_low": 0.32,
|
||||
"center_alpha_high": 0.78,
|
||||
"size_alpha_low": 0.22,
|
||||
"size_alpha_high": 0.65,
|
||||
"velocity_alpha": 0.35,
|
||||
"adaptive_innovation_low": 0.08,
|
||||
"adaptive_innovation_high": 0.3,
|
||||
"maximum_normalized_innovation": 1.2,
|
||||
"hold_frames": 2,
|
||||
"stitch_gap_frames": 8,
|
||||
"stitch_minimum_iou": 0.42,
|
||||
"stitch_maximum_normalized_center_distance": 0.22
|
||||
},
|
||||
"cuboids_3d": {
|
||||
"center_alpha": 0.28,
|
||||
"size_alpha": 0.18,
|
||||
"yaw_alpha": 0.18,
|
||||
"velocity_alpha": 0.25,
|
||||
"maximum_center_innovation_m": 2.0,
|
||||
"maximum_yaw_innovation_degrees": 55.0,
|
||||
"hold_seconds": 0.35
|
||||
},
|
||||
"semantic": {
|
||||
"mode": "spatially-supported-streaming-hysteresis-v1",
|
||||
"minimum_same_label_neighbors": 3,
|
||||
"class_count": 16
|
||||
},
|
||||
"bounds": {
|
||||
"maximum_track_states": 128,
|
||||
"maximum_track_idle_seconds": 1.25,
|
||||
"semantic_history_masks": 1
|
||||
},
|
||||
"acceptance": {
|
||||
"minimum_2d_acceleration_p95_reduction_fraction": 0.2,
|
||||
"minimum_3d_center_step_p95_reduction_fraction": 0.2,
|
||||
"minimum_3d_yaw_step_p95_reduction_fraction": 0.2,
|
||||
"minimum_semantic_unsupported_change_reduction_fraction": 0.1,
|
||||
"maximum_camera_frame_processing_p95_ms": 5.0,
|
||||
"maximum_semantic_frame_processing_p95_ms": 30.0,
|
||||
"maximum_track_states_observed": 128
|
||||
},
|
||||
"authority": {
|
||||
"commands_enabled": false,
|
||||
"navigation_or_safety_accepted": false
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user