Catalog · How the catalog works
20090201_DiplomaRecognition
The source code of BSc research in 2009 of vehicle license plates recognition
- ★ 3 on GitHub
Anyone may press Interesting, signed in or not. It helps others find 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):
- Бинаризация изображения порогом по гистограмме (
FindTImageArrayBlackThreshold). - Удаление рамки — чёрные компоненты, касающиеся границ, отбрасываются (
RemoveBorderComponents). - Сегментация — связные компоненты превращаются в метки, по вертикальному профилю выделяются символы номера.
- Нормализация — каждый символ приводится к квадрату 32×32 билинейным/сплайновым ресайзом.
- Сравнение с шаблонами шрифта RoadNumbers (каждый символ из
1234567890ABCEHKMOPTXY) с порогом совпадения; применяется грамматика номера (длина 8–9, серия из букв и цифр). - Вывод результата: серия + регион.
Подробное описание алгоритма, сильных сторон, ограничений и актуальности — 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.
Быстрый старт
# 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/ можно запускать и напрямую, например:
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)
одной командой:
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). Сэмпл
создан детерминированно и воспроизводится:
tools/select_sample.py <dataset>/test/img --count 100 --seed 42Лицензия
GPL-3.0 — полный текст в файле LICENSE.

