Система распознавания автомобильных номеров с Raspberry Pi и Node-RED
В этом проекте вы узнаете, как создать систему распознавания автомобилей с помощью Raspberry Pi и Node-RED. Для этого проекта мы будем использовать программное обеспечение под названием OpenALPR (Automatic License Plate Recognition — автоматическое распознавание номерных знаков), которое имеет API, позволяющий идентифицировать номерные знаки автомобилей и модели автомобилей на основе изображения.
Обзор
Этот проект разделён на две части.
Сначала мы идентифицируем автомобиль с помощью OpenALPR и Node-RED;
Затем мы вызовем событие на основе обнаруженного автомобиля (например, откроем гараж, когда система определит, что ваш автомобиль приехал домой);
На следующем изображении показано, как будет работать процесс обнаружения:
В этом примере мы используем PIR-датчик движения для обнаружения прибытия автомобиля. Существуют и другие датчики, которые могут лучше подходить для обнаружения автомобиля, например:
Датчик Холла: обнаруживает изменения магнитного поля, когда автомобиль находится рядом;
Ультразвуковой датчик: определяет расстояние до объекта;
Активные инфракрасные детекторы: обнаруживают присутствие объекта путём детектирования отражения инфракрасного излучения.
Когда датчик обнаруживает движение, камера Raspberry Pi делает фотографию. После этого Pi отправляет запрос к OpenALPR с фотографией автомобиля для идентификации. Затем API OpenALPR возвращает данные об автомобиле: номерной знак, модель, цвет и степень достоверности результатов.
После идентификации автомобиля мы проведём несколько проверок, и если обнаружим авторизованный автомобиль, вызовем событие (например, открытие гаража). На следующем изображении представлена блок-схема процесса.
Вот что происходит: после того как автомобиль был идентифицирован OpenALPR, мы проверяем, совпадают ли номерной знак и модель автомобиля. Если они совпадают, мы проверяем, находится ли автомобиль в списке авторизованных транспортных средств. Если да, мы вызываем событие. Например: открытие гаража. После этого мы ждём определённый период времени, пока автомобиль заедет в гараж. Затем вам нужно добавить несколько проверок, чтобы убедиться, что автомобиль уже заехал в гараж. Если да, можно закрыть гараж.
Предварительные требования
Вы должны быть знакомы с Raspberry Pi — прочитайте руководство «Начало работы с Raspberry Pi».
У вас должна быть установлена операционная система Raspbian или Raspbian Lite на вашем Raspberry Pi — прочитайте «Установка Raspbian Lite, включение и подключение по SSH».
Мы будем использовать модуль камеры Raspberry Pi Camera V2, рекомендуем прочитать: Руководство по модулю камеры Raspberry Pi Camera V2.
Вам нужен Node-RED, установленный на вашем Pi, и Node-RED, подготовленный для съёмки фотографий с помощью камеры Pi.
Если вам нравится домашняя автоматизация и вы хотите узнать больше о Node-RED, Raspberry Pi, ESP8266 и Arduino, мы рекомендуем скачать наш курс: Build a Home Automation System for $100.
Необходимые компоненты
Для этого проекта вам понадобятся следующие компоненты (нажмите на ссылки ниже, чтобы найти лучшую цену на Maker Advisor):
Плата Raspberry Pi — прочитайте Лучшие стартовые наборы Raspberry Pi
Резистор (220 или 330 Ом подойдёт)
Примечание: на данный момент у нас нет автоматического гаража, поэтому мы будем использовать светодиод для имитации срабатывания события (мы знаем, что это не одно и то же, но вы поймёте идею).
Подключение модуля камеры Raspberry Pi
При выключенном Pi подключите камеру к CSI-порту Pi, как показано на следующем рисунке. Убедитесь, что камера подключена правильной стороной — синие буквы на шлейфе должны быть обращены вверх (вам нужно включить камеру в вашей ОС Raspbian).
Также у вас должен быть установлен Node-RED на вашем Pi и установлен узел node-red-contrib-camerapi:
Схема
Соберите схему для тестирования этого проекта. Следуйте следующей принципиальной схеме:
После того как ваш 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 Cloud API, вы можете создать бесплатный аккаунт. После завершения создания аккаунта у вас должен быть доступ к следующей странице:
Откройте вкладку Cloud API, чтобы получить доступ к вашему Secret Key (секретному ключу). Он нужен для выполнения запросов к API.
В моём случае секретный ключ: sk_8081041caedd50a———
Сохраните ваш секретный ключ в безопасном месте, потому что он понадобится вам совсем скоро.
Тестирование камеры и сервиса OpenALPR
Сначала вам следует начать с идентификации вашего автомобиля с помощью камеры Pi и сервиса OpenALPR. Итак, начните с предоставленного примера потока (flow), который делает фотографию и отправляет запрос к OpenALPR Cloud API для идентификации вашего автомобиля. Чтобы импортировать предоставленный поток Node-RED, перейдите в репозиторий GitHub или нажмите на изображение ниже, чтобы увидеть исходный файл, и скопируйте предоставленный код.
Далее, в окне Node-RED, в правом верхнем углу, выберите меню и перейдите в Import > Clipboard.
Затем вставьте предоставленный код и нажмите Import. В вашем потоке должны появиться следующие узлы:
Настройка тестового потока
После импорта потока вам нужно внести некоторые изменения, чтобы он работал для вас. Откройте узел Take Photo:
Отредактируйте узел, чтобы он имел те же настройки, что показаны на следующем рисунке:
File Name: car-photo.jpeg
File default path: No
File Path: /home/pi/Pictures/
Важно: иногда предыдущий узел может перезаписать настройки по умолчанию. Убедитесь, что вы дважды проверили правильность настроек. Затем нажмите кнопку deploy.
Подготовка запроса к OpenALPR Cloud API
Дважды щёлкните по узлу cURL POST:
Затем измените поле Command, чтобы включить ваш Secret Key и код страны:
По умолчанию там должна быть следующая команда:
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, чтобы все изменения вступили в силу:
Тестирование потока
После развёртывания потока давайте протестируем процесс идентификации автомобиля. Переместите свой автомобиль в место, где вы можете сделать фотографию с помощью Raspberry Pi:
Направьте камеру на автомобиль и нажмите на квадрат рядом с узлом timestamp, чтобы запустить поток.
Это должно сделать фотографию с помощью камеры Pi, сохранить её по пути /home/pi/Pictures/car-photo.jpeg и отправить запрос к облачному API для идентификации номерного знака и модели вашего автомобиля. Ответ в формате JSON должен быть выведен в окне Debug.
Понимание ответа
Откройте окно debug, и вы должны увидеть объект со всеми подробностями JSON-ответа. Массив results должен содержать хотя бы один результат (array[1]), в противном случае может анализироваться фотография без автомобиля или система не смогла идентифицировать автомобиль (убедитесь, что камера Pi направлена на автомобиль во время съёмки).
Нажмите на стрелку рядом с 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, в правом верхнем углу, выберите меню и перейдите в Import > Clipboard.
Затем вставьте предоставленный код и нажмите Import. В вашем потоке должны загрузиться следующие узлы:
Настройка потока
После импорта потока вам нужно внести некоторые изменения, чтобы он работал для вас. Откройте узел Take Photo:
Отредактируйте узел, чтобы он имел те же настройки, что показаны на следующем рисунке:
File Name: car-photo.jpeg
File default path: No
File Path: /home/pi/Pictures/
Подготовка запроса к OpenALPR Cloud API
Дважды щёлкните по узлу cURL POST:
Затем измените поле Command, чтобы включить ваш Secret Key и код страны:
По умолчанию там должна быть следующая команда:
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, чтобы добавить номерной знак и модель вашего автомобиля.
Вам нужно заменить переменные 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:
Демонстрация
Теперь, когда автомобиль подъезжает, PIR-датчик обнаруживает движение, камера Pi делает фотографию, и автомобиль идентифицируется с помощью API OpenALPR.
Ваш Node-RED должен идентифицировать номерной знак и модель вашего автомобиля. Затем он вызовет событие: включит GPIO 17 на несколько секунд, а затем выключит. Это имитирует команду открытия/закрытия гаражных ворот.
Заключение
В этом проекте мы показали вам, как идентифицировать номерные знаки автомобилей с помощью OpenALPR. Мы также показали, как можно вызвать событие на основе конкретного номерного знака. Таким образом, вы можете автоматически открывать гараж, когда подъезжаете на своём автомобиле. Вы можете модифицировать этот проект, чтобы он работал для вас, и использовать его в собственной системе домашней автоматизации.
В показанном примере мы использовали PIR-датчик движения для обнаружения подъезжающего автомобиля. Существуют и другие датчики, которые могут лучше подходить для этого случая, например: ультразвуковой датчик, активный инфракрасный датчик или датчик Холла.
Когда мы вызываем событие, мы ждём 10 секунд до «закрытия гаража». Вам нужно добавить несколько процессов проверки (которые мы не включили в поток), чтобы проверить, заехал ли автомобиль в гараж или нет.
Надеемся, что этот проект показался вам интересным. Если вам понравился этот проект, вам также могут понравиться: