Как стать автором
Обновить
2390.03
МТС
Про жизнь и развитие в IT

Пайплайн распознавания номеров транспортных средств: как это устроено

Время на прочтение7 мин
Количество просмотров1.8K

Привет, Хабр! Это Анастасия Белозерова, я возглавляю команду, которая занимается исследованиями в области транспорта в VisionLabs. В прошлый раз я писала о пайплайне распознавания ТС, а сегодня поговорим про распознавание номеров. Для нас это одно из ключевых направлений, ведь номер для машины — это уникальный идентификатор, фактически то же самое, что и лицо для человека. Распознавать его можно совершенно разными способами, это всегда интересная задача. Что ж, погнали!

Ожидание и реальность

Когда я говорю людям, что мы создаем решения для распознавания номеров, в ответ слышу: «Да уже 20 лет назад все сделали, что еще нужно?». Так что сначала давайте разберемся, что и для каких кейсов могли сделать 20 лет назад, а что в современном мире подразумевается под LPR (License Plate Recognition).

Картинка из статьи, где описывается метод распознавания, источник
Картинка из статьи, где описывается метод распознавания, источник

Когда мы видим open-source-решения для LPR, обычно они сделаны для таких кейсов: на кадрах одно авто с крупным освещенным номером, он расположен горизонтально, символы контрастные, прекрасно друг от друга отделяются. В таком случае все действительно понятно. Тут отработает даже классика Computer Vision (CV). Можно поиграться с фильтрами и бинаризацией изображения, выделить контрастный белый объект, а дальше аппроксимировать его полигоном четвертой степени. Вот тебе и детекция номера!

Или, например, после предобработки изображения можно найти четыре прямые с помощью преобразования Хафа, пересечь их друг с другом и получить нужный четырехугольник. Дальше этот номер можно кропнуть и работать только с ним. Снова пользуемся тем, что фон и цифры контрастны и отделимы, и бинаризуем уже символы. При хороших условиях сделать это несложно, и у нас будут маски всех объектов. Ну а дальше на каждый символ натравливаем модельку-классификатор, ведь символов в алфавите конечное количество. Готово! Решили задачу LPR, не потратив ни одного GPU-часа.

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

Мы работаем с потоком машин, и нам нужно уметь вовремя задетектировать и распознать номер. А теперь представьте, как сложен мир автомобильных номеров! На примерах ниже вы сможете оценить, с чем нам нужно уметь работать:

Бирюзовый цвет — номер, относящийся к целевому ТС. Красный — к другому ТС
Бирюзовый цвет — номер, относящийся к целевому ТС. Красный — к другому ТС

И сразу сюрприз: у машины может быть несколько номеров. В нашей практике было до трех разных — такое встречается в Китае. Не говоря уже про отдельные номера тягача и прицепа, что в России обычная история. К тому же в кроп ТС могут попадать другие номера или на самой машине могут быть наклейки, похожие на номер. Нам нужно придумать, как все это фильтровать. Во многих странах вместо стандартного номера может вообще быть произвольная надпись. Особенно это типично для США и Гонконга.

Примеры индивидуальных номеров США, Гонконга, Камбоджи и Грузии
Примеры индивидуальных номеров США, Гонконга, Камбоджи и Грузии

А теперь прибавьте сложные условия съемки, при которых нужно умудриться получить качество в 99%. Как во всем этом выжить и построить рабочее решение, расскажу дальше.

Примеры номеров из наших тестовых выборок. Никакая классика CV тут не справится
Примеры номеров из наших тестовых выборок. Никакая классика CV тут не справится

Из чего состоит пайплайн распознавания ГРЗ

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

Тогда пайплайн у нас такой:

  • запускаем детектор номеров, фильтруем их по порогу на score — числу, характеризующему уверенность детектора в предсказанном боксе;

  • для каждого кропа номера запускаем сеть классификации страны номера;

  • в зависимости от страны запускаем ту или иную сеть-эксперт по номерам этой страны.

Если же мы говорим про пайплайн работы на треке ТС в целом, то он будет еще сложнее:

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

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

Хороший вариант в этом случае — отранжировать номера в соответствии с их качеством. И только топ списка отправлять на распознавание страны и чтение символов номера.

Получается, весь пайплайн состоит из таких пунктов:

  • детектируем и трекаем ТС, выбираем бестшоты ТС;

  • детектируем номера на бестшотах ТС;

  • ранжируем номера по качеству, топ списка отправляем на распознавание;

  • классифицируем страну номера;

  • распознаем символы и атрибуты номера — например, тип: обычные, военные, дипломатические, такси, прицепные и так далее.

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

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

Как устроено распознавание символов и атрибутов номера

У нас есть несколько моделей-экспертов, которые специализируются на номерах разных частей света.

На момент написания этого текста в проде у нас восемь моделей. Еще одна, для Таиланда, готовится к внедрению
На момент написания этого текста в проде у нас восемь моделей. Еще одна, для Таиланда, готовится к внедрению

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

