Как распознать номера авто

Как распознать номера авто

Сообщение valeon » 03 окт 2013, 13:27

1. Берем VirtualDUB (желательно последнй он все форматы видео понимает), открываем видео, удаляем не нужное видео, оставляем только кусок где сам инцендент. Далее Файл-сохранить последовательность картинок. выбирете папку куда сохранять. Я сохранял в формате BMP. Отобрал фото где более менее близко машина с не читаемым номером была. Как отрезать не нужное в VirtualDUB выбраете начало ненужного фрагмента нажимаете кнопку HOME на клаве, затем встанте в конец ненужного фрагмента нажмите END. затем DEL. все кусок отрезан.

2. Открываем программку PhotoZoom Pro 5. Загружаете туда первую картинку. Слева в программе выбраете разрешение 500-800, сдвигаете картинку так чтобы в правом окне был виден номер ил очертания его. Затем по порядку применяете Алгоритмы изменения размера. В каждом фильтре есть наборы настроек, их тоже прогоняете. Еще нюанс, иногда получается так что пр применении фильтра в близи номер непонятен но из далека метров с двух от монитора становиться различим. (в моем случае так и получилось). Если с первой не получилось пробуйте следующую. Процесс муторный, и долги в зависимости от ПК, программке хороший процессор нужен.

3. Если картинка четкая но смазанная есть изумительная прога SmartDeblur-2.1_win в ней все понятно. Тоже помогает хорошо.

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

з.ы. Админы готов заслуженно получить предупреждение тк не знаю в какой раздел форума, запостить.Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Источник

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

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто
Настало время подробно рассказать, как работает наша реализация алгоритма распознавания номеров: что оказалось удачным решением, что работало весьма скверно. И просто отчитаться перед Хабра-пользователями — ведь вы с помощью Android приложения Recognitor помогли нам набрать приличного размера базу снимков номеров, снятых совершенно непредвзято, без объяснения как снимать, а как нет. А база снимков при разработке алгоритмов распознавания самое важное!

Что получилось с Android приложением Recognitor

Было очень приятно, что пользователи Хабра взялись качать приложение, пробовать его и отправлять нам номера.

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто
Скачиваний программы и оценки

С момента выкладывания приложения на сервер пришло 3800 снимков номеров от мобильного приложения.
А еще больше нас порадовала ссылка http://212.116.121.70:10000/uploadimage — нам за 2 дня отправили около 8 тысяч полноразмерных снимков автомобильных номеров (преимущественно вологодских)! Сервер почти лежал.

Теперь у нас на руках база в 12 000 снимков фотографий — впереди гигантская работа по отладке алгоритмов. Все самое интересное только начинается!

Напомню, что в приложении Android предварительно выделялся номер. В этой статье я не буду подробно останавливаться на этом этапе. В нашем случае — каскадный детектор Хаара. Этот детектор не всегда срабатывает, если номер в кадре сильно повернут. Анализ того, как работает нами обученный каскадный детектор, когда не работает, оставлю на следующие статьи. Это ведь действительно очень интересно. Кажется, что это черный ящик — вот обучили детектор и больше ничего не сделать. На самом деле это не так.

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

Распознавание номера

Здесь рассказ про распознавание текста в картинках такого вида:

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто
Общие подходы про распознавании были описаны в первой статье.

Изначально мы ставили перед собой задачу распознавания грязных, частично стертых и здорово искаженных перспективой номеров.
Во-первых, это интересно, а во-вторых, казалось, что тогда чистые будут срабатывать вообще в 100% случаях. Обычно, конечно, так и происходит. Но тут не сложилось. Оказалось, что если по грязным номерам вероятность успеха была 88%, то по чистым, например, 90%. Хотя на деле вероятность распознавания от фотографии на мобильном приложении до успешного ответа, конечно, оказалось еще хуже указанной цифры. Чуть меньше 50% от приходящих изображений (чтобы люди не пытались фотографировать). Т.е. в среднем дважды нужно было сфотографировать номер, чтобы распознать его успешно. Хотя во многом такой низкий процент связан с тем, что многие пытались снимать номера с экрана монитора, а не в реальной обстановке.

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

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

