1. Введение

В этом руководстве создается сквозной проект для интеллектуальной масштабируемой обработки видео в реальном времени в Azure. При этом создается возможность обнаруживать граффити и определять номера вагонов с помощью видеозаписей поездов. Свойства проекта следующие:

  • Интеллектуальные алгоритмы обнаружения граффити и определения номеров вагонов
  • Надежный способ обработки видео в реальном времени от края до облака
  • Масштабируемость для экспоненциального роста количества видео
  • Функциональный проект, который можно оптимизировать для любых возможностей обработки видео.

Архитектуру проекта можно изобразить следующим образом:

В этом блоге эта архитектура реализована следующим образом:

  • 2а. Когнитивные сервисы для обнаружения граффити в поездах (Custom Vision)
  • 2b. Когнитивные службы для определения номеров вагонов (Computer Vision OCR)
  • 3. Функции Azure для параллельной обработки видео.
  • 4. Power BI для визуализации (необязательно)
  • 5. Архитектура IoT Edge для автоматического многоуровневого распределения данных (необязательно)
  • 6. Заключение

В этом блоге вся обработка видео выполняется в Azure. Обратитесь к этому последующему руководству, в котором обнаружение граффити выполняется на самой камере (краю). В следующей главе будут развернуты когнитивные службы Azure.

2. Когнитивные службы Azure

Когнитивные службы Azure - это набор API-интерфейсов, которые можно внедрить в ваши приложения. Он содержит интеллектуальные алгоритмы распознавания речи, распознавания объектов в изображениях и языкового перевода. Модели в основном предварительно обучены и могут быть встроены в ваш проект с полки. Большинство моделей также можно развернуть как контейнер на краю. В этом проекте будут использоваться два API:

  • Пользовательское зрение, которое будет использоваться для обнаружения граффити в поездах. Этой модели для изучения необходимы картинки поездов с граффити и без. Этот шаг можно рассматривать как «добавление последнего настраиваемого слоя в нейронную сеть модели распознавания изображений, которая уже была обучена в Azure Cognitive Services».
  • Компьютерное зрение OCR, которое будет использоваться для определения номера вагона в поезде. Эта модель не требует обучения и может быть снята с полки.

В оставшейся части этой главы будут выполнены следующие шаги:

  • 2а. Обучите и разверните Custom Vision API для обнаружения граффити
  • 2b. Развернуть OCR Computer Vision API

И реализована следующая часть архитектуры:

2а. Обучите и разверните Custom Vision API для обнаружения граффити

Перейдите на Веб-сайт Custom Vision и войдите в систему, используя свои учетные данные Azure AD. После входа в систему выберите создание проекта Custom Vision со свойствами классификация и мультикласс (один тег на изображение) », см. Также ниже.

Затем загрузите следующие изображения в папку CognitiveServices / CustomVisionImages в следующем git-проекте:

https://github.com/rebremer/realtime_video_processing.git

В качестве первого шага добавьте в свой проект изображения граффити с тегами граффити. Во-вторых, добавьте изображения no_graffiti с тегом graffiti, а затем NEGATIVE в свой проект. Затем обучите модель, используя ускоренный курс, см. Также ниже.

После обучения модели вы можете протестировать ее, нажав «Быстрый тест», а затем выберите изображение из тестовой папки, используя проект git, который был загружен ранее.

2b. Развернуть OCR Computer Vision API

Перейдите в группу ресурсов, созданную на шаге 2a, чтобы развернуть OCR Computer Vision API. Нажмите кнопку добавления и введите «Компьютерное зрение» в поле поиска. Выберите F0 в качестве ценового уровня. После развертывания API компьютерного зрения группа ресурсов будет выглядеть следующим образом.

В следующей главе API-интерфейсы будут использоваться для обнаружения граффити и номеров вагонов на видео.

3. Функции Azure для параллельной обработки видео.

Как только новое видео загружено (синхронизировано) в хранилище BLOB-объектов Azure, оно должно быть немедленно обработано следующим образом:

  • В хранилище BLOB-объектов Azure есть триггер, который выполняет простую функцию Azure, которая отправляет сообщение в очередь Azure.
  • В очереди Azure есть триггер, который выполняет расширенную функцию Azure, которая 1) извлекает видео из учетной записи хранения больших двоичных объектов, 2) принимает каждую секунду кадр видео с помощью OpenCV и 3) обнаруживает граффити на кадре, определяет номер вагона и записывает результаты в csv файл

Шаг «Очередь Azure» необходим для параллельной передачи видео. Если триггер большого двоичного объекта напрямую запускает расширенную функцию Azure, видео обрабатываются только последовательно. Архитектура параллельной обработки видео изображена ниже.

В оставшейся части этой главы будут выполнены следующие шаги:

  • 3а. Установите предварительные условия для функции Azure с помощью docker
  • 3b. Создание учетной записи службы хранилища Azure с контейнерами больших двоичных объектов и очередью.
  • 3c1. (Необязательно) создать образ докера для триггера BLOB-объекта функции Azure
  • 3c2. Развертывание триггера BLOB-объекта функции Azure
  • 3d1. (Необязательно) создать образ докера для триггера очереди функций Azure
  • 3d2. Развертывание триггера очереди функций Azure
  • 3д. Запустить тест с видео

И реализована следующая часть архитектуры:

Детали возможности параллельной обработки видео можно найти на рисунке 3.1 «Параллельная обработка видео» ранее.

3а. Установите предварительные условия для функции Azure с помощью docker

Чтобы создавать кадры из видео, необходима функция Azure с OpenCV. Для этой цели используется функция Azure с Python, использующая образ докера с предустановленными зависимостями OpenCV. Для этого необходимо установить следующие предварительные версии:

  • Установить Visual Studio Code
  • Установите Azure Core Tools версии 2.x.
  • Установите Azure CLI. Для этого блога требуется Azure CLI версии 2.0 или более поздней. Запустите az --version, чтобы найти версию, которая у вас есть.
  • (необязательно, если вы хотите создать свой образ) Установите Docker
  • (настоятельно рекомендуется), прежде чем запускать команды в этом учебном пособии, сначала выполните команды из этого учебного пособия.

3b. Создание учетной записи службы хранилища Azure с контейнерами больших двоичных объектов и очередью.

Учетная запись хранилища Azure необходима для загрузки видео и запуска служб очереди Azure, на которых срабатывает функция Azure. Откройте код Visual Studio, откройте новый сеанс терминала и выполните следующие команды:

az login
az group create -n blog-rtvideoproc-rg -l westeurope
az storage account create -n <stor name> -g blog-rtvideoproc-rg --sku Standard_LRS
az storage container create -n videoblob --account-name <stor name>
az storage container create -n pics --account-name <stor name>
az storage container create -n logging --account-name <stor name>
az storage blob upload -f Storage/ImageTaggingLogging.csv -c logging -n ImageTaggingLogging.csv --account-name <stor name> --type append
az storage queue create -n videoqueue --account-name <stor name>

Убедитесь, что для ‹имя хранилища› в качестве имени учетной записи хранения выбрано глобальное уникальное имя.

3c1. (Необязательно) создать образ докера для триггера BLOB-объекта функции Azure

На этом этапе создается простая функция Azure, которая запускается при добавлении нового видео в учетную запись хранения. Затем имя видео извлекается и добавляется в очередь хранения, созданную на шаге 3b. Откройте код Visual Studio, создайте новый сеанс терминала и выполните следующие команды (при появлении запроса выберите python в качестве среды выполнения)

func init afpdblob_rtv --docker
cd afpdblob_rtv
func new --name BlobTrigger --template "Azure Blob Storage trigger"

Затем откройте код Visual Studio, выберите «Файл», выберите «Открыть папку», а затем каталог afpdblob_rtv, который был создан в предыдущей команде, см. Также ниже:

В этом проекте замените содержимое следующих файлов

BlobTrigger/__init__.py
BlobTrigger/function.json
Dockerfile
requirements.txt

С содержимым проекта github https://github.com/rebremer/realtime_video_processing/tree/master/AzureFunction/afpdblob_rtv/. Следующим шагом является создание образа докера и публикация образа докера в общедоступном Docker Hub. В качестве альтернативы также можно использовать частный реестр контейнеров Azure (ACR), но затем убедитесь, что установлены учетные данные. Выполните следующие команды для публикации в Docker Hub

docker login
docker build --tag <<your dockerid>>/afpdblob_rtv .
docker push <<your dockerid>>/afpdblob_rtv:latest

3c2. Развертывание триггера BLOB-объекта функции Azure

На этом этапе образ докера развертывается как функция Azure. Если вы пропустили часть 3c1 для создания собственного образа докера, вы можете заменить ‹your dockerid› на bremerov, то есть bremerov / afpdblob_rtv: latest. Выполните следующие команды:

az appservice plan create --name blog-rtvideoproc-plan2 --resource-group blog-rtvideoproc-rg --sku B1 --is-linux
az functionapp create --resource-group blog-rtvideoproc-rg --os-type Linux --plan blog-rtvideoproc-plan --deployment-container-image-name <your dockerid>/afpdblob_rtv:latest --name blog-rtvideoproc-funblob --storage-account <stor name>
az functionapp config appsettings set --name blog-rtvideoproc-funblob --resource-group blog-rtvideoproc-rg --settings remoteStorageInputContainer="videoblob" `
AzureQueueName="videoqueue" `
remoteStorageAccountName="<stor name>" `
remoteStorageAccountKey="<stor key>"
az functionapp restart --name blog-rtvideoproc-funblob --resource-group blog-rtvideoproc-rg

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

Когда вы синхронизируете Blob Trigger, вы можете увидеть код, который является частью образа докера. В качестве последнего шага добавьте Applications Insights (см. Снимок экрана) и следуйте указаниям мастера. Это позволяет вам видеть ведение журнала на вкладке «Монитор». В качестве теста найдите видео Video1_NoGraffiti_wagonnumber.MP4 в проекте git и загрузите его в видеоблог контейнера хранилища BLOB-объектов с помощью мастера, см. Ниже

После загрузки видео функция Azure запускается с помощью триггера большого двоичного объекта, и файл json добавляется в видеочередь очереди Azure, см. Ниже.

3d1. (Необязательно) создать образ для триггера очереди функций Azure

На этом шаге создается расширенная функция Azure, которая запускается, когда сообщение отправляется в очередь Azure, которая была развернута на шаге 3c2. Откройте код Visual Studio, создайте новый сеанс терминала и выполните следующие команды (при появлении запроса выберите python в качестве среды выполнения)

func init afpdqueue_rtv --docker
cd afpdqueue_rtv
func new --name QueueTrigger --template "Azure Queue Storage trigger"

Затем откройте код Visual Studio, выберите «Файл», выберите «Открыть папку», а затем каталог afpdblob, который был создан в предыдущей команде, см. Также ниже:

В этом проекте замените содержимое следующих файлов

QueueTrigger/__init__.py
QueueTrigger/function.json
Dockerfile
requirements.txt

С содержимым проекта github https://github.com/rebremer/realtime_video_processing/tree/master/AzureFunction/afpdqueue_rtv/. Следующим шагом является создание образа докера и публикация образа докера в общедоступном Docker Hub. В качестве альтернативы также можно использовать частный реестр контейнеров Azure (ACR), но затем убедитесь, что установлены учетные данные. Выполните следующие команды для публикации в Docker Hub

docker login
docker build --tag <<your dockerid>>/afpdqueue_rtv .
docker push <<your dockerid>>/afpdqueue_rtv:latest

3d2. Развертывание триггера очереди функций Azure

На этом этапе образ докера развертывается как функция Azure. Если вы пропустили часть 3d1 для создания собственного образа докера, вы можете заменить ‹your dockerid› на bremerov, то есть bremerov / afpdqueue_rtv: latest. Выполните следующие команды:

az functionapp create --resource-group blog-rtvideoproc-rg --os-type Linux --plan blog-rtvideoproc-plan --deployment-container-image-name <your dockerid>/afpdqueue_rtv:latest --name blog-rtvideoproc-funqueue --storage-account <stor name>
az functionapp config appsettings set --name blog-rtvideoproc-funqueue --resource-group blog-rtvideoproc-rg --settings `
remoteStorageAccountName="<stor name>" `
remoteStorageAccountKey="<stor key>" `
remoteStorageConnectionString="<stor full connection string>" `
remoteStorageInputContainer="videoblob" `
AzureQueueName="videoqueue" `
remoteStorageOutputContainer="pics" `
region="westeurope" `
cognitiveServiceKey="<key of Computer vision>" `
numberOfPicturesPerSecond=1 `
loggingcsv="ImageTaggingLogging.csv" `
powerBIConnectionString=""
az functionapp restart --name blog-rtvideoproc-funqueue --resource-group blog-rtvideoproc-rg

Когда функции развернуты правильно, они создаются на портале следующим образом.

Опять же, выберите добавление Application Insights (см. Верхний снимок экрана), вы можете выбрать тот же ресурс Application Insight, который был создан для триггера большого двоичного объекта. Application Insights можно использовать для просмотра журнала QueueTrigger на вкладке монитора.

В случае успешного запуска триггера очереди функций Azure сообщение о том, что в очереди Azure обрабатывается, и журнал изображений можно найти в каталоге pics, см. Ниже.

Также журнал можно найти в файле logging / ImageTaggingLogging.csv. В следующей части вывод визуализируется в Power BI.

4. Power BI для визуализации (необязательно)

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

  • 4а. Установите предварительные версии для Power BI
  • 4b. Создать набор данных потоковой передачи
  • 4c. Создать панель мониторинга из плитки
  • 4г. Добавить ссылку Power BI в функцию Azure

И реализована следующая часть архитектуры:

Обратите внимание, что нет необходимости визуализировать вывод, чтобы выполнить последний шаг этого блога IoT Hub.

4а. Установите предварительные версии для Power BI

В этом блоге все наборы данных и панели мониторинга будут созданы непосредственно в Power BI, поэтому нет необходимости устанавливать панель мониторинга Power BI. Перейдите по следующей ссылке, чтобы создать учетную запись:



4б. Создать набор данных потоковой передачи

После входа в систему перейдите в свою рабочую область, выберите «Создать», а затем «Потоковая передача набора данных». Этот набор данных потоковой передачи передается из триггера очереди функций Azure.

Выберите API {} в мастере и добавьте следующие поля (поля также могут быть в __init__.py триггера очереди функций Azure в методе publishPowerBI ()

location (Text)
track (Text)
time (DateTime)
trainNumber (Text)
probGraffiti (Number)
caption (Text)
sasPictureTrainNumber (Text)
sasPictureGraffiti (Text)

4c. Создать панель мониторинга из плитки

На следующем этапе создается интерактивная информационная панель на основе набора данных потоковой передачи, который автоматически обновляется при поступлении новых данных. Сначала создайте отчет и визуальный элемент в виде таблицы. Просто добавьте все поля в эту таблицу. Затем выберите визуальный элемент булавки, чтобы создать интерактивную панель визуализации, см. Также ниже.

Таким образом, в отчете можно создать несколько визуальных элементов и опубликовать их на одной панели мониторинга. См. Ниже пример панели инструментов.

4г. Добавить ссылку Power BI в функцию Azure

Наконец, URL-адрес принудительной отправки Power BI необходимо добавить в триггер очереди функций Azure, чтобы можно было опубликовать данные. Нажмите на… ваших наборов данных потоковой передачи, выберите информацию об API и скопируйте URL-адрес, см. Ниже.

Затем добавьте URL-адрес принудительной отправки Power BI в триггер очереди функций Azure и перезапустите функцию, см. Ниже.

az functionapp config appsettings set --name blog-rtvideoproc-funqueue --resource-group blog-rtvideoproc-rg --settings `
powerBIConnectionString="<Power BI push URL"
az functionapp restart --name blog-rtvideoproc-funqueue --resource-group blog-rtvideoproc-rg

Удалите видео Video1_NoGraffiti_wagonnumber.MP4 и снова загрузите его в свою учетную запись хранения больших двоичных объектов в контейнер видеоблобов. Это отправит данные на вашу панель управления Power BI.

5. IoT Edge для автоматического многоуровневого распределения данных (необязательно)

Хранилище BLOB-объектов Azure на IoT Edge - это облегченный согласованный модуль Azure, который предоставляет локальное хранилище блочных BLOB-объектов. Благодаря функции многоуровневого хранения данные автоматически выгружаются из локального хранилища BLOB-объектов в Azure. Это особенно полезно в сценарии, когда 1) устройство (например, камера) имеет ограниченные возможности хранения, 2) множество устройств и данных, которые необходимо обработать, и 3) прерывистое подключение к Интернету. В этом блоге смоделирована камера на виртуальной машине Ubuntu, которая использует Blob on Edge. В оставшейся части этой главы будут выполнены следующие шаги:

  • 5а. Создан Центр Интернета вещей и виртуальная машина Ubuntu в качестве пограничного устройства.
  • 5б. Добавить модуль Хранилище BLOB-объектов на пограничное устройство
  • 5c. Моделирование камеры с помощью устройства Edge

И реализована следующая часть архитектуры:

5а. Установка предварительных условий для хранилища BLOB-объектов Azure на IoT Edge

Чтобы использовать хранилище BLOB-объектов Azure на IoT Edge, необходимо выполнить следующие команды (более подробную информацию см. Здесь).

az extension add --name azure-cli-iot-ext
az vm create --resource-group blog-rtvideoproc-rg --name blog-rtvideoproc-edge --image microsoft_iot_edge:iot_edge_vm_ubuntu:ubuntu_1604_edgeruntimeonly:latest --admin-username azureuser --generate-ssh-keys --size Standard_DS1_v2
az iot hub create --resource-group blog-rtvideoproc-rg --name blog-rtvideoproc-iothub --sku F1
az iot hub device-identity create --hub-name blog-rtvideoproc-iothub --device-id blog-rtvideoproc-edge --edge-enabled

Выполните следующую команду, чтобы получить ключ

az iot hub device-identity show-connection-string --device-id blog-rtvideoproc-edge --hub-name blog-rtvideoproc-iothub

И добавьте этот ключ в свою виртуальную машину, используя следующую команду

az vm run-command invoke -g blog-rtvideoproc-rg -n blog-rtvideoproc-edge --command-id RunShellScript --script "/etc/iotedge/configedge.sh '<device_connection_string from previous step>'"

Когда ваш Центр Интернета вещей и пограничное устройство будут созданы правильно, вы должны увидеть на портале следующее:

5б. Добавить модуль Хранилище BLOB-объектов на пограничное устройство

На этом этапе модуль хранилища BLOB-объектов устанавливается на граничное устройство. Выберите пограничное устройство и следуйте инструкциям в руководстве, используя портал Azure.



В этом случае используйте следующие параметры создания контейнера.

{
  "Env":[
    "LOCAL_STORAGE_ACCOUNT_NAME=localvideostor",
    "LOCAL_STORAGE_ACCOUNT_KEY=xpCr7otbKOOPw4KBLxtQXdG5P7gpDrNHGcrdC/w4ByjMfN4WJvvIU2xICgY7Tm/rsZhms4Uy4FWOMTeCYyGmIA=="
  ],
  "HostConfig":{
    "Binds":[
        "/srv/containerdata:/blobroot"
    ],
  "PortBindings":{
    "11002/tcp":[{"HostPort":"11002"}]
    }
  }
}

и следующие «установить желаемые свойства двойника модуля»:

{
  "properties.desired": {
    "deviceToCloudUploadProperties": {
      "uploadOn": true,
      "uploadOrder": "OldestFirst",
      "cloudStorageConnectionString": "<your stor conn string>",
      "storageContainersForUpload": {
        "localvideoblob": {
          "target": "videoblob"
        }
      },
      "deleteAfterUpload":false
    }
  }
}

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

Кроме того, вы запускаете следующие команды из интерфейса командной строки, чтобы убедиться, что все установлено правильно.

ssh azureuser@<<public IP of your Ubuntu VM>>
sudo systemctl status iotedge 
journalctl -u iotedge
cd /srv/containerdata
ls -la

Если все развернуто успешно, в следующей части мы можем запустить имитатор камеры, который загрузит файл в локальное хранилище BLOB-объектов.

5c. Моделирование камеры с помощью устройства Edge

В заключительной части этого блога мы будем использовать симулятор камеры, который поместит файл на устройство Edge.

В качестве первого шага вам необходимо открыть входящий порт 11002 вашей виртуальной машины Ubuntu. Найдите группу сетевой безопасности (NSG) вашей виртуальной машины и добавьте порт 11002, см. Также ниже.

Запустите код из github в CameraSimulator / CameraSimulater.py. В этом проекте замените IP-адрес вашей UbuntuVM и местоположение видеофайла, который вы хотите загрузить.

Этот симулятор загружает видео и запускает все, что было сделано в этом руководстве, а именно: 1) синхронизирует видео с учетной записью хранения, поскольку включено автоматическое многоуровневое хранение, 2) запускает триггер блога и функцию триггера очереди, которая обрабатывает видео, 3) вызывает когнитивные службы для обнаружение граффити и определение номера вагона и 4) отправка результатов на панель мониторинга Power BI, см. также ниже.

6. Заключение

В этом блоге был создан сквозной проект для интеллектуальной масштабируемой обработки видео в реальном времени в Azure. При этом была создана возможность обнаруживать граффити и определять номера вагонов с помощью видеозаписей поездов. При этом использовались следующие функции Azure

  • Когнитивные сервисы использовались в качестве интеллектуальных алгоритмов для обнаружения граффити в поездах (API пользовательского зрения) и OCR для определения номеров вагонов (API компьютерного зрения)
  • Функции Azure с Python и докером использовались для обработки видео в реальном времени масштабируемым методом.
  • Хранилище BLOB-объектов Azure и пограничные вычисления использовались для надежной обработки видео от пограничного сервера к облаку.
  • Power BI для визуализации вывода с использованием потоковых данных на панелях мониторинга

В этом блоге вся обработка видео выполняется в Azure. В продолжение этого блога модель обнаружения граффити будет развернута на камере (на краю), что может сэкономить передачу данных и снизить затраты. См. Уже этот учебник, как это делается в другом сценарии. Наконец, см. Также архитектуру проекта, изображенную ниже: