Comments 58
Давно искал что-нибудь подобное, вот и пригодится мне, наверное, ваша библиотечка 8)
Печаль моя не имела границ т.к. мои входные данные были в разы хуже чем для коммерческих аналогов. Так и не удалось добиться стабильных результатов.
Не могли бы вы указать приблизительные требования для входной картинки (Размеры номерного знака, допустимые углы отклонения)
PS: + за решенную задачу :)
- Разрешение фото должно быть не меньше 300x300
- Максимальное разрешение ограничено производительностью вашего компа, если использовать GPU Nvidia, то при разрешении FullHD будет распознавать около 500ms/фото, если на обычном CPU, то это будет уже 5 сек на фото.
- Большой плюс если размер найденного номерного знака на фото по вертикали имеет 64 и более точек
- Границы номера будут находиться даже при сильном повороте или даже на перевернутой фотографии, а вот распознаваться они будут только если можно сказать что номер в большей читается слева направо чем сверху вниз или снизу вверх. Эту проблему тоже можно решить, если будет смысл на это тратить процессорное время. Другими словами углы наклона ограничены читаемостью номера.
- Естественно, размытая или зашумленная фото будет распознаваться плохо.
Вот пример номерного знака
На сколько вероятно правильное распознавание?
- После нормализации, зная структуру номера разбить на зоны, в которых 1 позиция 1 символ, вам следует искать предполагаемый центр каждого символа.
- Далее вырезаем предполагаемый участок с символом и классифицируем его согласно возможных вариантов, которые там могут встречаться. Тут следует не сильно боятся зацепить часть рядом стоящего символа, хорошо натренированный классификатор это не остановит :)
- Ну и в конце постобработка, по вероятности сочетания тех или иных символов в номерных знаках РФ. Вероятность комбинаций можно получить проанализировав базу с реестром номерных знаков. Украинские данные открыты с 2013 года — там уже более 9 млн записей, достаточно точно можно прогнозировать вероятность сочетания той или иной комбинации букв/кодов
Можете дать совет, куда копать? Есть задача распознавать печатные цифры на произвольно (но без экстрима) изогнутом и повернутом листе бумаги. Шрифт один, букв нет, исходное соотношение сторон листа известно. Соответственно, вход может содержать довольно большие куски фона для листа, т.к. вырезается из исходного изображения лист вместе с фоном. Для простоты примем, что заломов нет. Вроде бы и простая задача, но сколько не мучил ssd сеть — точность находится на крайне низком уровне.
Какой понадобится объем обучающей выборки для каждого из 10 классов? Какую архитектуру лучше выбрать?
- Нормализовать изображение
- Отделить каждое слово
- Разбить слово по буквам(подойдёт RNN сеть)
- Непосредственно распознать(обычный классификатор)
Так же рекомендую посмотреть на EAST.
По поводу выборки, изначально хватит и минимальной — по 50-100 изображений каждого класса, что бы проверить работоспособность выбранного решения, но стоит помнить, что в датасете MNIST, например, 60000 изображений для обучения и 10000 изображений для тестирования. В наших задачах, мы использовали веса предварительно обученных нейронных сетей, а так же делали случайные преобразования над имеющимися входными данными для увлечения датасета.
Номера РФ не пробовали распознавать, т.к. у нас на сайте они не встречаются. Думаю что без доработки процент будет низкий так как мы отключили распознавание кириллицы (в украинских номерах все сочетания букв подобраны так чтоб соответствовать варианту из латиницы). Может кому то будет интересно — допилит, так как особой проблемы с нахождением границ номера РФ нету.
С ianpr не сравнивали, но вот OpenALPR работает хорошо (в том числе и с номерами РФ).
ps Кириллицы в российских номерах тоже давно нет.
Как ни странно, но в России тоже =)
Это очень-очень спорное решение, на мой взгляд.
в ГОСТ Р 50577-93
(и в новом Р 50577-2018
) звучит это так:
3.7 На регистрационных знаках типов 1-22 могут применяться следующие буквы: А, В, Е, К, М, Н, О, Р, С, Т, X, У. На регистрационных знаках типа 9, 10 может применяться также буква D.
По простому — из национального алфавита были выбраны ровно те буквы, которые имеют визуальный аналог на латинице. И почему это спорное решение?
Потому что у них нет визуальных аналогов в национальном алфавите
Кстати, в Украине классный дизайн-код номерных знаков стандарта 2015 года!Что именно классно?
в украинских номерах все сочетания букв подобраны так чтоб соответствовать варианту из латиницы
В Российских номерах, совершенно внезапно, все так же
новость: www.autocentre.ua/ua/avtopravo/zakonodatelstvo/v-ukraine-poyavilis-nomera-dlya-avto-s-latinskimi-bukvami-takie-poluchat-ne-vse-1267777.html
П.С. Привет :)
Касаемо tesseract, — распознаёт он действительно слабовато. Пробовал его использовать, без особых успехов.
На голландском номере распозналась полная чушь, к сожалению.
Вопрос: есть ли возможность в Вашем решении дообучать модели, «докидывая» новые фото, но не стартуя обучения с нуля?
P.S. Очень интересно почитать продолжение статьи о разметке и подготовке материала)
Спасибо за статью! Шикарный материал для ознакомления с возможностями Mask R-CNN. Поправьте, пожалуйста, ссылку на файл requirements.txt, указанную в статье — сейчас там 404.
Спасибо что написали — пофиксим, когда я сформировал этот файл у себя на компе туда повписывало все модули, которые у меня установлены, а их очень много. Тогда я решил в docer-е поставить все по минимому чтоб все заработало, но закрутился и забыл. Сегодня сделаем, проапдейтим и выложим.
Вопрос: есть ли возможность в Вашем решении дообучать модели, «докидывая» новые фото, но не стартуя обучения с нуля?
Если речь идет о самом нахождении границ номера с помощью Mask R-CNN, там только дообучать. Мы и сами дообучали модель из coco dataset.
Если речь идет о классификаторе, с помощью которого получать тип номера, то там дообучать можно, но по времени и качеству это не сильно будет отличаться от «обучения с нуля»
Я прочитал вы верно определяете 80 % номеров. Какая вероятность нахождения таблички номера? Есть ли лже срабатывания (т.е. найти номер там где его нет)?
Другими словами Mask R-CNN находит номера и др артефакты, потом классификатор c точностью 96% отбраковывает не номера и поэтому вероятность что в профильтрованых результатах остались артефакты 4%. (В примере выше если regionId == 0 зона с регионом уже отбракована, ее можно распознать для интереса, а можно и отбросить)
Сам классификатор легко и относительно недолго тренируется. Об этом расказывать долговато, поэтому оставил для будущих статей.
Конечно все расчитывалось по нашей обучающей выборке, где нету номеров РФ, так что для того чтоб наверняка померять точность для вашего случая, нужно разметить примеры номеров РФ и добавить их общую обучающую выборку и дотренировать модель, потом в классификатор добавить еще один выход (назовем его 'ru') и повторно натренировать классификатор, тогда точность можно померять на заданной тестовой выборке.
Аплоад картинки не проходит
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 пока не очень силен…
Довольно часто происходит определение не только номерной пластины, но и номера:
Как на мой взгляд, самая большая проблема в вашем решении — это лже срабатывания. Знаю обидеть художника может каждый, моя цель не в этом. Ниже примеры, вначале исходное сходное после результат обработки.
Дорожная разметка, как номерная пластина:
Дорожный знак, как номерная пластина:
Малая часть номерной пластины выделена:
P.S. Я так же занимаюсь определением номеров. У меня есть база более 7 000 рос номеров. Давайте меняться. Интересуют рос, укр, еврономера.
Немного потестировал онлайн вашу программу. Сразу скажу у меня есть база только российских номеров. Цель тестирования: определить качество выделения номерной пластины.
Довольно часто происходит определение не только номерной пластины, но и номера:
В нашей обучающей в выборке нету ни одного номера РФ. Добавте размеченные данные в выборку, перетренируйте модель и результат будет лучше. Артифакты будет находить всегда, потому что есть много визуально похожих на номер частей изображения. Но их можно отфильтровать, если очень хорошо детектить текст внутри границы номера. Мы над этим работаем, уже получили отличные результаты для украинских номеров. Другими словами мы заменили tesseract на свою обученную нейронку. Об этом напишем в следующей статье.
P.S. Я так же занимаюсь определением номеров. У меня есть база более 7 000 рос номеров. Давайте меняться. Интересуют рос, укр, еврономера.
Мы выложили датасеты в открытый доступ, так что Вам взамен ничего присылать ненужно. Если хотите приблизить хорошое распознавание номеров РФ нашим алгоритмом пришлите свою базу.
Распознавание номеров. Практическое пособие. Часть 1