Можно ли запихнуть распознавание номеров в любой тамагочи?
Про распознавание номеров мы рассказываем на Хабре давным давно. Надеюсь даже интересно. Похоже настало время рассказать как это применяется, зачем это вообще нужно, куда это можно запихнуть. А самое главное — как это изменяется в последние годы с приходом новых алгоритмов машинного зрения.
Как ни странно, распознавание номеров применяется не только при контроле ПДД. Применений десятки. И каждая задача имеет свою специфику, целевое качество, входные изображения, требование на скорость и.т.д. Начнём с самого простого и банального:
Контроль ПДД
Для начала стоит рассказать несколько историй о том как применяют камеры ПДД. Мы сами к этой тематике относимся очень поверхностно, но общались с большим числом крупных фирм, более-менее понимаем ситуацию в отрасли.
Например простой вопрос. Кто на ваш взгляд устанавливает камеры, следит за их работой?
Контроль скорости
Как ни странно — это прерогатива частных компаний. Инспектора ГИБДД получают штрафы в свою базу данных, проверяют что всё заполнено корректно и отправляют нам с вами. Прибыль с штрафов делят 50/50. Половина идёт концессионеру который обслуживает камеру, половина в бюджет.
Концессия — это договор на установку и поддержание некоторого числа камер. Обычно регионы предлагают пару десятков камер как лот. Но бывает по разному. Один из примеров самой эпичной концессии — это как казаки штрафуют (кстати, это не единственный случай).
На сегодняшний день существует несколько нарушений которые детектируются (список не полный, я перечисляю основные):
- Контроль скорости
- Контроль светофоров
- Контроль разметки
- Контроль переездов
Контроль переезда
За исключением Москвы самый лакомый кусок — это контроль скорости. Там больше всего поток штрафов. Камеры на светофорах и на полосах движения достаточно быстро перестают приносить прибыль, люди начинают ездить нормально после первого штрафа, особенно если это небольшой регион. А вот превышение скорости приносит стабильную прибыль, особенно на крупных трассах.
Ещё пару лет назад все камеры контроля скорости были радарными. Но радар — это самая дорогая в них штука. И уже лет 15 все пытаются от него избавиться.
Контроль скорости с треноги
И лишь где-то год-два назад лицензировали первую безрадарную систему. Сейчас таких уже несколько. Если честно я не знаю сколько их на сегодняшний день. Мне кажется, что три, но могу ошибаться. Исходя из того что появилось масса новых алгоритмов распознавания номеров, повысилось качество, понизилась цена хорошего железа — сейчас происходит глобальная замена, увеличение, обновление парка камер. Стало много точек куда можно поставить камеру и окупиться. Скорее всего процентов 80 установок перейдёт в ближайшие лет пять на безрадарные системы.
Учитывая что камеры ставят концессионеры — тема ужасно прибыльная и ликвидная.
Сами камеры могут ставить в очень разные места. Это может быть тренога, может быть специальная ферма, могут быть стационарные тумбочки около дороги, а могут быть простые столбы.
Лет 10 назад алгоритмы были слабее, номера распознавались хуже. Сейчас даже на мобильном телефоне можно получить хорошее качество. Увеличивается вариативность мест установки.
Что значит «распознавались хуже»? Реально, на хорошо выстроенной камере при правильном освещении можно распознать порядка 95–98% проходящих номеров. Это было ещё до нейронных сетей, лет 5–7 назад. Сейчас процент чуть выше, но не сильно. Все нераспознанные номера — это заляпаные грязью, снегом, испорченные. 90% из того что не распознаёт система -сам человек не распознает. Зато сильно улучшилось распознавание на камерах в плохих условиях. Повесили на кривой столб сбоку, дали мало света, и.т.д. Теперь всё это работает с минимальным числом настроек.
Конечно, в метель качество распознавание падает до нуля, но это особо никого и не смущает.
Не смотря на сложность входа на рынок и его зарегулированность государством (сертификация новой системы распознавания номеров это минимум пол года), он перенасыщен решениями.
Паркон
Особенность Парконов — в том что качество снимков хуже некуда. Съёмку ведут либо с движущихся машин, либо пешеходные инспектора. Данные, которые приходят на распознавание могут выглядеть примерно так (записал с регистратора, распознавал нашим алгоритмом, так что к Паркону это никакого отношения не имеет, видео для примера):
Из-за низкого качества распознавания нужно постоянно проверять что система распознавала (на настоящем парконе камера сильно лучше, свет выставлен, и.т.д.). Плюс проверять правда ли на парковке стоит одна и та же машина. Например в ДИТ, как я слышал, алгоритмы всё ещё прошлого поколения. Обработку штрафов год назад осуществлял цех из почти 100 работников которые глазами верифицировали все данные (всё это были слухи циркулируещие в области, могут не соответствовать реальности).
Кстати, для мобильных инспекторов данные все тоже верифицируются. Это дополнительная защита чтобы он своему недругу штраф не выписал.
С алгоритмами нового поколения верификация уже не так актуальна, так что я очень надеюсь, что они уже заапдейтили свой пайплайн.
В любом случае, основная сложность не в том, чтобы распознать номер, а в том чтобы сделать систему стабильной в плане получаемой информации и исключить ошибки.
Распознавание на смартфонах/мобильных устройствах
От пешеходных инспекторов можно плавно перейти в более широкую категорию — «распознавание на смартфонах».
Распознавание автомобильных номеров делится на два способа. Первый способ — распознавание номеров на сервере. Второй — на устройстве. Распознавание на устройстве сложней. Ещё два года назад его было нереально хорошо сделать.
К сравнению распознаваний мы еще вернемся вернемся. В первую очередь я расскажу о том где это распознавание нужно:
Первая задача — оптимизации вводимых данных. Возникает когда сотрудник должен заполнить какой-то документ на улице. Это может быть инспектор дорожного движения, страховой агент, автодилер. Сотрудник делает фотографии автомобиля и нажимаешь кнопочку. В документах автоматически распознаётся номер машины.
Задача не бог весть какая, но говорят что зимой людям помогает.
Вторая решаемая задача при распознавание номеров на смартфоне — контроль автомобилей на частных территориях. Например стоянка, зоны разгрузки, и.т.д. Там ходит инспектор, которому сразу после снимка выводится на планшет необходимая информация.
Особенностью распознавания на смартфонах можно назвать следующий момент. Человек сам редактирует номер, если он распознан неверно (чего не происходит в Парконе). И психологический порог правильного распознавания для первой задачи — где-то 80%, так что даже алгоритмы прошлого поколения неплохо справлялись. Мы пробовали наш прошлый алгоритм не нескольких таких задач использовать. Работает нормально, но экономический эффект сомнителен. Пилоты не выстреливают, лишь один раз использовалось когда заказчик системы заказал такую функцию, а исполнитель попросил нас. Да и то — это всё для галочки.
Для второй задачи хорошо иметь 95%. Тут уже только современные алгоритмы.
Некоторый уровень ошибок допускается. Люди всё равно вручную всё распознают. И если что-то не так, то проверяют и правят.
Шлагбаумы
Хорошо ли это, или плохо, но Россия — страна шлагбаумов. И шлагбаумы могут быть абсолютно везде. Это могут быть парковки, это могут быть въезды на территорию предприятий, это могут быть въезды в супермаркеты, это может быть въезд на ваш дачный участок или придомовую территорию.
Везде, где требуется контроль территории и скорость отклика — проще всего воткнуть шлагбаум. Но, если начинать разбираться, то оказывается треш.
Никакой, даже самый современный алгоритм распознавания не даёт 100% качества. Конечно, сейчас произошёл огромный рывок в распознавании. И для шлагбаумов качество скакнуло. Было процентов 93–95, стало 97–98. Рост произошёл за счёт тех мест где была грязь и плохая установка: не хватает света, большие углы, плохая комбинация светофильтров. Сейчас установка сильно проще. Это уже не должен быть супер-мега монтажник.
В реальности, единицы решений на новых технологиях. Обычно всё хуже.
Не пропускать 2–5% машин на территорию — неприемлемо. Нужен кто-то, кто сможет скорректировать распознавание номера. Охранник?
Крупные склады, где территория охраняемая давным давно пошли по этому пути. Распознавание номера у них завязано на соседнюю будку с охранником. Цена такого решения обычно составляет 50–100 тысяч. В зависимости от железа, камеры, алгоритма, света. Условия распознавания номера близки к идеальным. Устанавливает такое решение обычно монтажник, который разбирается в теме. Его услуги могут увеличить стоимость проекта на десяток-другой тысяч.
И это без шлагбаума, только за комплекс распознавания!
Второй путь, который популярен в Московских дворах — шлагбаум на телефонном звонке. Звоните по номеру, и если ваш номер в базе — вам открывают. Но опять же. Кто-то забыл телефон. Кто-то разрядил. К вам приехали гости. В итоге очень часто добавляют пропуск по номеру. А так как хорошую камеру повесить сложно и дорого + большая часть решений на алгоритмах старого поколения — на картинку смотрит охранник.
К тому же тема с телефоном часто не заходит — люди устраивают частные парковки из дворов куда у них есть доступ, в ущерб соседям.
Существует много фирм специализирующихся на установке шлагбаумов во дворы. Но почти никто из них не пробуем подцепить распознавание на объекты. Хотя рынок огромный. За те пол года как мы сделали новый алгоритм мы попробовали запустить несколько пилотов, один из них даже сейчас успешно работает. Идеальная схема для любого двора — это телефон/карточка + распознавание номера + доступ к камере для распознавания
Статистика
Ещё интересное применение для шлагбаумов — статистика по номерам. Это иногда используют торговые центры. Чтобы знать как часто приезжают люди (зачастую ещё распознают на каких машинах).
Можно ставить в автомойках для контроля машин. В автосервисах, на кассах, и.т.д.
Сервера
Распознавание на серверах очень общо. Всё кроме ПДД можно распознавать на серверах. Тут я в двух словах скажу каких задачах используют только серверное распознавание, а чуть ниже будет более общий рассказ про общее применение:
- Замазывание номеров машин на снимках. Например на сайтах объявлений.
- Парсинг баз объявлений. По тем кто номера не замазал.
- Подключение сервера к нескольким видеокамерам и распознавание потока с них. Статистика/Шлагбаумы/Наблюдение
Один из наших резервных серверов на jetson’е (а то что хорошей железке лежать даром!):
Как и где должны работать алгоритмы?
Перечисляя применения я абстрагировался от того где и как всё распознавать. Куда запихивать каскад сеток и где обрабатывать.
В принципе, если всё обобщить получается не так много вариантов:
- Машины с x86 вычислителем. Хороши для алгоритмов прошлого поколения. Адекватны для текущего, но высокой производительности на них не получить. Зависит, конечно от машины и от того как оптимизировать алгоритм. У нас выходило что поиск номера где-то на уровне десятка-двух fps, а распознавание номера где-то на уровне ¼ секунды. Естественно, алгоритмы могут быть разные. У кого-то побыстрее, у кого-то получше. Всё это трэйдофф. Можно сделать и сотни FPS, если, например, предназначить области детектирования. Такие ставят зачастую для распознавания на дороге, для распознавания на шлагбаумах. У них всегда проблемы с энергопотреблением. Скорее всего это отмирающий класс устройств.
- Машины с видеокартами NVIDIA. Такую не поставить на улицу. Да и энергопотребление высокое. Но для серверов используют именно их. Быстро, выгодно. Но применимы там где есть интернет-задачи.
- ARM-вычислители. На них можно неплохо разворачивать распознавание. Пусть скорость не очень высока. Но на RPi 3 мы смогли добиться 5FPS для поиска номера и полторы секунды на распознавание. Учитывая, что RPI не самый лучший вычислитель — это неплохо для того качества, которое можно затащить.
- Jetson. Следует отдельно упомянуть этот класс вычислителей. Jetson идеально подходит под задачи распознавания. Производительность на еденицу мощности у них феноменальная. Jetson по производительности можно сравнить с каким-нибудь i5-процессором. Только потребление Jetson это 10–15Вт. Много систем машинного зрения для внедрения сейчас делают на них.
Как это всё использовать
Реально все вопросы выше упираются в одну проблему. Что делать с ошибками распознавания? Что делать с качеством?
Если зафиксировать алгоритм распознавания, то качество системы определяется качеством аппаратуры: свет, объективы, точка установки.
Оптимизация качества этой связки — задача известная всем монтажникам. Тут нельзя придумать почти ничего нового. Каждая контора, которая занимается установкой камер имеет свой стек наработок. Стек, который будет применен зависит от того сколько у клиента денег на задачу.
Чтобы выбрать ошибки — обычно сажают операторов. Все штрафы проходят через них. Системы контроля парковок тоже идёт через операторов. Одного оператора может хватать на пару десятков шлагбаумов.
Если распознавание на смартфонах — контролирует пользователь. Если распознавание только ради статистики — на контроль забивают. 2–3% потерь считается допустимой величиной
К чему мы пришли
Мы постоянно получали предложения тестировать наш алгоритм/прикрепить его к чему-нибудь, или попользоваться. Плюс сами делали кучу экспериментов. До полноценного внедрения пока никуда не дошло, но других систем машинного зрения пяток настрогали, которые уже в проде.
Как видно из описания выше, распознавание номеров это вещь нестабильная. Всегда есть ошибки. Пусть даже 1%. Хотелось придумать способ чтобы алгоритм стал абсолютно дубовым, чтобы он работал в любой задаче, без особой настройки и дополнений.
Но даже мы сначала стали делать всё не так. Так как у нас был большой запас качества и неплохая скорость, то одной из первых мыслей было: «почему бы его не запустить на RPi и не повесить на каждый шлагбаум». Себестоимость железки для такого подхода была минимальной.
Взяли RPi, распаяли плату управления шлагбаумом, запихнули в коробку.
Но, поняли один простой момент. Даже нам сложно поставить камеру на шлагбаум так, чтобы избавить её от всех возможных артефактов. Мы можем побороть фары, солнце, неправильный угол установки или нерезкость. Но как все эти факторы поборет человек, который пробует настроить распознавание номеров в первый раз?!
Сложно настроить картинку на устройстве закопанном где-то в глубине шлагбаума. Нужно подключать ноут, выстраивать камеру.
Попробовали с Bluetooth. Тоже самое. Даже если выводить картинку на телефон — не сильно упрощает. Можно поставить идеально. Но всё равно через какое-то время устройство перестаёт работать. Нужно заново лезть в кишки и перенастраивать. Причём зачастую наугад. В какой-то момент сбиваешь камеру — и 10 минут думаешь, что же неправильно.
Или работает система два дня, и вдруг остановилась. Что произошло?
Когда мы делали распознавание с мобильных телефонов года 3 назад — таких проблем не было. Пошли ошибки? Делаешь фильтрацию что не распознавалось, пробуешь вытащить патерн ошибки — пробуешь допилить алгоритм, или дообучить операторов. В результате 1–2 дня и ошибка исправлена.
Это явно приятнее чем ползать под каждым шлагбаумом.
В итоге поняли, что самое стабильное — распознавание на сервере. На сервере куда проще понять причину ошибок, скомпенсировать, показать. Инструмент, который позволяет построить статистику за день, найти время когда система ошибается и не работает — пишется за один час. Графики распознавания:
Синий график — качество распознавания во времени. Красный — процент кадров с номерами во времени. Качество просело? Выдаётся ошибка на пульт оператора. А для быстрого понимания ошибки выводиться карта последних распознаваний:
Сразу видно, что часть номеров не ловиться. В чём дело? Смотрим ближе:
Подсветка ушла, номер не читаемый!
При этом если что-то не работает, то ошибку зачастую можно поправить на сервере. Если камера повернулась в зону где не работает — переделать гомографию. Если камера расфокусировалась — то для многих моделей можно перестроить их удалённо.
Если проблема с установкой, то можно дать чёткое указание: «с 10 до 10:30 солнце светит в камеру». Если камера установлена без доступа в интернет и статистики — то отловить ошибки такого плана очень сложно и муторно. При наличии 2–3 таких ошибок качество может упасть ниже 95% и клиент разочаруется в системе.
При этом сама система делается проще. Можно воткнуть RPi+Lan камеру + ключ:
А можно воткнуть вообще arduino c GPRS, по которому говорить серверу когда обработать камеру, получать ответ и открывать шлагбаум:
(Да, ардуино дорогая и не оптимальная плата. Но когда нужно 10 штук + стабильность, то цена разработки своей будет дороже).
Данное правило с контролем качества справедливо для любой DeepLearning системы. Ошибки будут всегда. И единственный способ чтобы заказчику система понравилась — заложить способы ловли и борьбы с ошибками ещё до того как они появиться. Сбор базы, контроль статистики онлайн, дообучение. Всё это лучше закладывать так, чтобы ловить ошибки и компенсировать их до того как клиент успел понять что что-то не работает и обидеться.
Когда мы распознавали товары на полках — всё распознавание шло на верификацию людей. Когда мы распознавали контейнеры — на верификацию оператора. И.т.д. и.т.п. Посылать на верификацию можно не всё, не всегда. Но всегда нужно придумать способ который позволит понять, что алгоритм не развалился.
У нас был замечательный опыт, когда один наш заказчик отгрузил полусырую систему в которой было несколько сотен модулей (не распознавание номеров, достаточно далёкая задача). Для этой системы мы разрабатывали математическое ядро.
Система даже неплохо работала. Но пользователи системы были не очень образованные люди: они начали её прямой саботаж.
Наш заказчик был очень разумный человек — в системе была возможность удалённого переобучения, перепрошивки, изменения алгоритма. И у него была целая команда на поддержку. В результате саботаж удалось очень своевременно отсечь. Сделать алгоритмы его ловли и обработки.
С автономерами то же самое. Качество системы нужно мониторить постоянно. Если идут проблемы — заказчик может отказаться от системы, даже если это проблемы на его стороне. Конечно, всегда есть границы которые нельзя переходить. Но простое добавление мониторинга позволяет 80% проблем решать проактивно, грамотной коммуникацией с заказчиком.
И не важно, это сервер, камера на трассе, на домашнем шлагбауме, или в автомойке. Главное — правильно настроить мониторинг, чтобы он минимально отвлекал, но максимально контролировал.