В этой статье я проведу вас через шаги, необходимые для создания вашей собственной системы оповещения об объектах, работающей на пограничном устройстве. Для этого мы будем использовать NVidia Jetson Nano, службу Azure Custom Vision и Azure IoT Edge.

Цель состоит в том, чтобы обрабатывать кадры камеры локально на Jetson Nano и отправлять сообщение в облако только тогда, когда обнаруженный объект достигает определенного порога достоверности.

Требования перед началом:

Часть 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

Часть 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 /). Вы увидите небольшой предварительный просмотр захваченного кадра.

Подробнее о составе и развертывании модулей

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-адрес, который вы скопировали из приложения логики. Наконец подтвердите выбор.

Продолжить обучение