Vision par ordinateur sur le serveur Intel OWT WebRTC avec accélération matérielle


WebRTC a simplifié (pour la plupart) la réception et l'envoi de flux vidéo en temps réel. Ainsi, vous pouvez vous amuser avec eux en utilisant l'apprentissage automatique. Le mois dernier, j'ai montré comment exécuter Computer Vision (CV) localement dans un navigateur . Comme je l'ai mentionné, localement est, bien sûr, bon, mais parfois des performances supérieures sont requises, et pour cela, nous avons besoin d'un serveur distant. Dans cet article, je parlerai de la façon d'exécuter des modèles de serveurs OpenCV avec accélération matérielle sur des chipsets Intel à l'aide de l'Open WebRTC Toolkit (OWT) avec du code source ouvert.

Je voulais jouer avec le serveur OWT depuis qu'Intel a démontré les fonctionnalités de vision par ordinateur de Kranky Geek , et maintenant j'ai la chance de travailler avec leur équipe de développement pour explorer les capacités du serveur. Ci-dessous, je parlerai de la façon d'installer OWT localement pour des tests rapides, ainsi que de la démonstration de certains modèles.

Ouvrez WebRTC Toolkit (OWT)


Intel a publié sa suite Intel Collaboration pour WebRTC vers 2014. Ce package se composait de SDK serveur et client conçus pour utiliser du matériel Intel. La société a continué d'étendre cet ensemble de logiciels, en ajoutant de nouvelles fonctionnalités et en améliorant ses capacités. Plus tard, en 2018, Intel a ouvert le code source de l'ensemble du projet sous la marque Open WebRTC Toolkit (OWT). Ils proposent toujours d'utiliser Collaborate Suite pour WebRTC, selon eux, la seule différence est le bundle avec Intel QA supplémentaire (ce qui n'est pas si rare dans les projets open source pris en charge par les sociétés commerciales). Dans cet article, nous nous concentrerons sur l'OWT open source.


Vous pouvez vous rendre sur la page d'accueil OWT Ă : 01.org/open-webrtc-toolkit

Que fait un serveur multimédia


Un serveur multimédia OWT peut agir en tant que serveur d'unité de contrôle multipoint (MCU), où les fichiers multimédias sont décodés, traités et transcodés avant d'être renvoyés aux clients en plus de la méthode plus classique de l' unité de transfert sélectif (SFU). OWT d'Intel est considéré comme un processeur multimédia en temps réel avec des fonctionnalités pour les applications suivantes:

  • ConfĂ©rences multipoint - Les SFU se sont avĂ©rĂ©es ĂŞtre l'architecture prĂ©dominante pour les confĂ©rences WebRTC, mais les MCU sont toujours nĂ©cessaires dans les scĂ©narios oĂą le traitement cĂ´tĂ© client est limitĂ© (par exemple, sur un appareil IoT), ou en combinaison avec l'un des points ci-dessous.
  • – MCU , .
  • – -WebRTC , , RTSP, RTMP, HLS, MPEG-DASH.
  • – .
  • SIP-gateway – WebRTC , VoIP-.
  • – ( ).

Le serveur est construit sur node.js avec MongoDB pour la base de données et RabbitMQ en tant que courtier de messages. Les fonctions répertoriées dans la liste ci-dessus, ainsi que celles non incluses dans la liste, sont implémentées en tant que divers agents connectés à l'architecture OWT.

De plus, OWT dispose d'un SDK client pour interagir avec un serveur multimédia. Il peut également être utilisé en mode P2P.

Accélération


L'architecture a été conçue pour utiliser du matériel Intel. Cela comprend la plupart des processeurs Intel modernes et des processeurs encore plus accélérés avec des graphiques intégrés, des CPLD (FPGA) et des processeurs spécialisés de vision industrielle Intel (Vision Processing Unit - VPU) . (Voici le projet que j'ai créé en utilisant l'une de leurs puces Movidius avec le kit Google Vision).