Деление номеров по доменам для моделей-экспертов у нас было обусловлено несколькими факторами:

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

  2. Какой алфавит используется в номерах. Тут свои особенности у каждой сети. В Европе и некоторых странах типа Сербии это специальные символы — например буквы с «шапочками» и насечками, которые нужно учитывать. Если мы работаем со странами, у которых в номерах свой уникальный алфавит, а не латиница (посмотрите на Монголию, Китай и Таиланд, например), будет некорректно объединять их с Россией и распознавать номера внутри одной и той же сети. От этого качество распознавания просаживается.

  3. Нужно ли определять специальные фичи для номеров конкретных стран. Например, эмират для ОАЭ или тип номера по ГОСТу для РФ. Распознавание этой фичи мы тоже просто закладываем в сеть-эксперт, а не создаем еще один классификатор. Так быстрее.

  4. Удобство лицензирования для разных частей света.

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

Выше я уже говорила, что реализовать распознавание номера ТС можно по-разному. Например, локализовать конкретные символы в рамках детектирования номера и на них направлять классификацию или сегментацию с классификации на каждый отдельный символ. Возможно, вы уже видели распознавание номеров в качестве примера задачи OCR (Optical Character Recognition).

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

Итак, у нас есть кропы номеров и разметка символов, подбитая пустыми значениями до фиксированной длины — обычно 9. Как правило, тут не нужно распознавать мелкие дополнительные надписи на номере, что, кстати, пытаются делать OCR-модели. Главное, чтобы разметка была консистентной, а символы указаны в одном порядке: слева направо, сверху вниз и так далее.

Это номера 273219, 1161524, 5031057. Мелкие символы в середине обозначают эмират и не нужны для распознавания, зато полезны для определения эмирата
Это номера 273219, 1161524, 5031057. Мелкие символы в середине обозначают эмират и не нужны для распознавания, зато полезны для определения эмирата

Что происходит внутри сети

У нас есть какой-нибудь крутой backbone — основное тело сети, CNN или ViT. Он устраивает нас по скорости. Над ним мы создаем определенное количество голов — fully-connected-слоев на выходе. Каждый по числу нейронов равен размеру алфавита для этой сети. А количество голов равно числу предсказываемых символов, то есть самому длинному номеру этого домена.

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

Сразу скажу, что наш подход хорош, но не идеален (а идеала здесь просто нет). Конкретно мы упираемся в необходимость сбора или создания большого количества данных. Это нужно, чтобы каждая голова могла увидеть все символы, которые бывают на этой позиции в номере. И не предсказывала, например, только «0», если в обучающей выборке она видела на этой позиции номера только нули.

На 50 или 500 номерах вряд ли получится хорошо обучить сетку. Чтобы решить эту проблему, мы много работаем с синтетикой — например, создаем ее сами. Если для страны есть ГОСТ (как в РФ) с описанием всех типов номеров, регулярных выражений и шрифтов, то по этим правилам с использованием OpenCV или PIL можно за недельку нахардкодить довольно неплохой генератор, который будет рисовать по символам соответствующий номер.

Примеры синтетических номеров РФ, Китая, Сингапура и Ирана
Примеры синтетических номеров РФ, Китая, Сингапура и Ирана
Примеры реальных и синтетических номеров Саудовской Аравии
Примеры реальных и синтетических номеров Саудовской Аравии

Синтетика — это не то же самое, что реальный номер. Внутри себя сети прекрасно это «понимают», возникает Domain Gap — разница в точности распознавания между данными из разных доменов. То есть тут все работает идеально, а на реальных номерах качество сильно проваливается. С синтетикой сети работать намного проще: все символы отлично видны и легко распознаются. Поэтому мы обязательно жестко ее аугментируем — это показано в третьем столбце скриншота выше.

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

Но этого все равно может быть недостаточно. В ситуациях, когда реальных данных совсем мало, мы используем техники Domain Adaptation или GAN (Generative Adversarial Networks). Результаты — в четвертом столбце скриншота выше. Все это дает неплохие приросты по качеству. Но, конечно, гораздо лучше, когда у нас есть возможность набрать реальные данные. Ничто так эффективно не влияет на качество обучаемой модели.

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

Теги:
Хабы:
+25
Комментарии1

Полезные ссылки

Real-time-распознавание лиц: методы обучения быстрых и точных моделей для работы на мобильных девайсах

Время на прочтение13 мин
Количество просмотров4.3K
Всего голосов 11: ↑11 и ↓0+16
Комментарии5

Пайплайн распознавания транспортных средств: как это работает

Время на прочтение12 мин
Количество просмотров5.2K
Всего голосов 11: ↑11 и ↓0+20
Комментарии7

Ликбез по компьютерному зрению в банках. Как технологии ИИ защищают ваши деньги

Время на прочтение7 мин
Количество просмотров3.1K
Всего голосов 5: ↑5 и ↓0+8
Комментарии4

Какие задачи сегодня решаются с помощью транспортной видеоаналитики

Время на прочтение7 мин
Количество просмотров1.8K
Всего голосов 6: ↑6 и ↓0+9
Комментарии4

Информация

Сайт
www.mts.ru
Дата регистрации
Дата основания
Численность
свыше 10 000 человек
Местоположение
Россия