Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

20090201_DiplomaRecognition

The source code of BSc research in 2009 of vehicle license plates recognition

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

rus-plate-recognition

The source code of BSc research in 2009 of vehicle license plates recognition.

In his BSc research, Anatoly solved the problem of recognition of license plates. This work involved the design of an information system. He developed the software with two models for recognition and analyzed experimental results of quality recognition from image noise, changing the brightness and the geometric distortions. Based on results of this research, he wrote his bachelor's thesis, received an excellent grade and published several articles. The source code of this work is published under the GPL license on GitHub at link https://github.com/asimkin/20090201_DiplomaRecognitionn

Your can read thesis at http://www.slideshare.net/asimkin/information-systems-design-license-plate-recognitionn and product requirements document at http://www.slideshare.net/asimkin/tr-250332711


Распознавание автомобильных номеров (РФ) по изображению: библиотека на Free Pascal с консольными утилитами сборки, бенчмарков и тестов.

Возможности

  • Распознавание номера целиком: серия (6 символов) + регион (2–3 цифры), грамматика 8–9 символов.
  • Адаптивная бинаризация (Otsu / BlackMass / FindMin) с ограничением диапазона.
  • Удаление рамки изображения перед сегментацией.
  • Сегментация по связным компонентам и вертикальному профилю.
  • Сравнение с шаблонами шрифта RoadNumbers2.0 (сплайн-ресайз, порог совпадения).
  • Пакетный режим с отчётом CSV и метриками качества (exact / series / region / precision / recall / accuracy).
  • Регенерация данных глифов шрифта из TTF (tools/gen_glyphs.py).

Как это работает

Пайплайн распознавания (ядро — src/ImgLibImpl.pas):

  1. Бинаризация изображения порогом по гистограмме (FindTImageArrayBlackThreshold).
  2. Удаление рамки — чёрные компоненты, касающиеся границ, отбрасываются (RemoveBorderComponents).
  3. Сегментация — связные компоненты превращаются в метки, по вертикальному профилю выделяются символы номера.
  4. Нормализация — каждый символ приводится к квадрату 32×32 билинейным/сплайновым ресайзом.
  5. Сравнение с шаблонами шрифта RoadNumbers (каждый символ из 1234567890ABCEHKMOPTXY) с порогом совпадения; применяется грамматика номера (длина 8–9, серия из букв и цифр).
  6. Вывод результата: серия + регион.

Подробное описание алгоритма, сильных сторон, ограничений и актуальности — ARCHITECTURE.md.

Структура проекта

  • src/ — библиотека распознавания:
    • ImgLibTypes.pas — типы, настройки стран (CountrySettings), константы;
    • ImgLibImpl.pas — ядро распознавания (сегментация, сравнение, грамматика);
    • ImgLibArrayExt.pas — операции с массивами изображений;
    • ImgIo.pas — загрузка/сохранение изображений (BMP/PNG/PGM);
    • ImgGlyphs.pas, ImgGlyphsFontData.inc — глифы шрифта RoadNumbers;
    • SplineLibBilinear.pas, SplineLibLinear.pas — сплайн-ресайз.
  • tests/ — утилиты и тесты: runner, selfcheck, batchtest, dumptmpl, metrics, prep_dataset; сэмпл реальных пластин tests/data/.
  • tools/gen_glyphs.py — генератор src/ImgGlyphsFontData.inc из RoadNumbers2.0.ttf.
  • tools/select_sample.py — детерминированная выборка реальных пластин из датасета в tests/data/.
  • scripts/ — скрипты настройки окружения, сборки и тестирования.

Требования

  • Free Pascal 3.2.2 (Debian/Ubuntu: sudo apt install fpc; или официальный пакет с https://www.freepascal.org/download.var)) fpc должен быть доступен в PATH.
  • Python 3 — для tools/select_sample.py достаточно стандартной библиотеки; numpy и Pillow нужны только для регенерации шрифта (scripts/gen_font.sh): python3 -m pip install -r requirements.txt.

Быстрый старт

bash
# 1. Проверить окружение (FPC, Python)
scripts/setup_env.sh

# 2. Собрать все утилиты (runner, selfcheck, metrics, …)
scripts/build.sh

# 3. Прогнать регрессионные тесты (юнит-тесты + сквозное распознавание)
scripts/test.sh

# 4. Скачать и подготовить полный датасет AUTO.RIA (test/val/train, ~1.5 ГБ)
scripts/fetch_dataset.sh [out_dir]

# 5. Бенчмарк на наборе изображений с .expected-файлами
scripts/benchmark.sh <img_dir> [report.csv]

# 6. (Опционально) регенерация данных глифов шрифта из RoadNumbers2.0.ttf
scripts/gen_font.sh

Утилиты из tests/ можно запускать и напрямую, например:

bash
cd tests

# Один файл
./runner path/to/plate.png --size 32 --resize akima --tmplthr 252

# Пакетный прогон с отчётом CSV
./runner --dir <img_dir> --size 32 --resize akima --tmplthr 252 --report out.csv

# Метрики качества по отчёту
./metrics out.csv

Метрики качества

Полный регламент и математические определения — tests/METRICS.md. Пороги по умолчанию: --min-exact 1241, --min-accuracy 75.0.

Метрика test (2845) val (4893)
exact — номер целиком 1241 (43.62%) 2306 (47.13%)
series_ok — серия (6 символов) 1626 (57.15%) 2950 (60.29%)
region_ok — регион 1656 (58.21%) 3002 (61.35%)
char_acc — посимвольно (по позиции) 66.86% (16045/23999) 69.35% (28712/41399)
precision / recall / accuracy (LCS) 94.00 / 78.89 / 75.11 94.48 / 80.83 / 77.19

Известное слабое место — путаницы буквенных позиций: E↔B, пониженный recall у 8, O, E.

Данные

Бенчмарк использует полный набор изображений AUTO.RIA Numberplate OCR RU (лицензия CC BY 4.0, данные предоставлены сообществом Habr.com, проект ria-com/nomeroff-net). Официальный архив (~1.5 ГБ):

  • https://nomeroff.net.ua/datasets/autoriaNumberplateOcrRu-2021-09-01.zip

Скачивание, распаковка и подготовка .expected-файлов (по аннотациям ann/*.json) одной командой:

bash
scripts/fetch_dataset.sh [out_dir]     # по умолчанию ~/datasets

Для каждого .png рядом должен лежать файл <имя>.expected с эталонным номером. Скрипт tests/prep_dataset.pas создаёт такие файлы по JSON-аннотациям датасета (вызывается из fetch_dataset.sh).

tests/data/ — сэмпл из 100 реальных пластин набора AUTO.RIA Numberplate OCR Ru (тестовый сплит), используемый регрессионным тестом selfcheck (сквозное распознавание с пороговым ассертом exact >= 40/100). Сэмпл создан детерминированно и воспроизводится:

bash
tools/select_sample.py <dataset>/test/img --count 100 --seed 42

Лицензия

GPL-3.0 — полный текст в файле LICENSE.