← Traffic viewer

Võ Văn Kiệt · CCTV observations

Provisional visual tuning; not a fitted traffic calibration. The numerical adjustments below are exploratory priors, not measured traffic rates.

Võ Văn Kiệt - Trần Đình Xu 2 · 56de42f611f398ec0c48128a · 5.6 m from the model. Beside the extended corridor near Trần Đình Xu; southwest view into its original section. No surveyed camera pose or complete field-of-view polygon.

Eight captured frames, seven unique. Camera clock: 19 September 2026, 16:23:45–16:24:59 ICT. Wet pavement; 512 × 288 resolution. One repeated JPEG is excluded. Camera exposure times are read from the image, not inferred from the HTTP download time.

Changes applied to the default preset

ParameterBefore → afterEvidence and limits
truckFraction of remaining four-wheel demand0 → 0.2Box/covered goods vehicles clearly visible in primary frame 000 and farther back in the main lanes.
High that the class is missing; low for the chosen 20% fraction. Exploratory prior, not a measured share; 5.2% of all attempted arrivals at default mix. Truck dimensions and dynamics remain generic assumptions.
bicycleShare (%)8 → 2No confidently identifiable pedal bicycle in the inspected near-field samples; visible two-wheelers are predominantly scooters.
Low; small sample and occluded city-side traffic prevent a reliable absence claim. Conservative sensitivity setting, not an estimated rate. Keep nonzero bicycle traffic; original 8% remains available.
busFraction of remaining four-wheel demand0.1 → 0.05Passenger vans/minibuses should not all be rendered as 10.5 m buses; no clearly identifiable full-size bus in the primary near-field sample.
Low; a nearby bridge frame has buses but is outside this model. Exploratory prior, not an observed rate; 1.3% of all attempted arrivals at default mix.

At the default settings: motorbikes 72%, bicycles 2%, cars 19.5%, trucks 5.2%, buses 1.3%. Demand stays at the unmeasured 2,600 veh/h assumption. Select “Original illustrative” in the viewer to compare the original mix.

Parameters deliberately not fitted

Automated frame reading — Gemma-read draft (9 frames)

Vehicle classes were read by gemma-4-31b-it, a general vision-language model. It is not a trained traffic detector and was never checked against hand-labelled frames, so these counts carry an unmeasured error rate. They constrain the mix of vehicles, not the flow.

195 vehicles over 9 frames (2 byte-identical repeats skipped, 0 failed), mean 21.67 per frame, mean legibility 3.89/5. Prior profile: cctv. Minibuses and light vans were counted separately and folded into the model's "car" class, which the model renders at 4.4 m.

Pooled classes: motorbike 101 · car 83 · van 11

What the counts fixed

QuantityPooledPer-frame spreadSample
Trucks, of four-wheelers0.0%0–0% over 9 frames0 of 94
Buses, of four-wheelers0.0%0–0% over 9 frames0 of 94
Bicycles, of two-wheelers0.0%0–0% over 9 frames0 of 101
Two-wheelers, of all vehicles in view51.8%33–65% over 9 frames101 of 195

Pooled over frames captured about 12 s apart; a slow vehicle appears in several frames, so these are not independent observations and no interval is computed.

Rates the sample could only bound

A class nobody saw is not a class that is absent, so these keep their assumed value rather than dropping to zero.

Unresolved: truckFraction of remaining four-wheel demand

This reading: No vehicle in 9 frames was read as a heavy goods vehicle; 11 were read as vans or minibuses.
The earlier reading by eye: Box/covered goods vehicles clearly visible in primary frame 000 and farther back in the main lanes.

Unresolved, and deliberately so. The prior 0.2 truck fraction is kept, and the 11 vans were folded into "car". Pass --van-as truck to take the opposite reading. A 6.5 m truck and a 4.4 m car occupy different road space and accelerate differently, so the choice changes the simulation. It is a classification boundary at 512 x 288 on wet asphalt, not a count anyone can settle from these frames.

Standstill gaps

Gaps were read as multiples of the stopped vehicle's own length, which needs no camera scale, then multiplied by the length the model already gives that vehicle.

ModeReadConvertedAssumedObservationsApplied
car0.4 vehicle lengths1.76 m1.6 m7yes
Median of 7 standstill readings, converted through the modelled 4.4 m vehicle length.
motorbike0.2 vehicle lengths0.38 m0.65 m1no
Only 1 standstill reading, below the 3 needed to move a behaviour parameter. Recorded as evidence; the assumed 0.65 m stands.

Left alone: desired, accel, brake, headway, lateral. desired speed, acceleration, braking, time headway and lateral speed are rates. A still frame has no clock, and consecutive captures here are about 12 s apart, so a vehicle leaves the view between frames and nothing can be matched. These stay at their assumed values.

