Skip to content

High-accuracy Russian ANPR system built with YOLOv8 for detection and an optimized, custom-trained PyTorch CRNN for OCR.

License

Notifications You must be signed in to change notification settings

Runoi/ANPR-System

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ANPR-System: Высокоточная система распознавания автомобильных номеров

Этот проект представляет собой end-to-end пайплайн для автоматического распознавания российских автомобильных номеров на изображениях и в видеопотоках. Система построена на базе современных нейросетевых моделей и оптимизирована для работы на CPU.

Ключевые особенности

  • Высокая точность: Система демонстрирует >98% точности распознавания на тестовых данных.
  • Двухступенчатый пайплайн: Используется связка из двух кастомных моделей:
    1. Детектор (YOLOv8) для точной локализации номеров.
    2. Распознаватель (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/.

  1. Датасет для детекции (YOLO):

    • Описание: Russian car plate detecting dataset (~25.5к изображений).
    • Ссылка для скачивания: https://huggingface.co/datasets/AY000554/Car_plate_detecting_dataset
  2. Датасет для распознавания (OCR):

    • Описание: AUTO.RIA Numberplate Options Dataset (~1.4 ГБ вырезанных номеров).
    • Ссылка для скачивания: [https://www.kaggle.com/datasets/evgrafovmaxim/nomeroff-russian-license-plates]

Установка и настройка

  1. Клонируйте репозиторий:

    git clone [URL-вашего-репозитория]
    cd anpr_project
  2. Создайте и активируйте виртуальное окружение:

    python -m venv venv
    .\venv\Scripts\activate  # Windows
    # source venv/bin/activate  # macOS/Linux
  3. Установите зависимости:

    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% на тестовой выборке.

Пример работы: alt text Как видим, номер под сильным наклоном и далко расположенный. Распознало(OCR) не совсем корректно

alt text

Возможные улучшения

Проект имеет потенциал для дальнейшего развития:

  1. Дообучение детектора для специфичных условий:

    • Проблема: Модель может показывать пониженную уверенность на объектах в нетипичном окружении (например, в автосервисе) или при сложных ракурсах.
    • Решение: Создать небольшой (~50-100 изображений) целевой датасет со "сложными" примерами и дообучить на нем YOLO-детектор (fine-tuning). Это значительно повысит его надежность в специфических условиях.
  2. Дообучение OCR с агрессивной аугментацией:

    • Проблема: На номерах с экстремальными искажениями (даже после коррекции перспективы) могут возникать ошибки распознавания отдельных символов.
    • Решение: Добавить в пайплайн обучения OCR более агрессивные аугментации (сильные перспективные искажения, размытие) и дообучить CRNN-модель. Это сделает ее более "закаленной" и устойчивой к шуму.
  3. Внедрение Confidence Score для OCR:

    • Проблема: Система всегда возвращает результат, даже если OCR-модель не "уверена" в нем, что приводит к "галлюцинациям".
    • Решение: Модифицировать декодер OCR для расчета и возврата показателя уверенности. Это позволит отфильтровывать результаты, в которых модель не уверена, и помечать их как "нечитаемые".

Releases

No releases published

Packages

No packages published