Этот проект представляет собой end-to-end пайплайн для автоматического распознавания российских автомобильных номеров на изображениях и в видеопотоках. Система построена на базе современных нейросетевых моделей и оптимизирована для работы на CPU.
- Высокая точность: Система демонстрирует >98% точности распознавания на тестовых данных.
- Двухступенчатый пайплайн: Используется связка из двух кастомных моделей:
- Детектор (YOLOv8) для точной локализации номеров.
- Распознаватель (CRNN) для чтения символов.
- Оптимизация для CPU: OCR-модель квантована в INT8, что обеспечивает ~2x ускорение на CPU при минимальной потере точности.
- Продвинутый препроцессинг: Встроенный механизм коррекции перспективы на базе OpenCV для "выпрямления" номеров, снятых под углом.
- Обработка видео: Включает алгоритм трекинга и стабилизации для надежного распознавания номеров в видеопотоках.
- Чистый код: Проект написан с соблюдением принципов SOLID, DRY, KISS и ООП для легкой поддержки и расширения.
anpr_project/
├── models/ # Финальные, готовые к использованию модели
│ ├── ocr_crnn/
│ │ ├── model/
│ │ │ └── crnn_ocr_model_best.pth # Лучшая FP32 OCR модель
│ │ └── quant/
│ │ └── crnn_ocr_model_int8_fx.pth # Оптимизированная INT8 OCR модель
│ │
│ └── yolo/
│ ├── model/
│ │ └── best.pt # Лучшая FP32 YOLO модель
│ └── quant/
│
├── ocr_crnn/ # Рабочая директория для OCR
│ ├── curves.png # Графики обучения
│ ├── matrix.png # Матрица ошибок
│ ├── ocr_train.ipynb # Jupyter Notebook для обучения OCR
│ └── README.md # Документация по этапу OCR
│
├── yolo_finetun/ # Рабочая директория для YOLO
│ ├── runs/ # Результаты экспериментов YOLO
│ ├── README.md # Документация по этапу детекции
│ └── yolotrain.ipynb # Jupyter Notebook для обучения YOLO
│
├── .gitignore
├── anpr_result1.png # Примеры работы
├── anpr_result2.png
├── inference.py # ✅ Главный исполняемый скрипт
└── README.md # Эта (главная) документация
Датасеты не включены в данный репозиторий из-за их большого размера. Для работы проекта необходимо скачать их и разместить в корневой папке datasets/.
-
Датасет для детекции (YOLO):
- Описание: Russian car plate detecting dataset (~25.5к изображений).
- Ссылка для скачивания:
https://huggingface.co/datasets/AY000554/Car_plate_detecting_dataset
-
Датасет для распознавания (OCR):
- Описание: AUTO.RIA Numberplate Options Dataset (~1.4 ГБ вырезанных номеров).
- Ссылка для скачивания:
[https://www.kaggle.com/datasets/evgrafovmaxim/nomeroff-russian-license-plates]
-
Клонируйте репозиторий:
git clone [URL-вашего-репозитория] cd anpr_project -
Создайте и активируйте виртуальное окружение:
python -m venv venv .\venv\Scripts\activate # Windows # source venv/bin/activate # macOS/Linux
-
Установите зависимости:
pip install torch torchvision ultralytics opencv-python pandas matplotlib seaborn python-Levenshtein
Важно: Для максимальной производительности рекомендуется установить PyTorch с поддержкой CUDA. Инструкции — на официальном сайте PyTorch.
Основной функционал запускается через скрипт inference.py из командной строки.
python inference.py --source "путь/к/вашему/фото.jpg"python inference.py --source "путь/к/вашему/видео.mp4"python inference.py --source "0"Для остановки обработки видео нажмите клавишу q.
Система была протестирована на различных данных и показала следующие результаты:
- Детектор (YOLOv8n):
[email protected] = 0.849на тестовой выборке. - Распознаватель (CRNN INT8):
Точность (Exact Match) = 98.4%на тестовой выборке.
Пример работы:
Как видим, номер под сильным наклоном и далко расположенный. Распознало(OCR) не совсем корректно
Проект имеет потенциал для дальнейшего развития:
-
Дообучение детектора для специфичных условий:
- Проблема: Модель может показывать пониженную уверенность на объектах в нетипичном окружении (например, в автосервисе) или при сложных ракурсах.
- Решение: Создать небольшой (~50-100 изображений) целевой датасет со "сложными" примерами и дообучить на нем YOLO-детектор (fine-tuning). Это значительно повысит его надежность в специфических условиях.
-
Дообучение OCR с агрессивной аугментацией:
- Проблема: На номерах с экстремальными искажениями (даже после коррекции перспективы) могут возникать ошибки распознавания отдельных символов.
- Решение: Добавить в пайплайн обучения OCR более агрессивные аугментации (сильные перспективные искажения, размытие) и дообучить CRNN-модель. Это сделает ее более "закаленной" и устойчивой к шуму.
-
Внедрение Confidence Score для OCR:
- Проблема: Система всегда возвращает результат, даже если OCR-модель не "уверена" в нем, что приводит к "галлюцинациям".
- Решение: Модифицировать декодер OCR для расчета и возврата показателя уверенности. Это позволит отфильтровывать результаты, в которых модель не уверена, и помечать их как "нечитаемые".
