LINUX.ORG.RU
ФорумTalks

Распознавание автомобильных номеров

 ,


4

2

Поскольку вопрос по распознаванию автомобильных номеров периодически всплывает, а open source вариантов у нас все еще нет, решил поделится написанной (и сложенной в чулан) распознавалкой.

Брать тут https://bitbucket.org/neird/alpr.git. Автор ответственности не несет и все такое.

Система была написана для целей логирования номерных знаков на пропусных пунктах парковок. Код стоит рассматривать как тестовый прототип заслуживающий переписывания. Тем не менее он рабочий и давал точность расспознавания на тестовом датасете (нет не поделюсь) порядка 90-95% (по схеме правильно/неправильно).


Readme для слабаков? Еще и на мёртвом хостинге.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Написано же 'и сложенной в чулан'. Проект из категории 'выкинуть жалко' поэтому 'подарим сообществу'.

Обсуждение мертвости bitbucket это имхо религиозный вопрос.

neird ()

На основе openalpr? Но зачем?

Solace ★★ ()

Тем не менее он рабочий и давал точность расспознавания на тестовом датасете (нет не поделюсь)

Как формировался датасет?

Мне как бы не надо, у меня есть, но просто интересно.

порядка 90-95% (по схеме правильно/неправильно).

В каком диапазоне яркость/контрастность пластины ГРЗ?
Как влияет грязь на пластине на процент распознавания?
Как влияет смаз изображения из-за высокой скорости?
Какой диапазон рабочих размеров в пикселях?
Препроцессинг (поворот пластины, исправление трапеции) нужен/есть?
Сколько распознаётся одна пластина?
Работа с цветной пластиной, или только ч/б?
Сколько стран распознаётся?
Есть ли шаблоны?

95%

Таких значений нет у ARH, ISS, Visillect при суточных прогонах на магистралях в произвольных погодных условиях. С парковками конечно попроще: изображение — статика, разброс по геометрии минимален, время распознавания не лимитируется, но скепсис имеется.

imul ★★★★★ ()
Ответ на: комментарий от imul

Там linear SVM + haar.
Поэтому вопросы по поводу работы с искаженными данными не требуют ответа, с ними все довольно плохо.

Solace ★★ ()
Последнее исправление: Solace (всего исправлений: 1)
Ответ на: комментарий от Solace

На основе openalpr? Но зачем?

Где вы увидели openalpr? Там кроме opencv нет ничего.

neird ()
Ответ на: комментарий от neird

Лажанул, да. Сорри.
И да, а почему не попробовал CNN для feature extraction?

Solace ★★ ()
Ответ на: комментарий от neird

В любом случае лично от меня спасибо за код. Попутно вопрос: почему забросил? Сейчас это направление очень популярное.

imul ★★★★★ ()
Ответ на: комментарий от imul

Как формировался датасет?

Съемка в режиме снапшота с камер парковок плюс веб.

В каком диапазоне яркость/контрастность пластины ГРЗ?

Худшее что было это (черное-белое)/белое~0.1

Как влияет грязь на пластине на процент распознавания?

Поскольку 'заказчик' решил проект не развивать, то до тестирования этого (и много чего еще) дело не дошло. Датасет парковок собирался поздней осенью ранней зимой поэтому в обучающих выборках было всякое.

Как влияет смаз изображения из-за высокой скорости?

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

Однако на парковках снимали в том числе дешевыми китайскими веб камерами иногда с не очень адекватным временем экспозиции и моментом съемки поэтому обучающие данные пришлось поаугментировать на это.

Какой диапазон рабочих размеров в пикселях?

Ширины от 100 до 200 были в тестовой выборке. Поскольку номер ищется Хааром то как таковых жестких ограничений нет.

Препроцессинг (поворот пластины, исправление трапеции) нужен/есть?

Исправляется только аффинное преобразование (параллелограмм). Как показала практика этого достаточно даже если угол съемки 30 градусов к нормали номерного знака. Обучающие данные данные для классификаторов символов были аугментированы чтобы терпеть остаточные деформации.

Сколько распознаётся одна пластина?

Порядка 0.3сек на все операции на одном ядре AMD A8-6410 если не свалится в 'брутфорс' поиска букв на номере. Если свалится, то ~3сек.

Работа с цветной пластиной, или только ч/б?

С серой, цветная приводится к серой.

Сколько стран распознаётся?

Только РФ, номера авто, автобусы и грузовые.

Есть ли шаблоны?

Нет.

95%

Таких значений нет у ARH, ISS, Visillect при суточных прогонах на магистралях в произвольных погодных условиях. С парковками конечно попроще: изображение — статика, разброс по геометрии минимален, время распознавания не лимитируется, но скепсис имеется.

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

neird ()
Ответ на: комментарий от Solace

Там linear SVM + haar. Поэтому вопросы по поводу работы с искаженными данными не требуют ответа, с ними все довольно плохо.

haar только для поиска номера. С ним все достаточно хорошо работает. В имевшихся условиях recall был >99%.

Аффинные искажения нормализуются. Обучающие данные для классификаторов символов аугментировались чтобы терпеть оставшие проективные искажения.

linear SVM чудесно работает для расспознавания символов 'фиксированного' шрифта если его пускать по hog.

neird ()
Ответ на: комментарий от Solace

Лажанул, да. Сорри. И да, а почему не попробовал CNN для feature extraction?

Потому что 'заказчик' хотел на дешевом железе. CNN сразу предполагает не самое дешевое железо.

neird ()
Ответ на: комментарий от neird

Ага. Почитал, повнимательнее глянул код. После работы поиграюсь.

Solace ★★ ()
Ответ на: комментарий от imul

В любом случае лично от меня спасибо за код. Попутно вопрос: почему забросил? Сейчас это направление очень популярное.

Пожалуйста. Забросил потому что изначальному 'заказчику' не очень хотелось платить за проект, а мне не очень хотелось самому заниматься его коммерциализацией. Поэтому случился 'no deal' и я решил 'подарить текущую версию людям'.

От меня не убудет поскольку объективно говоря, после скуривания всех 1500+ (да их в природе столько) статей связанных с license plate recognition, все нужно сильно переделать.

neird ()
Ответ на: комментарий от neird

Спасибо за подробный ответ.

Съемка в режиме снапшота с камер парковок плюс веб.

Сколько примерно понадобилось пластин для обучения до заявленного уровня?

Худшее что было это (черное-белое)/белое~0.1

Подсвечивали видимым/ИК светом? Или хватало «уличных» условий круглосуточно?

Деградирует естественно.

Это понятно, я имел в виду числа. Но, раз до тестирования не дошло, то вопрос снимается.

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

Снапшот делался по какому-то внешнему событию? Motion detection, или даже внешний датчик. Или выбирали кадры из кольцевого буфера и искали пластину там? В код не смотрел, поэтому такие глупые вопросы.

С серой, цветная приводится к серой. Шаблонов нет.

Кхм, это как-то совсем по частному. Там где хоть немного пахнет государством, обычно сразу всплывает требование на синие и чёрные пластины (насчёт красных склероз молчит). Их даже в базе фиксировать запрещается.

Ширины от 100 до 200 были в тестовой выборке.

Имелась в виду высота самого мелкого элемента текста ГРЗ. Но, в принципе неважно, пересчитывается в уме. Примерно 6-12 пиксел для букв, 7-14 для цифр, 6-12 для цифр номера и 3-6 для RUS. Значения такие же, как и у коммерческих систем.

Только РФ, номера авто, автобусы и грузовые.

Понятно. На фоне требований к распознанию 60-70 стран (в каждой 4-6 вариантов) не очень густо.

Охотно верю что на магистралях все плохо.

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

В условиях парковки несколько проще, особенно если статика.

Я так понял, что была только статика. Авто стоит номером перед камерой пока не откроется шлагбаум.

Очень может быть что датасет не репрезентативный.

Для своей задачи очень даже репрезентативный.

Как показала практика этого достаточно даже если угол съемки 30 градусов к нормали номерного знака.

А это очень интересно. Поскольку то, с чем приходилось сталкиваться, очень печально реагировали на вращение. А дополнительный препроцессинг плохо сказывался на жоре рессурсов. Также актуальная проблема — нестантартное расположение пластины ГРЗ.

imul ★★★★★ ()
Ответ на: комментарий от imul

Сколько примерно понадобилось пластин для обучения до заявленного уровня?

~10000 с парковок и ~30000 веб, но это только для распознавания и нормализации. В основном для набора статистики загрязнения. 20% ушло в test set.

Детектор был взят готовый из opencv. Он не очень хороший (recall ~95%), но если изображение 'подергать' блуром, то можно сделать ~99%. Свой большой датасет для обучения детектора был собран, но по вышеозвученной причине не был использован.

Подсвечивали видимым/ИК светом? Или хватало «уличных» условий круглосуточно?

