Visión por computadora en el servidor Intel OWT WebRTC con aceleración de hardware


WebRTC ha simplificado (en su mayor parte) recibir y enviar transmisiones de video en tiempo real. Por lo tanto, puede divertirse con ellos utilizando el aprendizaje automático. El mes pasado, mostré cómo ejecutar Computer Vision (CV) localmente en un navegador . Como mencioné, localmente es, por supuesto, bueno, pero a veces se requiere un mayor rendimiento, y para esto necesitamos un servidor remoto. En esta publicación, hablaré sobre cómo ejecutar modelos de servidor OpenCV con aceleración de hardware en conjuntos de chips Intel utilizando el Open WebRTC Toolkit (OWT) con código fuente abierto.

Quería jugar con el servidor OWT desde que Intel demostró las características de visión por computadora de Kranky Geek , y ahora tuve la suerte de trabajar con su equipo de desarrollo para explorar las capacidades del servidor. A continuación, hablaré sobre cómo instalar OWT localmente para realizar pruebas rápidas, así como mostrar algunos modelos.

Open WebRTC Toolkit (OWT)


Intel lanzó su Intel Collaboration Suite para WebRTC alrededor de 2014. Este paquete constaba de SDK de servidor y cliente diseñados para usar hardware Intel. La compañía continuó expandiendo este conjunto de software, agregando nuevas características y mejorando sus capacidades. Más tarde, en 2018, Intel abrió el código fuente de todo el proyecto bajo la marca Open WebRTC Toolkit (OWT). Todavía proponen usar Collaborate Suite para WebRTC, según ellos, la única diferencia está en agrupar Intel QA adicional (que no es tan raro en proyectos de código abierto respaldados por empresas comerciales). En esta publicación, nos centraremos en el código abierto OWT.


Puede ir a la página de inicio de OWT en: 01.org/open-webrtc-toolkit

¿Qué hace un servidor de medios?


Un servidor de medios OWT puede actuar como un servidor de unidad de control multipunto (MCU), donde los archivos de medios se decodifican, procesan y transcodifican antes de enviarlos de vuelta a los clientes, además del método más típico de la Unidad de reenvío selectivo (SFU). El OWT de Intel es visto como un procesador de medios en tiempo real con características para las siguientes aplicaciones:

  • Conferencias multipunto : las SFU han demostrado ser la arquitectura predominante para las conferencias WebRTC, pero las MCU aún se necesitan en escenarios donde el procesamiento del lado del cliente es limitado (por ejemplo, en un dispositivo IoT), o en combinación con uno de los puntos a continuación.
  • – MCU , .
  • – -WebRTC , , RTSP, RTMP, HLS, MPEG-DASH.
  • – .
  • SIP-gateway – WebRTC , VoIP-.
  • – ( ).

El servidor está construido en node.js con MongoDB para la base de datos y RabbitMQ como intermediario de mensajes. Las funciones enumeradas en la lista anterior, así como las no incluidas en la lista, se implementan como varios Agentes conectados a la arquitectura OWT.

Además, OWT tiene un SDK de cliente para interactuar con un servidor de medios. También se puede usar en modo P2P.

Aceleración


La arquitectura fue diseñada para usar hardware Intel. Esto incluye los procesadores Intel más modernos y procesadores aún más acelerados con gráficos integrados, CPLD (FPGA) y procesadores especializados de visión artificial Intel (Unidad de Procesamiento de Visión - VPU) . (Aquí está el proyecto que creé usando uno de sus chips Movidius con el Kit de Google Vision).


Analítica y Visión por Computadora (CV)


Cualquiera que haya trabajado seriamente con la visión por computadora se ha encontrado con OpenCV . OpenCV fue originalmente un proyecto de Intel y aún lo sigue siendo. Intel tiene un conjunto de herramientas llamadas OpenVINO (Open Visual Inference y Neural Network Optimization) para optimizar modelos de aprendizaje profundo en su hardware. Es parte del repositorio de OpenCV . OpenCV incluye docenas de modelos previamente entrenados, desde reconocimiento de texto básico hasta aplicaciones de conducción autónoma.

OWT Analytics Agent es un módulo para recibir predicciones en tiempo real en modelos OpenVINO. El Agente de análisis puede enviar metadatos de salida a la nube, o usted mismo puede enviarlo de vuelta al servidor de medios para hacer, por ejemplo, anotaciones para video en tiempo real (lo mostraré un poco más adelante). La conocida biblioteca GStreamer se utiliza para administrar una canalización multimedia.

Arquitectura



El diagrama anterior está tomado de la guía de análisis del servidor . Parece complicado, pero aquí solo debe recordar que el Agente de análisis actúa como otro participante de la conferencia que puede suscribirse al canal de video en esta conferencia. Después de recibir la transmisión de video, puede dirigir el procesamiento de la transmisión a varias etapas utilizando la canalización de GStreamer. En la mayoría de los casos, querrá realizar predicciones y clasificaciones antes de devolver la transmisión de video a la MCU, pero también puede enviar la transmisión y / o los datos de salida a otro lugar.

Instalación de Docker


La instalación llevará un poco de tiempo, ya que deberá instalar el servidor OWT y el Agente de análisis. Afortunadamente, tienen instrucciones de compilación de Docker para una fácil instalación. Si lo desea, puede ejecutar OWT + Analytics Agent como 4 contenedores separados para entornos distribuidos. Decidí dejar todo mi localmente en un contenedor para simplificar la evaluación.

De hecho, Intel inicialmente me dio una imagen gst-owt-all:runpara el trabajo, ya que al momento de escribir mi artículo estaban actualizando la documentación para instalar el Agente de análisis. El nuevo conjunto es mucho más comprensible. Todavía le recomiendo que primero se familiarice con la instalación estándar de OWT para comprender sus componentes y opciones.

Además, necesita compilar mucho con gcc. Asegúrese de tener la última versión ejecutando el siguiente comando: brew install gcc

Al principio, nada compilado para mí, pero después de ejecutar este comando todo funcionó.
Al final, comencé a construir todo por mi cuenta. Para crear un servidor OWT con Analytics, ejecute el siguiente comando:

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

Después de configurar el servidor OWT principal y el servicio de análisis, deberá descargar los modelos necesarios de OpenCV Open Model Zoo y crear una tubería analítica para su uso. Para los ejemplos adjuntos, todo esto incluye simplemente ejecutar el comando recopilador en bash y copiar algunos archivos.

Comprobación de estado en macOS


Configurar puertos acoplables


La opción docker --net=hostno funciona en macOS, por lo que para el lanzamiento local debe abrir los puertos correspondientes:
PuertoServicio
8080Puerto de señal de socket web para WebRTC
3004Servidor web para descargar la página de demostración
30000-30050Puertos UDP para WebRTC

Lanzamiento de Docker


Instalé mi contenedor así:

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

Edición de la configuración predeterminada de OWT para ejecutarse localmente en MacOS


Aquí debe editar el archivo webrtc_agent/agent.tomlpara reconocer estos puertos.

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

Y luego reemplace 0acf7c0560d8con el nombre del contenedor o id. Y cambie lo siguiente:


A continuación, debe indicar el recurso web para que el navegador muestre "localhost" en lugar del puente IP interno de la ventana acoplable (172.17.0.2):

vi /home/owt/portal/portal.toml


Nuevamente, en otras plataformas, puede usar la configuración predeterminada si ejecuta su contenedor con la opción --net=host.

Iniciar servidor


Ahora puede iniciar el servidor:

./home/start.sh

Puede recibir estos errores:

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

Esto es normal mientras el servidor se está conectando. Comprenderá que todo funciona si ve algo como:

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

Prueba en navegador


Abra https: // localhost: 3004 / en un navegador en la máquina local. Deberá habilitar el certificado, ya que el navegador tendrá problemas con él.


Y además de esto, debe habilitar el servidor websocket en localhost: 8080 . Puede hacer esto haciendo clic en el enlace " Haga clic aquí para probar el certificado y actualizar ". Alternativamente, también puede configurar #allow-insecure-localhostchrome: // flags para evitar problemas con los flags en Chrome.


Una vez que haga esto, regrese a https: // localhost: 3004 / y acepte la resolución de la cámara. Seleccione inmediatamente su identificador de canal de video en la lista desplegable "video de" y haga clic en "startAnalytics".


Finalmente, vaya a la lista desplegable de "video de subsribe", seleccione la tubería de línea larga + ID de video y haga clic en suscribirse:


En la imagen recibida del servidor, debería ver que se reconoce la cara.


Agregar modelos OpenCV


El Agente de análisis contiene la arquitectura del complemento OpenCV GStreamer Video Analytics (GVA) . GVA incluye una variedad de módulos que le permiten usar varios esquemas de predicción, como detección, clasificación e identificación, así como módulos de entrada y salida para enviar video a los usuarios (en este caso, de regreso a OWT), proporcionando superposición de imágenes o transmisión de datos a través de mqtt.

Tubería


En la práctica, estas canalizaciones se implementan cambiando algunos códigos C ++. Por ejemplo, si lo miramos /home/owt/analytics_agent/plugins/samples/cpu_pipeline/mypipeline.cc, veremos varios elementos de canalización:

 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

Y estas tuberías están ubicadas en una secuencia determinada:

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

Si desea cambiar alguno de sus elementos, deberá volver a compilar la canalización con el comando:

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

Luego simplemente copie las bibliotecas compiladas encima de la actual utilizada en /home/owt/analytics_agent/lib/.

Obteniendo otros modelos


