Программа распознавания номеров автомобилей

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags

Nothing to show

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Cancel Create

  • Local
  • Codespaces

HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Новинки решений для распознавания номерных знаков и управлением КПП | LPR BOX «ORTHUS» обзор

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

Latest commit message
Commit time

README.md

Проект реализуется в рамках курса по глубокому обучению.

Задача стояла в следующем: Существует предприятие, директора интересуют автомобильные номера. Есть камера, она шлет поток, мы из него выделяем фото. Распознаем:

  • Российские номера
  • Тип автомобиля
  • Цвет автомобиля
  • Кто из работников уезжает домой пораньше

Чтобы запустить проект локально, необходимо:

  1. Создать виртуальное окружение
  2. Установить зависимости из requirements.txt:

pip install -r requirements.txt

  1. Проверить пути до весов/видео
  2. python main.py

Для распознавания автомобиля по типам и номерного знака на изображении была дообучена YOLOv5. Пайплайн выглядит следующим образом:

  1. Сначала определяется, что бокс номера лежит внутри бокса машины, тогда номерной знак присваивается этой машине
  2. Записывается тип машины и координаты номера и бокса автомобиля
  3. Затем происходит распознавание номера машины и проверка распознанного номера по регулярному выражению
  4. Производится распознование цвета автомобиля

При запуске программы можно остановить ее, нажав на клавишу «q», также можно остановиться на определенном фрейме на пять секунд во время возпроизведения видео, нажав на клавишу «s».

Производительность алгоритма:

На CPU алгоритм обрабатывает 2.7577 изображения в секунду (FPS). Эксперименты проводились на компьютере с 2,2 GHz Intel Core i7

Снимок экрана 2022-10-09 в 13 36 12

РАСПОЗНАВАНИЕ АВТОМОБИЛЬНЫХ НОМЕРОВ С ПОМОЩЬЮ PYTHON | КОМПЬЮТЕРНОЕ ЗРЕНИЕ | PYTESSERACT, OPENCV

Снимок экрана 2022-10-09 в 13 35 48

2022-10-05 16 55 17

Для распознавания номера на номерных знаках сначала использовался tesseract, но точность получилась низкая:

После этого было принято решение обучить нейросеть архитектуры LPRnet. Точность распознавания текста 89,6%.

Для распознавания цвета каждый бокс машины сначала разбивался на вектора трех цветов: красный, синий, зеленый (с помощью метода OpenCV split()). Затем брались максимумы из каждого из векторов и значение максимума записывалось в общее значение цвета изображения в формате BGR (то есть максимальное значение из синего, из зеленого и из красного записывалось в общее значение).

Затем то же самое производится с изображениями из обучающего датасета (директория training_data). Каждое из изображений находится в папке соответствующего цвета (так происходит разметка датасета). Таким образом, в файл training.data сохраняются значения BGR для каждого изображения из обучающей выборки и тот цвет, который представлен на изображении.

Читайте также:
Программа перезагрузка отзывы участников

В файл test.data сохраняется значение BGR для изображения, цвет которого мы детектируем. Затем с применением KNN-классификации определяется, какой цвет у машины.

├── colour_detection │ ├── detect_color.py │ └── training_dataset │ ├── black │ │ ├── black1.png │ │ ├── black10.png │ │ . │ ├── blue │ │ ├── blue.jpg │ │ ├── blue1.jpg │ │ . │ ├── green │ │ ├── green1.jpg │ │ . │ ├── orange │ │ ├── orange1.png │ │ ├── orange10.png │ │ . │ ├── red │ │ ├── red1.jpg │ │ ├── red10.jpg │ │ . │ ├── violet │ │ ├── violet1.png │ │ ├── violet10.png │ │ . │ ├── white │ │ ├── white1.png │ │ ├── white10.jpg │ │ . │ └── yellow │ ├── yellow1.jpg │ ├── yellow2.png │ . ├── lpr_net │ ├── data │ │ ├── NotoSansCJK-Regular.ttc │ │ ├── __init__.py │ │ └── load_data.py │ ├── model │ │ ├── __init__.py │ │ ├── lpr_net.py │ │ └── weights │ │ ├── Final_LPRNet_model.pth │ │ └── LPRNet__iteration_2000_28.09.pth │ └── rec_plate.py ├── main.py ├── object_detection │ ├── YOLOS_cars.pt │ └── detect_car_YOLO.py ├── requirements.txt ├── settings.py ├── test │ └── videos │ ├── test.mp4 │ └── test2.mp4 └── track_logic.py

