具有硬件加速功能的Intel OWT WebRTC服务器上的计算机视觉


WebRTC(在大多数情况下)简化了实时接收和发送视频流的过程。因此,您可以使用机器学习与他们一起玩乐。上个月,我展示了如何在浏览器中本地运行Computer Vision(CV)。正如我所提到的,本地当然是好的,但是有时需要更高的性能,为此,我们需要一个远程服务器。在本文中,我将讨论如何使用带有开放源代码的Open WebRTC Toolkit(OWT)在Intel芯片组上运行具有硬件加速功能的OpenCV服务器模型。

自从Intel演示了Kranky Geek的计算机视觉功能以来,我就想玩OWT服​​务器,现在我很幸运能够与他们的开发团队一起探索服务器的功能。下面,我将讨论如何在本地安装OWT以进行快速测试,并演示一些模型。

打开WebRTC工具包(OWT)


英特尔在2014年左右发布了针对WebRTC的英特尔协作套件。该软件包由旨在使用英特尔硬件的服务器和客户端SDK组成。该公司继续扩展这套软件,增加了新功能并提高了功能。后来在2018年,英特尔以Open WebRTC Toolkit(OWT)品牌打开了整个项目的源代码。他们仍然建议使用Collaborate Suite for WebRTC,据他们称,唯一的区别是捆绑了附加的Intel QA(在商业公司支持的开源项目中这种情况并不罕见)。在本文中,我们将重点介绍开源OWT。


您可以转到OWT主页:01.org/open-webrtc-toolkit

媒体服务器做什么


OWT媒体服务器可以充当多点控制单元(MCU)服务器,在该服务器中,除了更典型的选择性转发单元(SFU)方法之外,还可以在媒体文件被解码,处理和转码之前,再将其发送回客户端英特尔的OWT被视为具有以下应用程序功能的实时媒体处理器:

  • 多点会议 - 交换网已经被证明是对的WebRTC会议的主要架构,但微控制器仍然需要在场景中客户机侧处理是有限的(例如,IOT中的设备上),或者与下面的点中的一个组合。
  • – MCU , .
  • – -WebRTC , , RTSP, RTMP, HLS, MPEG-DASH.
  • – .
  • SIP-gateway – WebRTC , VoIP-.
  • – ( ).

服务器建立在node.js之上,其中MongoDB用于数据库,RabbitMQ作为消息代理。上面列表中列出的功能以及未包含在列表中的功能都实现为连接到OWT体系结构的各种代理。

此外,OWT还具有用于与媒体服务器进行交互的客户端SDK。也可以在P2P模式下使用。

加速


该体系结构旨在使用英特尔硬件。这包括最现代的英特尔处理器,以及集成了图形,CPLD(FPGA)和专用处理器机器视觉的英特尔(Vision Processing Unit-VPU)甚至更加速的处理器 。(这是我使用其Movidius芯片之一和Google Vision Kit创建项目)。


分析和计算机视觉(CV)


认真对待计算机视觉的任何人都曾经遇到过OpenCVOpenCV最初是Intel的一个项目,现在仍然如此。英特尔拥有一套称为OpenVINO(开放式视觉推理和神经网络优化)的工具,用于优化其硬件上的深度学习模型。它是OpenCV信息库的一部分OpenCV包括从基本文本识别到自动驾驶应用程序在内的数十种预训练模型。

OWT Analytics Agent是一个模块,用于接收有关OpenVINO模型的实时预测。Analystics Agent可以将输出元数据发送到云,或者您自己也可以将其发送回媒体服务器以制作例如实时视频的注释(稍后再介绍)。众所周知的GStreamer用于管理多媒体管道。

建筑



上图取自服务器分析指南它看起来很复杂,但是在这里您只需要记住,Analytics Agent充当了另一个会议参与者,可以订阅此会议中的视频频道。他收到视频流后,可以使用GStreamer管道将流的处理定向到各个阶段。在大多数情况下,您将需要执行预测和分类,然后再将视频流返回到MCU,但是您也可以在其他地方发送该流和/或输出数据。

Docker安装


安装将花费一些时间,因为您将需要安装OWT服务器和Analytics Agent。幸运的是,他们拥有易于安装的Docker构建说明。如果需要,可以将OWT + Analytics Agent作为4个单独的容器运行,用于分布式环境。为了简化评估,我决定将我的所有内容都放在一个容器中。

实际上,英特尔最初给了我一个gst-owt-all:run工作图像,因为在撰写本文时,他们正在更新用于安装Analytics Agent的文档。新的设置更容易理解。我仍然建议您首先熟悉标准OWT安装,以了解其组件和选项。

另外,您需要使用gcc进行大量编译。通过运行以下命令,确保您具有最新版本:brew install gcc

首先,什么都没有编译,但是在运行此命令后,一切正常。
最后,我开始自己构建所有内容。要使用Analytics创建OWT服务器,请运行以下命令:

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服务器和Google Analytics(分析)服务后,您将需要从OpenCV Open Model Zoo下载必要的模型,并建立分析管道以供使用。对于所附示例,所有这些都包括简单地在bash中运行collector命令并复制一些文件。

