Распознавание автомобильных номеров до сих пор является самым продаваемым решением на основе компьютерного зрения. Сотни, если не тысячи продуктов конкурируют на этом рынке уже на протяжении 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 изображений. Большая часть базы — снимки с телефона со случайным положением и масштабом номера:



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



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



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

yadi.sk/d/EAfnQ947criHW
yadi.sk/d/0H2AipxrcrXqy
yadi.sk/d/U41QZ8v7cpJ6R

В итоге


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

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

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

Комментарии (27)


  1. DrZlodberg
    29.05.2017 09:23

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

    А ещё в примерах виден номер то ли прицепа, то ли мотоцикла. Он поколоночно плохо проходит. Кстати он ещё и трансформирован под автомобильный (сплющен). Как с ними дело обстоит?


    1. Vasyutka
      29.05.2017 09:50

      Должны проверяться. Не все и не всё работает идеально, к сожалению. Эффект интернета, скандалы о том, что штраф пришел правильно, не случаются. :) Но, конечно, пусть смотрят внимательно, а алгоритмы работают лучше. Все-таки на тень реагировать не гоже ни тем, ни другим.


    1. Vasyutka
      29.05.2017 09:51

      прицеп и мотоцикл сейчас как правило выделяются корректно, но потом на стадии распознаваня символов мы такого не ждем. В тексте статьи где-то написано, что стандартные гос.знаки и такси сейчас.


    1. DancingOnWater
      29.05.2017 11:25

      Читал истории, что в аналогичных историях люди проходили в ГИБДД обжаловать штраф. Там им показывали все досье по штрафу. Оказывалось, что нарушение-то было, но отправлялась почему-то не та фотка.


      1. DrZlodberg
        29.05.2017 11:50
        +1

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


        1. khim
          29.05.2017 12:07

          У нас тут вроде ИТ-ресурс, да? Не из той базы фотку брали, элементарно. Если IDшники сквозные, то могли ничего и не замечать до того, как к ним с жалобами пришли.

          Понятно что тесты должны быть и всё такое, но… мы в реальном мире живём, да?

          Хотя всё это требует перекрёстной проверки, конечно…


          1. DrZlodberg
            29.05.2017 13:19

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


            1. DancingOnWater
              29.05.2017 15:26

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


        1. DancingOnWater
          29.05.2017 12:42

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

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


          1. khim
            29.05.2017 18:14

            Обоснование, которое я слышал в качестве байки: важно не то, что мы высылаем, а то, что мы НЕ высылаем: всякие автомобили с проблесковыми маячками выставленными на крышу и т.п.

            Что мешает завести «белый список» номеров, которым можно такие кренделя выделывать — история умалчивает…


  1. frees2
    29.05.2017 09:47

    Электронные авто номера уже действуют в США, странах Азии, пока в части эксперимента.


    1. Vasyutka
      29.05.2017 09:55

      и это, наверное, хорошо.


  1. ilyaplot
    29.05.2017 10:18

    За 10 минут бот так и не ответил. Прилег?


    1. Vasyutka
      29.05.2017 10:36

      поднялся :) Разбираемся, чего он такой хрупкий оказался


    1. Vasyutka
      29.05.2017 10:48

      должен отвечать за пару секунд, когда исправно работает


      1. ilyaplot
        29.05.2017 18:18

        Так и не получил ответа от бота :)


        1. ZlodeiBaal
          29.05.2017 18:36

          Иногда он падает, перезагружаем. Читатели хабра очень любят эксперементировать с отправкой странных вещей и исследованием границ применимости алгоритма.
          Например попробовать перебрать команды: вдруг удасться грохнуть бота. Или поискать уязвиммости с неэкранированием текста.
          Картинки толщиной в 1 пиксель и длинной 1000. Что-то ещё весёлое было.
          Где-то треть номеров не российская/или российских типов с которыми сейчас система не работает:)
          Всё у нас в боте написанном за пол часа не учитыватется. Так что правим на ходу. Если честно, то мою кормушку так не ддосили, как сейчас ддосят:)


          1. ilyaplot
            30.05.2017 09:58

            Отличная возможность написать высокопроизводительного бота под нагрузку :) Так и не удалось попробовать бота :)


  1. al_sh
    29.05.2017 10:39

    А где в России можно купить Jetson TX1, если не секрет? Нашел только в некой eltech по цене космодрома…


    1. Vasyutka
      29.05.2017 10:49

      Да, есть такая проблема. Eltech и по цене новенького iPhone


  1. Sway
    29.05.2017 11:08
    +1

    А можно ли ваш алгоритм запустить на CPU?


    1. Vasyutka
      29.05.2017 11:10

      Да, только сложнее влезть в realtime. Ну и энергоэффективность.


  1. kostus1974
    29.05.2017 11:32

    сверточные нейронные сети (CNN)

    почему не СНН, если это по-русски? или приведите анголоязычное название для вашего CNN.

    Jetson TX1

    что это такое? расскажите про это хотя бы в паре предложений в начале статьи.


    1. miolini
      29.05.2017 12:07

      сверточные нейронные сети (CNN)

      почему не СНН, если это по-русски? или приведите анголоязычное название для вашего CNN.

      потому что СНС (свёрточные нейронные сети)


      1. kostus1974
        29.05.2017 12:54

        ну да. но почему сверточные нейронные сети — это CNN?


        1. miolini
          29.05.2017 13:00
          +1

          convolutional neural networks


  1. badimao
    30.05.2017 18:33

    а всего то надо было пойти по пути гугла :) = номера в капчу.

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