распознавание номеров автомобилей python

volkswagen 1509784 1920
Содержание

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

image loader

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

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

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

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

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

Automatic License Plate Recognition

Recognitor

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

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

982e3e301e6a4d2f02c32b51cbe602b8

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

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

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

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

image loader

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

Nomeroff Net

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

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

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

Nomeroff Net «Hello world»

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

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

Онлайн демка

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

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

Что дальше

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

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

Анонс

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

Источник

Читаем номерной знак с 10 линиями кода на Python

Любое компьютерное зрение не является тривиальной задачей, и обнаружение номерного знака не является исключением.

Если вы подумаете об этом, нам, людям, будет легко классифицировать то, что на изображениях, — но проблема возникает, когда вы хотите автоматизировать этот процесс. Компьютеры не могут «видеть» так, как мы можем, поскольку они могут только понимать числа, и определение правил для массивов чисел — это, в основном, то, к чему сводятся любые задачи компьютерного зрения (в значительной степени упрощенно).

Итак, в сегодняшней статье я быстро продемонстрирую возможности OpenALPR API для следующих действий:

Опять же, нам так легко взглянуть на изображение автомобиля, и через секунду у нас будет информация по всем вышеперечисленным пунктам. Для компьютеров эта задача намного сложнее — я позволю себе установить OpenCV и попытаться реализовать логику самостоятельно, если вы не согласны со мной.

Немного установки

Для начала вам понадобится учетная запись OpenALPR, для которой вы можете зарегистрироваться здесь. У меня бесплатный тарифный план, и если я не ошибаюсь, он позволит вам делать 50 запросов в месяц. Этого недостаточно для коммерческих целей, но оно точно подойдет вам для исследования.

Если в какой-то момент вам понадобится больше, вот планы, из которых вы можете выбрать:

Это ни в коем случае не дешево, но если у вас есть стоянка, которая обслуживает 1 млн. Автомобилей в месяц, то я предполагаю, что 2 тысячи не так уж много для современной системы считывания номерных знаков.
В любом случае, после регистрации вы получите доступ к своей панели инструментов, и в ней вы можете перейти в раздел API CarCheck, чтобы получить ключ API:

Нам это понадобится позже при отправке запросов, но об этом чуть позже.
Круто, давайте теперь посмотрим на изображение, которое мы будем использовать для тестирования API.

Давайте получим изображение

Я искал в Интернете изображения автомобилей с номерным знаком, которые бесплатны для некоммерческого использования (на самом деле довольно сложно найти то, где номер не размыт). Через некоторое время я нашел довольно приличное изображение приличного автомобиля, и вы можете скачать его по этой ссылке:

1 1 eREWERvaQf9odkFo DBg min

Чтение номерных знаков (Читаем номерной знак)

Когда дело доходит до импорта, нам понадобятся только две библиотеки:

Да, вы правильно прочитали. Вам не нужно устанавливать какие-либо библиотеки для использования OpenALPR, что значительно упрощает потенциальное развертывание в будущем.

1 63edi9x ae 6v6FxdgI7Sw min

1 cZyjsI3LR5NnCcFFZRRujQ min

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

1 e8U ZVFmDovHdXbAI2KaeA min

1 JCxOKBX8recyCTqplTbqzQ min

В итоге мы получили Цвет, Номер авто, Регион, Брэнд, Год авто, естественно можно было больше указать критериев.

Помните, что я разделил переменную url на две строки, чтобы изображение было более читабельным для вас. Также обратите внимание, как можно указать параметр страны внутри URL-адреса, чтобы получить лучшие результаты, если вы заранее знаете, к какой стране принадлежит номерной знак.
Как видите, с помощью всего лишь нескольких строк кода нам удалось получить столько полезной информации из изображения. Для тех, кто не знаком с компьютерным зрением, для разработки такого решения могут потребоваться месяцы и месяцы работы, и сомнительно, насколько вы были бы удовлетворены результатами в итоге. Читаем номерной знак.

Прежде чем ты уйдешь

И вот, у вас это есть — всего за несколько строк кода нам удалось выполнить современную работу по компьютерному зрению (ну, вроде, мы только что обратились к API).
Бесплатный план подойдет вам для изучения, но подумайте над разработкой полного решения самостоятельно, просто для удовольствия. Может быть, это будет темой для другого времени, так что дайте мне знать, если вас это заинтересует.
А если вам лень кодить то загрузите изображение прям к ним на сайт:

1 6wZteIJMDHLR2I2qgUl3 w min

На мой взгляд мы добились неплохих результатов, но если присмотритесь то на номере регистрационного знака автомобиля отсутствует цифра 1, хотя номера просматриваются хорошо. Но это может баг сайта так как точность составила 91.82%.

1 YZw2Ag0SekjSNAcAY3abig min

Но если проанализировать точность распознание номера, то она очень высока, с точность 91.82% система распознала правильный номер.

Источник

Распознавание номеров автомобилей python

Script that can make detection of a car number-plate and recognize it

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Скрипт выполняющий детектирование и распознование автомобильного номера

Настройка окружения для запуска скрипта:

Скрипт для своей работы использует несколько вспомогательных инструментов, а именно:

Для запуска скрипта необходимо выполнить следующие действия:

Выполнить установку tensorflow object detection API

Выполнить установку tesseract tesseract для Windows (не забыть при установки выбрать русский язык), tesseract для Linux или для Linux можно использовать команду:

Установить пакеты для Python:

Cython, Numpy, Opencv, Matplotlib, path.py

необходимо выполнить установку protobuf compiler’а 3-ей версии:

После чего выполнить:

для Windows

скачать Nuget по ссылке

добавить папку с nuget.exe в переменную среды PATH

загрузить Google.Protobuf.Tools с помощью команды:

добавить в переменную среды PATH путь к protoc.exe например D:\Nuget\Google.Protobuf.Tools.3.4.0\tools\windows_x64

Готово! Можно запускать!

В командной строке либо терминале ввести:
Для изображений:

Возможные варианты улучшения:

Иные возможные пути решения задачи:

About

Script that can make detection of a car number-plate and recognize it

Источник

Распознавание номеров автомобилей python

nomeroff net

Nomeroff Net. Automatic numberplate recognition system. Version 2.4

Nomeroff Net is an opensource python license plate recognition framework based on YOLOv5 and CRAFT networks and customized OCR-module powered by RNN architecture.

The project is now at the stage of development, write to us if you are interested in helping us in the formation of a dataset for your country.

Version 2.4 is completely rewritten to PyTorch. Change History.

Installation from Source (Linux)

Nomeroff Net requires Python >= 3.6

For Centos, Fedora and other RedHat-like OS:

For Ubuntu and other Debian-like OS:

Hello Nomeroff Net

Hello Nomeroff Net for systems with a small GPU size.

Note: This example disables some important Nomeroff Net features. It will recognize numbers that are photographed in a horizontal position.

In order to evaluate the quality of work of Nomeroff Net without spending time on setting up and installing, we made an online form in which you can upload your photo and get the recognition result online

AUTO.RIA Numberplate Dataset

All data on the basis of which the training was conducted is provided by RIA.com. In the following, we will call this data the AUTO.RIA Numberplate Dataset.

We will be grateful for your help in the formation and layout of the dataset with the image of the license plates of your country. For markup, we recommend using VGG Image Annotator (VIA)

AUTO.RIA Numberplate Options Dataset

The system uses several neural networks. One of them is the classifier of numbers at the post-processing stage. It uses dataset AUTO.RIA Numberplate Options Dataset.

The categorizer accurately (99%) determines the country and the type of license plate. Please note that now the classifier is configured mainly for the definition of Ukrainian numbers, for other countries it will be necessary to train the classifier with new data.

AUTO.RIA Numberplate OCR Datasets

As OCR, we use a specialized implementation of a neural network with RNN layers, for which we have created several datasets:

If we did not manage to update the link on dataset you can find the latest version here

This gives you the opportunity to get 99% accuracyon photos that are uploaded to AUTO.RIA project

Contributions to this repository are welcome. Examples of things you can contribute:

Источник

Распознавание номеров. Как мы получили 97% точности для Украинских номеров. Часть 2

image loader

Тренируем Mask RCNN находить область с номером

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

Сейчас мы разберемся как натренировать сеть для решения этой задачи. На самом деле тут программирования мало, все сводится к монотонной, нудной, однообразной разметке данных. Да-да, после того как вы разметите свою первую сотню вы поймете о чем я 🙂

Итак, алгоритм подготовки данных следующий:

Обратите внимание — мы не обучаем все «с нуля», мы дотренировываем модель, обученную на данных COCO dataset, которую Mask RCNN закачает при первом запуске

Улучшаем классификатор номерных знаков под свои требования

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

В нашем проекте мы реализовали поддержку распознавания номеров Украины, РФ и Европейские номера в целом. Качество распознавания европейских номеров немного хуже, так как там номера с разным дизайном и увеличенным количеством встречающихся символов. Возможно, со временем, будут отдельные модули распознавания для «eu-ee», «eu-pl», «eu-nl»,…