macOS上的运行状况检查


配置Docker端口


docker选项--net=host在macOS上不起作用,因此对于本地启动,您需要打开相应的端口:
港口服务
8080WebRTC的Web套接字信号端口
3004Web服务器下载演示页面
30000-30050WebRTC的UDP端口

启动泊坞窗


我这样安装了容器:

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。并更改以下内容:


接下来,您需要告诉Web资源,以便浏览器显示“ localhost”,而不是Docker的内部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 /您将需要启用证书,因为浏览器会遇到问题。


除此之外,您还需要在localhost:8080上启用websocket服务器您可以通过单击“ 单击此以测试证书并刷新链接来执行此操作另外,您也可以设置#allow-insecure-localhostchrome://标志,以避免Chrome中出现标志问题。


完成此操作后,返回https://本地主机:3004 /并接受相机分辨率。立即在“视频来源”下拉列表中选择您的视频频道标识符,然后单击“ startAnalytics”。


最后,转到“订阅视频”下拉列表,选择长线管道+视频ID,然后单击订阅:


在从服务器收到的图像中,您应该看到面部被识别。


添加OpenCV模型


Analytics Agent包含OpenCV GStreamer视频分析(GVA)插件的体系结构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/

获取其他型号


GitHub上OpenCV Open Model Zoo下托管着大量模型除了所有流行的公共CV模型(例如mobilenet,resnet,squeezenet,vgg等)外,英特尔还支持一套套件,其中包括多种模型,这些模型可用于检测物体,无人驾驶车辆和处理人类行为:
动作识别头姿势估计人检测动作识别老师语义分割
年龄性别认同人体姿势估计人检测asl单图像超分辨率
asl识别图像检索人检测提高手识别文字检测
驾驶员动作识别实例分段安全人检文字图像超分辨率
情绪识别地标回归个人识别文字识别
人脸检测车牌识别障碍人车自行车检测十字路口文字斑点
人脸识别行人和车辆检测器产品检测车辆属性识别障碍
面部标志性建筑35行人检测resnet18-xnor-binary-onnx车辆检测
凝视估计人属性识别十字路口resnet50-binary车辆检测二进制
手写分数识别人检测动作识别路段细分车牌检测障碍

英特尔在这里有关于此的更多信息

将模型添加到OWT Analytics Agent


要添加模型,您需要克隆存储库,然后使用Open Model Zoo Downloader工具获得相应的模型此后,您需要确保管道包含适当的元素(分类,检测,标识),并/home/owt/analytics_agent/plugin.cfg使用适当的参数配置文件

插件测试


我尝试了几种面部和情绪识别模型。

面部参考点


由于我已经玩过对面部触摸的检测,因此我决定查看模型face -landmarks-35-adas-0002该模型检测面部的35个参考点。


在我的人脸触摸监控应用程序中,我可以使用gstreamer通用元数据发布器将MQTT流添加到管道中,以捕获和处理定位点。例如,我可以看到眼睛,鼻子和嘴巴周围的点是否变暗,甚至可以将所有这些与模型结合起来以评估一个人的姿势

情绪识别


这是另一件事。情绪识别零售0003模型使用卷积网络来识别中性,快乐,悲伤,惊讶和愤怒的表情。


看来我的面部表情并没有被认为是中立的,而是令人悲伤的-也许这么长时间的孤立一直让我:恼:(

加速优化


要利用OWT的硬件加速功能,请确保将适当的设备安装在/home/owt/analytics_agent/plugin.cfg-即,写入:

device = "MULTI:HDDL,GPU,CPU"

不幸的是,我没有足够的时间进行测试,但是除了CPU和GPU加速之外,您还可以利用各种机器视觉处理器(VPU)硬件。这些是用于神经网络高效运行的专用芯片。几年前,我购买了英特尔神经计算卡(NCS),以在Raspberry Pi 3上发布更高级的CV模型

。当然,您始终可以在处理能力和帧速率/分辨率之间找到折衷方案。

推荐建议


OpenCV拥有悠久的历史,拥有庞大的开发人员社区,在我于2018年中进行人气分析时,它在所有机器学习开源项目中排名第四。同样,gstreamer是另一个已经存在很长时间的项目。英特尔OWT分析代理的理想位置是帮助这些社区通过WebRTC向他们的项目添加实时流分析。他们应该能够采用现有的GST模型,并使用OWT实时运行它们。

如果您刚刚开始尝试计算机视觉并想在OWT服务器上运行模型,建议您从更基本的OpenCV教程开始。然后,您可以使用GVA插件。如果您刚开始使用OpenCV,它们将需要大量的精力,但是稍后您将可以轻松更改Analytics Agent以启动它们。您可以优化堆栈以与目标平台一起使用,并使用各种英特尔硬件加速选项来提高性能。

All Articles