- PVSM.RU - https://www.pvsm.ru -

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT - 1


WebRTC упростил (в большинстве своем) получение и отправку видеопотоков в реальном времени. А значит, можно немного поразвлекаться с ними при помощи машинного обучения. В прошлом месяце я показал, как запустить компьютерное зрение (Computer Vision – CV) локально в браузере [1]. Как я уже упоминал, локально – это, конечно, хорошо, но иногда требуется более высокая производительность, и для этого нам понадобится удаленный сервер. В данном посте я расскажу о том, как запускать серверные модели OpenCV с аппаратным ускорением на чипсетах Intel с помощью Open WebRTC Toolkit (OWT) с открытым исходным кодом.

Я хотел поиграться с сервером OWT с тех пор, как Intel продемонстрировали функции компьютерного зрения на Kranky Geek [2], и теперь мне посчастливилось поработать с их командой разработчиков для изучения возможностей сервера. Ниже я расскажу о том, как установить OWT локально для быстрого тестирования, а также продемонстрирую некоторые модели.

Open WebRTC Toolkit (OWT)

Корпорация Intel выпустила свой пакет Intel Collaboration Suite для WebRTC где-то в 2014 году. Этот пакет состоял из серверных и клиентских SDK, предназначенных для использования аппаратного обеспечения Intel. Компания продолжила расширять данный набор ПО, добавляя новые функции и улучшая его возможности. Позднее, в 2018 году, Intel открыла исходный код всего проекта под брендом Open WebRTC Toolkit (OWT). Они по-прежнему предлагают использовать Collaborate Suite для WebRTC, по их словам, единственное отличие заключается в комплектации дополнительным Intel QA (что не так уж редко встречается в проектах с открытым исходным кодом, поддерживаемых коммерческими компаниями). В этом посте мы сосредоточимся на опенсорсном OWT.

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT - 2

Вы можете перейти на главную страницу OWT по ссылке: 01.org/open-webrtc-toolkit [3]

Что делает медиасервер

OWT-медиасервер может выступать в качестве сервера многоточечной конференции (Multipoint control unit – MCU), где медиафайлы декодируются, обрабатываются и перекодируются перед отправкой обратно клиентам в дополнение к более типичному методу Selective Forwarding Unit [4] (SFU). OWT от Intel рассматривается как медиа-процессор реального времени с возможностями для следующего применения:

  • Многоточечные конференцииSFU [5] оказался преобладающей архитектурой для WebRTC конференций, но MCU все еще необходим в сценариях, где обработка клиентской стороны ограничена (например, на IoT устройстве), или в сочетании с одним из нижеприведенных пунктов.
  • Транскодирование – MCU помогает при транскодировании между различными кодеками, особенно при обработке видеокодеков с высокой интенсивностью.
  • Прямая трансляция – передача видеосигнала от не-WebRTC клиентов, использующих потоковые протоколы, такие как RTSP, RTMP, HLS, MPEG-DASH.
  • Запись – хранение потоков на диске в необходимых форматах.
  • SIP-gateway – преобразования WebRTC потоков и сигналов в форматы, которые могут использоваться более традиционными VoIP-сетями.
  • Аналитика – запуск машинного обучения на медиа (компьютерное зрение).

Сервер создан на node.js с MongoDB для базы данных и RabbitMQ в качестве посредника сообщений. Функции, перечисленные в списке выше, а также не включенные в список реализованы в виде различных Агентов, подключаемых к архитектуре OWT.

Кроме того, OWT имеет клиентский SDK для взаимодействия с медиасервером. Он также может быть использован в режиме P2P.

Ускорение

Архитектура была разработана для использования аппаратного обеспечения Intel. Сюда относятся большинство современных процессоров Intel и еще более ускоренные процессоры со встроенной графикой, ППВМ [6] (FPGAs) и специализированные процессоры машинного зрения Intel (Vision Processing Unit – VPU). (Вот здесь [7] проект, который я создал, применяя один из их чипов Movidius с Google Vision Kit).

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT - 3

Аналитика и компьютерное зрение (CV)

Любой, кто серьезно работал с компьютерным зрением, сталкивался с OpenCV [8]. OpenCV изначально был проектом Intel и до сих пор остается таковым. У Intel есть набор инструментов, который они называют OpenVINO (Open Visual Inference and Neural Network Optimization) для оптимизации моделей глубокого обучения на своем оборудовании. Он является частью репозитория OpenCV [9]. OpenCV включает десятки предварительно обученных моделей, начиная от базового распознавания текста и заканчивая приложениями для самостоятельного вождения автомобиля.

OWT Analytics Agent – это модуль для получения предсказаний в реальном времени на моделях OpenVINO. Analystics Agent может отправлять выходные метаданные в облако, или вы сами можете направлять их обратно на медиасервер, чтобы делать, например, аннотации для видео в реальном времени (я покажу это немного позже). Широко известная библиотека GStreamer [10] используется для управления мультимедийным пайплайном.

Архитектура

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT - 4

Приведенная выше диаграмма взята из гайда по серверной аналитике [11]. Она выглядит сложной, но здесь нужно лишь запомнить, что Analytics Agent действует как еще один участник конференции, который может подписаться на видеоканал в этой конференции. После того, как он получит видеопоток, вы сможете направлять обработку потока на различные этапы с помощью пайплайна GStreamer. В большинстве случаев вы захотите выполнить получение предсказаний и классификацию, прежде чем возвращать видеопоток обратно в MCU, но вы также можете отправить поток и/или данные вывода куда-то еще.

Установка с помощью докера

Установка займет немного времени, так как вам нужно будет установить OWT сервер и Analytics Agent. К счастью, у них есть инструкции по сборке Docker [12] для упрощения установки. Если хотите, можете запустить OWT + Analytics Agent как 4 отдельных контейнера для распределенных сред. Я решил оставить все свои локально в одном контейнере, чтобы упростить оценку.

На самом деле Intel изначально дали мне образ gst-owt-all:run для работы, так как на момент написания моей статьи они занимались обновлением документации по установке Analytics Agent. Новый набор гораздо более понятен. Я все же рекомендую сначала ознакомиться со стандартной установкой OWT, чтобы разобраться в его компонентах и опциях.

Кроме того, нужно много компилировать с помощью gcc. Убедитесь, что у вас стоит последняя версия, запустив следующую команду: brew install gcc

Сначала у меня ничего не компилилось, но после запуска этой команды все заработало.
В конечном итоге я начал билдить все самостоятельно. Чтобы создать OWT-сервер с Analytics, запустите следующую команду:

git clone https://github.com/open-webrtc-toolkit/owt-server.git
 
cd owt-server
git branch gst-analytics
cd /owt-server/docker/gst
curl -o l_openvino_toolkit_p_2019.3.334.tgz http://registrationcenter-download.intel.com/akdlm/irc_nas/15944/l_openvino_toolkit_p_2019.3.334.tgz
http://registrationcenter-download.intel.com/akdlm/irc_nas/15944/l_openvino_toolkit_p_2019.3.334.tgz
docker build --target owt-run-all -t gst-owt-all:run 
  --build-arg http_proxy=${HTTP_PROXY} 
  --build-arg https_proxy=${HTTPS_PROXY} 
  .

После настройки основного сервера OWT и сервиса Analytics, надо будет скачать необходимые модели из OpenCV Open Model Zoo и построить аналитический пайплайн [13] для их использования. Для прилагаемых примеров всё это включает в себя простой запуск команды сборщика в bash и копирование некоторых файлов.

Проверка работоспособности в macOS

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

Опция docker --net=host не работает в macOS, поэтому для локального запуска вам нужно обязательно открыть соответствующие порты:

Port Service
8080 Сигнальный порт Web-сокета для WebRTC
3004 Веб-сервер для загрузки демонстрационной страницы
30000-30050 UDP-порты для WebRTC

Запуск докера

Я установил свой контейнер так:

docker run -p 8080:8080 -p 3004:3004  -p 30000-30050:30000-30050/udp --name owtwebrtchacks --privileged -tid gst-owt-all:run bash

Редактирование настроек OWT по умолчанию для локального запуска на MacOS

Здесь же необходимо отредактировать файл webrtc_agent/agent.toml для распознавания этих портов.

docker start owtwebrtchacks
docker exec -it owtwebrtchacks bash
vi /home/owt/webrtc_agent/agent.toml

А затем заменить 0acf7c0560d8 именем контейнера или id. И изменить следующее:

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT - 5

Далее вам нужно сообщить веб-ресурсу, чтобы браузер показывал «localhost» вместо внутреннего IP-моста докера (172.17.0.2):

vi /home/owt/portal/portal.toml

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT - 6

Опять же, на других платформах вы сможете использовать конфигурацию по умолчанию, если вы запустите свой контейнер с параметром --net=host.

Запустить сервер

Теперь вы можете запустить сервер:

./home/start.sh

У вас могут появляться такие ошибки:

2020-03-31T01:47:20.814+0000 E QUERY    [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :
connect@src/mongo/shell/mongo.js:251:13
@(connect):1:21
exception: connect failed

Это нормально, пока сервер соединяется. Вы поймете, что все работает, если увидите что-то вроде:

starting app, stdout -> /home/owt/logs/app.stdout
0 rooms in this service.
Created room: 5e82a13b402df00313685e3a
sampleRoom Id: 5e82a13b402df00313685e3a

Тест в браузере

Откройте https://localhost:3004/ [14] в браузере на локальной машине. Потребуется разрешить сертификат, так как у браузера будут с ним проблемы.

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT - 7

И кроме этого, вам нужно разрешить сервер websocket на localhost:8080 [15]. Вы можете сделать это, перейдя по ссылке «Click this for testing certificate and refresh [16]». В качестве альтернативы вы также можете установить #allow-insecure-localhost в chrome://flags чтобы избежать проблем с флагами в Chrome.

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT - 8

Как только вы это сделаете, вернитесь на https://localhost:3004/ [14], и примите разрешение камеры. Тут же выберите свой идентификатор канала видео в раскрывающемся списке «video from» и нажмите «startAnalytics».

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT - 9

Наконец, перейдите к выпадающему списку «subsribe video», выберите длинную строку pipeline + video ID и нажмите subscribe:

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT - 10

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

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT - 11

Добавление моделей OpenCV

Analytics Agent содержит архитектуру плагина OpenCV GStreamer Video Analytics (GVA) [17]. GVA включает в себя разнообразные модули, которые позволяют использовать различные схемы получения предсказаний, такие как детектирование, классификация и идентификация, а также модули ввода и вывода для отправки видео пользователям (в данном случае обратно в OWT), обеспечивая наложение изображений или потоковую передачу данных по mqtt.

Pipelining

На практике данные пайплайны реализуются путем изменения некоторого кода C ++. Например, если мы рассмотрим /home/owt/analytics_agent/plugins/samples/cpu_pipeline/mypipeline.cc, то увидим различные элементы пайплайнов:

 source = gst_element_factory_make("appsrc", "appsource");
 h264parse = gst_element_factory_make("h264parse","parse");
 decodebin = gst_element_factory_make("avdec_h264","decode");
 postproc = gst_element_factory_make("videoconvert","postproc");
 detect = gst_element_factory_make("gvadetect","detect");
 classify = gst_element_factory_make("gvaclassify","classify");
 watermark = gst_element_factory_make("gvawatermark","rate");
 converter = gst_element_factory_make("videoconvert","convert");
 encoder = gst_element_factory_make("x264enc","encoder");
 outsink = gst_element_factory_make("appsink","appsink");x

И эти пайплайны расположены в некой последовательности:

gst_bin_add_many(GST_BIN (pipeline), source,decodebin,watermark,postproc,h264parse,detect,classify,converter, encoder,outsink, NULL);

Если вы хотите изменить любой из их элементов, вам нужно будет перекомпилить пайплайн, используя команду:

./home/owt/analytics_agent/plugins/samples/build_samples.sh

Затем просто скопируйте скомпилированные библиотеки поверх текущей, используемой в /home/owt/analytics_agent/lib/.

Получение других моделей

Существует огромный набор моделей, размещенных под OpenCV Open Model Zoo на GitHub [18]. В дополнение ко всем популярным публичным моделям CV [19], таким как mobilenet, resnet, squeezenet, vgg и многие другие, Intel также поддерживает набор, который включает в себя широкий спектр моделей, полезных для обнаружения объектов, для беспилотных автомобилей и для обработки человеческих действий:

action-recognition head-pose-estimation person-detection-action-recognition-teacher semantic-segmentation
age-gender-recognition human-pose-estimation person-detection-asl single-image-super-resolution
asl-recognition image-retrieval person-detection-raisinghand-recognition text-detection
driver-action-recognition instance-segmentation-security person-detection text-image-super-resolution
emotions-recognition landmarks-regression person-reidentification text-recognition
face-detection license-plate-recognition-barrier person-vehicle-bike-detection-crossroad text-spotting
face-reidentification pedestrian-and-vehicle-detector product-detection vehicle-attributes-recognition-barrier
facial-landmarks-35 pedestrian-detection resnet18-xnor-binary-onnx vehicle-detection
gaze-estimation person-attributes-recognition-crossroad resnet50-binary vehicle-detection-binary
handwritten-score-recognition person-detection-action-recognition road-segmentation vehicle-license-plate-detection-barrier

У Intel есть больше информации об этом здесь [20].

Добавление моделей в OWT Analytics Agent

Для добавления моделей необходимо клонировать репозиторий, а затем получить соответствующие с помощью инструмента Open Model Zoo Downloader tool [21]. После этого необходимо убедиться, что ваш пайплайн содержит соответствующие элементы (классификация, обнаружение, идентификация) и настроить файл /home/owt/analytics_agent/plugin.cfg, применяя соответствующие параметры.

Тестирование плагина

Я попробовал несколько моделей распознавания лиц и эмоций.

Опорные точки лица

Так как я уже играл с детектированием прикосновений к лицу [1], то решил проверить модель facial-landmarks-35-adas-0002 [22]. Эта модель обнаруживает 35 опорных точек лица.

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT - 12

В своем приложении для мониторинга касания лица, я мог бы добавить потоковую передачу MQTT в пайплайн, используя gstreamer generic metadata publisher [23] для захвата и обработки опорных точек. Например, мог бы посмотреть, не затемнены ли точки вокруг глаз, носа и рта, или даже совместить всё это с моделью оценки позы человека [24].

Распознавание эмоций

Это еще одна прикольная штука. Модель emotions-recognition-retail-0003 [25] использует сверточную сеть для распознавания нейтрального, счастливого, грустного, удивленного и яростного выражения.

Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT - 13

Похоже, мое выражение лица воспринимается не как нейтральное, а как грустное – возможно, такое долгое пребывание в изоляции начинает доставать меня

Оптимизация ускорения

Чтобы воспользоваться возможностями аппаратного ускорения OWT, обязательно установите соответствующее устройство в /home/owt/analytics_agent/plugin.cfg – то есть напишите:

device = "MULTI:HDDL,GPU,CPU"

К сожалению, у меня не хватило времени, чтобы протестировать это, но в дополнение к CPU и GPU-ускорению вы также можете воспользоваться преимуществами различных аппаратных средств процессора машинного зрения (VPU). Это специализированные чипы для эффективной работы нейронных сетей. Я купил нейронную вычислительную карту Intel (NCS) [26] пару лет назад для запуска более совершенных моделей CV на Raspberry Pi 3.

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

Рекомендации

У OpenCV долгая история с огромным сообществом разработчиков, он занимал 4-е место среди всех проектов с открытым исходным кодом Machine Learning на момент проведения моего анализа популярности в середине 2018 года [27]. Точно так же, gstreamer – еще один проект, который существует уже вечность. Intel OWT Analytics Agent идеально подходит для того, чтобы помочь этим сообществам добавить в свои проекты потоковый анализ в реальном времени через WebRTC. Они должны иметь возможность брать существующие модели GST и запускать их в потоковом режиме реального времени с помощью OWT.

Если вы только начинаете экспериментировать с компьютерным зрением и хотите запускать модели на сервере OWT, то я рекомендую начать с более базовых туториалов по OpenCV. Затем вы сможете дойти до GVA-плагинов [17]. Они потребуют массу усилий, если вы только начинаете работать с OpenCV, но позже вам не составит труда изменение Analytics Agent для их запуска. Вы сможете оптимизировать стек для работы с вашей целевой платформой и использовать различные варианты аппаратного ускорения Intel для повышения производительности.

Автор: Ирина Максимова

Источник [28]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/353214

Ссылки в тексте:

[1] локально в браузере: https://webrtchacks.com/stop-touching-your-face-with-browser-tensorflow-js/

[2] Kranky Geek: https://www.youtube.com/watch?v=zt1oiG3Yen0

[3] 01.org/open-webrtc-toolkit: https://01.org/open-webrtc-toolkit

[4] Selective Forwarding Unit: https://tools.ietf.org/html/rfc7667#section-3.7

[5] SFU: https://webrtchacks.com/tag/sfu/

[6] ППВМ: https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%BC_%D0%B2%D0%B5%D0%BD%D1%82%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0

[7] здесь: https://cogint.ai/custom-vision-training-on-the-aiy-vision-kit/

[8] OpenCV: https://en.wikipedia.org/wiki/OpenCV

[9] репозитория OpenCV: https://github.com/opencv/dldt

[10] GStreamer: https://gstreamer.freedesktop.org/features/index.html

[11] гайда по серверной аналитике: https://github.com/open-webrtc-toolkit/owt-server/blob/gst-analytics/doc/servermd/AnalyticsServerGuide_en_US.md

[12] инструкции по сборке Docker: https://github.com/open-webrtc-toolkit/owt-server/blob/gst-analytics/doc/servermd/AnalyticsServerGuide_en_US.md#build-docker-image

[13] построить аналитический пайплайн: https://github.com/open-webrtc-toolkit/owt-server/blob/gst-analytics/doc/servermd/AnalyticsServerGuide_en_US.md#build-analytics-pipeline

[14] https://localhost:3004/: https://localhost:3004/

[15] localhost:8080: https://localhost:8080/

[16] Click this for testing certificate and refresh: https://localhost:8080/socket.io/

[17] плагина OpenCV GStreamer Video Analytics (GVA): https://github.com/opencv/gst-video-analytics/wiki/Getting-Started-Guide-%5B2020.1%5D

[18] OpenCV Open Model Zoo на GitHub: https://github.com/opencv/open_model_zoo

[19] публичным моделям CV: https://github.com/opencv/open_model_zoo/tree/master/models/public

[20] здесь: https://docs.openvinotoolkit.org/latest/_models_intel_index.html

[21] Open Model Zoo Downloader tool: https://github.com/opencv/open_model_zoo/tree/master/tools/downloader

[22] facial-landmarks-35-adas-0002: https://docs.openvinotoolkit.org/latest/_models_intel_facial_landmarks_35_adas_0002_description_facial_landmarks_35_adas_0002.html

[23] gstreamer generic metadata publisher: https://github.com/opencv/gst-video-analytics/wiki/gvametapublish

[24] моделью оценки позы человека: https://docs.openvinotoolkit.org/latest/_models_intel_human_pose_estimation_0001_description_human_pose_estimation_0001.html

[25] emotions-recognition-retail-0003: https://docs.openvinotoolkit.org/latest/_models_intel_emotions_recognition_retail_0003_description_emotions_recognition_retail_0003.html

[26] нейронную вычислительную карту Intel (NCS): https://software.intel.com/en-us/neural-compute-stick

[27] анализа популярности в середине 2018 года: https://cogint.ai/ml-github-comparison/

[28] Источник: https://habr.com/ru/post/502682/?utm_source=habrahabr&utm_medium=rss&utm_campaign=502682