Methodology Vehicle counting
We pull a fresh image from each of the 205 City of Calgary traffic cameras every 60 seconds and run a YOLO computer vision model over each frame to detect cars, trucks, and buses. Per-camera counts are averaged into 5-minute windows and stored continuously, building up a longitudinal record of vehicle density across the city.
Comparison — what "busier than usual" means
Each camera has its own pattern: a Tuesday at 8 AM doesn't look like a Saturday at 11 PM. We compare the current 15-minute count to the rolling baseline for that camera at the same hour and day of week (using the trailing 8 weeks of data once available). When today is meaningfully above or below that baseline, the camera is flagged as busier or quieter than usual.
Density vs. flow
We count vehicles visible in the frame , not vehicles per hour. This is intentional: slow or stopped traffic accumulates more vehicles in view, so density is a better proxy for how congested a spot feels than throughput. A free-flowing freeway camera may show fewer vehicles per frame than a backed-up arterial despite carrying more cars per hour.
Visual conditions — what the cameras see
A second vision model (Gemma 4 E2B, running locally on a small dedicated machine) looks at a rotating set of 24 corridor-anchor cameras every 15 minutes and classifies what it sees: visibility (clear / reduced / poor), road surface (dry / wet / snow / icy), lens state (clean / water / frost / dirt / blocked), and light level (daylight / dawn-dusk / night / glare). These observations are stored as typed columns — no free-text guessing. We picked this model from a benchmark that compared two variants against hand-labelled frames; the smaller variant was the more literal observer and won on most dimensions.
The corridor banner — how it's written
The strip at the top of the page summarises the city corridor by corridor. A small text-only model (Gemma 4 E4B) takes the structured visual observations, the live count comparisons, any active SODA incidents, and the current weather snapshot, and turns them into short descriptive phrases: "snow" , "wet" , "incident at 22 Ave" , "clear" . The model is constrained to a closed vocabulary and a strict no-advice rule: we describe what the cameras, weather, and incident feed actually show, never "drive carefully" or "avoid this route" . We're a data observatory, not a transportation authority — users decide for themselves. If the model ever drifts from descriptive language, a regex validator catches it and falls back to a deterministic templated output for that cycle.
Weather — microclimate, not one citywide reading
NW Calgary (foothills, higher elevation) and SE (drier, more chinook-influenced) can differ by 5–10°C and have completely different precipitation. So we sample current weather at the centroid of every Calgary community (~313 points) every 15 minutes via Open-Meteo's free forecast API, batched into a single API call. The chip in the banner shows the citywide average plus a microclimate note when quadrant temperatures diverge by more than 3°C. For longer-horizon analysis we also pull Environment Canada's daily station observations (climate ID 3031094, ~9 years of history) as a fully-licensed cross-check.
Limitations
Counts can underestimate when cameras are obstructed, poorly lit, or pointed at low-visibility weather. We don't track individual vehicles or measure speed. Comparison baselines need a few weeks of consistent data per (day-of-week, hour) bucket before they become statistically meaningful — the page launched its current methodology on May 1, 2026, so some flags will warm up over the coming weeks.
Why this exists
The City doesn't retain these counts. By saving every detection, we're accumulating a dataset for seasonal trend analysis, infrastructure impact studies, event-driven patterns, and before/after comparisons for road projects — none of which currently exist for Calgary.
Data sources: Camera images from City of Calgary ·
Incidents and construction from Calgary Open Data