Система распознавания автомобильных номеров с Raspberry Pi и Node-RED

В этом проекте вы узнаете, как создать систему распознавания автомобилей с помощью Raspberry Pi и Node-RED. Для этого проекта мы будем использовать программное обеспечение под названием OpenALPR (Automatic License Plate Recognition — автоматическое распознавание номерных знаков), которое имеет API, позволяющий идентифицировать номерные знаки автомобилей и модели автомобилей на основе изображения.

Система распознавания автомобильных номеров с Raspberry Pi и Node-RED

Обзор

Этот проект разделён на две части.

  1. Сначала мы идентифицируем автомобиль с помощью OpenALPR и Node-RED;

  2. Затем мы вызовем событие на основе обнаруженного автомобиля (например, откроем гараж, когда система определит, что ваш автомобиль приехал домой);

На следующем изображении показано, как будет работать процесс обнаружения:

Обзор проекта — процесс обнаружения автомобиля

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

  • Датчик Холла: обнаруживает изменения магнитного поля, когда автомобиль находится рядом;

  • Ультразвуковой датчик: определяет расстояние до объекта;

  • Активные инфракрасные детекторы: обнаруживают присутствие объекта путём детектирования отражения инфракрасного излучения.

Когда датчик обнаруживает движение, камера Raspberry Pi делает фотографию. После этого Pi отправляет запрос к OpenALPR с фотографией автомобиля для идентификации. Затем API OpenALPR возвращает данные об автомобиле: номерной знак, модель, цвет и степень достоверности результатов.

После идентификации автомобиля мы проведём несколько проверок, и если обнаружим авторизованный автомобиль, вызовем событие (например, открытие гаража). На следующем изображении представлена блок-схема процесса.

Блок-схема процесса распознавания автомобиля

Вот что происходит: после того как автомобиль был идентифицирован OpenALPR, мы проверяем, совпадают ли номерной знак и модель автомобиля. Если они совпадают, мы проверяем, находится ли автомобиль в списке авторизованных транспортных средств. Если да, мы вызываем событие. Например: открытие гаража. После этого мы ждём определённый период времени, пока автомобиль заедет в гараж. Затем вам нужно добавить несколько проверок, чтобы убедиться, что автомобиль уже заехал в гараж. Если да, можно закрыть гараж.

Предварительные требования

Если вам нравится домашняя автоматизация и вы хотите узнать больше о Node-RED, Raspberry Pi, ESP8266 и Arduino, мы рекомендуем скачать наш курс: Build a Home Automation System for $100.

Необходимые компоненты

Для этого проекта вам понадобятся следующие компоненты (нажмите на ссылки ниже, чтобы найти лучшую цену на Maker Advisor):

Необходимые компоненты для проекта

Примечание: на данный момент у нас нет автоматического гаража, поэтому мы будем использовать светодиод для имитации срабатывания события (мы знаем, что это не одно и то же, но вы поймёте идею).

Подключение модуля камеры Raspberry Pi

При выключенном Pi подключите камеру к CSI-порту Pi, как показано на следующем рисунке. Убедитесь, что камера подключена правильной стороной — синие буквы на шлейфе должны быть обращены вверх (вам нужно включить камеру в вашей ОС Raspbian).

Подключение модуля камеры Raspberry Pi

Также у вас должен быть установлен Node-RED на вашем Pi и установлен узел node-red-contrib-camerapi:

Узел камеры Pi в Node-RED для съёмки фото

Схема

Соберите схему для тестирования этого проекта. Следуйте следующей принципиальной схеме:

Схема подключения для системы распознавания автомобильных номеров

После того как ваш Raspberry Pi подготовлен и программное обеспечение Node-RED настроено, вы можете продолжить работу с этим проектом.

OpenALPR

OpenALPR — это библиотека автоматического распознавания номерных знаков с открытым исходным кодом, написанная на C++ с привязками для C#, Java, Node.js, Go и Python. У них также есть OpenALPR Cloud API — веб-сервис, работающий в облаке, который анализирует изображения транспортных средств и возвращает номерной знак, модель, цвет и многое другое. OpenALPR Cloud API имеет бесплатный сервис, позволяющий до 2000 бесплатных распознаваний в месяц.

Примечание: вместо использования их Cloud API, который ограничен всего 2000 распознаваниями в месяц, вы можете установить их программное обеспечение с открытым исходным кодом и использовать их интеграцию с Python для написания скриптов на Python для анализа неограниченного количества изображений. Таким образом, вам не нужно использовать их облачный сервис, и вы не ограничены 2000 запросами в месяц.

Поддерживаемые страны

OpenALPR содержит специализированные обучающие данные для многих стилей номерных знаков. В настоящее время OpenALPR поддерживает следующие страны:

Страны, поддерживаемые OpenALPR

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

Создание бесплатного аккаунта

Чтобы начать работу с OpenALPR Cloud API, вы можете создать бесплатный аккаунт. После завершения создания аккаунта у вас должен быть доступ к следующей странице:

Главная страница OpenALPR

