- PVSM.RU - https://www.pvsm.ru -
WebRTC упростил (в большинстве своем) получение и отправку видеопотоков в реальном времени. А значит, можно немного поразвлекаться с ними при помощи машинного обучения. В прошлом месяце я показал, как запустить компьютерное зрение (Computer Vision – CV) локально в браузере [1]. Как я уже упоминал, локально – это, конечно, хорошо, но иногда требуется более высокая производительность, и для этого нам понадобится удаленный сервер. В данном посте я расскажу о том, как запускать серверные модели OpenCV с аппаратным ускорением на чипсетах Intel с помощью Open WebRTC Toolkit (OWT) с открытым исходным кодом.
Я хотел поиграться с сервером OWT с тех пор, как Intel продемонстрировали функции компьютерного зрения на Kranky Geek [2], и теперь мне посчастливилось поработать с их командой разработчиков для изучения возможностей сервера. Ниже я расскажу о том, как установить 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 [3]
OWT-медиасервер может выступать в качестве сервера многоточечной конференции (Multipoint control unit – MCU), где медиафайлы декодируются, обрабатываются и перекодируются перед отправкой обратно клиентам в дополнение к более типичному методу Selective Forwarding Unit [4] (SFU). OWT от Intel рассматривается как медиа-процессор реального времени с возможностями для следующего применения:
Сервер создан на node.js с MongoDB для базы данных и RabbitMQ в качестве посредника сообщений. Функции, перечисленные в списке выше, а также не включенные в список реализованы в виде различных Агентов, подключаемых к архитектуре OWT.
Кроме того, OWT имеет клиентский SDK для взаимодействия с медиасервером. Он также может быть использован в режиме P2P.
Архитектура была разработана для использования аппаратного обеспечения Intel. Сюда относятся большинство современных процессоров Intel и еще более ускоренные процессоры со встроенной графикой, ППВМ [6] (FPGAs) и специализированные процессоры машинного зрения Intel (Vision Processing Unit – VPU). (Вот здесь [7] проект, который я создал, применяя один из их чипов Movidius с Google Vision Kit).
Любой, кто серьезно работал с компьютерным зрением, сталкивался с OpenCV [8]. OpenCV изначально был проектом Intel и до сих пор остается таковым. У Intel есть набор инструментов, который они называют OpenVINO (Open Visual Inference and Neural Network Optimization) для оптимизации моделей глубокого обучения на своем оборудовании. Он является частью репозитория OpenCV [9]. OpenCV включает десятки предварительно обученных моделей, начиная от базового распознавания текста и заканчивая приложениями для самостоятельного вождения автомобиля.
OWT Analytics Agent – это модуль для получения предсказаний в реальном времени на моделях OpenVINO. Analystics Agent может отправлять выходные метаданные в облако, или вы сами можете направлять их обратно на медиасервер, чтобы делать, например, аннотации для видео в реальном времени (я покажу это немного позже). Широко известная библиотека GStreamer [10] используется для управления мультимедийным пайплайном.
Приведенная выше диаграмма взята из гайда по серверной аналитике [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 и копирование некоторых файлов.
Опция 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
Здесь же необходимо отредактировать файл 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/ [14] в браузере на локальной машине. Потребуется разрешить сертификат, так как у браузера будут с ним проблемы.
И кроме этого, вам нужно разрешить сервер websocket на localhost:8080 [15]. Вы можете сделать это, перейдя по ссылке «Click this for testing certificate and refresh [16]». В качестве альтернативы вы также можете установить #allow-insecure-localhost
в chrome://flags чтобы избежать проблем с флагами в Chrome.
Как только вы это сделаете, вернитесь на https://localhost:3004/ [14], и примите разрешение камеры. Тут же выберите свой идентификатор канала видео в раскрывающемся списке «video from» и нажмите «startAnalytics».
Наконец, перейдите к выпадающему списку «subsribe video», выберите длинную строку pipeline + video ID и нажмите subscribe:
На изображении, полученном с сервера, вы должны увидеть, что лицо распознается.
Analytics Agent содержит архитектуру плагина OpenCV GStreamer Video Analytics (GVA) [17]. GVA включает в себя разнообразные модули, которые позволяют использовать различные схемы получения предсказаний, такие как детектирование, классификация и идентификация, а также модули ввода и вывода для отправки видео пользователям (в данном случае обратно в OWT), обеспечивая наложение изображений или потоковую передачу данных по mqtt.
На практике данные пайплайны реализуются путем изменения некоторого кода 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].
Для добавления моделей необходимо клонировать репозиторий, а затем получить соответствующие с помощью инструмента Open Model Zoo Downloader tool [21]. После этого необходимо убедиться, что ваш пайплайн содержит соответствующие элементы (классификация, обнаружение, идентификация) и настроить файл /home/owt/analytics_agent/plugin.cfg
, применяя соответствующие параметры.
Я попробовал несколько моделей распознавания лиц и эмоций.
Так как я уже играл с детектированием прикосновений к лицу [1], то решил проверить модель facial-landmarks-35-adas-0002 [22]. Эта модель обнаруживает 35 опорных точек лица.
В своем приложении для мониторинга касания лица, я мог бы добавить потоковую передачу MQTT в пайплайн, используя gstreamer generic metadata publisher [23] для захвата и обработки опорных точек. Например, мог бы посмотреть, не затемнены ли точки вокруг глаз, носа и рта, или даже совместить всё это с моделью оценки позы человека [24].
Это еще одна прикольная штука. Модель emotions-recognition-retail-0003 [25] использует сверточную сеть для распознавания нейтрального, счастливого, грустного, удивленного и яростного выражения.
Похоже, мое выражение лица воспринимается не как нейтральное, а как грустное – возможно, такое долгое пребывание в изоляции начинает доставать меня
Чтобы воспользоваться возможностями аппаратного ускорения 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
Нажмите здесь для печати.