quang.duong
VI
Smart Mobility Engineer

Quang Nhat Duong

I build active-safety and driver-monitoring systems, and I test them hard enough to find out where they fail.

VGU × HAW Hamburg  ·  Ho Chi Minh City  ·  Open to a 6-month full-time internship in Vietnam
Portrait of Quang Nhat Duong
210 · 410
self-test checks and unit tests — logic and mocked tests, not vehicle runs — CI
45 / 45
simulated catalog cases met the criteria; the weather matrix still fails one case — reports
60
unseen drivers in the drowsiness evaluation — result
0.87
eye-state balanced accuracy on 13 unseen people (parked car) — report

Selected work

CARLA ADAS — active safety and a simulated L3-style fallback

2026

An end-to-end driving stack in the CARLA simulator: multi-sensor perception, a geometry-first emergency braking corridor swept through LiDAR rather than gated on a detector, a committed safety arbiter, and a reinforcement-learned cruise controller that only proposes a speed, clamped under a safety cap. Simulation only — nothing here has run on a vehicle.

The stack driving itself in Town02. Left: the swept braking corridor and tracked objects. Right: live speed, the arbiter state, the L3 mode and time-to-collision — here dropping into EMERGENCY_BRAKE at 0.2 s TTC.
Scenario suite
45 / 45
15 scenarios × 3 seeds, Town02, CPU inference, one run per case (2026-09-27, on the fixed harness). Smallest surface-to-surface clearance 0.88 m; no collision recorded.
Weather matrix
29 / 30
Core scenarios × 5 weather profiles. The gate failed: the pedestrian-crossing case reacted in 1.225 s in storm against a 1.0 s budget.
Offline tests
210 · 410
Self-test checks and unit tests (307 of them in CI), plus lint and static typing. They test logic with fixed inputs; they are not a coverage figure and not vehicle runs.

The history behind these numbers: an early run also reported 45/45, but with the reaction-delay criterion effectively switched off — the harness had no hazard origin to time from, so it could not fail. Once that was fixed, the 2026-09-19 run gave 43/45 and a failed gate. A later review of my own harness found more places where a missing or invalid measurement could count as a pass; after fixing them, the 2026-09-27 re-run gave the 45/45 above. That does not mean the late reaction is fixed: the same pedestrian case took between 0.5 and 1.225 s across runs and still fails in storm, and one run per case cannot separate a fix from luck. It stays an open finding.

A decision I made: braking triggers on a LiDAR/radar corridor check, not on detector confidence, so with the same geometry, path and sensor data a missed bounding box does not by itself remove a brake request. It still depends on valid range data and on the selected lane, and on a sensing envelope of about 30 m ahead. The learned cruise controller only proposes a speed under that envelope.

geometry-first AEBsimulated ODD → TOR → MRM DQN under a safety capYOLO · LiDAR · radar fail-closed teardown

Guardian Co-Pilot — driver monitoring

2026

A driver-state layer that sits above the ADAS and reads the person as well as the road: eyelid closure over a rolling window, the longest unbroken closure, and jaw opening — then explains every intervention in one sentence. Runs locally in Python; it has not been measured on embedded hardware.

0.000.250.500.751.00GRU (sequence)GRU (sequence): held out 0.53, in sample 0.730.53Hand-written ruleHand-written rule: held out 0.51, in sample 0.520.51Gradient boostingGradient boosting: held out 0.51, in sample 1.000.51Logistic regressionLogistic regression: held out 0.47, in sample 0.540.47Majority classMajority class: held out 0.27, in sample 0.300.27held out (60 unseen drivers)in sample
Every predictor, scored on drivers it never saw, against the same predictor scored on the rows it was fitted to. Gradient boosting reaches 1.00 in sample and 0.51 held out — the dashed span is everything that memorising bought it. The honest range for this problem is the left cluster.
60 unseen drivers
0.53
Held-out macro-F1, recurrent model, subject-disjoint 5-fold. The hand-written rule scores 0.51 on the same split.
Overfit gap
+0.20
In-sample minus held-out. A gradient-boosted baseline scores 1.00 in sample and 0.51 held out — a gap of +0.49.
Cross-dataset control
0.99 → 0.49
An image classifier trained with a random frame split, then tested on a different dataset. It lands on chance.

Read the first column as the real result: on drivers the model has never seen, this problem is hard, and the honest score is near the low end. The control experiment in the third column is the reason the numbers are reported this way — the same pipeline evaluated carelessly would have produced 99%, and that 99% would have meant nothing.

A decision I made: validation folds are split by driver, not by frame. Splitting by frame puts the same person on both sides and turns a memorised face into an apparent result.

Eye-state stage on strangers: on 13 people from the DMD dataset, leave-one-person-out, the eye open/closing/closed/opening classifier reaches 0.87 balanced accuracy, and the PERCLOS it produces is within 0.023 of the annotated value on average. Every recording is a parked car, and DMD has no drowsiness label, so this says nothing yet about drowsiness accuracy on the road.

The rule engine's demo on 6 labelled drives (3,600 frames at 20 fps) flags 2,083 of 2,100 impaired frames and 147 of 1,500 clear frames. Those thresholds were not tuned on held-out drivers, and neighbouring frames are not independent, so these are demo figures for six people — not a population rate, and not a measure of how often a driver would get a false alert per hour.

subject-disjoint foldsPERCLOS GRU · sequence modelMediaPipe leave-one-person-out

ByteLoop — EV tyre-wear particle capture

Wheel-mounted electrostatic capture for tyre and road-wear particles, with an ESP32 → MQTT → Supabase pipeline and a Flutter app for fleet operators. My part: the ESP32 code that reads the sensors.

Neural Voice Console

Speech-to-text and translation running fully offline, so no audio leaves the device: Whisper with a LoRA adapter and NLLB for translation. No accuracy figure is claimed here.

What I work on

01

Autonomous driving & ADAS

Perception, sensor fusion and committed active-safety arbitration, validated in simulation.

02

Computer vision & perception

Detection, tracking and lane estimation — resolved into metric range, not just boxes.

03

Embedded & IoT

ESP32 sensor reading inside a telemetry pipeline (MQTT, time-series backend). Growing this area next.

04

Applied machine learning

On-device models, and the evaluation discipline that tells you whether they actually work.

Experience

Nov 2025 – May 2026
Logistics & Finance Manager
Career Fair 2026 — Vietnamese-German University
Ran logistics and finance for a 1,000+ student event with 30+ companies including SAP, MiTek and Wanek — a budget over 300 million ₫ and a team of 8, across seven months.
Oct – Dec 2025
Student Volunteer
VGU Math Open Day · Germany–Vietnam Green Science Conference
Guided 200+ school students through hands-on mathematics, and supported a bilateral international science conference.
2019 – 2022
Class Representative & Competitor
Dinh Thien Ly High School
Class representative for three years; competed in city-level academic olympiads, the 30/4 Olympiad and chess.

Background

Recognition

Top 30 — Asian Hackathon for Green Future2026
Top 20 — Digiport Logistics Hackathon2025

Education

2025 – 2029
Vietnamese-German University
B.Sc. Smart Mobility Engineering — dual degree with HAW Hamburg, full tuition scholarship. Currently in the first year.

Contact

Looking for a 6-month full-time internship in Vietnam — ADAS, embedded software or computer vision. Start date flexible; happy to align with your team's schedule.

Happy to walk through any number on this page and show you where it came from, including the ones that got worse.