Pull to refresh

Comments 58

Ради интереса потестил на фотке, где номер расположен сильно под углом и глазами читается с усилием. Распознала вполне нормально. Молодцы!
Давно искал что-нибудь подобное, вот и пригодится мне, наверное, ваша библиотечка 8)
Справедливости ради надо сказать, что основную часть по «выравниванию» текста для дальнейшего распознавания делает алгоритм перспективной трансформации из библиотеки openCV, но в тоже время достаточно нелинейной является задача определения «опорных» точек, которые подаются на вход этому алгоритму. Вот тут пришлось вспомнить многое из школьного курса геометрии :)
Было время, сам делал распознавание номерных знаков.
Печаль моя не имела границ т.к. мои входные данные были в разы хуже чем для коммерческих аналогов. Так и не удалось добиться стабильных результатов.
Не могли бы вы указать приблизительные требования для входной картинки (Размеры номерного знака, допустимые углы отклонения)
PS: + за решенную задачу :)
Ограничения, конечно есть:
  • Разрешение фото должно быть не меньше 300x300
  • Максимальное разрешение ограничено производительностью вашего компа, если использовать GPU Nvidia, то при разрешении FullHD будет распознавать около 500ms/фото, если на обычном CPU, то это будет уже 5 сек на фото.
  • Большой плюс если размер найденного номерного знака на фото по вертикали имеет 64 и более точек
  • Границы номера будут находиться даже при сильном повороте или даже на перевернутой фотографии, а вот распознаваться они будут только если можно сказать что номер в большей читается слева направо чем сверху вниз или снизу вверх. Эту проблему тоже можно решить, если будет смысл на это тратить процессорное время. Другими словами углы наклона ограничены читаемостью номера.
  • Естественно, размытая или зашумленная фото будет распознаваться плохо.
С детекцией рамки проблем нет. Проблемы начинаются при распознавании текста.
Вот пример номерного знака image
На сколько вероятно правильное распознавание?

Точное распознавание такого знака требует:
  • После нормализации, зная структуру номера разбить на зоны, в которых 1 позиция 1 символ, вам следует искать предполагаемый центр каждого символа.
  • Далее вырезаем предполагаемый участок с символом и классифицируем его согласно возможных вариантов, которые там могут встречаться. Тут следует не сильно боятся зацепить часть рядом стоящего символа, хорошо натренированный классификатор это не остановит :)
  • Ну и в конце постобработка, по вероятности сочетания тех или иных символов в номерных знаках РФ. Вероятность комбинаций можно получить проанализировав базу с реестром номерных знаков. Украинские данные открыты с 2013 года — там уже более 9 млн записей, достаточно точно можно прогнозировать вероятность сочетания той или иной комбинации букв/кодов
Молодцы, что довели решение до конца!
Можете дать совет, куда копать? Есть задача распознавать печатные цифры на произвольно (но без экстрима) изогнутом и повернутом листе бумаги. Шрифт один, букв нет, исходное соотношение сторон листа известно. Соответственно, вход может содержать довольно большие куски фона для листа, т.к. вырезается из исходного изображения лист вместе с фоном. Для простоты примем, что заломов нет. Вроде бы и простая задача, но сколько не мучил ssd сеть — точность находится на крайне низком уровне.
Какой понадобится объем обучающей выборки для каждого из 10 классов? Какую архитектуру лучше выбрать?
Идеальное решение это:
  1. Нормализовать изображение
  2. Отделить каждое слово
  3. Разбить слово по буквам(подойдёт RNN сеть)
  4. Непосредственно распознать(обычный классификатор)

Так же рекомендую посмотреть на EAST.


По поводу выборки, изначально хватит и минимальной — по 50-100 изображений каждого класса, что бы проверить работоспособность выбранного решения, но стоит помнить, что в датасете MNIST, например, 60000 изображений для обучения и 10000 изображений для тестирования. В наших задачах, мы использовали веса предварительно обученных нейронных сетей, а так же делали случайные преобразования над имеющимися входными данными для увлечения датасета.

Спасибо. Большую часть пунктов выполнял, но выборки, очевидно, не хватило.
Какой получился процент найденных и правильно распознанных номеров? С ianpr не сравнивали? У них есть поддержка украинских номеров и тестовая версия.
Качество распознавание украинских номеров на уровне 80%, но поскольку к одному объявлению загружают несколько фото с номерами, то итоговое качество выше 90%.

Номера РФ не пробовали распознавать, т.к. у нас на сайте они не встречаются. Думаю что без доработки процент будет низкий так как мы отключили распознавание кириллицы (в украинских номерах все сочетания букв подобраны так чтоб соответствовать варианту из латиницы). Может кому то будет интересно — допилит, так как особой проблемы с нахождением границ номера РФ нету.