Откройте вкладку Cloud API, чтобы получить доступ к вашему Secret Key (секретному ключу). Он нужен для выполнения запросов к API.

Секретный ключ OpenALPR Cloud API

В моём случае секретный ключ: sk_8081041caedd50a———

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

Тестирование камеры и сервиса OpenALPR

Сначала вам следует начать с идентификации вашего автомобиля с помощью камеры Pi и сервиса OpenALPR. Итак, начните с предоставленного примера потока (flow), который делает фотографию и отправляет запрос к OpenALPR Cloud API для идентификации вашего автомобиля. Чтобы импортировать предоставленный поток Node-RED, перейдите в репозиторий GitHub или нажмите на изображение ниже, чтобы увидеть исходный файл, и скопируйте предоставленный код.

Простой поток Node-RED для идентификации автомобиля

Далее, в окне Node-RED, в правом верхнем углу, выберите меню и перейдите в Import > Clipboard.

Импорт узлов в Node-RED

Затем вставьте предоставленный код и нажмите Import. В вашем потоке должны появиться следующие узлы:

Тестовый поток Node-RED

Настройка тестового потока

После импорта потока вам нужно внести некоторые изменения, чтобы он работал для вас. Откройте узел Take Photo:

Узел Take Photo в потоке Node-RED

Отредактируйте узел, чтобы он имел те же настройки, что показаны на следующем рисунке:

  • File Name: car-photo.jpeg

  • File default path: No

  • File Path: /home/pi/Pictures/

Настройки узла камеры

Важно: иногда предыдущий узел может перезаписать настройки по умолчанию. Убедитесь, что вы дважды проверили правильность настроек. Затем нажмите кнопку deploy.

Подготовка запроса к OpenALPR Cloud API

Дважды щёлкните по узлу cURL POST:

Узел cURL POST в потоке Node-RED

Затем измените поле Command, чтобы включить ваш Secret Key и код страны:

Настройка команды cURL POST

По умолчанию там должна быть следующая команда:

sudo curl -X POST "https://api.openalpr.com/v2/recognize?secret_key=YOUR_SECRET_KEY&recognize_vehicle=1&country=YOUR_COUNTRY_CODE&return_image=0&topn=10" -F image=@/home/pi/Pictures/car-photo.jpeg

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

sudo curl -X POST "https://api.openalpr.com/v2/recognize?secret_key=sk_8081041caedd50a---------&recognize_vehicle=1&country=eu&return_image=0&topn=10" -F image=@/home/pi/Pictures/car-photo.jpeg

Примечание: EU — это не страна, но если вы живёте в любой стране Европы, используйте код страны EU.

Скопируйте и вставьте вашу точную команду в поле Command узла cURL POST и нажмите кнопку Deploy в вашем программном обеспечении Node-RED, чтобы все изменения вступили в силу:

Кнопка Deploy в Node-RED

Тестирование потока

После развёртывания потока давайте протестируем процесс идентификации автомобиля. Переместите свой автомобиль в место, где вы можете сделать фотографию с помощью Raspberry Pi:

Фотография автомобиля, сделанная камерой Raspberry Pi

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

Запуск тестового потока

Это должно сделать фотографию с помощью камеры Pi, сохранить её по пути /home/pi/Pictures/car-photo.jpeg и отправить запрос к облачному API для идентификации номерного знака и модели вашего автомобиля. Ответ в формате JSON должен быть выведен в окне Debug.

Понимание ответа

Откройте окно debug, и вы должны увидеть объект со всеми подробностями JSON-ответа. Массив results должен содержать хотя бы один результат (array[1]), в противном случае может анализироваться фотография без автомобиля или система не смогла идентифицировать автомобиль (убедитесь, что камера Pi направлена на автомобиль во время съёмки).

Окно отладки JSON-ответа

Нажмите на стрелку рядом с results: array[1], чтобы раскрыть объект. Вы должны увидеть объект plate с номерным знаком вашего автомобиля. Сохраните номерной знак в формате, полученном от API. В моём случае это «61CP–». Он понадобится вам позже для идентификации вашего автомобиля:

Данные номерного знака в отладочном окне

Раскройте объект vehicle > make_model > 0: object, и вы должны увидеть название вашего автомобиля и то, как API идентифицировал модель автомобиля. В нашем случае система определила автомобиль как Toyota Yaris с достоверностью 77,2%. Мы должны сохранить точную строку «toyota_yaris», полученную от API, потому что она нужна для следующего потока. Сохраните модель вашего автомобиля в формате, полученном от API.

Данные модели автомобиля в отладочном окне

Советы по устранению неполадок

Если ваш ответ вернул недопустимые результаты, убедитесь, что вы дважды проверили следующие детали:

  • Узел Take Photo сохраняет фотографию по правильному пути: /home/pi/Pictures/

  • Убедитесь, что камера делает хорошие фотографии (откройте папку Pictures на Raspberry Pi по адресу /home/pi/Pictures/car-photo.jpeg, чтобы увидеть, выглядит ли сделанная фотография хорошо)

  • Проверьте, виден ли на фотографии автомобиль и его номерной знак, в противном случае API может не суметь правильно идентифицировать автомобиль

  • Убедитесь, что вы ввели правильную команду с вашим собственным API-ключом и кодом страны в команде cURL POST

