← Back Case study · Vision to emissions Ingestion live · since Oct 2025

Traffic Emissions

Ninety public traffic cameras, polled every three minutes, turned into an hourly, street-level emissions ledger for Singapore: vehicle detection, class-aware emission factors, coverage-corrected aggregation, and maps that show where the grams actually come from.

Designer · Sole engineer Centre for Climate Change and Environmental Health, NTU Oct 2025 to Jul 2026 · ingestion live Python · YOLO · Dash · Supabase

00 / 04Context

The problem.

Emissions inventories are annual, coarse, and late. Health studies and hotspot analysis want the opposite: hourly, street-level, current. Singapore already publishes traffic-camera frames every few minutes on its open data platform, so the question became: can existing public infrastructure be turned into a defensible emissions measurement system, with no new hardware?

The answer is a pipeline that has been collecting continuously since 7 October 2025: 11.4 million frames and 1.7 TB of imagery so far, distilled into 10.5 million analytics rows of hourly traffic and emissions by pollutant and vehicle class.

01 / 04Pipeline

Frames to grams.

→ 01

Capture

The open traffic-camera API is polled every three minutes, about 480 batches a day, each frame archived with a manifest for full replayability.

→ 02

Detect

YOLO detection over every frame, keeping four vehicle classes (car, motorcycle, bus, truck) with explicit confidence gates. CPU-only on 32 cores: about 37 seconds per batch, no GPU required.

→ 03

Emissions

Per-class MOVES-proxy emission factors (ICCT figures adjusted with local fleet data) turn counts into per-frame emissions, reported by pollutant and vehicle class.

→ 04

Aggregate

Hourly totals are built by summing frame-level counts and applying a coverage correction for missing frames. Instantaneous per-frame rates are never averaged: that shortcut biases the numbers, so the pipeline refuses it.

→ 05

Explain

Emission-intensity and composition maps rebuilt every six hours, plus a Dash dashboard: flow per camera, emissions per camera, fleet mix, and a geolocated map coloured by grams per hour.

02 / 04Validation

Numbers that can be defended.

Camera-derived hourly counts were structurally validated against reference monitoring stations using normalised diurnal profiles: shape and peak timing rather than absolute magnitude, since cameras and fixed sensors see different slices of the same road. Agreement is strong on expressways and major arterials; mismatched pairs are flagged by nearest-link ratios and treated as diagnostics, not discarded.

The camera approach also captures what fixed sensors cannot: vehicle composition and congestion dynamics, which is exactly what emissions modelling and hotspot analysis need.

11.4MFrames archived
10.5MAnalytics rows
3minCapture cadence
4Vehicle classes
5Pollutants reported

03 / 04Result

What it proved.

Measurement from what exists

No new sensors, no procurement: a public camera feed became an hourly emissions ledger with vehicle composition attached, at the cost of compute and care.

Method over convenience

The defensibility work (coverage correction, structural validation, outlier framing) is what made the numbers usable in meetings with domain scientists, not the detector itself.

Honest status

The provider retired most expressway cameras on 30 June 2026, cutting the fleet from ninety to eight. Ingestion continues and the analytics track current data; the project's scope is now structurally limited by that feed.

What it taught

Measurement systems inherit the fate of their upstreams. Build the archive first (1.7 TB of replayable frames means the analysis can always be rerun) and treat every external feed as something that can vanish.

Next case study AQ Forecasting →
© 2026 Anthony Meijer · Singapore Traffic Emissions · CCEH, NTU