Computer Vision auf Intel OWT WebRTC-Server mit Hardwarebeschleunigung


WebRTC hat das Empfangen und Senden von Videostreams in Echtzeit (größtenteils) vereinfacht. Mit maschinellem Lernen können Sie also Spaß daran haben. Letzten Monat habe ich gezeigt, wie Computer Vision (CV) lokal in einem Browser ausgeführt wird . Wie bereits erwähnt, ist lokal natürlich gut, aber manchmal ist eine höhere Leistung erforderlich, und dafür benötigen wir einen Remote-Server. In diesem Beitrag werde ich darüber sprechen, wie OpenCV-Servermodelle mit Hardwarebeschleunigung auf Intel-Chipsätzen mit dem Open WebRTC Toolkit (OWT) mit Open Source-Code ausgeführt werden.

Ich wollte mit dem OWT-Server spielen, da Intel die Computer Vision-Funktionen von Kranky Geek demonstriert hat , und jetzt habe ich das Glück, mit dem Entwicklungsteam zusammenzuarbeiten, um die Funktionen des Servers zu erkunden. Im Folgenden werde ich erläutern, wie OWT für schnelle Tests lokal installiert wird, und einige Modelle demonstrieren.

Öffnen Sie das WebRTC Toolkit (OWT).


Intel hat seine Intel Collaboration Suite für WebRTC um 2014 veröffentlicht. Dieses Paket bestand aus Server- und Client-SDKs für die Verwendung von Intel-Hardware. Das Unternehmen hat diese Software weiter ausgebaut, neue Funktionen hinzugefügt und seine Funktionen verbessert. Später, im Jahr 2018, eröffnete Intel den Quellcode für das gesamte Projekt unter der Marke Open WebRTC Toolkit (OWT). Sie schlagen weiterhin vor, Collaborate Suite für WebRTC zu verwenden. Der einzige Unterschied besteht darin, dass zusätzliche Intel QA gebündelt werden (was bei Open-Source-Projekten, die von kommerziellen Unternehmen unterstützt werden, nicht so selten ist). In diesem Beitrag konzentrieren wir uns auf Open Source OWT.


Sie können die OWT-Homepage unter 01.org/open-webrtc-toolkit aufrufen

Was macht ein Medienserver?


Ein OWT-Medienserver kann als MCU-Server (Multipoint Control Unit) fungieren, auf dem Mediendateien zusätzlich zur typischen SFU- Methode ( Selective Forwarding Unit ) decodiert, verarbeitet und transkodiert werden, bevor sie an Clients zurückgesendet werden . Intels OWT wird als Echtzeit-Medienprozessor mit Funktionen für die folgenden Anwendungen angesehen:

  • Mehrpunktkonferenzen - SFUs haben sich als die vorherrschende Architektur für WebRTC-Konferenzen erwiesen. MCUs werden jedoch weiterhin in Szenarien benötigt, in denen die clientseitige Verarbeitung eingeschränkt ist (z. B. auf einem IoT-Gerät) oder in Kombination mit einem der folgenden Punkte.
  • – MCU , .
  • – -WebRTC , , RTSP, RTMP, HLS, MPEG-DASH.
  • – .
  • SIP-gateway – WebRTC , VoIP-.
  • – ( ).

Der Server basiert auf node.js mit MongoDB für die Datenbank und RabbitMQ als Nachrichtenbroker. Die in der obigen Liste aufgeführten Funktionen sowie die nicht in der Liste enthaltenen Funktionen werden als verschiedene Agenten implementiert, die mit der OWT-Architektur verbunden sind.

Darüber hinaus verfügt OWT über ein Client-SDK für die Interaktion mit einem Medienserver. Es kann auch im P2P-Modus verwendet werden.

Beschleunigung


Die Architektur wurde für die Verwendung von Intel-Hardware entwickelt. Dies umfasst die meisten modernen Intel-Prozessoren und noch schnellere Prozessoren mit integrierter Grafik, CPLDs (FPGAs) und spezialisierten Prozessoren Machine Vision Intel (Vision Processing Unit - VPU) . (Hier ist das Projekt, das ich mit einem ihrer Movidius-Chips mit dem Google Vision Kit erstellt habe.)


Analytik und Computer Vision (CV)


Jeder, der ernsthaft mit Computer Vision gearbeitet hat, ist auf OpenCV gestoßen . OpenCV war ursprünglich ein Projekt von Intel und bleibt es auch weiterhin. Intel verfügt über eine Reihe von Tools namens OpenVINO (Open Visual Inference und Neural Network Optimization) zur Optimierung von Deep-Learning-Modellen auf seiner Hardware. Es ist Teil des OpenCV-Repositorys . OpenCV umfasst Dutzende vorgefertigter Modelle, von der grundlegenden Texterkennung bis hin zu selbstfahrenden Anwendungen.

OWT Analytics Agent ist ein Modul zum Empfangen von Echtzeitvorhersagen für OpenVINO-Modelle. Analystics Agent kann Ausgabemetadaten an die Cloud senden oder Sie können sie selbst an den Medienserver zurücksenden, um beispielsweise Anmerkungen für Echtzeitvideos zu erstellen (ich werde sie etwas später zeigen). Mit der bekannten GStreamer- Bibliothek wird eine Multimedia-Pipeline verwaltet.

Die Architektur



Das obige Diagramm stammt aus dem Handbuch zur Serveranalyse . Es sieht kompliziert aus, aber hier müssen Sie nur daran denken, dass der Analytics Agent als ein anderer Konferenzteilnehmer fungiert, der den Videokanal in dieser Konferenz abonnieren kann. Nachdem er den Videostream empfangen hat, können Sie die Verarbeitung des Streams mithilfe der GStreamer-Pipeline auf verschiedene Stufen lenken. In den meisten Fällen möchten Sie die Vorhersage und Klassifizierung durchführen, bevor Sie den Videostream an die MCU zurücksenden. Sie können den Stream jedoch auch senden und / oder Daten an eine andere Stelle ausgeben.

Docker-Installation


Die Installation dauert einige Zeit, da Sie den OWT-Server und den Analytics Agent installieren müssen. Glücklicherweise haben sie Docker Build-Anweisungen für eine einfache Installation. Wenn Sie möchten, können Sie OWT + Analytics Agent als 4 separate Container für verteilte Umgebungen ausführen. Ich habe beschlossen, alle meine lokalen in einem Container zu lassen, um die Bewertung zu vereinfachen.

Tatsächlich gab mir Intel zunächst ein Image gst-owt-all:runfür die Arbeit, da zum Zeitpunkt des Schreibens meines Artikels die Dokumentation für die Installation des Analytics Agent aktualisiert wurde. Das neue Set ist viel verständlicher. Ich empfehle weiterhin, dass Sie sich zuerst mit der Standard-OWT-Installation vertraut machen, um deren Komponenten und Optionen zu verstehen.

Außerdem müssen Sie viel mit gcc kompilieren. Stellen Sie sicher, dass Sie die neueste Version haben, indem Sie den folgenden Befehl ausführen: brew install gcc

Zuerst wurde nichts kompiliert, aber nach dem Ausführen dieses Befehls hat alles funktioniert.
Am Ende fing ich an, alles selbst zu bauen. Führen Sie den folgenden Befehl aus, um einen OWT-Server mit Analytics zu erstellen:

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} \
  .

Nach dem Einrichten des Haupt-OWT-Servers und des Analytics-Dienstes müssen Sie die erforderlichen Modelle aus OpenCV Open Model Zoo herunterladen und eine Analyse-Pipeline für deren Verwendung erstellen . In den angehängten Beispielen umfasst dies lediglich das Ausführen des Befehls collector in bash und das Kopieren einiger Dateien.

Health Check unter macOS


Konfigurieren Sie Docker-Ports


Die Docker-Option --net=hostfunktioniert unter macOS nicht. Für den lokalen Start müssen Sie die entsprechenden Ports öffnen:
HafenBedienung
8080Web-Socket-Signalport für WebRTC
3004Webserver zum Herunterladen der Demoseite
30000-30050UDP-Ports für WebRTC

Starten Sie Docker


Ich habe meinen Container folgendermaßen installiert:

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

Bearbeiten der OWT-Standardeinstellungen für die lokale Ausführung unter MacOS


Hier müssen Sie die Datei bearbeiten webrtc_agent/agent.toml, um diese Ports zu erkennen.

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

Und dann durch 0acf7c0560d8den Containernamen oder die ID ersetzen . Und ändern Sie Folgendes:


Als Nächstes müssen Sie der Webressource mitteilen, dass der Browser "localhost" anstelle der internen IP-Bridge des Dockers (172.17.0.2) anzeigt:

vi /home/owt/portal/portal.toml