Не подсвечивали вообще ни чем :(. Значительная часть датасета это съемка китайской камерой на гране ослепления фронтальными фарами.

Снапшот делался по какому-то внешнему событию? Motion detection, или даже внешний датчик. Или выбирали кадры из кольцевого буфера и искали пластину там? В код не смотрел, поэтому такие глупые вопросы.

Чесно говоря фиг его знает как оно срабатывало (это не я делал) когда датасет собирался. Судя по всему снапшот делался по сигналу поднятия шлагбаума три раза через 1 секунду. Поэтому моя задача состояла в том чтобы написать библиотеку которой на вход дается картинка плюс настройки, а на выход она даст номер.

Для демонстрации был сделан autonum.py который сидит, смотрит видео поток и по получению в консоль get, распознает и выводит номер.

Кхм, это как-то совсем по частному. Там где хоть немного пахнет государством, обычно сразу всплывает требование на синие и чёрные пластины (насчёт красных склероз молчит). Их даже в базе фиксировать запрещается.

На доступных парковках черных, синих и красных не было. В задании на это тоже забили. По факту нужно поправить в svm_letter_detector.py проекцию на серое чтобы распознавалось.

Понятно. На фоне требований к распознанию 60-70 стран (в каждой 4-6 вариантов) не очень густо.

Вряд ли исходники такой вещи мы в ближайшее время увидим.

Я так понял, что была только статика. Авто стоит номером перед камерой пока не откроется шлагбаум.

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

А это очень интересно. Поскольку то, с чем приходилось сталкиваться, очень печально реагировали на вращение. А дополнительный препроцессинг плохо сказывался на жоре рессурсов. Также актуальная проблема - нестантартное расположение пластины ГРЗ.

Нормализация номера была одна из основных проблем, потому что камеры поставлены фиг знает как и переставить их нельзя. Поэтому пришлось терпеть углы к нормали до порядка 30 градусов (сверху + справа/слева). Поскольку вменяемый shape regressor остался в пухлом TODO (на которое забили), то делал только нормализацию аффинных деформаций. На перспективные искажение и 'спремление' кривых номеров забили, но поаугментировали данных для классификаторов символов чтобы они это терпели.

neird ()
Ответ на: комментарий от neird

Спасибо ещё раз за ответы. Больше вопросов не осталось.

imul ★★★★★ ()

А страна то какая? В каждой стране свои особенности номеров ведь.

zgen ★★★★★ ()
Ответ на: комментарий от zgen

А страна то какая? В каждой стране свои особенности номеров ведь.

Только РФ, номера авто, автобусы и грузовые.

neird ()

Зря кстати заброшено. Вон ребята наваяли нечто подобное, прикрутили туда гуй и продаюк за 16к деревянных на 4 камеры лицензии. http://sprecord.ru/products/programma-ipvideorecord/
Сервер там кстати есть под онтопик.
Может кому будет полезно.
Штука завелась с полпинка, единственное клиент требует 3Д-ускорения под оффтопом, на виртуалке не завелось (

tmp_do ()
Ответ на: комментарий от tmp_do

Зря кстати заброшено. Вон ребята наваяли нечто подобное, прикрутили туда гуй и продаюк за 16к деревянных на 4 камеры лицензии.

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

neird ()
Ответ на: комментарий от neird

Забросил потому что изначальному 'заказчику' не очень хотелось платить за проект,

NDA подписывал? Не из Питера/Сколково заказчик? Уж больно часто встречаю на просторах инета такое кидалово.

pacify ★★★★★ ()
Последнее исправление: pacify (всего исправлений: 1)
Ответ на: комментарий от pacify

NDA подписывал? Не из Питера/Сколково заказчик? Уж больно часто встречаю на просторах инета такое кидалово.

Нет, можете спокойно пользоваться. Считайте что public domain.

Откуда не скажу.

Тут немножко другая ситуация. 'Заказчик' пришел от знакомого. Предполагалось что случится бизнес. Был написан прототип. Стремление 'заказчика' взять на себя какие либо риски оказалось ниже плинтуса (даете готовую систему, мы будем продавать). 'Заказчик' был послан. Проект был сложен на полку всесте с TODO.

neird ()
Ответ на: комментарий от neird

Стремление 'заказчика' взять на себя какие либо риски оказалось ниже плинтуса

Да я просто с таким же коммерсом сталкивался, из бывших. Всё 1-в-1. Только у меня не номера надо было обнаруживать, а лица.

Считайте что public domain.

Ну это всё понятно, как в старые-добрые 90-е.

pacify ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.