С ianpr не сравнивали, но вот OpenALPR работает хорошо (в том числе и с номерами РФ).
А находит он все 100% номеров? В OpenCV есть готовый натренированный каскад Хаара для поиска российских номеров, но он иногда ошибается — не находит номер или находит не номер.
ps Кириллицы в российских номерах тоже давно нет.
Ну прям 100% не будет, конечно. Нейронка ищет что-то похожее на номера, мы тренировали на базе 1 125 фото, а рекомендуют 5 000, так что потенциально точность можно улучшить. Кроме того, в нашей выборке не было номеров РФ :). Размечать выборку это очень монотонная и неинтересная работа, поэтому мы ограничились минимумом, с которым у нас все заработало довольно неплохо для украинских номеров.
(в украинских номерах все сочетания букв подобраны так чтоб соответствовать варианту из латиницы)

Как ни странно, но в России тоже =)
Но не всё еще сняли старые. У некоторых есть еще времен СССР.
Это в пределах погрешности. Последний раз видел живьем на дороге номер СССР лет 8 назад.
UFO just landed and posted this here
Это очень-очень спорное решение, на мой взгляд.

в ГОСТ Р 50577-93 (и в новом Р 50577-2018) звучит это так:


3.7 На регистрационных знаках типов 1-22 могут применяться следующие буквы: А, В, Е, К, М, Н, О, Р, С, Т, X, У. На регистрационных знаках типа 9, 10 может применяться также буква D.

По простому — из национального алфавита были выбраны ровно те буквы, которые имеют визуальный аналог на латинице. И почему это спорное решение?

UFO just landed and posted this here

Потому что у них нет визуальных аналогов в национальном алфавите

Потому что русскому человеку гораздо проще запомнить и продиктовать номер, представляющий собой сочетание русских букв. И важно это не только для передачи номеров по радиоканалу в работе ГИБДД и подобных служб (их-то еще можно научить фонетическому алфавиту и обязать его использовать), но и, например, при опросе свидетелей ДТП.
Кстати, в Украине классный дизайн-код номерных знаков стандарта 2015 года!
Что именно классно?
Статья какая-то ни о чём, если честно. В чём именно плюс использования полной латиницы? С учётом возможного количества кодов регионов до 999, текущая концепция позволяет выдать более полутора миллиардов знаков. Да, использование полного алфавита позволило бы регионам ограничиться меньшим количеством кодов регионов, но латиница, имхо, более костыль. У нас всё же есть официальный язык, а это позволяет увязать его с международными стандартами.
в украинских номерах все сочетания букв подобраны так чтоб соответствовать варианту из латиницы


В Российских номерах, совершенно внезапно, все так же
Да, в электокарах встречается Z — дотренируем.
Добавил номера з «Z», уже работает.
Спасибо, тема очень актуальная на самом деле. Давно хотел поиграться в этом направлении, подумываю прикрутить к автоматическим воротам в частном доме, в качестве эксперимента.
Касаемо tesseract, — распознаёт он действительно слабовато. Пробовал его использовать, без особых успехов.

На голландском номере распозналась полная чушь, к сожалению.


Заголовок спойлера

Границы определило правильно и класcифицировало номер правильно [eu], значит плохо отработал tesseract. Думаю для данного типа номеров нужно применять другой модуль для распознавания, либо писать собственную реализацию.
На российских номерах тоже белиберда распознается, хотя сам контур номера определяет очень близко даже под большими углами.
Мы работаем над заменой tresseract, но это не очень тривиальная задача, поэтому запасайтесь терпением и попкорном, мы приступили к разработке. Все что очень нужно это фотки с номерами РФ, как, собствненно, фото с номерами и др. стран. У кого есть — поделитесь.
Спасибо. Чтобы сильно помогло, нужно около 10 000 распознаных номеров. Мы уже натренировали базу украинских номеров и получили очень высокую точность. Скоро напишем вторую часть статьи, где расскажем как тренировать модели под свои нужды.
Спасибо за статью! Шикарный материал для ознакомления с возможностями Mask R-CNN. Поправьте, пожалуйста, ссылку на файл requirements.txt, указанную в статье — сейчас там 404.

Вопрос: есть ли возможность в Вашем решении дообучать модели, «докидывая» новые фото, но не стартуя обучения с нуля?

P.S. Очень интересно почитать продолжение статьи о разметке и подготовке материала)
Спасибо за статью! Шикарный материал для ознакомления с возможностями Mask R-CNN. Поправьте, пожалуйста, ссылку на файл requirements.txt, указанную в статье — сейчас там 404.

Спасибо что написали — пофиксим, когда я сформировал этот файл у себя на компе туда повписывало все модули, которые у меня установлены, а их очень много. Тогда я решил в docer-е поставить все по минимому чтоб все заработало, но закрутился и забыл. Сегодня сделаем, проапдейтим и выложим.
Вопрос: есть ли возможность в Вашем решении дообучать модели, «докидывая» новые фото, но не стартуя обучения с нуля?

Если речь идет о самом нахождении границ номера с помощью Mask R-CNN, там только дообучать. Мы и сами дообучали модель из coco dataset.
Если речь идет о классификаторе, с помощью которого получать тип номера, то там дообучать можно, но по времени и качеству это не сильно будет отличаться от «обучения с нуля»
Если речь идет о классификаторе, с помощью которого получать тип номера, то там дообучать можно, но по времени и качеству это не сильно будет отличаться от «обучения с нуля»

