-
-
Dashboard: A PlateVision UI managing 88k+ plates, displaying key metrics like 97.8% confidence and 21k matches for visual data analysis.
-
Match Logs: A precision_pairs.txt file linking Cloud Storage URLs of two different images identified as the same vehicle.
-
Backend Code: A phase1.py script using YOLOv9 and OCR for async, high-concurrency image extraction and plate recognition.
-
Cleaned Data: A structured cleaned_results1.csv file storing validated URLs, plate strings, and high-confidence OCR scores.
Inspiration
It started with a real problem: how do you find the same vehicle appearing twice across thousands of camera snapshots? Security teams, parking operators, and traffic analysts deal with this daily—manually scrolling through endless images, trying to spot matching license plates. It's slow, exhausting, and easy to miss things. We thought: what if AI could do this instantly? Upload your images, and get every matching pair in seconds. No spreadsheets. No guesswork. Just answers. That's how PlateVision was born.
What it does
PlateVision is an AI-powered license plate recognition and matching system. The workflow is simple:
Upload a CSV with image URLs and extracted plate numbers The system groups all images by matching plates Browse results in a clean, searchable gallery Export matched pairs with one click
Key features:
Handles 100,000+ images without breaking a sweat Smart matching that accounts for OCR errors (0↔O, 1↔I, 8↔B) Real-time search—type a plate number, see all matches instantly Paginated gallery that stays fast even with 89K records One-click export of matched pairs
How we built it
Backend Pipeline:
Used fast-alpr with YOLOv9 for license plate detection GPU-accelerated inference on NVIDIA RTX A4500 via RunPod Async downloads with aiohttp (500 concurrent connections) to maximize throughput SQLite for caching results and enabling resume capability Flask API serving paginated data to keep the frontend snappy
Matching Algorithm:
Canonicalized plates to handle common OCR confusion (0→O, 1→I, 8→B, 5→S) Grouped plates by canonical form for O(n) matching instead of O(n²) Strict length matching to minimize false positives
Frontend:
React-based gallery with glass-morphism design Server-side pagination (100 items per page) Lazy image loading for smooth scrolling Real-time filtering by confidence, search query, and match status
Challenges we ran into
- Speed at Scale Processing 100K images at 11 img/s meant 2.5 hours of waiting. Unacceptable. We profiled the pipeline and discovered the bottleneck was network downloads, not GPU inference. Switching from synchronous requests to async aiohttp with 500 concurrent connections tripled our throughput.
- GPU Not Being Utilized Despite having an RTX A4500, nvidia-smi showed 0% GPU usage. Turned out ONNX Runtime was defaulting to TensorRT (which wasn't installed) and silently falling back to CPU. We had to explicitly disable TensorRT and force CUDAExecutionProvider.
- Too Many False Positives Early versions matched plates too aggressively. "ABC123" was pairing with "ABE128" due to fuzzy matching. We tightened the algorithm to only accept exact canonical matches, cutting false positives by 90%.
- Browser Crashing on Large Datasets Loading 89K image cards at once killed the browser tab. Server-side pagination was the fix—now we only send 100 items at a time, and the UI stays buttery smooth.
Accomplishments that we're proud of
Scaled to 100K images with stable memory usage and no crashes 96%+ matching accuracy with minimal false positives Clean, intuitive UI that makes results immediately understandable Resume capability—if processing stops, it picks up where it left off Sub-second search across 89K plates Built the entire system in under 48 hours
What we learned
Technical insights:
Network I/O is often the real bottleneck, not GPU compute OCR errors follow predictable patterns—building a confusion matrix dramatically improves matching Pagination isn't optional at scale—it's essential Sometimes simpler is better: single-pass detection beat our fancy multi-pass approach
Design philosophy:
Strict matching beats fuzzy matching (fewer false positives > more matches) Show results visually—a gallery is worth a thousand spreadsheets Build for the worst case (89K records) and everything else feels fast
What's next for PlateVision
Real-time video processing — Connect to live camera feeds Multi-camera correlation — Track vehicles across different locations Vehicle make/model detection — Add another layer of identification Mobile app — Scan plates on the go Public API — Let others build on top of PlateVision Cloud deployment — One-click hosted solution
We're just getting started. "Find the same car, twice."
Log in or sign up for Devpost to join the conversation.