Как же распознать хороший и чистый номер? Это совсем не сложно.

Предъявим следующие требования к такому алгоритму:

1) некоторая устойчивость к поворотам (± 10 градусов)
2) устойчивость к незначительному изменению масштаба (20%)
3) отрезание каких-либо границ номера границей кадра или просто плохо выраженные границы не должны рушить все (это принципиально важно, т.к. в случае грязных номеров приходится опираться на границу номера; если номер чистый, то ничего лучше цифр/букв не характеризует номер).

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

Здесь стоит еще пройтись фильтром средних частот и нормализовать изображение.
Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто
На изображении приведен изначально малоконтрастный кадр для наглядности.

Затем бинаризовать по фиксированному порогу (можно порог фиксировать, т. к. изображение было нормализовано).

Гипотезы по повороту кадра

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

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

А затем собрать все связанные области. Тут использовалась стандартная функция findContours из OpenCV. Если связанная область (контур) имеет высоту в пикселях от H1 до H2 а ширина и высота связана отношением от K1 до K2, то оставляем в кадре и отмечаем, что в этой области может быть знак. Почти наверняка на этом этапе останутся лишь цифры и буквы, остальной мусор из кадра уйдет. Возьмем ограничивающие контуры прямоугольники, приведем их к одному масштабу и дальше поработаем с каждой буквой/цифрой отдельно.

Вот какие ограничивающие прямоугольники контуров удовлетворили нашим требованиям:
Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Качество снимка хорошее, все буквы и цифры отлично разделимы, иначе мы до этого шага не дошли бы.
Масштабируем все знаки к одному размеру, например, 20х30 пикселей. Вот они:
Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто
Кстати, OpenCV при выполнении Resize (при приведении к размеру 20х30) бинаризованное изображение превратит в градиентаное, за счет интерполяции. Придется повторить бинаризацию.

И теперь самый простой способ сравнить с известными изображениями знаков — использовать XOR (нормализованная дистанция Хэмминга). Например так:

Distance = 1.0 — |Sample XOR Image|/|Sample|

Если дистанция больше пороговой, то считаем, что мы нашли знак, меньше — выкидываем.

Да, мы ищем автомобильные знаки РФ именно в таком формате. Тут нужно учесть, что цифра 0 и буква «о» вообще не отличимы друг от друга, цифра 8 и буква «в». Выстроим все знаки слева направо и будем брать по 6 знаков.
Критерий раз — буква-цифра-цифра-цифра-буква-буква (не забываем про 0/о, 8/в)
Критерий два — отклонение нижней границы 6 знаков от линии

Суммарные очки за гипотезу — сумма дистанций Хэмминга всех 6 знаков. Чем больше, тем лучше.

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

Тут еще стоит рассмотреть отдельно буквы «Н» и «М». Для этого нужно сделать отдельный классификатор, например, по гистограмме градиентов.

Следующие два или три знака над линей, проведенной по низу 6 уже найденных знаков, — регион. Если третья цифра существует, и ее похожесть больше пороговой, то регион состоит из трех цифр. Иначе из двух.

Однако, распознавание региона часто происходит не так гладко, как хотелось бы. Цифры в регионы меньше, могут удачно не разделиться. Поэтому регион лучше узнавать способом более устойчивым к грязи/шума/перекрытию, описанным далее.

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

Алгоритм устойчивый к грязным номерам

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

Вот примеры номеров, когда первый алгоритм не смог ничего сделать:
Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

А алгоритм, описанный далее, смог.

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

Ищем нижнюю границу номера

Самый простой и самый надежный этап в этом алгоритме. Перебираем несколько гипотез по углу поворота и строим для каждой гипотезы по повороту гистограмму яркости пикселей вдоль горизонтальных линий для нижней половины изображения:
Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Выберем максимум градиента и так определим угол наклона и по какому уровню отрезать номер снизу. Не забудем улучшить контраст и получим вот такое изображение:
Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

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

Ищем верхнюю границу номера