Analytique et vision par ordinateur (CV)


Quiconque a travaillé sérieusement avec la vision par ordinateur est tombé sur OpenCV . OpenCV était à l'origine un projet d'Intel et le reste toujours. Intel dispose d'un ensemble d'outils appelés OpenVINO (Open Visual Inference and Neural Network Optimization) pour optimiser les modèles d'apprentissage en profondeur sur son matériel. Il fait partie du référentiel OpenCV . OpenCV comprend des dizaines de modèles pré-formés, de la reconnaissance de texte de base aux applications autonomes.

OWT Analytics Agent est un module pour recevoir des prédictions en temps réel sur les modèles OpenVINO. L'Agent Analystics peut envoyer des métadonnées de sortie vers le cloud, ou vous-même pouvez les renvoyer au serveur multimédia pour faire, par exemple, des annotations pour la vidéo en temps réel (je le montrerai un peu plus tard). La bibliothèque bien connue GStreamer est utilisée pour gérer un pipeline multimédia.

Architecture



Le diagramme ci-dessus est tiré du guide d'analyse du serveur . Cela semble compliqué, mais ici, vous devez simplement vous rappeler que l'agent Analytics agit comme un autre participant à la conférence qui peut s'abonner au canal vidéo de cette conférence. Après avoir reçu le flux vidéo, vous pouvez diriger le traitement du flux vers différentes étapes à l'aide du pipeline GStreamer. Dans la plupart des cas, vous souhaiterez effectuer une prédiction et une classification avant de renvoyer le flux vidéo au MCU, mais vous pouvez également envoyer le flux et / ou les données de sortie ailleurs.

Installation de Docker


L'installation prendra un peu de temps, car vous devrez installer le serveur OWT et l'agent Analytics. Heureusement, ils ont des instructions de construction Docker pour une installation facile. Si vous le souhaitez, vous pouvez exécuter l'agent OWT + Analytics en tant que 4 conteneurs distincts pour les environnements distribués. J'ai décidé de laisser tous mes locaux dans un seul conteneur afin de simplifier l'évaluation.

En fait, Intel m'a d'abord donné une image gst-owt-all:runpour le travail, car au moment d'écrire mon article, ils mettaient à jour la documentation pour l'installation de l'agent Analytics. Le nouvel ensemble est beaucoup plus compréhensible. Je vous recommande toujours de vous familiariser d'abord avec l'installation OWT standard pour comprendre ses composants et ses options.

De plus, vous devez compiler beaucoup avec gcc. Assurez-vous que vous disposez de la dernière version en exécutant la commande suivante: brew install gcc

Au début, rien n'a été compilé, mais après avoir exécuté cette commande, tout a fonctionné.
Finalement, j'ai commencé à tout construire par moi-même. Pour créer un serveur OWT avec Analytics, exécutez la commande suivante:

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

Après avoir configuré le serveur OWT principal et le service Analytics, vous devrez télécharger les modèles nécessaires depuis OpenCV Open Model Zoo et créer un pipeline analytique pour leur utilisation. Pour les exemples ci-joints, tout cela comprend simplement l'exécution de la commande collector dans bash et la copie de certains fichiers.

Bilan de santé sur macOS


Configurer les ports docker


L'option docker --net=hostne fonctionne pas sur macOS, donc pour un lancement local, vous devez ouvrir les ports correspondants:
PortUn service
8080Port de signal de socket Web pour WebRTC
3004Serveur Web pour télécharger la page de démonstration
30000-30050Ports UDP pour WebRTC

Lancer le docker


J'ai installé mon conteneur comme ceci:

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

Modification des paramètres OWT par défaut pour une exécution locale sur MacOS


Ici, vous devez modifier le fichier webrtc_agent/agent.tomlpour reconnaître ces ports.

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

Et puis remplacez 0acf7c0560d8par le nom ou l'id du conteneur. Et changez ce qui suit:


Ensuite, vous devez indiquer à la ressource Web afin que le navigateur affiche «localhost» au lieu du pont IP interne du docker (172.17.0.2):