Да, вопрос был по классификатору. Спасибо за ответ!
UFO just landed and posted this here
Да, конечно, просто мы до этого этапа еще не дошли, т.к. для наших задач получили приемлемую точность.
Добрый день!
Я прочитал вы верно определяете 80 % номеров. Какая вероятность нахождения таблички номера? Есть ли лже срабатывания (т.е. найти номер там где его нет)?
После того как найден регион происходит его классификация нейронной сетью. Точность классификатора 96%.
Другими словами Mask R-CNN находит номера и др артефакты, потом классификатор c точностью 96% отбраковывает не номера и поэтому вероятность что в профильтрованых результатах остались артефакты 4%. (В примере выше если regionId == 0 зона с регионом уже отбракована, ее можно распознать для интереса, а можно и отбросить)
Сам классификатор легко и относительно недолго тренируется. Об этом расказывать долговато, поэтому оставил для будущих статей.
Конечно все расчитывалось по нашей обучающей выборке, где нету номеров РФ, так что для того чтоб наверняка померять точность для вашего случая, нужно разметить примеры номеров РФ и добавить их общую обучающую выборку и дотренировать модель, потом в классификатор добавить еще один выход (назовем его 'ru') и повторно натренировать классификатор, тогда точность можно померять на заданной тестовой выборке.
Моя параноидальная привычка замазывать номера на всех фотках своего авто приобретатет новый смысл! :)
По статистике просмотров, объявления с замазанными номерами смотрят на 43% меньше а звонят по них еще меньше. Для покупателя вы попадаете в одну категорию с мошенниками, которые обычно замазывают номера. Так что не рекомендую так делать. Это вызывает недоверие на начальном этапе и вы просто можете не получить покупателя, которому вы изначально подозрительны.
Я понимаю, что вы правы (спасибо за пояснение / обмен опытом), но мне не нравится, что по номеру любой Вася может получить личные данные владельца авто. Это неправильно, эта информация не должна быть публичной и легкодоступной, уж точно не автоматически доступной онлайн.
что-то вы поздно спохватились про "по номеру". (вкратце — вам поищут недвижимость, юрлиц и физлиц-предпринимателей и многое другое, к чему вы знаете номер)
Вот, теперь можно и по фото авто.
Попробуйте еще раз, на демо-сайте не такое уж крутое железо.
Есть продукт которий ошыбается минимально. Поддержка многих стран и втом числе росии.
В примере Demo0 и других возникает такая ошибка:
error: OpenCV(4.0.0) C:\projects\opencv-python\opencv\modules\imgproc\src\shapedescr.cpp:237: error: (-215:Assertion failed) count >= 0 && (depth == CV_32F || depth == CV_32S) in function 'cv::arcLength'
Куда копать? В Puthon пока не очень силен…
Ставте 3.4, там ошибки не будет. В понедельник пофиксим для 4.0.0.
Это была проблема на нашей стороне. В OpenCV 4.x функция findContours возвращает 2 объекта, в отличии от соответствующей функции в OpenCV 3.x.
Баг был пофикшен. Теперь будем следить что бы NomeroffNet поддерживал и 4 версию.
Немного потестировал онлайн вашу программу. Сразу скажу у меня есть база только российских номеров. Цель тестирования: определить качество выделения номерной пластины.
Довольно часто происходит определение не только номерной пластины, но и номера:
image
Как на мой взгляд, самая большая проблема в вашем решении — это лже срабатывания. Знаю обидеть художника может каждый, моя цель не в этом. Ниже примеры, вначале исходное сходное после результат обработки.
Дорожная разметка, как номерная пластина:
image

image
Дорожный знак, как номерная пластина:
image

image

image

image
Малая часть номерной пластины выделена:
image

image

P.S. Я так же занимаюсь определением номеров. У меня есть база более 7 000 рос номеров. Давайте меняться. Интересуют рос, укр, еврономера.
Немного потестировал онлайн вашу программу. Сразу скажу у меня есть база только российских номеров. Цель тестирования: определить качество выделения номерной пластины.
Довольно часто происходит определение не только номерной пластины, но и номера:

В нашей обучающей в выборке нету ни одного номера РФ. Добавте размеченные данные в выборку, перетренируйте модель и результат будет лучше. Артифакты будет находить всегда, потому что есть много визуально похожих на номер частей изображения. Но их можно отфильтровать, если очень хорошо детектить текст внутри границы номера. Мы над этим работаем, уже получили отличные результаты для украинских номеров. Другими словами мы заменили tesseract на свою обученную нейронку. Об этом напишем в следующей статье.

P.S. Я так же занимаюсь определением номеров. У меня есть база более 7 000 рос номеров. Давайте меняться. Интересуют рос, укр, еврономера.

Мы выложили датасеты в открытый доступ, так что Вам взамен ничего присылать ненужно. Если хотите приблизить хорошое распознавание номеров РФ нашим алгоритмом пришлите свою базу.
Добрый день! Когда выйдет 2 часть? Спасибо!
Мы сейчас добавляем поддержку номеров РФ с качеством распознавания 96%, уже все работает. Причешем, закомитим и опишем все во 2 части в ближайшие несколько дней.
Sign up to leave a comment.

Articles