Поток системы распознавания автомобильных номеров

В этой части мы добавим обнаружение автомобиля и срабатывание события в наш поток. Когда обнаруживается движение, камера Pi делает фотографию с помощью камеры Pi и отправляет запрос к OpenALPR. Затем, на основе ответа, она вызовет событие (в данном случае мы включим выход для зажигания светодиода).

Чтобы импортировать предоставленный поток Node-RED, перейдите в репозиторий GitHub или нажмите на изображение ниже, чтобы увидеть исходный файл, и скопируйте предоставленный код.

Финальный поток Node-RED для распознавания номеров

Далее, в окне Node-RED, в правом верхнем углу, выберите меню и перейдите в Import > Clipboard.

Импорт узлов в Node-RED

Затем вставьте предоставленный код и нажмите Import. В вашем потоке должны загрузиться следующие узлы:

Полный поток Node-RED для системы распознавания номеров

Настройка потока

После импорта потока вам нужно внести некоторые изменения, чтобы он работал для вас. Откройте узел Take Photo:

Узел Take Photo в полном потоке

Отредактируйте узел, чтобы он имел те же настройки, что показаны на следующем рисунке:

  • File Name: car-photo.jpeg

  • File default path: No

  • File Path: /home/pi/Pictures/

Настройки узла камеры

Подготовка запроса к OpenALPR Cloud API

Дважды щёлкните по узлу cURL POST:

Узел cURL POST в полном потоке

Затем измените поле Command, чтобы включить ваш Secret Key и код страны:

Настройка команды cURL POST

По умолчанию там должна быть следующая команда:

sudo curl -X POST "https://api.openalpr.com/v2/recognize?secret_key=YOUR_SECRET_KEY&recognize_vehicle=1&country=YOUR_COUNTRY_CODE&return_image=0&topn=10" -F image=@/home/pi/Pictures/car-photo.jpeg

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

sudo curl -X POST "https://api.openalpr.com/v2/recognize?secret_key=sk_8081041caedd50a---------&recognize_vehicle=1&country=eu&return_image=0&topn=10" -F image=@/home/pi/Pictures/car-photo.jpeg

Добавление данных вашего автомобиля в поток

Откройте функциональный узел Identify Car, чтобы добавить номерной знак и модель вашего автомобиля.

Узел Identify Car в потоке

Вам нужно заменить переменные carPlate и carModel на номерной знак и название модели вашего автомобиля (в точно таком же формате, как было получено ранее). В нашем случае мы получаем:

var carPlate = "61CP--";
var carModel = "toyota_yaris";

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

Функциональный узел с данными автомобиля

Примечание: если вы хотите добавить ещё один номерной знак автомобиля, вам нужно отредактировать функцию «Identify Car». Объявите ещё одну пару переменных carPlate2 и carModel2:

var carPlate2 = " ";
var carModel2 = " ";

Затем после оператора else if добавьте следующее:

else if(msg.payload.results[0].plate==carPlate2 && msg.payload.results[0].vehicle.make_model[0].name==carModel2){
  msg.payload=1;
  global.set("garageOpen","1");
}

Это должно позволить вам проверять два автомобиля (вы можете добавить больше).

После того как вы добавили данные вашего автомобиля, нажмите Done и кнопку Deploy:

Кнопка Deploy в Node-RED

Демонстрация

Теперь, когда автомобиль подъезжает, PIR-датчик обнаруживает движение, камера Pi делает фотографию, и автомобиль идентифицируется с помощью API OpenALPR.

Процесс обнаружения автомобиля

Ваш Node-RED должен идентифицировать номерной знак и модель вашего автомобиля. Затем он вызовет событие: включит GPIO 17 на несколько секунд, а затем выключит. Это имитирует команду открытия/закрытия гаражных ворот.

Демонстрация системы распознавания автомобильных номеров

Заключение

В этом проекте мы показали вам, как идентифицировать номерные знаки автомобилей с помощью OpenALPR. Мы также показали, как можно вызвать событие на основе конкретного номерного знака. Таким образом, вы можете автоматически открывать гараж, когда подъезжаете на своём автомобиле. Вы можете модифицировать этот проект, чтобы он работал для вас, и использовать его в собственной системе домашней автоматизации.

В показанном примере мы использовали PIR-датчик движения для обнаружения подъезжающего автомобиля. Существуют и другие датчики, которые могут лучше подходить для этого случая, например: ультразвуковой датчик, активный инфракрасный датчик или датчик Холла.

Когда мы вызываем событие, мы ждём 10 секунд до «закрытия гаража». Вам нужно добавить несколько процессов проверки (которые мы не включили в поток), чтобы проверить, заехал ли автомобиль в гараж или нет.

Надеемся, что этот проект показался вам интересным. Если вам понравился этот проект, вам также могут понравиться: