Scope: Vision · 210k frames · Polyline & polygon labels
Outcome: Night/rain lane‑detection mAP +9 pts with flat labeling cost
Snapshot
-
Client: Mobility/ADAS team operating in multiple Indian cities (name withheld)
-
Data: 210k frames (1080p & 720p) from 1,900+ night/rain segments across 17 urban routes
-
Timeline: 6 weeks, secure VPC environment
-
Deliverables: Annotated dataset, guidelines, QA reports, format converters (CULane/TuSimple)
Client context
The client’s lane‑keeping stack struggled in low‑light, wet asphalt conditions. Puddles, headlight glare, and worn paint produced false lanes; legitimate lanes often disappeared under reflections. Their team needed production‑quality labels to retrain models without blowing the labeling budget.
Challenge
-
Glare & reflections: High‑luminance streaks and puddles mimicked dashed lines.
-
Worn & partial paint: Faded markings, construction zones, and irregular lane widths.
-
Occlusions: Wiper blades, vehicles, and roadside water spray.
-
Heterogeneous sensors: Mixed resolutions/FOVs and inconsistent camera pitch/roll.
-
Budget guardrail: Add rigor (consensus) where needed but keep cost flat overall.
What we labeled (schema)
-
Lane boundary polylines (per visible boundary), captured as ordered control points.
-
Attributes per segment:
solid | dashed | double,color: white | yellow,wornness: 0–3,occlusion: 0–2, and a reflection likelihood flag. -
Merge/split zones and gore areas as polygons to preserve topology.
-
“Maybe‑lane” tags on ambiguous sections to route frames to adjudication instead of forcing bad certainty.
Process
1) Pilot & calibration (first 1,000 frames)
We assembled an “edge‑case deck” of 120 images (puddles, zebra‑cross near-lane, bus‑only lanes, wet curb paint). Three tight guideline revisions came out of this pilot:
-
Treat continuous puddle highlights as non‑lane unless aligned with paint across ≥25 m in perspective.
-
For dashed lanes under glare, annotate the lane centerline continuity, not every light streak.
-
For worn markings, extend polylines through occlusions only if both pre‑ and post‑segments are consistent.
2) Targeted consensus instead of blanket triple‑labeling
We computed a frame ambiguity score (low median luminance, high specular index, high motion blur proxy).
-
Top ~22% of frames (most ambiguous) received consensus‑of‑3 with an adjudicator tie‑break.
-
Remaining frames got single‑pass labels with 10% stratified audit.
3) Speed without quality: pre‑label + snapping
We integrated a lightweight lane‑proposal model to auto‑suggest polylines; annotators edited rather than drew from scratch. A custom curvature‑snap tool locked control points to realistic cubic curves, reducing jitter.
4) QA you can measure
-
Inter‑annotator agreement for geometry: mean perpendicular distance (MPD) between polylines; target p95 ≤ 3.5 px (achieved 3.1 px).
-
Attribute agreement (κ): 0.88 across solid/dashed/color.
-
Gold‑frame seeding: 8–12 per batch with weekly drift checks and reviewer retraining when κ < 0.8.
Results
| Metric (Night + Rain hold‑out) | Before | After | Change |
|---|---|---|---|
| Lane‑detection mAP | 0.58 | 0.67 | +0.09 |
| CULane‑style F1 (overall) | 0.72 | 0.806 | +0.086 |
| False positives near puddles | — | — | −34% |
| Broken lane segments per km | — | — | −28% |
| Reviewer disagreement rate | 19% | 7% | −12 pp |
Cost & speed: By applying consensus only to flagged frames and using pre‑labels + snapping, we kept unit label cost within ±2% of the original budget while improving cycle time.
Downstream impact: The client reported fewer lateral “nudges” from their planner on wet nights and smoother lane continuity through merges/splits.
Security & compliance
-
Work executed inside a client‑approved VPC with S3‑equivalent object locks.
-
Faces/plates automatically blurred prior to labeling; no raw data left the environment.
-
Full audit trail: who changed what, when, and why (linked to guideline clauses).
Deliverables
-
Annotated frames with polylines/polygons + attributes (JSON)
-
Converters to CULane and TuSimple formats
-
Guideline PDF (17 pages) with visual do/don’t examples
-
QA packet: MPD distributions, κ by attribute, confusion log (reflection vs. dashed, worn vs. occluded)
Tech stack
-
Annotation: CVAT (custom curvature‑snap plugin)
-
Automation: Python, OpenCV, NumPy, Shapely, FFmpeg
-
QA & reports: Jupyter, Pandas, lightweight internal dashboards

Written by
Oliver Thomas
Oliver Thomas is a passionate developer and tech writer. He crafts innovative solutions and shares insightful tech content with clarity and enthusiasm.




