Сегодня очень много хороших конкурентных систем создается отдельными разработчиками, а не только большими компаниями. Как правило, это копирование на базе эталонного решения (продукт корпорации) с последующей оптимизацией. В таком случае выигрывают все: компании – от здоровой конкуренции, разработчики – от развития технических навыков и получения опыта, потребители – от новых возможностей и решений.
Представлюсь: меня зовут Иван Греков, я из фронтенд-команды Badoo. Мне очень понравился этот пост, я просто не смог пройти мимо и не перевести его. Этот пост – отличный источник вдохновения для любителей прототипирования устройств и open-source-решений. Перевод публикуется с сохранением авторской точки зрения и, надеюсь, будет интересен вам.
Полиция Виктории — главное силовое ведомство, отвечающее за охрану правопорядка в штате Виктория в Австралии. За последний год в этом штате было угнано более 16 000 автомобилей общей стоимостью около $170 млн. Поэтому полицейский департамент экспериментирует с разными технологическими решениями, чтобы снизить количество угонов.
Ими уже используется веб-сервис VicRoads, призванный помочь в предотвращении мошеннических продаж угнанных автомобилей. В сервисе можно проверить текущий статус автомобильных регистраций. Также полицейский департамент приобрел стационарный сканер номерных знаков — камеру на штативе, которая снимает проезжающие автомобили и автоматически определяет среди них угнанные.
Не спрашивайте, зачем, но однажды я захотел создать прототип сканера номерных знаков, монтируемый на автомобиль. Этот сканер уведомлял бы об угнанных или незарегистрированных автомобилях в автоматическом режиме. Я понимал, что отдельные компоненты желаемого продукта уже кем-то реализованы, и мне было интересно узнать, насколько трудно будет объединить их в единую систему.
Но, порыскав в сети, я узнал, что полиция Виктории недавно провела испытания аналогичного устройства, оценочная стоимость развёртывания которого – около $86 000 000. Не трудно заметить, что при его установке на 220 полицейских машин стоимость одной инсталляции составит кошмарные $390 909.
Уверен, что можно найти решение оптимальнее.
Один из стационарных сканеров номерных знаков
Критерии успеха
Прежде всего давайте сформулируем основные требования к архитектуре продукта.
Локальная обработка видео
Потоковая передача видео для централизованной обработки выглядит наименее эффективным решением проблемы. Помимо огромных счетов за передачу данных нужно учитывать ещё и сетевую задержку, которая существенно снизит скорость обработки.
Хотя централизованные алгоритмы машинного обучения становятся всё лучше, мне хотелось выяснить, насколько приемлемым будет решение с использованием локальной обработки.
Работа с изображением достаточно низкого качества
Поскольку у меня нет камеры для Raspberry Pi или обычной веб-камеры, я воспользуюсь записями с видеорегистратора. Это идеальный источник для тестирования. К тому же качество записей с видеорегистраторов сравнимо с качеством камер, установленных на полицейские автомобили.
Продукт должен быть создан с использованием open-source-технологий
Если опираться на проприетарное ПО, то будешь постоянно упираться в необходимость просить разработчиков внести изменения со всеми вытекающими проблемами. С open-source-технологиями такого не будет.
Решение
В общих словах я решил брать изображение из записи с видеорегистратора, прогонять его через open-source-систему распознавания номерных знаков, установленную на устройстве, запрашивать сервис проверки автомобильной регистрации, а затем выводить результаты на экран.
Данные, возвращаемые на установленное в полицейской машине устройство, содержат марку и модель машины (для проверки ситуаций, когда украден был только сам номерной знак), статус автомобильной регистрации и уведомление о том, что машина числится в угоне.
Звучит просто, и так оно и есть: например, изображение можно обработать с помощью библиотеки openalpr
. Для распознавания символов на номерном знаке больше ничего не потребуется:
openalpr.IdentifyLicense(imagePath, function (error, output) {
// handle result
});
Небольшое пояснение
К API VicRoads
нет публичного доступа, так что в моём прототипе проверка номерных знаков выполняется через граббер контента. Хотя в целом это порицаемое решение, но всё же речь идёт о проверке работоспособности концепции — я не роняю ничьи сервера.
Вот так выглядит моё доказательство реализуемости идеи:
// Open form and submit enquire for `rego`
function getInfo(rego) {
horseman
.userAgent('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0')
.open(url)
.type('#registration-number-ctrl input[type=text]', rego)
.click('.btn-holder input')
.waitForSelector('.ctrl-holder.ctrl-readonly')
.html()
.then(function(body) {
console.log(processInfo(body, rego));
return horseman.close();
});
}
// Scrape the results for key info
function processInfo(html, rego) {
var $ = cheerio.load(html);
var vehicle = $('label.label').filter(function() {
return $(this).text().trim() === 'Vehicle:';
}).next().text().trim();
var stolen = $('label.label').filter(function() {
return $(this).text().trim() === 'Stolen status:';
}).next().text().trim();
var registration = $('label.label').filter(function() {
return $(this).text().trim() === 'Registration status & expiry date:';
}).next().text().trim();
return {
rego,
vehicle,
stolen,
registration
};
}
Результаты
Должен сказать, я был приятно удивлён.
Я ожидал, что open-source-распознавание номеров будет довольно грубым. Кроме того, алгоритмы наверняка не оптимизированы под австралийский формат номерных знаков.
Однако система смогла распознавать номера на широкоугольных изображениях.
Аннотации добавлены мной для красоты. Несмотря на блики и оптические искажения, номер был успешно распознан
Однако с определёнными буквами возникли проблемы.
Номер считан неправильно, вместо M распознана H
Но в итоге система всё же корректно их распознавала.
Через несколько кадров буква M определена верно, с высокой степенью достоверности
Как видите, достоверность распознавания прыгнула с 87% на первом кадре до 91% на втором.
Уверен, что точность можно улучшить за счёт увеличения частоты выборки с последующей сортировкой по степени достоверности. Или для проверки номеров можно установить порог приемлемой достоверности, скажем, на уровне 90%.
Для этого достаточно довольно простых исправлений в коде и не нужно ограничивать обучение приложения по распознаванию только номерами вашей страны.
Вопрос на 86 000 000 долларов
Честно говоря, я совершенно не представляю, какие статьи включены в эту сумму, а также не могу сравнивать точность распознавания пилотной системы BlueNet и open-source-инструмента, не обученного работе с австралийскими номерами.
Предполагаю, что часть бюджета запланирована на замену нескольких устаревших баз данных и приложений на новые решения, поддерживающие высокую частоту обработки и обеспечивающие низкую задержку при обработке многочисленных запросов на распознавание номерных знаков.
С другой стороны, стоимость в $391 тыс. на одну машину выглядит довольно сильно, особенно если BlueNet окажется не слишком точной и если в стоимость не входит реализация масштабных IT-проектов по выводу из эксплуатации или обновлению взаимосвязанных систем.
Будущие применения
Чтобы не зацикливаться на идее создания по Оруэллу вездесущей сети воров номерных знаков, для этой технологии можно придумать много более позитивных применений. Представьте себе пассивную систему, сканирующую автомобили на дороге и автоматически предупреждающую власти и владельцев о текущем местоположении и направлении движения похищенных машин.
Автомобили Tesla уже напичканы камерами и датчиками, умеющими принимать OTA-обновления. А что, если превратить их в виртуальный флот добрых самаритян? Машины Uber и Lyft тоже могут быть оснащены такими устройствам, что радикально увеличит зону покрытия.
С использованием open-source-технологий и уже готовых программных и аппаратных компонентов можно будет предложить решение, которое обеспечит гораздо более высокую доходность при инвестициях куда меньше $86 миллионов.
Автор: Wint95r