Case file 01
VoxelQ
Real-time queue wait-time estimator. Solves lagging feedback by tracking camera streams using YOLOv8 & ByteTrack, computing stable estimates via Little's Law.
Problem
Queue and crowd density are usually reported after the fact, if at all — by the time a manager sees a wait-time report, the line has already moved. There was no low-cost way to get a live, trustworthy estimate from an ordinary camera feed.
Context
Built as a lead portfolio project (evolved from an earlier concept called NetraScan) to prove out an end-to-end perception-to-decision pipeline: detect, track, model, serve, visualize — not just a detector demo.
Data
Live and recorded video streams processed frame-by-frame; per-frame detections are converted into zone-level occupancy counts rather than raw bounding boxes, which is the actual unit the wait-time model needs.
Approach
YOLOv8n handles detection and ByteTrack handles identity across frames, feeding a zone-counting layer. Wait time is estimated with Little's Law (L = λW) rather than a black-box regression, with a custom ArrivalFilter debounce layer added to stop the raw arrival signal from producing noisy, flickering estimates.
Analysis
Built in ten defined phases — detection, zone counting, Little's-Law estimation, the debounce layer, a FastAPI + WebSocket serving layer, PostgreSQL/Redis persistence, and a React dashboard styled like an operations board rather than a chart gallery.
Key findings
Hardened performance to process real-time streams with sub-50ms inference latency on standard frames, maintaining low-variance wait estimations.
Decision
Chose an interpretable queueing-theory model (Little's Law) over a purely learned estimator, trading some accuracy ceiling for a number a non-technical operator can actually reason about and trust.
Result
Deployed with a containerized Docker Compose stack across Render/Vercel; actively being hardened against out-of-memory errors.
Limitations
Little's-Law estimates assume a roughly steady-state arrival process, which breaks down under sudden bursts; the current debounce layer smooths noise but doesn't yet model burst regimes explicitly.
What I learned
That the hardest part of a real-time system isn't the model — it's the layer that turns a noisy raw signal into a number stable enough for a human to act on.
Next case file
SentinelAI→