Перед классификацией номерного знака его нужно «вырезать» из изображения и нормализировать, другими словами по максимуму убрать все искажения и получить аккуратный прямоугольник, который будет подвергаться дальнейшему анализу. Эта задача оказалась достаточно нетривиальной, мне даже пришлось вспомнить школьную математику и написать специализированную реализацию алгоритма кластеризации k-means :). Модуль, который это все процессит называется RectDetector, вот как выглядят нормализованные номера, которые далее будем классифицировать и распознавать.

image loader

Чтоб как-то автоматизировать процесс создания датасета для классификации номеров мы разработали небольшую админку на nodejs. С помощью этой админки вы можете разметить надпись на номерном знаке и класс к которому его относить.

Классификаторов может быть несколько. В нашем случае по типу номера и по тому зарисован/закрашен ли он на фото.

image loader

После того как разметили датасет, делим его на тренировочную, валидационную и тестовую выборки. В качестве примера скачайте наш датасет autoriaNumberplateOptions3Dataset-2019-05-20.zip, чтоб посмотреть как там все устроено.

Так как выборка уже размечена (отмодерирована), то вам нужно в рандомных json-файлах поменять «isModerated»:1 на «isModerated»:0 и после этого запустить админку.

Тренируем классификатор:

Скрипт тренировки train/options.ipynb поможет получить Вам свой вариант модели. На нашем примере видно что для классификации регионов/типов номерных знаков мы получили точность 98.8%, для классификации «закрашен ли номер?» 99,4% на нашем датасете. Согласитесь, неплохо получилось.

Тренируем свою OCR (распознавалку текста)

Ну вот мы нашли область с номером и нормализировали ее в прямоугольник, который содержит надпись с номером. Как нам прочитать текст? Проще всего прогнать его через FineReader или Tesseract. Качество будет «не очень», но при хорошем разрешении области с номером сможете получить точность на уровне 80%. На самом деле это неплохая точность, но если я Вам скажу что можете получить 97% и при этом потратите значительно меньше компьютерных ресурсов? Звучит неплохо — попробуем. Для этих целей подойдет немного необычная архитектура, в которой используются как сверточные так и рекуррентные слои. Архитектура этой сети выглядит приблизительно так:

image loader

Реализация взята с сайта https://supervise.ly/, мы ее немного модифицировали для тренировки на реальных фото (на сайте supervisely подан вариант для синтетической выборки)

Теперь начинается самая увлекательная часть, разметить хотя бы 5 000, номеров :). Мы разметили около

10 000 РФ. Это была самая сложна часть разработки. Вы даже не представляете сколько раз я засыпал на стуле у компа модерируя по нескольку часов в день очередную порцию номеров. Но настоящий герой разметки dimabendera — он разметил 2/3 всего контента, (поставьте ему плюс если понимаете как скучно было делать всю эту работу 🙂 )

Можно попробовать этот процесс как-то автоматизировать, например, предварительно распознав каждое изображение Tesseract-ом, а потом уже поправить ошибки с помощью нашей админки.

Обратите внимание: для разметки классификатора и OCR на номере используется одна и та же админка. Одни и те же данные вы сможете загрузить и туда и туда, кроме зарисованных номеров, конечно.

Если вы разметите хотя бы 5000 номеров и сможете обучить свою OCR — смело оформляйте себе премию у начальства, уверен, это испытание не для слабаков!

Приступаем к тренировке

Скрипт train/ocr-ru.ipynb тренирует модель для номеров РФ, там же примеры для Украины и Европы.

Обратите внимание, в настройках тренировки там только одна эпоха (один проход).

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

Немного о настройке tensorflow для GPU NVIDIA

Если вы счастливый обладатель GPU от NVIDIA, то вы можете в разы все ускорить: и тренировку моделей и инференс (режим распознавания) номеров. Проблема заключается в том чтоб корректно все установить и скомпилировать.

Мы на своих серверах ML используем Fedora Linux (так сложилось исторически).

Приблизительная последовательность действий для тех кто использует эту OS следующая:

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

UPD1: Так как мне и Дмитрию пишут в личку стандартные вопросы по распознаванию номеров, связке tensorflow с gpu и т.д. и мы с Дмитрием даем одни и те же ответы, хочется как-то заоптимизировать этот процесс.
Предлагаем сделать переписку в комментариях более структурированной, разделенной по темах. Для этого есть удобный функционал на GitHub. В дальнейшем просьба задавать вопросы не в комментах а в тематических issue на github Nomeroff Net

UPD2: Со временем появились также датасеты: Казахские номера, Грузинские номера

Источник

Поделиться с друзьями
AvtoPoisk.top - автоподбор с гарантией
0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии