description
The production-hardened successor to PL02. Same violation ("pallet on the floor longer than violent_count seconds") but with the false-positive/duplicate machinery that real deployments needed: a per-track floor timer anchored by timestamp that RESETS when the pallet moves and re-anchors after track gaps; the violation threshold separated from the re-report cooldown (report_interval); slender side-on boxes get extra confirm time; a REGION-level cooldown (centroid distance + IoU vs recently fired locations) so tracker id churn on the same physical pallet cannot re-fire; and a guarded batch FSM — one-shot post-ready hold, one-shot near-grace while near-violation pallets exist, minimum emit gap, max batch wait force-fire, and a duplicate-signature guard. Evidence is sampled (first/last per video segment + midpoints, capped). Prefer PL03 over PL02 for new deployments; PL02 stays as the faithful simple port.
use cases
- aisle/staging-area blockage enforcement with operator-friendly, deduplicated alerts
- long-lived floor violations in scenes with flaky tracking (id churn handled by region cooldown)
- batched emission timing on busy docks (one event per pallet, released together)
limitations
- thresholds interact (hold/grace/gap/wait) — tune with real traffic, not defaults alone
- region cooldown radius is pixel-based; re-tune per camera geometry
- like PL02, cannot distinguish floor vs low rack without zones
- legacy nested-pallet suppression / pallet-merge preprocessing is not ported; the IoU 0.95 dedup is weaker against double-detections
config parameters
general
| Parameter | Type | Default | Notes |
|---|---|---|---|
| violent_count * | integer | 60 | seconds on floor → violation (min 1) |
| report_interval * | integer | 3600 | re-report cooldown per track/region (s) (min 1) |
zone
| Parameter | Type | Default | Notes |
|---|---|---|---|
| cam_zones | array of array of pair of number | [] |
advanced
| Parameter | Type | Default | Notes |
|---|---|---|---|
| pallet_classes | array of string | ["pallet", "product_package"] | |
| first_waiting_window_time | integer | 10 | (min 0) |
| max_batch_wait | integer | 90 | (min 0) |
| near_grace | integer | 10 | (min 0) |
| post_ready_hold | integer | 10 | (min 0) |
| min_emit_gap | integer | 60 | (min 0) |
| dup_guard | integer | 180 | (min 0) |
| max_track_gap | integer | 15 | (min 1) |
| moving_threshold | number | 0.1 | (min 0) |
| same_pallet_iou | number | 0.95 | (min 0, max 1) |
| side_face_extra | integer | 20 | (min 0) |
| side_face_aspect | number | 0.35 | (min 0, max 1) |
| region_centroid_dist | number | 100 | (min 0) |
| evidence_max | integer | 6 | (min 1) |
| evidence_window | integer | 90 | (min 1) |
golden replay cases
| Case | Frames | Expected events |
|---|---|---|
| pallet-on-floor | 13 | 1 |