Рассмотрим задачу создания собственной системы автоматического детектирования и распознавания автомобильных номеров на основе открытой библиотеки OpenALPR. Такие системы применяются не только в карательных целях, чтобы штрафовать водителей, превышающих разрешенную скорость. Так, установленная на контрольном пункте система распознавания сокращает время ожидания водителей перед шлагбаумом и снижает нагрузку постового. Программа сверяет распознанный номер с базой, разрешая или запрещая въезд транспорта. Другое применение – оптимизация городского или локального трафика через трекинг передвижения автомобилей и общественного транспорта по камерам наружного наблюдения. Мы будем рады, если вы поделитесь своими идеями применения таких систем в комментариях.
Что мы хотим сделать?
Итак, когда в кадре видеонаблюдения оказывается автомобиль, система должна обнаружить знак и распознавать его в виде строки, состоящей из набора символов. Нахождение объектов в видеопотоке – задача из области компьютерного зрения. При беглом поиске в интернете можно найти множество публикаций, посвященных распознаванию номеров, но... чаще всего на одном единственном примере. Такие решения, конечно, не универсальны. Автомобильные номера в поле зрения камеры оказываются под разными углами, в меняющихся условиях освещения, могут иметь загрязнения и повреждения. Кроме того, в кадре может одновременно находиться несколько автомобилей.
Универсальные системы требуют обучения на сотнях тысяч предварительно распознанных примеров. Для этого, кроме предообработки изображений, используется глубокое обучение на основе нейросетей. Процесс их тренировки требует наличия мощных видеокарт или распределенных вычислительных систем. В то же время результат в виде предобученной нейросети для распознавания символов вполне может работать и на одноплатных компьютерах, например, Raspberry Pi. Это снижает издержки внедрения и использования технологии.
Таким образом, кроме самой платы, понадобятся следующие инструменты:
- Библиотека для предобработки изображений OpenCV.
- Библиотека распознавания текста Tesseract OCR.
- Библиотека OpenALPR, учитывающая предполагаемый объект распознавания (табличку автомобильного номера) и использующая методы вышеуказанных библиотек.
OpenALPR – это библиотека для автоматического распознавания табличек с буквенно-численными символами, написанная на C++ с интерфейсом для Node.js, Python, Java, Go и C#. Под аббревиатурой OpenALPR скрывается Automatic License Plate Recognition (автоматическое распознавание автомобильных номеров). Пакет предоставляет как открытую библиотеку для разработки собственных приложений, так и платный агент (при желании использовать готовое решение). Библиотека работает как со статичными изображениями, так и с видеопотоком. Документация проекта.
Ниже мы подробно рассмотрим установку OpenALPR на примере Raspberry Pi третьей модели с учетом нюансов. Обратите внимание: при установке важно учитывать зависимости и конкретные версии библиотек.
1. Выполняем update и upgrade ОС
По умолчанию мы предполагаем, что на плате стоит наиболее популярная операционная система для рассматриваемой платы – Raspbian. Все шаги выполняются на правах администратора (root). Начать нужно с двух стандартных команд, обновляющих операционную систему:
2. Устанавливаем необходимые пакеты
Перед установкой OpenALPR необходимо разобраться со всеми необходимыми зависимостями:
То же можно выполнить в виде однострочной команды:
В случае, если apt-get install
для какого-либо из пакетов закончится неудачей (no package found), необходимо вручную найти отсутствующий пакет, используя apt-cache search
.
Tesseract использует библиотеку leptonica версии 1.71, поэтому предварительно ее установим:
3. Устанавливаем основные библиотеки нужных версий
Как было сказано выше, в основе OpenALPR лежат две библиотеки:
- Tesseract OCR v3.0.4 (важно: OpenALPR не использует Tesseract последней версии)
- OpenCV v2.4.8+
Чтобы предупредить возможные трудности, опишем процесс установки подробнее.
3.1. Tesseract OCR
Скачиваем (клонируем) пакет с git:
Если все прошло успешно, вы получите сообщение:
На следующем шаге нужно настроить библиотеку, как предложено в сообщении выше, то есть запустить ./configure
. Запустим с опцией отладки.
После того как мы настроили библиотеку, запустим компиляцию:
На Raspberry процесс занимает много времени. Поэтому запускаем команду с опцией j2
(в два потока). В случае если это вызовет проблемы, запускайте команду make
без дополнительных параметров. Устанавливаем скомпилированное:
Проверяем результат компиляции:
Если вы получили схожую ошибку (на этом или следующих этапах) запустите ldconfig
. Вновь проверим результат, теперь всё работает:
Видим номер версии, библиотека установлена.
3.2. OpenCV
Загрузим OpenCV. Разархивируем zip-файл. При этом будет создана директория /usr/src/opencv-2.4.13
.
Далее создаем внутри каталог release
, переходим в него и настраиваем проект.
Если всё закончится хорошо, мы получим следующее сообщение:
Если вы получите ошибку вида libdc1394 error: Failed to initialize libdc1394
, запустите следующий код:
Далее нужно скомпилировать результат, лучше, как и прежде, с параметром j2
, чтобы сократить время компиляции. То есть в окне терминала это будет выглядеть примерно так:
В первый раз процесс может закончиться следующей ошибкой:
Это может быть вызвано нехваткой памяти. Срабатывает следующий набор действий:
- Перезагрузить плату
- Увеличить файл подкачки (swap)
- Запустить
make clean
и вновьmake
Чтобы увеличить файл подкачки, выполняем следующую последовательность:
После того как удастся успешно скомпилировать OpenCV, производим установку:
4. Устанавливаем OpenALPR
Наконец, мы можем установить саму OpenALPR. Клонируем репозиторий и проверяем версию:
Например, в нашем случае ответом на последний запрос было v2.1.0-513-gcd2aab0
, то есть версия 2.1.0. Если вы хотите использовать ту же версию, что в нашем примере, используйте git checkout v2.1.0
.
Если после запуска make
выводится ошибка, аналогичная случаю с установкой OpenCV, выполняем вышеописанную последовательность действий для OpenCV. Если обнаруживаются ошибки, связанные с отсутствием библиотек:
Протестируем полученный результат:
Всё работает. Слева — распознанный номер, справа — вероятность его соответствия реальному номеру на изображении.
Чтобы настроить связку библиотеки с С/С++Java, C#, Java или Python, ознакомьтесь с соответствующим разделом официальной документации. Например, использов связку с Python, вы можете построить систему из нескольких веб-камер, взаимодействующих с общим сервером, обращаясь к отдельным камерам только в случае нестандартных ситуаций, когда номер оказался не распознан.
Комментарии