Auch auf anderen Plattformen können Sie die Standardkonfiguration verwenden, wenn Sie Ihren Container mit der Option ausführen --net=host.

Server starten


Jetzt können Sie den Server starten:

./home/start.sh

Möglicherweise erhalten Sie folgende Fehler:

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

Dies ist normal, während der Server eine Verbindung herstellt. Sie werden verstehen, dass alles funktioniert, wenn Sie etwas sehen wie:

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

Im Browser testen


Öffnen Sie https: // localhost: 3004 / in einem Browser auf dem lokalen Computer. Sie müssen das Zertifikat aktivieren, da der Browser Probleme damit hat.


Außerdem müssen Sie den Websocket-Server auf localhost: 8080 aktivieren . Klicken Sie dazu auf den Link „ Klicken Sie hier, um das Zertifikat zu testen und zu aktualisieren “. Alternativ können Sie auch #allow-insecure-localhostchrome: // Flags setzen, um Flag-Probleme in Chrome zu vermeiden.


Wenn Sie dies getan haben, kehren Sie zu https: // localhost: 3004 / zurück und akzeptieren Sie die Kameraauflösung. Wählen Sie sofort Ihre Videokanal-ID in der Dropdown-Liste "Video von" aus und klicken Sie auf "startAnalytics".


Wechseln Sie abschließend zur Dropdown-Liste "Video abonnieren", wählen Sie die lange Pipeline + Video-ID aus und klicken Sie auf "Abonnieren":


In dem vom Server empfangenen Bild sollten Sie sehen, dass das Gesicht erkannt wird.


Hinzufügen von OpenCV-Modellen


Der Analytics Agent enthält die Architektur des OpenCV GStreamer Video Analytics (GVA) -Plugins . GVA enthält eine Vielzahl von Modulen, mit denen Sie verschiedene Vorhersageschemata wie Erkennung, Klassifizierung und Identifizierung sowie Eingabe- und Ausgabemodule zum Senden von Videos an Benutzer (in diesem Fall zurück zu OWT) verwenden können, um Bildüberlagerung oder Daten-Streaming bereitzustellen mqtt.

Pipelining


In der Praxis werden diese Pipelines durch Ändern von C ++ - Code implementiert. Wenn wir es /home/owt/analytics_agent/plugins/samples/cpu_pipeline/mypipeline.ccuns zum Beispiel ansehen , werden wir verschiedene Pipeline-Elemente sehen:

 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

Und diese Pipelines befinden sich in einer bestimmten Reihenfolge:

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

Wenn Sie eines ihrer Elemente ändern möchten, müssen Sie die Pipeline mit dem folgenden Befehl neu kompilieren:

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

Kopieren Sie dann einfach die kompilierten Bibliotheken über die aktuell verwendete /home/owt/analytics_agent/lib/.

Andere Modelle bekommen


Es gibt eine große Anzahl von Modellen, die unter dem OpenCV Open Model Zoo auf GitHub gehostet werden . Neben allen gängigen öffentlichen CV-Modellen wie Mobilet, Resnet, Squeezenet, Vgg und vielen anderen unterstützt Intel auch eine Suite mit einer Vielzahl von Modellen, die zur Erkennung von Objekten, für unbemannte Fahrzeuge und zur Verarbeitung menschlicher Handlungen nützlich sind:
HandlungserkennungKopf-Pose-SchätzungPerson-Erkennung-Aktion-Erkennung-Lehrersemantische Segmentierung
Alter-Geschlecht-AnerkennungSchätzung der menschlichen Posepersonenerkennung-aslEinzelbild-Superauflösung
ASL-ErkennungBildabrufPersonenerkennung-Erhebung-Hand-ErkennungTexterkennung
Fahrer-Aktions-ErkennungInstanz-Segmentierungs-SicherheitPersonenerkennungText-Bild-Super-Auflösung
EmotionserkennungLandmarken-RegressionPersonenidentifikationTexterkennung
GesichtserkennungKennzeichen-ErkennungsbarrierePerson-Fahrzeug-Fahrrad-Erkennung-KreuzungText-Spotting
GesichtsidentifikationFußgänger- und FahrzeugdetektorProdukterkennungFahrzeugattribute-Erkennungsbarriere
Gesichts-Wahrzeichen-35Fußgängererkennungresnet18-xnor-binary-onnxFahrzeugerkennung
BlickschätzungPersonenattribute-Erkennung-Kreuzungresnet50-binärFahrzeugerkennung-binär
handschriftliche PartiturerkennungPersonenerkennung-HandlungserkennungStraßensegmentierungFahrzeugkennzeichen-Erkennungsbarriere

