Dimensioned layout of the deployment site for the Justice-Centered Edge AI shelf-monitoring prototype, reconstructed by reference-object photogrammetry from 250 video frames. Layout confirmed current as of Aug 2026.
Real frames from the site video with feature tags F1–F10 keyed to the trainable-feature inventory below. Green = detector targets and states, amber = confusers and special-case zones, dark = structure reference. Faces blurred / cropped per project privacy rules.
| Tag | Feature | Role in training |
|---|---|---|
| F9, F5 | Bare shelf / bare cubby: exposed shelf board or wire with nothing on it | The primary gap class. High-contrast, well-defined edges, consistent with the pooled retail gap data. Eight instances occur in this footage; all are labeled in the v1 set. |
| F1 | Dense can facade: uniform front-faced rows | The clean "full" state. Purchased-in-bulk stock makes this pantry more retail-like than the literature predicted; transfer should be good here. |
| F8 | Facade void: dark depth behind a 1-deep front row | Labeling policy: facade-only for v1 (matches what staff see at a glance) rather than visible-depth voids, applied consistently. |
| F2 | Sparse-by-design stock: 2 boxes in a 24" opening is normal | Why occupancy thresholds must be per-ROI, not global: "2 boxes" is FULL for the cereal bay and LOW for the can bay. Calibrate per cubby at install. |
| F3 | Wire-basket produce: loose fruit in black mesh baskets | Not a gap-detection problem: an emptying basket never exposes shelf board the same way. Give baskets their own ROI + heuristic (basket fill fraction or simple classification) in v2; exclude from v1 gap labels. |
| F7 | On-counter stock: bread crate, bag stacks | Needs its own ROI outside the cubby grid; crate walls partially occlude contents. v2. |
| F4 | Fruit-cutout wall decor: fruit-shaped, fruit-colored, above the shelves | Permanent fixture; a produce-trained model can false-positive here (confirmed in EXP-001). Mitigated by ROI cropping (decor sits above the cubby line); verified in EXP-002. |
| F10 | Glass + LED cold cases: reflections, condensation, cold color temperature | Out of v1 scope. Different exposure regime from the dry wall; monitoring it is its own project phase. |
| F6 | People and hands: client-choice shopping, mid-hours restock | Never a training target. Frames with people are transient occlusion: skip inference when motion is detected, or accept occluded readings and let the persistence filter absorb them. Frames are discarded either way. |
EXP-001 tested the retail-trained detector (0.90 mAP50 on supermarket data) on real pantry imagery; EXP-002 fine-tuned it on 15 hand-labeled frames from this room (7 gap boxes + 8 negatives, ~2 min of training on a laptop) and re-ran the same test on held-out images. Left column = before, right = after.
The on-device pipeline (repo: monitor/ + scripts/06_monitor.py) was implemented and exercised on 2026-08-15 using video frames as a stand-in camera. Frames are analyzed in memory and discarded; the only outputs ever written are occupancy numbers, shelf state, and the digest.
1 valid reading, 29 refused reason: scene mismatch, camera moved or blocked CAMERA COULD NOT READ (check lens/lighting): cubby top c1: no recent reading cubby top c2: no recent reading ...
Calibrated on one viewpoint, then fed 29 frames from other viewpoints. The guard refused all 29 rather than emit occupancy numbers for a scene it was not calibrated on. This is the intended behavior for a bumped or blocked camera.
Pantry shelf digest - Sat Aug 15 All 13 shelves OK. Nothing needs attention. occupancy: 13/13 ROIs = 1.00 (wall fully stocked: correct)
Both frames pass the guard; all 13 regions read fully stocked, matching the ground truth for that wall. The digest renders the steady-state output a healthy pantry should produce.
| Element | Estimate | Basis | Confidence |
|---|---|---|---|
| Cubby opening, interior | ~22–24" W × 13–14" H | 7–8 × 3.0" cans per row; 12" cereal box + clearance; 5 brick courses | HIGH |
| Countertop height | 36" | standard + person reference | HIGH |
| Openings per column | 2 | all frames | HIGH |
| Shelf-pin pitch on gables | 32 mm system | close-up frame | HIGH |
| Fridge bank width | 54" + ~27" ≈ 6.8 ft | SABA standard reach-in sizes | HIGH |
| Cubby depth | ~12–14" | cans 2–3 deep + box depth | MED |
| Counter-to-cubby gap | ~16–21" | brick count disagrees between frames (6–8 courses) | MED |
| Unit top above floor | ~84–85" | stack-up + full-overhead-reach test | MED |
| Room size | ~8–9 × 18–20 ft | fixture chaining, door + fridge yardsticks | MED |
| Aisle width | ~5.5–6.5 ft | room width − counter depth | MED |
| Column count | 8–10 | angles disagree (6 / 8 / 9–10 counted) | VERIFY |
| Fridge-bank wall orientation | far end, exact wall unclear | perspective ambiguity across frames | VERIFY |
| Format | How it presents | Detector implication |
|---|---|---|
| Canned goods | front-faced rows, 7–8 wide, 1–3 deep | closest to retail training data; facade can hide empty depth |
| Boxes (cereal, pasta) | 2–3 upright per opening | sparse-by-design; “2 boxes” is normal, not low |
| Bagged staples (rice) | bricked flat, 3–4 layers | reads as texture, not objects; gap detection fits |
| Loose produce | black wire baskets in openings (incl. two-tier) | basket fill ≠ shelf gap; needs its own heuristic |
| Bread | wooden crate on countertop | on-counter ROI, separate from cubby grid |
| Cold items | glass-door fridge/freezer, LED-lit | out of prototype scope; reflections + exposure fight |