Тут уже не так очевидно, оказалось, если снимают с рук задний автомобильный номер, то верхняя граница может быть сильно изогнута и частично прикрывать знаки или в тени, как в данном случае:
Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто
Резкого перехода яркости в верхней части номера нет, а максимальный градиент и вовсе разрежет номер посередине.

Мы вышли из ситуации не очень тривиально: обучили на каждую цифру и каждую букву каскадный детектор Хаара, нашли все знаки на изображении, так определили верхнюю линию где резать:

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Казалось бы, что тут и стоит остановиться — мы же нашли уже цифры и буквы! Но на деле, конечно, детектор Хаара может ошибаться, а у нас тут 7-8 знаков. Хороший пример цифры 4. Если верхняя граница номера сливается с цифрой 4, то совсем не сложно увидеть цифру 7. Что кстати и произошло в данном примере. Но с другой стороны, несмотря на ошибку в детектировании, верхняя граница найденных прямоугольников действительно совпадает с верхней границей автомобильного номера.

Найти боковые границы номера

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

Итак, вот хорошо обрезанный номер:

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто
да! особенно приятно вставить кадр с отвратительным номером, который был успешно распознан.

Печалит лишь одно — к этому этапу от 5% до 15% номеров могут отрезаться неправильно. Например, так:
Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто
(кстати это кто-то нам отправил желтый номер такси, насколько я понял — формат не штатный)

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

Разделить строку на знаки

К сожалению, из-за перспективы и не стандартной ширины всех знаком, приходится как-то выделять символы в уже обрезанном номере. Тут снова выручит гистограмма по яркости, но уже вдоль оси X:
Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

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

Изображение до сих пор не бинаризовано, будем использовать всю информацию, что есть.

Здесь печатные символы, значит подойдет взвешенная ковариация для сравнения изображений с примером:
Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Образцы для сравнения и веса при ковариации:
Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Конечно, нельзя просто сравнить область, выделенную с помощью горизонтальной гистограммы, с образцами. Приходится делать несколько гипотез по смещению и по масштабу.
Количество гипотез по положению по оси X = 4
Количество гипотез по положению по оси Y = 4
Количество гипотез по масштабу = 3

Таким образом, для каждой области при сравнении с одним знаком необходимо рассчитать 4х4х3 ковариации.

Первым делом найдем 3 большие цифры. Это 3 х 10 х 4 х 4 х 3 = 1440 сравнений.

Затем слева одну букву и справа еще две. Букв для сравнения 12. Тогда количество сравнений 3x12x4x4x3 = 1728

Когда у нас есть 6 символов, то все справа от них — регион.

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

В регионе могут быть 2 цифры или 3 цифры — это нужно учесть. Разбивать регион гистограммным способом уже бессмысленно из-за того, что качество изображения может быть слишком низкое. Поэтому просто поочередно находим цифры слева направо. Начинаем с левого верхнего угла, необходимо несколько гипотез по оси X, оси Y и масштабу. Находим наилучшее совпадение. Смещаемся на заданную величину вправо, снова ищем. Третий символ будем искать слева от первого и справа от второго, если мера похожести третьего символа больше пороговой, то нам повезло — номер региона состоит из трех цифр.

Выводы

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

Вскрылась и другая сторона медали: мало что так раздражает пользователя, как ситуация, когда автоматическая система не решает совсем примитивную задачу. «Ну что тут может не читаться?!» А то, что автоматическая система не смогла узнать грязный или потертый номера, — это ожидаемо.

Откровенно говоря, это наш первый опыт разработки системы распознавания для массового потребителя. И о таких «мелочах», как о пользователях, стоит учиться думать. Сейчас к нам присоединился специалист, разработавший аналогичную «Recognitor» программу под iOs. В UI у пользователя появилась возможность увидеть, что сейчас отправляется на сервер, выбрать какой из выделенных Хааром номеров нужный, есть возможность выделить необходимую область в уже «застывшем» кадре. И пользоваться этим уже удобнее. Автоматическое распознавание становится не дурацкой функцией, без которой нельзя ничего сделать, а просто помощником.

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

И, конечно, надеюсь, что статья будет полезна.

Первая статья цикла — общий обзор технологий
Вторая статья — Наш сервер
Третья статья — Протокол обращения к нашему серверу

