Skip to content
← Back to the work
ProjectComputer vision on commodity hardware2025

Smart RetailAnalytics

Footfall, occupancy and heatmaps from a store camera — running at 5.30 FPS with no GPU, no cloud, and no stored imagery.

Hover the panel to run it

Tracking people · nothing is stored

The problem

A store wants to know how many people came in, where they lingered, and how full it gets. The usual answer is a cloud vision service, which means shipping customer footage off-site and paying per frame forever.

The constraint

No GPU, no cloud, and no stored imagery — the last one by choice. Anything that keeps frames becomes a privacy liability, so the system had to compute its numbers and forget the picture, on whatever hardware the store already had.

What I built

  1. 01

    Detection and tracking that fit the budget

    YOLOv8n handles detection — the smallest model in the family, chosen because it fits a CPU budget — and SORT maintains identity between frames so a person crossing the door counts once rather than every frame.

  2. 02

    Occupancy and Gaussian heatmaps

    Tracked positions accumulate into Gaussian heatmaps showing where attention actually goes, alongside a live occupancy count.

  3. 03

    A dashboard, not a video feed

    React and Vite front the numbers. Nothing in the pipeline persists an image, so what the dashboard shows is all that ever exists.

What moved

5.30 FPSsustained on commodity hardware with no GPU
0 framesstored — privacy-preserving by construction, not by policy
validatedagainst real store footage rather than a benchmark set

Running

live_tracking · occupancy 10
Store camera view with tracked people in bounding boxes, per-section counts and a live occupancy readout
gaussian_heatmap.png
Gaussian heatmap of where shoppers spent time, with a low-to-high legend
Built with
PythonOpenCVYOLOv8nSORTReactVite
Open to 2027 new-grad rolesGet in touch →