End-to-end Tunisian license plate recognition: YOLOv8 detection + CRNN/CTC OCR, trained on real road-camera footage.
# LPR System — License Plate Detection & Recognition
An end-to-end **License Plate Recognition (LPR)** pipeline for Tunisian
plates, built from footage captured on real road-side cameras. It has two
independently developed stages:
```
camera frame ──▶ [ detection ] ──▶ cropped plate ──▶ [ recognition ] ──▶ "123 تونس 8071"
YOLOv8 CRNN + CTC
```
| Stage | Folder | Model | Job |
|-------|--------|-------|-----|
| Detection | `detection/` | YOLOv8 | Find and crop license plates in an image |
| Recognition | `recognition/` | CRNN + CTC | Read the characters off a cropped plate |
Each stage has its own README with full details; this page is the overview.
## Pipeline at a glance
1. **Detection** — a YOLOv8 model, trained on manually labeled frames from 4
real cameras, locates plates and crops them with padding.
2. **Recognition** — a CRNN (CNN + BiLSTM, CTC loss) reads the cropped plate as
a character sequence over the vocabulary `0-9`, `تونس`, and space.
See `detection/README.md` and
`recognition/README.md` for setup, training, and usage.
## Example detection
A detection from the trained YOLOv8 model (`license_plate`, confidence 0.65).
The plate is blurred for privacy; the box and label are the raw model output.
## Datasets
The two stages have different data needs:
- **Detection** was trained purely on the project's **own camera frames**,
labeled by hand (single `license_plate` class).
- **Recognition** needed far more character-level data than the real set could
provide, so its training data **combines three sources**:
1. Real cropped plates from the project's cameras (limited).
2. An open-source real license-plate dataset.
3. Synthetically generated plates for volume and character coverage.
The recognition model is therefore trained in two stages: pre-trained on the
synthetic + open-source data, then fine-tuned on the real crops.
The open-source dataset used is **Tunisian Licensed Plates** from
Dataset Ninja — please refer …