vi /home/owt/portal/portal.toml


Encore une fois, sur d'autres plates-formes, vous pouvez utiliser la configuration par défaut si vous exécutez votre conteneur avec l'option --net=host.

DĂ©marrer le serveur


Vous pouvez maintenant démarrer le serveur:

./home/start.sh

Vous pouvez recevoir ces erreurs:

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

Ceci est normal lorsque le serveur se connecte. Vous comprendrez que tout fonctionne si vous voyez quelque chose comme:

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

Tester dans le navigateur


Ouvrez https: // localhost: 3004 / dans un navigateur sur la machine locale. Vous devrez activer le certificat, car le navigateur aura des problèmes avec celui-ci.


Et en plus de cela, vous devez activer le serveur websocket sur localhost: 8080 . Vous pouvez le faire en cliquant sur le lien « Cliquez ici pour tester le certificat et actualiser ». Vous pouvez également définir #allow-insecure-localhostdes indicateurs chrome: // pour éviter les problèmes d'indicateur dans Chrome.


Une fois que vous avez fait cela, revenez à https: // localhost: 3004 / et acceptez la résolution de la caméra. Sélectionnez immédiatement votre identifiant de chaîne vidéo dans la liste déroulante «vidéo de» et cliquez sur «startAnalytics».


Enfin, accédez à la liste déroulante "abonnement vidéo", sélectionnez le pipeline longue ligne + ID vidéo et cliquez sur s'abonner:


Dans l'image reçue du serveur, vous devriez voir que le visage est reconnu.


Ajout de modèles OpenCV


L'agent Analytics contient l'architecture du plugin OpenCV GStreamer Video Analytics (GVA) . GVA comprend une variété de modules qui vous permettent d'utiliser divers schémas de prédiction, tels que la détection, la classification et l'identification, ainsi que des modules d'entrée et de sortie pour envoyer de la vidéo aux utilisateurs (dans ce cas, revenir à OWT), fournissant une superposition d'images ou un streaming de données sur mqtt.

Pipelining


En pratique, ces pipelines sont implémentés en modifiant du code C ++. Par exemple, si nous le regardons /home/owt/analytics_agent/plugins/samples/cpu_pipeline/mypipeline.cc, nous verrons divers éléments de pipeline:

 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

Et ces pipelines sont situés dans une certaine séquence:

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

Si vous souhaitez modifier l'un de leurs éléments, vous devrez recompiler le pipeline à l'aide de la commande:

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

Ensuite, copiez simplement les bibliothèques compilées au-dessus de celles actuellement utilisées dans /home/owt/analytics_agent/lib/.

Obtenir d'autres modèles


Il existe un énorme ensemble de modèles hébergés sous le OpenCV Open Model Zoo sur GitHub . En plus de tous les modèles de CV publics populaires , tels que mobilenet, resnet, squeezenet, vgg et bien d'autres, Intel prend également en charge une suite qui comprend une large gamme de modèles utiles pour détecter des objets, pour les véhicules sans pilote et pour traiter les actions humaines:
reconnaissance-actionestimation de la pose de la têteenseignant-détection-action-reconnaissance-personnesegmentation sémantique
reconnaissance âge-sexeestimation de la pose humaineperson-detection-aslsuper-résolution à image unique
reconnaissance aslrécupération d'imagedétection-personne-sensibilisation-reconnaissancedétection de texte
reconnaissance-action-conducteurinstance-segmentation-securitydétection de personnetexte-image-super-résolution
émotions-reconnaissancerepères-régressionréidentification de personnereconnaissance de texte
détection facialbarrière de reconnaissance de plaque d'immatriculationpersonne-véhicule-vélo-détection-carrefourrepérage de texte
face-réidentificationdétecteur de piétons et de véhiculesdétection de produitbarrière de reconnaissance des attributs du véhicule
repères faciaux-35détection des piétonsresnet18-xnor-binary-onnxdétection de véhicules
estimation du regardpersonne-attributs-reconnaissance-carrefourresnet50-binarybinaire de détection de véhicule
reconnaissance de partition manuscritedétection-action-reconnaissance-personnesegmentation de la routebarrière de détection de plaque d'immatriculation de véhicule