Carriageway width — reported, not applied

Cars abreast x 1.8 m modelled car width, plus 0.25 m clearance at each boundary and between vehicles. The clearance is an assumption; the car width is the model's own.

CarriagewayCars abreastImplied widthFrames
Nearer48.5 m8
Farther48.5 m9

The model currently uses mixed-west 6.4 m · cars-west 9 m · cars-east 6.4 m · bikes-east 3.2 m. Not applied. The camera pose is unsurveyed, so no image region maps to a named route, and the scene mesh is built from these widths at load time. Treat a disagreement as a reason to re-check the lane tags in data/street.json.

Are these frames usable for a flow at all?

No. Frames read as: free-flowing 3, mixed 6. 19.5% of counted vehicles were stopped. 6 of 9 frames read as queued or mixed and 19% of vehicles were stopped. Stopped vehicles accumulate, so occupancy no longer identifies an arrival rate: the same count is consistent with almost any demand. The demand estimates below are recorded but should not be applied.

What the model says when asked outright

Asked directly for a flow and a speed, it answered 1500 veh/h and 40 km/h (medians over 9 frames; per frame: 1200, 1500, 1200, 1500, 1800, 1200, 800, 1800, 2500). Neither sets anything. What the model answers when asked for a flow and a speed outright. A single frame has no clock, so these are impressions, not readings. They are stored next to the derived values so the two can be compared, and they set nothing.

Total two-wheeler share: left at the prior

Kept at the prior 74%. The readings put two-wheelers at 51.8% of vehicles in view, but this camera resolves carriageways unequally and the trunk carriageways are tagged motorcycle=no, so a whole-image share is not the corridor's mode split. Pass --apply-two-wheeler-share to use it anyway.

Resulting mix: motorbike 72% · bicycle 2% · car 19.5% · truck 5.2% · bus 1.3%

Demand: not fitted (2600 veh/h)

Demand stays at the prior. A still frame gives an occupancy, and occupancy only yields a flow once the visible length of corridor is assumed; see demandEstimates for how far the answer moves with that assumption.

Assumed visible corridorImplied densityDemand that reproduces it
80 m0.2708 veh/mObserved density 0.2708 exceeds the model's 0.1977 veh/m at 7500 veh/h; the corridor saturates before reaching it
120 m0.1806 veh/m6865 veh/h
200 m0.1083 veh/m4317 veh/h
300 m0.0722 veh/m3096 veh/h

Check this by eye. If demand really is 2600 veh/h, the camera would have to resolve about this much corridor to hold 21.7 vehicles. Compare it against the frames by eye; it is the cheapest available check on the reading. It works out to about 354 m. If the frames plainly do not show that much road, the prior demand is too low for what the camera sees; if they show more, it is too high.

Per-frame counts

FrameTotalClasses
56de42f611f398ec0c48128a_000.jpg18motorbike 6 · car 9 · van 3
56de42f611f398ec0c48128a_001.jpg37motorbike 21 · car 15 · van 1
56de42f611f398ec0c48128a_002.jpg14motorbike 8 · car 6
56de42f611f398ec0c48128a_004.jpg17motorbike 11 · car 5 · van 1
56de42f611f398ec0c48128a_005.jpg10motorbike 4 · car 5 · van 1
56de42f611f398ec0c48128a_006.jpg24motorbike 12 · car 11 · van 1
56de42f611f398ec0c48128a_007.jpg14motorbike 7 · car 6 · van 1
56de42f611f398ec0c481288_000.jpg29motorbike 16 · car 11 · van 2
56de42f611f398ec0c481288_002.jpg32motorbike 16 · car 15 · van 1

Limits of this reading

Readings: data/vlm/gemma-pass-002-reparsed/readings.json · prompt SHA-256 99ae7fb02b0e252d50a4973ef06f60039775a347c58d0330762ef10765596d8e

Primary camera samples

These are visual observations, not automated detections or line-crossing counts. A vehicle appearing in several images is not several arrivals. Foreground turning traffic is outside the straight-route model.

Extended corridor: Cầu Ông Lãnh camera

The corridor now reaches Nguyễn Thái Học (1.18 km). The initial sample above remains the basis of the provisional preset. Additional images show mixed car/motorbike use near the new endpoint; they do not establish new numerical traffic rates.

Nearby cameras — excluded from parameter tuning

Capture and provenance

Captured over SSH using the public JPEG endpoint and request pattern found in oracle:/media/150G/rainmap/src/fetch/check.py. The rainmap service and its camera lists were not modified. Frames remain local to this project.

Parameter and observation record · Capture timestamps and SHA-256 hashes · Camera proximity ranking

Camera images: HCMC traffic-camera portal. OSM geometry has separate attribution. Capturing these images does not assign them an OSM or project-code licence.