← Traffic viewerVõ 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
| Parameter | Before → after | Evidence and limits |
| truckFraction of remaining four-wheel demand | 0 → 0.2 | Box/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 → 2 | No 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 demand | 0.1 → 0.05 | Passenger 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
- demand: Snapshots miss boundary crossings; occupancy cannot establish veh/h.
- motorbikeShare: Keep prior: one view does not observe all streams equally, and turning riders contaminate a whole-image count.
- speedsHeadwaysAccelerationLateralGaps: Unchanged: no reliable multi-frame identities, camera homography or distance scale. Wet pavement alone does not quantify these.
- roadWidths: Unchanged: camera perspective has not been rectified against surveyed control points.
- signalTiming: Not fitted: stopped/released groups are visible, but only part of a cycle was captured and the junction is outside the model boundary.
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
| Quantity | Pooled | Per-frame spread | Sample |
| Trucks, of four-wheelers | 0.0% | 0–0% over 9 frames | 0 of 94 |
| Buses, of four-wheelers | 0.0% | 0–0% over 9 frames | 0 of 94 |
| Bicycles, of two-wheelers | 0.0% | 0–0% over 9 frames | 0 of 101 |
| Two-wheelers, of all vehicles in view | 51.8% | 33–65% over 9 frames | 101 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.
- truckFraction — kept at 0.2, bounded at roughly 3.2%. Not one of 94 counted vehicles was read as this class. That bounds the rate at roughly 3.2% rather than establishing zero, and the frames are not independent samples, so the real bound is looser. The prior is kept; an absent class is not a removed class.
- busFraction — kept at 0.05, bounded at roughly 3.2%. Not one of 94 counted vehicles was read as this class. That bounds the rate at roughly 3.2% rather than establishing zero, and the frames are not independent samples, so the real bound is looser. The prior is kept; an absent class is not a removed class.
- bicycleOfTwoWheelers — kept at 0.02702702702702703, bounded at roughly 3%. Not one of 101 counted vehicles was read as this class. That bounds the rate at roughly 3% rather than establishing zero, and the frames are not independent samples, so the real bound is looser. The prior is kept; an absent class is not a removed class.
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.
| Mode | Read | Converted | Assumed | Observations | Applied |
| car | 0.4 vehicle lengths | 1.76 m | 1.6 m | 7 | yes Median of 7 standstill readings, converted through the modelled 4.4 m vehicle length. |
| motorbike | 0.2 vehicle lengths | 0.38 m | 0.65 m | 1 | no 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.
| Carriageway | Cars abreast | Implied width | Frames |
| Nearer | 4 | 8.5 m | 8 |
| Farther | 4 | 8.5 m | 9 |
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 corridor | Implied density | Demand that reproduces it |
| 80 m | 0.2708 veh/m | Observed density 0.2708 exceeds the model's 0.1977 veh/m at 7500 veh/h; the corridor saturates before reaching it |
| 120 m | 0.1806 veh/m | 6865 veh/h |
| 200 m | 0.1083 veh/m | 4317 veh/h |
| 300 m | 0.0722 veh/m | 3096 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
Limits of this reading
- A vision-language model reading a 512 x 288 frame can miss, merge or invent vehicles.
- Whole-image counts mix carriageways, turning traffic and parked vehicles; they are not corridor flow.
- Still frames carry no speed, headway or distance scale, so no metric parameter follows from them.
- Class boundaries, especially van against bus and scooter against bicycle, are the model's judgement.
- Camera pose is unsurveyed, so image regions are not mapped to modelled routes.
- Scale-free measurements use the vehicle as the ruler, so they inherit the model's class judgement and are coarse at this resolution.
- unanchoredGuesses are the model's impression of flow and speed with nothing to measure against. They are stored for comparison and never set a parameter.
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.
2026-09-19T16:23:45+07:00Several goods vehicles are visible, including two prominent departing box/covered trucks. Cars move through the junction; scooters cluster at the canal-side stop line.
Received UTC: 2026-09-19T09:23:53.593392+00:00
2026-09-19T16:23:57+07:00Cars and a dark passenger van/minibus approach. Canal-side scooters are still clustered. The passenger van is not classified as a full-size bus.
Received UTC: 2026-09-19T09:24:03.245745+00:00
2026-09-19T16:24:09+07:00Approaching cars have changed position. Canal-side scooters remain grouped by the crossing.
Received UTC: 2026-09-19T09:24:13.307306+00:00
2026-09-19T16:24:09+07:00 · REPEATED FRAMEByte-identical repeat of frame 002; excluded as an independent observation.
Received UTC: 2026-09-19T09:24:23.235744+00:00
2026-09-19T16:24:23+07:00Scooters cross/turn through the foreground while approaching four-wheel traffic is clustered behind the crossing. These turning scooters must not be counted as through-corridor demand.
Received UTC: 2026-09-19T09:24:33.278521+00:00
2026-09-19T16:24:35+07:00A red car crosses/turns in the foreground. Approaching main-carriageway vehicles are still clustered near the stop line.
Received UTC: 2026-09-19T09:24:43.285175+00:00
2026-09-19T16:24:47+07:00A similar approaching queue remains; two-wheel traffic moves along the canal side.
Received UTC: 2026-09-19T09:24:53.293584+00:00
2026-09-19T16:24:59+07:00Turning scooters and a red car occupy the foreground. This confirms junction movements absent from the current straight-route simulation.
Received UTC: 2026-09-19T09:25:03.570651+00:00
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.
Võ Văn Kiệt - Cầu Ông Lãnh 1 · 2.9 m from extended corridor. Beside the Nguyễn Thái Học end of the extended corridor. Shared car/motorbike carriageway visible.
Võ Văn Kiệt - Cầu Ông Lãnh 1 · 2.9 m from extended corridor. Beside the Nguyễn Thái Học end of the extended corridor. Shared car/motorbike carriageway visible.
Nearby cameras — excluded from parameter tuning
421.6 m from model. Nguyễn Văn Cừ junction outside the selected corridor.
508.2 m from model. Bridge traffic outside the selected corridor; not used to tune shares.
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.