Heoshua takes 2nd place at the 3LC Multi-Vehicle Detection Challenge
2nd place on Kaggle in a data-centric challenge where the model is frozen and only data quality counts. From 0.543 to 0.928 — and a first open-source model to show for it.
Heoshua takes 2nd place at the Kaggle 3LC Multi-Vehicle Detection Challenge — 192 teams, a frozen model, and one question: how far can you go by touching only the data?
A competition turned inside out
Normally you optimise the model. Here everything was locked: YOLOv8n trained from scratch, 640px input, no ensembles, no TTA, no pseudo-labeling, no external data. Architecture, starting weights, image size — frozen for everyone.
The only allowed lever is the data. Clean the labels, fix the train/val split, rebalance the sampling. That's the data-centric AI bet: when the model can't move, data quality is the differentiator.
What "2nd place" actually means — no rounding
Let's be precise. On the raw private leaderboard, our score of 0.92016 placed us 14th of 192. But this challenge wasn't a plain race for score.
To be eligible for a prize, a submission had to clear a strict bar: an on-time evaluation form, an accessible code repo, genuine use of 3LC, and full rules compliance (from scratch, 640px, no ensembles or TTA). Many higher scores didn't clear that bar. Among the eligible submissions, ranked by private score, we finish 2nd.
2nd — AYITEY Kodjo Josué. "Well documented data-centric work and a repeat strong performer." — hosts' official announcement
In other words: the rigor is the ranking. A good score that skips the data-centric discipline didn't count. That's exactly the spirit of the competition — and ours.
The journey: from 0.543 to 0.928
Iteration What changed Public LB baseline starter, 10 epochs 0.543 v3 hand-reviewed labels via a review grid 0.755 v5 sequence-aware split + 3LC sampling weights 0.927 v7 difficulty weighting (embedding clusters) 0.927 v12 (final) retrain on 100% of the labelled data 0.928Each jump comes from a different kind of lever — and all of them ride on 3LC primitives.
Review labels instead of trusting them. The first idea — auto-accept any high-confidence prediction as a missing label — dropped the score. Model confidence alone isn't a safe signal. The real fix: an HTML grid that surfaces, from 3LC-computed predictions, only the ambiguous boxes for a human to judge. Result: +0.21 in one step.
Make validation honest. UA-DETRAC ships 99 of 100 sequences shared across train and val — near-identical frames leak across the split. A sequence-aware split (disjoint train/val) plus 3LC per-row sampling weights for the rare classes lifted the LB by +0.17 in a single iteration.
Oversample hard regions, not classes. Error isn't uniform within a class: it concentrates in glare, night, occlusion. Clustering 3LC's image embeddings (HDBSCAN) and weighting by visual difficulty put v7 in the lead.
The failures that count
The most instructive iteration scored nothing. Pushing one weak class (vans) raised validation — and lowered the leaderboard. A model that over-predicts a class with an ambiguous boundary produces false positives, which the metric punishes harder than the recall gain rewards.
What made that trap visible — and cheap to test — was the honest split: when a validation gain doesn't transfer to the LB, that's a signal in itself. Data-centric isn't just "edit labels." It's being able to trust your measurement, and test a hypothesis for the price of a single training run.
Choosing without getting trapped
The public score covers only ~40% of the test set. Picking your two final submissions on public score alone is the trap a data-centric mind should avoid. We modelled the public→private shake-down from the hosts' previous run of the same format: public always overstates private, and rank reshuffles hard.
So the two finalists had opposite failure modes: v12 (100% of the data, the max-signal bet) and v10 multi-scale (honest validation + robust augmentation). One survives whichever way the private split breaks. That's metrics analysis, not superstition.
The model is open
The model, the code, and the full journey are public:
- Live demo — mvdc-heoshua.streamlit.app: detection on your own images/videos, training curves, and the data-centric journey in EN/FR.
- Source code — github.com/yehoshua0/3lc-mvdc: full pipeline, review grid, sequence split, label-error mining.
- Official results — the hosts' announcement on Kaggle.
This is our first open-source model trained for a real-world use case — and the first of a series. Competitions prove the method; models make it useful.
Big things start small.