This week was heavy on measurement — hardware, pipelines, engagement. Five things I'm still thinking about.
1. Post-processing did more work than the model
I've been running an empty-shelf detector on a Raspberry Pi 3. The camera detects a single class — empty_space — and never tries to identify which product belongs in a gap. Which SKU goes there is a planogram lookup, not a vision problem.
The held-out test set gave mAP50 of 0.844. Usable, not spectacular. What actually made it work in practice were three post-processing stages, none of which required a better model:
- ROI mask — detections outside a pre-drawn shelf region are discarded, so a bag or hand passing in front doesn't fire.
- Baseline subtraction — a "full shelf" reference scan records the structural gaps that are always there; those are removed from every later scan.
-
Temporal majority vote — a detection is only
confirmedif it appears in at least 2 of the last 3 scans, which kills single-frame noise.
The Pi has now completed 19 real scans and correctly detected a gap on a real bookshelf. That result has more to do with those three filters than with the training run.
2. YOLO11n on Apple MPS: zero cloud spend for a usable model
The training setup: YOLO11n fine-tuned on 11,667 images merged from seven Roboflow Universe datasets, all CC BY 4.0 (a licence filter selects only commercially usable sets). Dataset split: 9,358 train / 1,162 valid / 1,147 test. I ran 60 epochs on Apple MPS — device="mps", imgsz=640, batch=16. Zero cloud GPU cost.
The final model exported to NCNN is 36 MB (model.ncnn.bin). The best.pt it came from is 18 MB. I'd been assuming vision-model fine-tuning meant renting an A100. The MPS path in Ultralytics is stable enough to close that gap for a dataset under 12k images at this resolution.
3. 8.5 seconds per inference is acceptable when you scan hourly
Running the NCNN model on the Pi 3 (906 MB RAM, arm64) at 416 px input — down from the 640 px training resolution, because the Pi 3 won't handle 640 comfortably — gives a median inference time of 8.5 seconds per scan. Measured across 19 scans; range 8.4–11.8 s. That's slow in any lab-benchmark sense.
But the design is hourly scans of a fixed shelf. At that cadence, 8.5 s per scan contributes less than 0.3% of the hour. Latency requirements belong to the polling interval, not to some abstract speed bar. If this were video at 30 fps the number would be disqualifying; at one scan per hour it's irrelevant. The Pi 3 is the right hardware for this use case precisely because it doesn't need to be fast.
4. Six failures hid in a green pipeline for 36 to 113 days
From an audit of a content pipeline's PDCA baseline (dates verified against commits in that article on three PDCA patterns):
| Failure | Days undetected |
|---|---|
| Price field returned discounted value; every caller quoted it as list price | 113 |
Reddit source 403'd; .catch(() => null) turned it into an empty array |
94 |
| 97 consecutive uploads failed the same distribution gate | 109 |
| Articles published for ~3 months with zero measured human readers | 91 |
| A hardcoded multiplier wrong since a one-day data anomaly | 36 |
The common shape: the job kept producing a well-formed file, so nobody looked inside it. An empty array is not obviously wrong. A green workflow run is not evidence that the content shipped. The counterexample from the same codebase: a fabricated number in one article was caught in ~2 days — the one stage where an independent review actually inspected the output's content instead of its existence.
5. Recap-style posts are outperforming pillar articles on reactions per post
From the Dev.to API, machine-counted on 2026-08-28: 262 published articles, 159 total reactions, 28 comments. Weekly-digest and recap-style posts had the highest median reaction count at 1.5. Articles published in the last 30 days averaged 1.26 reactions each against 0.42 for everything older — despite the older cohort having had months more exposure time.
I don't have a confident explanation. Possible factors: recap posts index across different keywords than pillar articles and get discovered via different paths; readers scroll past long technical posts but click "this week in X"; the format signals low reading commitment. Month 2 and 3 cohorts will say more. For now I'm treating it as a signal, not a conclusion.
Part of an ongoing 6-month experiment running three AI-curated directory sites. The technical claims here are real; this article was AI-assisted.
Top comments (0)