Intel a plus d'informations Ă  ce sujet ici .

Ajout de modèles à l'agent OWT Analytics


Pour ajouter des modèles, vous devez cloner le référentiel, puis obtenir les modèles correspondants à l'aide de l' outil Open Model Zoo Downloader . Après cela, vous devez vous assurer que votre pipeline contient les éléments appropriés (classification, détection, identification) et configurer le fichier en /home/owt/analytics_agent/plugin.cfgutilisant les paramètres appropriés.

Test de plugin


J'ai essayé plusieurs modèles de reconnaissance du visage et des émotions.

Points de référence du visage


Comme j'ai déjà joué avec la détection des touches du visage , j'ai décidé de découvrir le modèle facial-landmarks-35-adas-0002 . Ce modèle détecte 35 points de référence du visage.


Dans mon application de surveillance tactile, j'ai pu ajouter le streaming MQTT au pipeline à l'aide de l' éditeur de métadonnées génériques gstreamer pour capturer et traiter les points d'ancrage. Par exemple, je pourrais voir si les points autour des yeux, du nez et de la bouche sont obscurcis, ou même combiner tout cela avec un modèle pour évaluer la posture d'une personne .

Reconnaissance des Ă©motions


C'est une autre chose cool. Le modèle émotions-reconnaissance-vente au détail-0003 utilise un réseau convolutionnel pour reconnaître les expressions neutres, heureuses, tristes, surprises et furieuses.


Il semble que mon expression faciale ne soit pas perçue comme neutre, mais aussi triste - peut-être qu'un si long séjour dans l'isolement commence à m'attraper :(

Optimisation de l'accélération


Pour profiter des capacités d'accélération matérielle OWT, assurez-vous d'installer le périphérique approprié dans /home/owt/analytics_agent/plugin.cfg- c'est-à-dire, écrivez:

device = "MULTI:HDDL,GPU,CPU"

Malheureusement, je n'ai pas eu assez de temps pour tester cela, mais en plus de l'accélération CPU et GPU, vous pouvez également profiter des différents matériels du processeur de vision industrielle (VPU). Ce sont des puces spécialisées pour le fonctionnement efficace des réseaux de neurones. J'ai acheté une carte Intel Neural Computing Card (NCS) il y a quelques années pour lancer des modèles CV plus avancés sur le Raspberry Pi 3.

Bien sûr, vous pouvez toujours trouver un compromis entre la puissance de traitement et la fréquence d'images / résolution.

Recommandations


OpenCV a une longue histoire avec une énorme communauté de développeurs, il se classait 4ème parmi tous les projets open source de Machine Learning au moment de mon analyse de popularité à la mi-2018 . De même, gstreamer est un autre projet qui existe depuis des lustres. L'agent Intel OWT Analytics est idéalement placé pour aider ces communautés à ajouter une analyse de streaming en temps réel à leurs projets via WebRTC. Ils devraient être en mesure de prendre les modèles de TPS existants et de les exécuter en streaming en temps réel en utilisant OWT.

Si vous commencez tout juste à expérimenter la vision par ordinateur et que vous souhaitez exécuter des modèles sur un serveur OWT, je vous recommande de commencer par des didacticiels OpenCV plus basiques. Ensuite, vous pouvez accéder aux plugins GVA.. Ils nécessiteront beaucoup d'efforts si vous commencez tout juste à travailler avec OpenCV, mais plus tard, vous n'aurez aucun problème à changer l'agent Analytics pour les lancer. Vous pouvez optimiser la pile pour qu'elle fonctionne avec votre plate-forme cible et utiliser diverses options d'accélération matérielle Intel pour améliorer les performances.

All Articles