Intel hat weitere Informationen zu diesem hier .

Hinzufügen von Modellen zum OWT Analytics Agent


Um Modelle hinzuzufügen, müssen Sie das Repository klonen und dann die entsprechenden mit dem Open Model Zoo Downloader-Tool abrufen . Danach müssen Sie sicherstellen, dass Ihre Pipeline die entsprechenden Elemente (Klassifizierung, Erkennung, Identifizierung) enthält, und die Datei /home/owt/analytics_agent/plugin.cfgmithilfe der entsprechenden Parameter konfigurieren .

Plugin-Test


Ich habe verschiedene Modelle der Gesichts- und Emotionserkennung ausprobiert.

Bezugspunkte des Gesichts


Da ich bereits mit der Erkennung von Gesichtsberührungen gespielt habe , habe ich mich entschlossen, das Modell Gesichts-Wahrzeichen-35-adas-0002 zu testen . Dieses Modell erkennt 35 Referenzpunkte des Gesichts.


In meiner Anwendung zur Überwachung von Gesichtsberührungen konnte ich der Pipeline MQTT-Streaming hinzufügen, indem ich den generischen Metadaten-Publisher von gstreamer verwendete , um Ankerpunkte zu erfassen und zu verarbeiten. Zum Beispiel könnte ich sehen, ob die Punkte um Augen, Nase und Mund dunkel sind, oder all dies mit einem Modell zur Beurteilung der Körperhaltung einer Person kombinieren .

Emotionserkennung


Das ist eine andere coole Sache. Das Modell für die Erkennung von Emotionen im Einzelhandel 0003 verwendet ein Faltungsnetzwerk, um neutrale, fröhliche, traurige, überraschte und wütende Ausdrücke zu erkennen.


Es scheint, dass mein Gesichtsausdruck nicht als neutral, sondern als traurig empfunden wird - vielleicht fängt mich ein so langer Aufenthalt in Isolation an :(

Beschleunigungsoptimierung


Um die Funktionen der OWT-Hardwarebeschleunigung nutzen zu können, müssen Sie das entsprechende Gerät installieren. /home/owt/analytics_agent/plugin.cfgSchreiben Sie also:

device = "MULTI:HDDL,GPU,CPU"

Leider hatte ich nicht genug Zeit, um dies zu testen, aber zusätzlich zur CPU- und GPU-Beschleunigung können Sie auch verschiedene VPU-Hardware (Machine Vision Processor) nutzen. Dies sind spezialisierte Chips für den effizienten Betrieb neuronaler Netze. Ich habe vor ein paar Jahren eine Intel Neural Computing Card (NCS) gekauft , um fortschrittlichere CV-Modelle auf dem Raspberry Pi 3 auf den Markt zu bringen.

Natürlich gibt es immer einen Kompromiss zwischen Verarbeitungsleistung und Bildrate / Auflösung.

Empfehlungen


OpenCV hat eine lange Geschichte mit einer riesigen Community von Entwicklern. Zum Zeitpunkt meiner Beliebtheitsanalyse Mitte 2018 belegte OpenCV den 4. Platz unter allen Open-Source-Projekten für maschinelles Lernen . Ebenso ist gstreamer ein weiteres Projekt, das es schon seit Ewigkeiten gibt. Der Intel OWT Analytics Agent ist ideal positioniert, um diesen Communities zu helfen, ihren Projekten über WebRTC Echtzeit-Streaming-Analysen hinzuzufügen. Sie sollten in der Lage sein, vorhandene GST-Modelle zu verwenden und sie mithilfe von OWT in Echtzeit zu streamen.

Wenn Sie gerade erst mit Computer Vision experimentieren und Modelle auf einem OWT-Server ausführen möchten, empfehle ich, mit grundlegenderen OpenCV-Tutorials zu beginnen. Dann können Sie zu den GVA-Plugins gelangen.. Sie erfordern viel Aufwand, wenn Sie gerade erst mit OpenCV arbeiten. Später können Sie jedoch problemlos den Analytics Agent ändern, um sie zu starten. Sie können den Stack für die Verwendung mit Ihrer Zielplattform optimieren und verschiedene Intel-Hardwarebeschleunigungsoptionen verwenden, um die Leistung zu verbessern.

All Articles