Hay un gran conjunto de modelos alojados en OpenCV Open Model Zoo en GitHub . Además de todos los modelos populares de CV públicos , como mobilenet, resnet, squeezenet, vgg y muchos otros, Intel también admite una suite que incluye una amplia gama de modelos útiles para detectar objetos, vehículos no tripulados y procesar acciones humanas:
reconocimiento de accióncabeza-pose-estimacióndetección-persona-acción-reconocimiento-profesorsegmentación semántica
reconocimiento de edad-géneroestimación de pose humanadetección-persona-aslsola imagen-super-resolución
reconocimiento de aslrecuperación de imagendetección de personas-levantamiento-reconocimiento de manosdetección de texto
reconocimiento de acción del conductorinstancia-segmentación-seguridaddetección de personastexto-imagen-super-resolución
reconocimiento de emocionespuntos de referencia-regresiónreidentificación de personareconocimiento de texto
Detección de rostrobarrera de reconocimiento de matrículapersona-vehículo-bicicleta-detección-crucemanchado de texto
reidentificación de rostrosdetector de peatones y vehículosdetección de productobarrera de reconocimiento de atributos del vehículo
facial-puntos de referencia-35detección de peatonesresnet18-xnor-binary-onnxdetección de vehículos
estimación de la miradapersona-atributos-reconocimiento-cruceresnet50-binarybinario de detección de vehículos
reconocimiento de puntaje escrito a manoreconocimiento-acción-detección-personasegmentación vialbarrera de detección de matrículas de vehículos

Intel tiene más información sobre esto aquí .

Agregar modelos a OWT Analytics Agent


Para agregar modelos, debe clonar el repositorio y luego obtener los correspondientes con la herramienta Open Model Zoo Downloader . Después de esto, debe asegurarse de que su canalización contenga los elementos apropiados (clasificación, detección, identificación) y configurar el archivo /home/owt/analytics_agent/plugin.cfgutilizando los parámetros apropiados.

Prueba de complementos


Probé varios modelos de reconocimiento de rostro y emoción.

Puntos de referencia de la cara


Como ya jugué con la detección de toques en la cara , decidí revisar el modelo facial-hitos-35-adas-0002 . Este modelo detecta 35 puntos de referencia de la cara.


En mi aplicación de monitoreo táctil, podría agregar transmisión MQTT a la tubería utilizando el editor de metadatos genéricos gstreamer para capturar y procesar puntos de anclaje. Por ejemplo, podría ver si los puntos alrededor de los ojos, la nariz y la boca están oscurecidos, o incluso combinar todo esto con un modelo para evaluar la postura de una persona .

Reconocimiento de emociones


Esta es otra cosa genial. El modelo emociones-reconocimiento-retail-0003 utiliza una red convolucional para reconocer expresiones neutrales, felices, tristes, sorprendidas y furiosas.


Parece que mi expresión facial no se percibe como neutral, sino como triste, tal vez una estadía tan larga en el aislamiento comienza a sorprenderme :(

Optimización de Aceleración


Para aprovechar las capacidades de aceleración de hardware de OWT, asegúrese de instalar el dispositivo apropiado /home/owt/analytics_agent/plugin.cfg, es decir, escriba:

device = "MULTI:HDDL,GPU,CPU"

Lamentablemente, no tuve tiempo suficiente para probar esto, pero además de la aceleración de la CPU y la GPU, también puede aprovechar varios hardware del procesador de visión artificial (VPU). Estos son chips especializados para la operación eficiente de redes neuronales. Compré una Intel Neural Computing Card (NCS) hace un par de años para lanzar modelos CV más avanzados en la Raspberry Pi 3.

Por supuesto, siempre puede encontrar un compromiso entre la potencia de procesamiento y la velocidad de cuadros / resolución.

Recomendaciones


OpenCV tiene una larga historia con una gran comunidad de desarrolladores, ocupó el cuarto lugar entre todos los proyectos de código abierto de Machine Learning en el momento de mi análisis de popularidad a mediados de 2018 . Del mismo modo, gstreamer es otro proyecto que ha existido durante siglos. El Intel OWT Analytics Agent está en una posición ideal para ayudar a estas comunidades a agregar análisis de transmisión en tiempo real a sus proyectos a través de WebRTC. Deben poder tomar modelos GST existentes y ejecutarlos en tiempo real mediante OWT.

Si recién está comenzando a experimentar con la visión por computadora y desea ejecutar modelos en un servidor OWT, le recomiendo comenzar con tutoriales más básicos de OpenCV. Luego puede acceder a los complementos de GVA.. Requerirán mucho esfuerzo si recién está comenzando a trabajar con OpenCV, pero luego no tendrá problemas para cambiar el Agente de análisis para iniciarlos. Puede optimizar la pila para trabajar con su plataforma de destino y usar varias opciones de aceleración de hardware Intel para mejorar el rendimiento.

All Articles