В этой статье я проведу вас через шаги, необходимые для создания вашей собственной системы оповещения об объектах, работающей на пограничном устройстве. Для этого мы будем использовать NVidia Jetson Nano, службу Azure Custom Vision и Azure IoT Edge.
Цель состоит в том, чтобы обрабатывать кадры камеры локально на Jetson Nano и отправлять сообщение в облако только тогда, когда обнаруженный объект достигает определенного порога достоверности.
Требования перед началом:
- Вам нужна Nvidia Jetson Nano
- USB-камера.
- Подписка Azure (Начните бесплатно здесь)
Часть 1. Ресурсы по настройке в Azure
Для начала нам нужно настроить несколько ресурсов в Azure. Для этого воспользуемся Azure CLI. Если на вашем компьютере не установлен Azure CLI, вы можете следовать руководству по MS Docs здесь.
1.1 Создание Центра Интернета вещей Azure
Первый ресурс, который нам нужен, - это Центр Интернета вещей Azure. Мы будем использовать это для связи с нашим пограничным устройством. Это даст нам возможность развертывать наши модели IoT Edge на устройстве и даст устройству Edge возможность отправлять сообщения обратно в облако.
Создайте группу ресурсов
az group create --name [resource group name] --location westeurope
Создайте Центр Интернета вещей
az iot hub create --name [iot hub name] --resource-group [resource group name] --sku S1
1.2 Создание реестра контейнеров Azure
Второй ресурс, который нам нужно создать, - это реестр контейнеров Azure (ACR). В этом реестре контейнеров мы будем хранить наши модули IoT Edge.
Создайте реестр контейнеров Azure
az acr create --resource-group [resource group name] --name [container registry name] --sku Basic
Войдите в реестр контейнеров Azure. Сначала используйте интерфейс командной строки, чтобы получить учетные данные из ACR.
az acr update -n [container registry name] --admin-enabled true
az acr credential show -n [container registry name]
Эти учетные данные понадобятся вам в части 3.
Подробнее об этих ресурсах в MS Docs
- Создайте центр Интернета вещей с помощью интерфейса командной строки в MS Docs
- Создание реестра контейнеров с помощью интерфейса командной строки в MS Docs
Часть 2 - Настройка Nvidia Jetson Nano
В этой части мы собираемся подготовить наше устройство Jetson Nano для запуска трех модулей IoT Edge, которые мы собираемся создать позже.
Самый простой способ выполнить это пошаговое руководство - подключиться по SSH к вашему Jetson Nano.
2.1 Установите последнюю версию операционной системы
Установите последнюю версию операционной системы на Jetson Nano. На сайте обучения Nvidia есть отличное руководство для этого. Следуйте инструкциям здесь. Когда устройство загрузится и на экране появится рабочий стол, вы можете перейти к следующему шагу.
2.2 Установите IoT Edge на Jetson Nano
Сборки ARM64 IoT Edge в настоящее время предлагаются в предварительной версии и в конечном итоге станут общедоступными. Мы будем использовать сборки ARM64, чтобы обеспечить максимальную производительность наших решений IoT Edge.
Запустите приведенный ниже код на устройстве Nvidia Jetson, чтобы установить IoT Edge.
# You can copy the entire text from this code block and # paste in terminal. The comment lines will be ignored.
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash sudo apt-get -y install libssl-dev libffi-dev jq python-pip pip install iotedgedev sudo mv ~/.local/bin/iotedgedev /usr/local/bin
# Download and install the standard libiothsm implementation curl -L https://github.com/Azure/azure-iotedge/releases/download/1.0.8-rc1/libiothsm-std_1.0.8.rc1-1_arm64.deb -o libiothsm-std.deb && sudo dpkg -i ./libiothsm-std.deb
# Download and install the IoT Edge Security Daemon curl -L https://github.com/Azure/azure-iotedge/releases/download/1.0.8-rc1/iotedge_1.0.8.rc1-1_arm64.deb -o iotedge.deb && sudo dpkg -i ./iotedge.deb
# Run apt-get fix sudo apt-get install -f
Теперь, когда IoT Edge установлен, нам нужно подключить устройство к IoT Hub. Для этого нам нужно настроить устройство в центре Интернета вещей и получить строку подключения. Мы можем получить эту строку подключения с помощью Azure CLI с расширением azure-iot.
# First add the azure-iot extension. az extension add --name azure-iot
# Create a new IoT Edge device az iot hub device-identity create --device-id [device id] --hub-name [hub name] --edge-enabled
# List all IoT Edge devices az iot hub device-identity list --hub-name [hub name]
# Get the Connection string az iot hub device-identity show-connection-string --device-id [device id] --hub-name [hub name]
Получив строку подключения, откройте файл конфигурации на Jetson Nano:
sudo nano /etc/iotedge/config.yaml
Найдите в файле раздел подготовки и раскомментируйте режим подготовки вручную. Обновите значение device_connection_string строкой подключения с вашего устройства IoT Edge.
provisioning: source: "manual" device_connection_string: "<ADD DEVICE CONNECTION STRING HERE>"
# provisioning: # source: "dps" # global_endpoint: "https://global.azure-devices-provisioning.net" # scope_id: "{scope_id}" # registration_id: "{registration_id}"
Вы также можете настроить конфигурацию агента IoT Edge по умолчанию для получения версии агента 1.0.8-rc1. Находясь в файле конфигурации, прокрутите вниз до раздела агента и обновите значение изображения до следующего:
agent:
name: "edgeAgent"
type: "docker"
env: {}
config:
image: "mcr.microsoft.com/azureiotedge-agent:1.0.8-rc1"
auth: {}
Перезапустите службу iot-edge
service iotedge restart
Посмотрите, подключено ли ваше устройство к Центру Интернета вещей
az iot hub device-identity show --device-id [device id] --hub-name [hub name]
Ищите в ответе:
"connectionState": "Connected"
Дополнительные сведения о настройке Azure IoT Edge на Jetson Nano
2.3 Включение поддержки GPU в Docker
Модели AI работают быстрее, если они могут использовать мощность графического процессора. Чтобы получить поддержку графического процессора в Docker на Jetson Nano, вам необходимо настроить несколько параметров.
Отключить пользовательский интерфейс
По умолчанию Nano запускает визуальный интерфейс. Это требует ресурсов, необходимых для запуска моделей ИИ.
sudo systemctl set-default multi-user.target
Увеличьте мощность
Переведите Nano в режим повышенной мощности (10 Вт):
sudo nvpmodel -m 0
Среда выполнения NVidia
Установите среду выполнения NVidia в качестве среды выполнения по умолчанию в Docker. Ваш файл /etc/docker/daemon.json должен выглядеть так.
{
“default-runtime”: “nvidia”,
“runtimes”: {
“nvidia”: {
“path”: “nvidia-container-runtime”,
“runtimeArgs”: []
}
}
}
Запустите обновления
Обновите свою ОС Nano и пакеты до последних версий.
sudo apt-get update
sudo apt-get dist-upgrade
Добавить текущего пользователя в группу докеров
Добавить текущего пользователя в группу докеров, чтобы использовать команды докеров без sudo, следуя этому руководству: https://docs.docker.com/install/linux / linux-postinstall / .
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
Перезагрузите устройство
sudo reboot
Проверьте поддержку графического процессора
docker run -it jitteam/devicequery ./deviceQuery
Если в последней строке не указано «Result = PASS», следуйте инструкциям на экране, чтобы включить поддержку графического процессора в Docker.
Теперь вы готовы запускать контейнеры Docker, поддерживающие Tensorflow с графическим процессором.
3. Создайте модули IoT Edge.
Начните с клонирования репозитория, содержащего образцы модулей IoT Edge и конфигурацию развертывания.
git clone https://github.com/hnky/iot-edge-custom-vision-jetson-nano
Репо имеет следующую структуру:
- modules = ›Папка, в которой находятся 3 модуля IoT Edge.
- Deploy.template.json = ›Шаблон, из которого создается конфигурация развертывания.
- .env = ›ваши секреты
Создание контейнеров может занять некоторое время
Войдите в свой ACR. Сначала нам нужно войти в наш реестр контейнеров на Jetson Nano.
docker login [container registry name].azurecr.io
3.1 Пользовательский модуль технического зрения Azure
Этот модуль содержит небольшой веб-сервер, который предоставляет модель, созданную с помощью службы Azure Custom Vision, через API на порт 80. Этот контейнер содержит простую модель с 3 классами: Apple, Banana или Negative.
Создайте контейнер и отправьте в ACR
cd modules/CustomVisionModule
docker build . -f Dockerfile.arm64v8 -t [container registry name].azurecr.io/customvisionmodule:latest-arm64v8
docker push [container registry name].azurecr.io/customvisionmodule:latest-arm64v8
Протестируйте контейнер
# Run the container docker run -p 127.0.0.1:80:80 -d [container registry name].azurecr.io/customvisionmodule:latest-arm64v8
# Send a test image of a banana to the containers curl -X POST http://127.0.0.1/url -d '{ "url": "https://www.wievultuwbroodtrommel.nl/205-large_default/banaan.jpg"}'
Остановите контейнер
# List all the containers and locate the Container ID docker container list
# Stop the container docker container stop [container id]
Подробнее Если вы хотите узнать, как создать свою собственную модель и запустить ее как контейнер на Jetson Nano, вы можете прочитать этот блог.
3.2 Модуль камеры
Этот модуль захватывает кадры камеры, отправляет изображения в модуль компьютерного зрения и помещает результат в локальный центр Интернета вещей.
cd modules/CameraModule
docker build . -f Dockerfile.arm64v8 -t [container registry name].azurecr.io/cameramodule:latest-arm64v8
docker push [container registry name].azurecr.io/cameramodule:latest-arm64v8
3.3 Модуль предупреждений
Этот модуль получает результат локального центра Интернета вещей и отправляет его в центр Интернета вещей Azure, если для одного из классов (Apple, Banana или Negative) достигнут порог в 60%.
cd modules/AlertModule
docker build . -f Dockerfile.arm64v8 -t [container registry name].azurecr.io/alertmodule:latest-arm64v8
docker push [container registry name].azurecr.io/alertmodule:latest-arm64v8
4. Разверните модули в IoT Edge.
Создайте развертывание
Обновите файл .env, указав свои учетные данные.
nano .env
Создайте манифест развертывания из файла deployment.template.json.
iotedgedev genconfig -f deployment.template.json -P arm64v8
Скопируйте сгенерированный файл манифеста config / deployment.config на свой компьютер, на котором работает Azure CLI.
az iot edge set-modules --device-id [device id] --hub-name [hub name] --content deployment.config
Проверьте Jetson Nano, работают ли модули.
iotedge list
Чтобы увидеть сообщения, которые отправляет модуль предупреждений, вы можете использовать команду ниже
iotedge logs alert-module
Чтобы просмотреть выходные данные модуля камеры, вы можете открыть веб-браузер и ввести IP-адрес Jetson Nano на порту 5012 (http: //x.x.x.x: 5012 /). Вы увидите небольшой предварительный просмотр захваченного кадра.
Подробнее о составе и развертывании модулей
- Узнайте, как развертывать модули и устанавливать маршруты в IoT Edge
- Разрабатывайте свои собственные модули IoT Edge
- Развертывание модулей Azure IoT Edge с помощью Azure CLI
5. Создайте приложение логики, которое отправляет оповещение.
5.1 Создание ресурса приложения логики
На портале Azure выберите «Создать ресурс», затем введите «приложение логики» в поле поиска и выберите возврат. Выберите приложение логики из результатов.
- На следующем экране выберите Создать.
- Дайте своему приложению логики имя, уникальное для вашей подписки, а затем выберите ту же подписку, группу ресурсов и расположение, что и центр Интернета вещей.
- Выберите "Создать".
- После создания ресурса перейдите в приложение логики. Для этого выберите Группы ресурсов, затем выберите группу ресурсов, которую вы создали для этого руководства. Затем найдите приложение логики в списке ресурсов и выберите его.
- В конструкторе приложений логики перейдите на страницу вниз, чтобы увидеть шаблоны. Выберите «Пустое приложение логики», чтобы создать приложение логики с нуля.
Выберите триггер
Триггер - это конкретное событие, запускающее ваше приложение логики. В этом руководстве триггер, запускающий рабочий процесс, получает запрос по HTTP.
- В строке поиска коннекторов и триггеров введите HTTP.
- Выберите запрос - когда HTTP-запрос получен в качестве триггера.
- Выберите Использовать образец полезной нагрузки для создания схемы.
- Вставьте следующий образец кода JSON в текстовое поле и выберите Готово:
[
{
"id": "fc52510d-e9b7-da86-c7af-c05b7b820554",
"topic": "/SUBSCRIPTIONS/431DBAE5-40CA-438A-8DAF-77D7D5580B41/RESOURCEGROUPS/AIAPRIL_IOT/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/AIAPRILIOTHUB",
"subject": "devices/AIAprilDevice/alert-module",
"eventType": "Microsoft.Devices.DeviceTelemetry",
"eventTime": "2020-04-19T18:52:03.247Z",
"data": {
"properties": {},
"systemProperties": {
"correlation-id": "test-1234",
"message-id": "d2b805e5-cef5-4eea-a9fc-536516408bfd",
"iothub-content-type": "application/json",
"iothub-content-encoding": "utf-8",
"iothub-connection-device-id": "AIAprilDevice",
"iothub-connection-module-id": "alert-module",
"iothub-connection-auth-method": "{\"scope\":\"module\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
"iothub-connection-auth-generation-id": "637228229021652362",
"iothub-enqueuedtime": "2020-04-19T18:52:03.247Z",
"iothub-message-source": "Telemetry"
},
"body": {
"tag": "Apple"
}
},
"dataVersion": "",
"metadataVersion": "1"
}
]
- Вы можете получить всплывающее уведомление, в котором говорится: «Не забудьте включить в свой запрос заголовок Content-Type, для которого установлено значение application / json». Вы можете проигнорировать это предложение и перейти к следующему разделу.
Создать действие
Действия - это любые шаги, которые происходят после того, как триггер запускает рабочий процесс приложения логики. В этом руководстве действие заключается в отправке уведомления по электронной почте от вашего поставщика услуг электронной почты.
- Выберите Новый шаг. Откроется окно для выбора действия.
- Найдите электронную почту.
- В зависимости от вашего провайдера электронной почты найдите и выберите подходящий соединитель. В этом руководстве используется Office 365 Outlook. Действия для других провайдеров электронной почты аналогичны.
- Сохраните приложение логики.
Скопируйте URL-адрес HTTP
Прежде чем покинуть конструктор приложений логики, скопируйте URL-адрес, который приложение логики ожидает от триггера. Этот URL-адрес используется для настройки сетки событий.
- Разверните окно конфигурации «Триггер при получении HTTP-запроса», щелкнув по нему.
- Скопируйте значение URL-адреса HTTP POST, нажав кнопку копирования рядом с ним.
5.3 Настройка подписки на события IoT Hub
В этом разделе вы настроите свой Центр Интернета вещей для публикации событий по мере их возникновения.
- На портале Azure перейдите в центр Интернета вещей. Вы можете сделать это, выбрав Группы ресурсов, затем выберите группу ресурсов для этого руководства, а затем выберите свой Центр Интернета вещей из списка ресурсов.
- Выберите События и выберите подписку на событие.
- Создайте подписку на событие со следующими значениями:
Типы событий: снимите все флажки, кроме Телеметрия устройства.
- Сведения о конечной точке: выберите Тип конечной точки как Веб-перехватчик, выберите конечную точку и вставьте URL-адрес, который вы скопировали из приложения логики. Наконец подтвердите выбор.
Продолжить обучение
- Учебное пособие: отправка уведомлений по электронной почте о событиях Azure IoT Hub с помощью сетки событий и приложений логики
- Https://dev.to/azure/getting-started-with-devops-ci-cd-pipelines-on-nvidia-arm64-devices-4668
- Https://github.com/janza/docker-python3-opencv/blob/master/Dockerfile
- Https://github.com/Azure/azure-iot-sdk-python/blob/master/azure-iot-device/samples/async-edge-scenarios/send_message_to_output.py
- Https://github.com/toolboc/IntelligentEdgeHOL
- Https://dev.to/azure/getting-started-with-iot-edge-development-on-nvidia-jetson-devices-2dfl
- Https://www.youtube.com/watch?v=_K5fqGLO8us
- Https://www.youtube.com/watch?v=gMJgsQ13SKs&feature=youtu.be Расширенная информация о запуске Custom Vision с включенным графическим процессором на Jetson Nano