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

Я хотел поиграться с сервером OWT с тех пор, как Intel продемонстрировали функции компьютерного зрения на Kranky Geek, и теперь мне посчастливилось поработать с их командой разработчиков для изучения возможностей сервера. Ниже я расскажу о том, как установить 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.


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

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


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

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

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

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

Ускорение


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


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


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

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

Архитектура



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

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


Установка займет немного времени, так как вам нужно будет установить OWT сервер и Analytics Agent. К счастью, у них есть инструкции по сборке Docker для упрощения установки. Если хотите, можете запустить 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 и построить аналитический пайплайн для их использования. Для прилагаемых примеров всё это включает в себя простой запуск команды сборщика в 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. И изменить следующее:


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

vi /home/owt/portal/portal.toml


Опять же, на других платформах вы сможете использовать конфигурацию по умолчанию, если вы запустите свой контейнер с параметром --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/ в браузере на локальной машине. Потребуется разрешить сертификат, так как у браузера будут с ним проблемы.


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


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


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


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


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


Analytics Agent содержит архитектуру плагина OpenCV GStreamer Video Analytics (GVA). 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. В дополнение ко всем популярным публичным моделям CV, таким как 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 есть больше информации об этом здесь.

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


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

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


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

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


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


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

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


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


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

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


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

device = "MULTI:HDDL,GPU,CPU"

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

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

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


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

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