Датасет состоит из 4 классов:

  • 0 — номера автомобилей
  • 1 — легковые автомобили
  • 2 — грузовые автомобили
  • 3 — общественный транспорт

В обучающей выборке: 1200 изображений (92%)

В тестовой выборке: 103 изображения (8%)

Описание обученных моделей

В задаче распознавания объектов на изображении были проведены эксперименты с обучением моделей на сетях с разной архитектурой. Все гиперпараметры в YOLO изначально подобраны оптимальным образом, мы меняли только архитектуру, чтобы получить наиболее точную.

Класс mAP50 mAP50-95
Для всех 0.855 0.708
0 (Номерные знаки) 0.907 0.641
1 (Легковые автомобили) 0.851 0.76
2 (Грузовые автомобили) 0.87 0.75
3 (Общественный транспорт) 0.792 0.682
Класс mAP50 mAP50-95
Для всех 0.807 0.709
0 (Номерные знаки) 0.91 0.691
1 (Легковые автомобили) 0.827 0.786
2 (Грузовые автомобили) 0.777 0.723
3 (Общественный транспорт) 0.712 0.635

Модель была обучена на 19 эпохах, так как размер датасета был слишком маленьким для сети такого размера.

Класс mAP50 mAP50-95
Для всех 0.848 0.726
0 (Номерные знаки) 0.932 0.69
1 (Легковые автомобили) 0.859 0.795
2 (Грузовые автомобили) 0.839 0.762
3 (Общественный транспорт) 0.761 0.658

Источник: github.com

iCCTV — бесплатный программный комплекс для распознавания автомобильных номеров и детектирования объектов с IP камер

459419

Существует много платных программ видеонаблюдения, позволяющих встраивать распознавание автомобильных номеров и детектирование типов различных объектов в системы наблюдения и/или автоматизации управления доступа. Часть из них работает с использованием облачных технологий, предоставляя доступ к IP камере через Интернет, что не всегда возможно по разным причинам. В данной статье мы представим бесплатное решение для ОС Windows, которое работает без использование средств интернет.

Разрешенное бесплатное использование:

  • всем для ознакомления;
  • физическим лицам для целей автоматизации и/или контроля въезда на собственную территорию;
  • физическим лицам в целях обучения и других академических и научных целях;
  • некоммерческим организациям для автоматизации и/или контроля въезда на собственную территорию;
  • коммерческим организациям для автоматизации и/или контроля въезда на собственную территорию при условии использования только 1 (одной) копии программного обеспечения iCCTV, установленной на собственном компьютере;
  • физическим и юридическим лицам для подсчёта объектов по видеопотокам при условии использования только 1 (одной) копии программного обеспечения iCCTV, установленной на собственном компьютере.

Запрещение бесплатного использования:

  • запрещена любая перепродажа программы, как отдельно, так и в составе своего аппаратного-комплекса;
  • запрещено любое прямое или косвенное использование со своей программной системой или аппаратным комплексом, который вы распространяете подл любыми видами лицензии – это разрешается версией Developer;
  • запрещена любая монетизация прибыли от использования iCCTV – будь то передача результатов распознавания сторонним юридическим и/или физическим лицам, создание интернет-сервиса или взимание платы за проезд, который контролирует программа.
Читайте также:
Ява программа нужна или нет

Ниже представлен скриншот работы программы:

Источник: recog.ru

Распознавание номеров. Практическое пособие. Часть 1

Пример распознавания номерных знаков

Все начиналось банально — моя компания уже год платила ежемесячно плату за сервис, который умел находить регион с номерными знаками на фото. Эта функция применяется для автоматической зарисовки номера у некоторых клиентов.

И в один прекрасный день МВД Украины открыло доступ к реестру транспортных средств. Теперь по номерному знаку стало возможным проверять некоторую информацию про автомобиль (марку, модель, год выпуска, цвет и т.д. )! Скучная рутина линейного программирования померкла перед новой свехзадачей — считывать номера по всей базе фото и валидировать эти данные с теми, что указывал пользователь. Сами знаете как это бывает «глаза загорелись» — вызов принят, все остальные задачи на время стали скучны и монотонны… Мы принялись за работу и получили неплохие результаты, чем, собственно и решили поделиться с сообществом.

Для справки: на сайт AUTO.RIA.com, в день добавляется около 100 000 фото.

Датасаентисты давно уже знают и умеют решать подобные задачи, поэтому мы с dimabendera написали эту статью именно для программистов. Если вы не боитесь словосочетания «сверточные сети» и умеете писать «Hello World» на питоне — милости просим под кат…

Кто еще распознает

Год назад я изучил этот рынок и оказалось, что работать с номерами стран exUSSR умеет не так уж много сервисов и ПО. Ниже представлен список компаний с которыми мы работали:

Automatic License Plate Recognition

Recognitor

Какие инструменты нужны для распознавания номеров

Нахождение объектов на изображении или в видео-потоке это задача из области компьютерного зрения, которая решается разными подходами, но чаще всего с помощью, так-называемых, сверточных нейронных сетей. Нам нужно найти не просто область на фото в которой встречается искомый объект, но и отделить все его точки от других объектов или фона. Эта разновидность задач называется «Instance Segmentation». На иллюстрации ниже визуализированы разные типы задач компьютерного зрения.

Computer vision task classification

Я не буду сейчас писать много теории о том как работает сверточная сеть, этой информации достаточно в сети и докладов на youtube.

Из современных архитектур сверточных серей для задач сегментации часто используют: U-Net или Mask R-CNN. Мы выбрали Mask R-CNN.
Второй инструмент, который нам понадобится — это библиотека по распознаванию текстов, которая бы могла работать с разными языками и которую можно легко настраивать под специфику текстов, которые мы будем распознавать. Тут выбор не так уж велик, самой продвинутой является tesseract от Google.

Так же есть ряд менее «глобальных» инструментов, с помощью которых нам нужно будет нормализовать область с номерным знаком (привести его в такой вид, при котором распознавание текста будет возможным). Обычно для таких преобразований используют opencv.

Так же, можно будет попробовать определить страну и тип, к которой относится найденный номерной знак, чтоб в постобработке применить уточняющий шаблон, характерный для этой страны и этого типа номера. Например, украинский номерной знак, начиная с 2015 года оформлен в сине-желтом оформлении состоит из шаблона «две буквы черыре цифры две буквы».

image

Кроме того, имея статистику частоты «встречания» в номерных знаках того или иного сочетания букв или цифр можно улучшить качество постобработки в «спорных» ситуациях. «

Nomeroff Net

Из названия статьи понятно, что мы все реализовали и назвали проект Nomeroff Net. Сейчас часть кода этого проекта уже работает в production на сайте AUTO.RIA.com. Конечно, до коммерческих аналогов еще далеко, все работает неплохо только для украинских номеров. Кроме того, приемлемая скорость работы достигается только при поддержке GPU у модуля tensorflow! Без GPU тоже можно пробовать, но не на Raspberry Pi :).

Все материалы для нашего проекта: размеченные датасеты и натренированные модели, мы выложили в открытый доступ с разрешения RIA.com под лицензией Creative Commons CC BY 4.0

Что нам понадобится

  • Python3
  • opencv-python не ниже версии 3.4
  • свежие Mask RCNN, tesseract
  • через менеджер пакетов pip3 нужно будет установить несколько модулей на python3, они будут перечислены в отдельном файле requirements.txt
Читайте также:
Как работает программа метатрейдер

Для того, чтобы ускорить установку планируем создать dockerfile — ожидайте в ближайших апдейтах проекта.

Nomeroff Net «Hello world»

Давайте уже что-то попробуем распознать. Клонируем с github-а репозиторий с кодом. Качаем в папку models, натренированные модели для поиска и классификации номеров, немного подправим под себя переменные с расположением папок.

UPD: Этот код является устаревшим, он будет работать только в ветке 0.1.0, свежие примеры смотрите здесь:
Все, можно распознавать:

import os import sys import json import matplotlib.image as mpimg # change this property NOMEROFF_NET_DIR = «/var/www/nomeroff-net/» MASK_RCNN_DIR = «/var/www/Mask_RCNN/» MASK_RCNN_LOG_DIR = os.path.join(NOMEROFF_NET_DIR, «logs/») MASK_RCNN_MODEL_PATH = os.path.join(NOMEROFF_NET_DIR, «models/mask_rcnn_numberplate_0700.h5») REGION_MODEL_PATH = os.path.join(NOMEROFF_NET_DIR, «models/imagenet_vgg16_np_region_2019_1_18.h5») sys.path.append(NOMEROFF_NET_DIR) # Import license plate recognition tools. from NomeroffNet import filters, RectDetector, TextDetector, RegionDetector, Detector, textPostprocessing # Initialize npdetector with default configuration file. nnet = Detector(MASK_RCNN_DIR, MASK_RCNN_LOG_DIR) # Load weights in keras format. nnet.loadModel(MASK_RCNN_MODEL_PATH) # Initialize rect detector with default configuration file. rectDetector = RectDetector() # Initialize text detector. textDetector = TextDetector() # Initialize numberplate region detector. regionDetector = RegionDetector() regionDetector.load(REGION_MODEL_PATH) img_path = ‘./examples/images/example1.jpeg’ img = mpimg.imread(img_path) NP = nnet.detect([img]) # Generate image mask. cv_img_masks = filters.cv_img_mask(NP) for img_mask in cv_img_masks: # Detect points. points = rectDetector.detect(img_mask, fixRectangleAngle=1, outboundWidthOffset=3) # Split on zones zone = rectDetector.get_cv_zones(img, points) # find standart regionId = regionDetector.predict(zone) regionName = regionDetector.getLabels(regionId) # find text with postprocessing by numberplate region detector text = textDetector.detect(zone) text = textPostprocessing(text, regionName) print(‘Detected numberplate: «%s» in region [%s]’%(text,regionName)) # Detected numberplate: «AC4921CB» in region [eu-ua-2015]

Онлайн демка

Набросали простенькую демку для тех кому не хочется все это ставить и запускать у себя :). Будьте снисходительны и терпеливы к скорости работы скрипта.

Если нужны примеры украинских номеров (для проверки работы алгоритмов коррекции), возьмите пример из этой папки.

Что дальше

Я понимаю, что тема очень нишевая и вряд ли вызовет большой интерес у широкого круга программистов, кроме того, код и модели еще достаточно «сыроваты» в плане качества распознавания, быстродействия, потребления памяти и пр. Но все же есть надежда, что найдутся энтузиасты, которым будет интересно натренировать модели под свои нужды, свою страну, которые помогут и подскажут, где есть проблемы и вместе с нами сделают проект не хуже, чем коммерческие аналоги.

Известные проблемы

  • У проекта нет документации, только базовые примеры кода.
  • В качестве модуля распознавания выбран универсальная OCR tesseract и она может прочитать многое, но ошибок делает много. В случае распознавания украинских номеров, там написана специализированная система коррекции, которая пока что компенсирует часть ошибок, но есть предчувствие что тут можно сделать значительно лучше.
  • «Квадратные» номера (номерные знаки с пропорцией 1:2) встречаются достаточно редко и мы с ними только начали разбираться, так что с ними погрешность будет больше.
  • Иногда вместо номерного знака наша модель находит дорожные знаки с названием населенного пункта, приборную доску внутри салона и др. артефакты.
  • При плохом качестве номера или малом разрешении, не совсем точно определяется регион из 4 точек

Анонс

Если это будет кому-то интересно, во второй части собираемся рассказать о том как и чем размечать свой датасет и как тренировать свои модели, которые могут работать лучше для вашего контента (вашей страны, вашего размера фото). Также поговорим о том как создать свой классификатор, который, например, поможет определять не зарисован ли номер на фото.

Несколько примеров в Jupyter Notebook:

  • Пример нахождения масок регионов с номерными знаками
  • Пример нахождения и преобразования масок регионов в четырехугольные полигоны
  • Пример распознавания номерных знаков с визуализацией

Полезные ссылки

  • Домашняя страница Nomeroff Net
  • Nomeroff Net на GitHub
  • Онлайн демка Nomeroff Net
  • Онлайн демка OpenALPR
  • UPD: Распознавание номеров. Как мы получили 97% точности для Украинских номеров. Часть 2
  • UPD: Распознавание номерных знаков. Как все ускорить

Источник: habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru