Instructions to use Babblu2821/alpr-plate-detector with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- ultralytics
How to use Babblu2821/alpr-plate-detector with ultralytics:
from ultralytics import YOLOvv8 model = YOLOvv8.from_pretrained("Babblu2821/alpr-plate-detector") source = 'http://images.cocodataset.org/val2017/000000039769.jpg' model.predict(source=source, save=True) - Notebooks
- Google Colab
- Kaggle
| license: mit | |
| tags: | |
| - object-detection | |
| - license-plate-detection | |
| - ultralytics | |
| - yolov8 | |
| - alpr | |
| library_name: ultralytics | |
| pipeline_tag: object-detection | |
| # ALPR plate detector (YOLOv8s) | |
| Single-class license plate detector, trained as Phase 2 of | |
| [fayazhussain2821/ALPR](https://github.com/fayazhussain2821/ALPR) β an end-to-end pipeline that | |
| detects plates in video, reads them, validates them against Indian and German plate grammars, and | |
| logs one deduplicated row per vehicle to an Excel workbook. | |
| ## Results | |
| Evaluated on a held-out test split of 465 images the model never saw. | |
| | Metric | Test | | |
| |---|---| | |
| | mAP@50 | **0.9921** | | |
| | mAP@50-95 | 0.8377 | | |
| | Precision | 0.9816 | | |
| | Recall | **0.9917** | | |
| | Inference | 4.7 ms/image (T4) Β· 29 ms/frame (Apple M4, MPS) | | |
| **Recall is the metric that matters for a plate pipeline.** A plate the detector misses can never | |
| be read downstream β that error is unrecoverable. A false positive produces a crop, OCR emits | |
| noise, and a grammar check rejects it. The error profile is the right way round: **1 missed plate | |
| against 23 false positives** across the whole test split. | |
| ### Detection by plate size | |
| | Ground-truth width | n | Precision | Recall | | |
| |---|---|---|---| | |
| | tiny (<32 px) | 8 | 1.0000 | 1.0000 | | |
| | small (32β64 px) | 64 | 0.9000 | 0.9844 | | |
| | medium (64β128 px) | 191 | 0.9598 | 1.0000 | | |
| | large (β₯128 px) | 190 | 0.9845 | 1.0000 | | |
| Small plates were expected to cap accuracy. They do not β every plate under 32 px was found. | |
| ### The test split was audited for leakage | |
| A perceptual-hash audit found **5.8% of test images had a near-duplicate in train** (consecutive | |
| video frames whose filenames the grouped-splitting logic did not recognise as frames of one clip). | |
| Re-scoring on only the 438 uncontaminated images: | |
| | | Full test (465) | Uncontaminated (438) | | |
| |---|---|---| | |
| | Recall | 0.9979 | 0.9978 | | |
| | Precision | 0.9545 | 0.9556 | | |
| The leak was **not** carrying the score. Grouping was fixed so future splits cluster duplicates. | |
| ## Training | |
| | | | | |
| |---|---| | |
| | Architecture | YOLOv8s (11.1M parameters) | | |
| | Epochs | 100 | | |
| | Image size | 640 | | |
| | Hardware | Google Colab T4, 1.25 h | | |
| | Data | 3,105 images / 3,273 plates, split 2174/466/465 | | |
| Augmentation was tuned for plates rather than for COCO: **no vertical flip** (a plate is never | |
| upside down), and rotation and perspective *enabled* (Ultralytics defaults both to zero, which | |
| under-trains the variation this task actually has). | |
| Full arguments are in | |
| [`results/args.yaml`](https://github.com/fayazhussain2821/ALPR/blob/main/results/args.yaml). | |
| Ultralytics changes augmentation defaults between minor releases, so reproducing this needs the | |
| arguments *and* the version that consumed them. | |
| ## Usage | |
| ```python | |
| from ultralytics import YOLO | |
| model = YOLO("best.pt") | |
| results = model.predict("car.jpg", conf=0.25) | |
| ``` | |
| Or through the project's pipeline, which adds tracking, OCR, plate-grammar validation and Excel | |
| logging: | |
| ```bash | |
| alpr run --source 0 --weights best.pt --out plates.xlsx | |
| ``` | |
| ## Training data and attribution | |
| Derived from two Roboflow Universe datasets, **both CC BY 4.0**: | |
| - [European License Plates](https://universe.roboflow.com/e-hh49k/european-license-plates-tjviy) β 1,455 images | |
| - [Indian License Plate (NIVU)](https://universe.roboflow.com/nivu/indian-license-plate-knte7) β 1,650 images | |
| ## Limitations | |
| **It only finds plates. It does not read them.** Recognition is a separate stage in the pipeline. | |
| **Boxes are axis-aligned**, so a plate photographed obliquely comes out as a rectangle around a | |
| slanted plate. Downstream OCR cannot un-skew it without the four corners, which this model does | |
| not predict. | |
| **The training data is European and Indian.** Plates from other regions may work β a detector | |
| largely learns "small bright rectangle on a vehicle" β but that is untested here. | |
| **Test images averaged 119Γ40 px plates.** Performance on much smaller plates, heavy motion blur | |
| or night footage is not characterised by these numbers. | |
| ## Intended use and responsible use | |
| Built as a portfolio and learning project. Automatic plate recognition is surveillance | |
| technology, and a plate is **personal data** β under the GDPR in the EU, and under comparable | |
| regimes elsewhere. Deploying it against public traffic engages legal obligations around lawful | |
| basis, retention, and notice that are the deployer's responsibility, not the model's. | |
| Reasonable uses: research, private property you control, and datasets you have the right to | |
| process. This model should not be used to track individuals. | |