Источник

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

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

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

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

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

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

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

Automatic License Plate Recognition

Recognitor

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

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

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

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

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

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

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

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

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

Nomeroff Net

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

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

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

Nomeroff Net «Hello world»

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

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

Онлайн демка

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

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

Что дальше

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

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

Анонс

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

Источник

Нейронные сети в детектировании номеров

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Распознавание автомобильных номеров до сих пор является самым продаваемым решением на основе компьютерного зрения. Сотни, если не тысячи продуктов конкурируют на этом рынке уже на протяжении 20-25 лет. Отчасти поэтому сверточные нейронные сети (CNN) не бьют прежние алгоритмические подходы на рынке.

Но опыт последних лет говорит, что алгоритмы CNN позволяют делать надежные и гибкие для применения решения. Есть и еще одно удобство: при таком подходе всегда можно улучшить надежность решения на порядок после реального внедрения за счет переобучения. Кроме того, такие алгоритмы отлично реализуются на GPU (графических модулях), которые значительно эффективней с точки зрения потребления электроэнергии, чем обычные процессоры. А платформа Jetson TX от NVidia так просто потребляет очень мало по меркам современных вычислителей. Наглядное «энергетическое превосходство»:

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Конечно, такое превосходство Jetson TX1 над Intel Core i7 преувеличено, т.к. всегда существуют побочные задачи: захват изображения с камеры, работа с памятью, не все вычисления целесообразно переносить на GPU. И все-таки, выглядит заманчиво.

Несложно оценить бюджет потребления для системы в сборе:

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

А значит, даже для автономного решения, запитываемого от солнца и ветра, можно установить 3-4 камеры с источниками ИК и 2 Jetson-а.

Стало еще привлекательней! Значит, нужно сделать распознавание на Jetson TX1, и сделать хорошо.
Сразу скажем спасибо коллективу NVidia в России. Благодаря их помощи все получилось. Мужики подарили нам Jetson TX1 на опыты и обещали дать затестить TX2.

Алгоритм поиска номера

Поиск границ и углов автомобильных номеров на снимках состоял из трех стадий, реализованных разными обученными CNN-ями.

Определение позиции автомобильного номера (центра):

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Выходной слой сверточной сети — поле вероятностей нахождения центра номера в данной точке. На выходе получаются вот такие красивые “Гауссы”. Конечно, тут возможны ложные срабатывания. Более того, пороги так и выбираются, чтобы минимизировать вероятность пропуска номера (увеличив “ложняки”).

За последние пару лет на наш свободно-доступный сервер пришли десятки тысяч разнообразных номеров. С такой базой удалось обучить значительно более надежный детектор, чем используемый ранее Haar.

Оценка масштаба автомобильного номера:

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Тут попутно отсеиваем часть ложных срабатываний.

Поиск лучшего преобразования “гомографии”, приводящей автомобильный номер в привычный вид:

Здесь поработали еще 2 сверточные нейронные сети: детектирование границ номера, определение максимально правдоподобной гипотезы.

Результат работы первой:

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

А вторая выбирает наилучшую гомографию:

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

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

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

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

Для того, чтобы заставить все это работать, мы использовали 2 типа сверточных сетей:

1) Стандартный классификационный вариант, подобный VGG:

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

2) Архитектуру, предназначенную для сегментации, подробнее описанную в одной из предыдущих статей.

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Конечно, эти архитектуры пришлось немного облегчать для работы на Jetson TX1. Кроме того, несколько ухищрений с функциями потерь и выходными слоями помогли улучшить обобщение при тренировке на не такой уж и огромной базе, которая имелась в распоряжении.

Алгоритм распознавания текста на номере

Честно говоря, казалось, что проблемы с распознаванием текста уже несколько лет основательны решены современными Deep Learning алгоритмами. Но почему-то нет.

На Хабре недавно была статья про использование LSTM и CNN для распознавания текста в паспорте.

Но описанный подход требует ручной разметки всей базы (границы между знаками). А у нас была серьезного размера база с разметкой другого плана (изображение + текст):

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

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

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

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

Соорудим маленькую контекстно-зависимую область из 36 миниколонок (подробнее):

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

На картинке изображены только 10 преобразований. Вот как должны выглядеть отклики на каждый из контекстов в приведенной выше картинке

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Тут нужно отметить, что использовалось далеко не самое эффективное кодирование внутри миниколонок, но при имеющихся 22 понятиях, это не большая проблема.

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

И в результате обучения получим “срез” для 36 миниколонок:

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Выделим локальные максимумы и сообщим на выход сочетания: что узнали и в каком контексте. А затем соберем все по порядку слева-направо: A902YT190

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

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

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

Применения

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

1) Контроль ПДД (применение 1)

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

— Высокое разрешение камер: 3-8MP
— ИК осветитель
— Предсказуемая ориентация и масштаб
— Возможная ручная настройка после монтажа
— До 10-20 номеров в кадре

2) Контроль проезда на КПП (применение 2)

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

— Камеры низкого разрешения (0.3MP — 1MP)
— ИК осветитель
— Предсказуемый размер и область номера
— Возможная ручная настройка после монтажа
— Только один номер за раз в кадре

3) Фотографии “с рук” (применение 3)

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

— Камера высокого разрешения
— Нет ИК подсветки

Непредсказуемый размер номера и область его расположения. Оказалось, что последнее применение наиболее затратно по вычислительным ресурсам. В основном из-за того, что масштаб номера плохо предсказуем. Наиболее простое применение — второе. В кадре не больше одного номера. Масштаб номера варьируется в небольших пределах. Первое применение тоже достаточно удачное и находится по вычислительным потребностям посередине. Но со всеми этими ситуациями Jetson TX1 успешно справляется. Только последнее не укладывается в масштаб реального времени, а требует около 1 секунды на расчет в неоптимизированном коде.

Бюджет времени расчета кадра на Jetson TX1

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто
Тесты производительности предварительны, все еще возможна оптимизация, особенно под специфичное применение.

И, естественно, при выполнении того же самого алгоритма на видеокартах уровня 1080/Titan можно получить практически десятикратное увеличение скорости работы. Для третьего применения это уже

100мс на изображение.

Telegram Bot

Плоха та статья на хабре, которая не заканчивается рассказом о написании Telegram бота! Поэтому, конечно, мы сделали одного такого на Jetson TX1, чтобы Вы могли пофотографировать и протестировать алгоритм. Бота зовут Recognitor

Работает сейчас этот бот на демонстрационной плате Jetson TX1:

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Jetson TX1 распознает изображения в домашних условиях (обратите внимание на вентилятор — он включается каждый раз, когда приходит новое изображение).

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Оказалось, что Telegram Bot — великолепный вспомогательный инструмент при работе с программами компьютерного зрения. Так, например, можно организовать ручную проверку результатов распознавания с его помощью. Telegram API предоставляет отличный набор функций для этого. ZlodeiBaal здесь уже использовал телеграм бота.

Все просто: прикладываете изображение в сообщение (одно! Кажется telegram позволяет отправить несколько, но проанализировано будет только последнее). Возвращается изображение с отмеченными рамками и несколько строк со всеми вероятно-найденными номерами. В каждой строке также указан процент — это условная вероятность того, что номер действительно распознан. Меньше 50% — что-то с номером не то (часть не влезла в кадр или это вовсе не номер).

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

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

Обучающая выборка

У нас в распоряжении было около 25000 изображений. Большая часть базы — снимки с телефона со случайным положением и масштабом номера:

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Несколько тысяч снимков были получены с контрольно-пропускных пунктов:

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

Около тысячи снимков — стандартный ракурс для камер регистрации нарушений ПДД.

Как распознать номера авто. Смотреть фото Как распознать номера авто. Смотреть картинку Как распознать номера авто. Картинка про Как распознать номера авто. Фото Как распознать номера авто

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

В итоге

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

Надежность распознавания значительно улучшилась относительно предыдущего алгоритма. Конкретные цифры приводить тяжело, т.к. они сильно разнятся в зависимости от условий применения. Но разница неплохо видна невооруженным глазом — Recognitor

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *