Visão computacional no servidor Intel OWT WebRTC com aceleração de hardware


O WebRTC simplificou (na maioria das vezes) o recebimento e o envio de fluxos de vídeo em tempo real. Assim, você pode se divertir com eles usando o aprendizado de máquina. No mês passado, mostrei como executar o Computer Vision (CV) localmente em um navegador . Como mencionei, localmente é, obviamente, bom, mas às vezes é necessário um desempenho mais alto e, para isso, precisamos de um servidor remoto. Neste post, falarei sobre como executar modelos de servidor OpenCV com aceleração de hardware em chipsets Intel usando o Open WebRTC Toolkit (OWT) com código-fonte aberto.

Eu queria jogar com o servidor OWT, pois a Intel demonstrou os recursos de visão computacional do Kranky Geek , e agora tenho a sorte de trabalhar com a equipe de desenvolvimento para explorar os recursos do servidor. Abaixo, falarei sobre como instalar o OWT localmente para testes rápidos, além de demonstrar alguns modelos.

Abra o WebRTC Toolkit (OWT)


A Intel lançou seu Intel Collaboration Suite for WebRTC por volta de 2014. Este pacote consistia em SDKs de servidor e cliente projetados para usar o hardware Intel. A empresa continuou a expandir esse conjunto de softwares, adicionando novos recursos e melhorando seus recursos. Posteriormente, em 2018, a Intel abriu o código-fonte para todo o projeto sob a marca Open WebRTC Toolkit (OWT). Eles ainda propõem o uso do Collaborate Suite for WebRTC, de acordo com eles, a única diferença está no pacote de controle de qualidade adicional da Intel (o que não é tão raro em projetos de código aberto suportados por empresas comerciais). Neste post, vamos nos concentrar no OWT de código aberto.


Você pode acessar a página inicial do OWT em: 01.org/open-webrtc-toolkit

O que um servidor de mídia faz


Um servidor de mídia OWT pode atuar como um servidor de unidade de controle multiponto (MCU), onde os arquivos de mídia são decodificados, processados ​​e transcodificados antes de serem enviados de volta aos clientes, além do método mais típico da Unidade de encaminhamento seletivo (SFU). OWT da Intel é visto como um processador de mídia em tempo real com recursos para os seguintes aplicativos:

  • Conferências multiponto - as SFUs provaram ser a arquitetura predominante para conferências WebRTC, mas as MCUs ainda são necessárias em cenários em que o processamento no lado do cliente é limitado (por exemplo, em um dispositivo IoT) ou em combinação com um dos pontos abaixo.
  • – MCU , .
  • – -WebRTC , , RTSP, RTMP, HLS, MPEG-DASH.
  • – .
  • SIP-gateway – WebRTC , VoIP-.
  • – ( ).

O servidor é construído no node.js com o MongoDB para o banco de dados e o RabbitMQ como um intermediário de mensagens. As funções listadas na lista acima, bem como as não incluídas na lista, são implementadas como vários agentes conectados à arquitetura OWT.

Além disso, o OWT possui um SDK do cliente para interagir com um servidor de mídia. Também pode ser usado no modo P2P.

Aceleração


A arquitetura foi projetada para usar o hardware Intel. Isso inclui a maioria dos processadores Intel modernos e processadores ainda mais acelerados com gráficos integrados, CPLDs (FPGAs) e processadores especializados com visão de máquina Intel (Vision Processing Unit - VPU) . (Aqui está o projeto que criei usando um de seus chips Movidius com o Google Vision Kit).


Análise e visão computacional (CV)


Qualquer um que tenha trabalhado seriamente com a visão computacional encontrou o OpenCV . O OpenCV era originalmente um projeto da Intel e continua sendo o mesmo. A Intel possui um conjunto de ferramentas chamado OpenVINO (Inferência Visual Aberta e Otimização de Rede Neural) para otimizar modelos de aprendizado profundo em seu hardware. Faz parte do repositório OpenCV . O OpenCV inclui dezenas de modelos pré-treinados, desde o reconhecimento básico de texto até aplicativos autônomos.

O OWT Analytics Agent é um módulo para receber previsões em tempo real nos modelos OpenVINO. O Analystics Agent pode enviar metadados de saída para a nuvem ou você mesmo pode enviá-los de volta ao servidor de mídia para fazer, por exemplo, anotações para vídeo em tempo real (mostrarei um pouco mais adiante). A conhecida biblioteca GStreamer é usada para gerenciar um pipeline de multimídia.

Arquitetura



O diagrama acima é retirado do guia de análise do servidor . Parece complicado, mas aqui você só precisa se lembrar de que o Analytics Agent atua como outro participante da conferência que pode se inscrever no canal de vídeo desta conferência. Depois que ele recebe o fluxo de vídeo, você pode direcionar o processamento do fluxo para vários estágios usando o pipeline do GStreamer. Na maioria dos casos, você deseja executar previsões e classificações antes de retornar o fluxo de vídeo de volta ao MCU, mas também pode enviar o fluxo e / ou dados de saída para outro lugar.

Instalação do Docker


A instalação levará um pouco de tempo, pois você precisará instalar o servidor OWT e o Analytics Agent. Felizmente, eles têm instruções de construção do Docker para facilitar a instalação. Se desejar, você pode executar o OWT + Analytics Agent como 4 contêineres separados para ambientes distribuídos. Decidi deixar todo o meu local em um contêiner para simplificar a avaliação.

De fato, a Intel inicialmente me deu uma imagem gst-owt-all:runpara o trabalho, pois, na época em que escrevi meu artigo, eles estavam atualizando a documentação para instalar o Analytics Agent. O novo conjunto é muito mais compreensível. Eu ainda recomendo que você se familiarize primeiro com a instalação padrão do OWT para entender seus componentes e opções.

Além disso, você precisa compilar muito com o gcc. Verifique se você possui a versão mais recente executando o seguinte comando: brew install gcc

No início, nada foi compilado, mas depois de executar este comando, tudo funcionou.
No final, comecei a construir tudo sozinho. Para criar um servidor OWT com o Analytics, execute o seguinte 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} \
  .

Depois de configurar o servidor OWT principal e o serviço Analytics, você precisará fazer o download dos modelos necessários no OpenCV Open Model Zoo e criar um pipeline analítico para seu uso. Para os exemplos em anexo, tudo isso inclui simplesmente executar o comando collector no bash e copiar alguns arquivos.

Verificação de integridade no macOS


Configurar portas da janela de encaixe


A opção docker --net=hostnão funciona no macOS, portanto, para inicialização local, é necessário abrir as portas correspondentes:
PortaServiço
8080Porta de sinal do soquete da Web para WebRTC
3004Servidor da Web para baixar a página de demonstração
30000-30050Portas UDP para WebRTC

Janela de encaixe


Instalei meu contêiner assim:

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

Edição das configurações padrão do OWT para execução local no MacOS


Aqui você deve editar o arquivo webrtc_agent/agent.tomlpara reconhecer essas portas.

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

E depois substitua 0acf7c0560d8pelo nome ou ID do contêiner. E mude o seguinte:


Em seguida, é necessário informar o recurso da Web para que o navegador exiba "localhost" em vez da ponte IP interna do docker (172.17.0.2):

vi /home/owt/portal/portal.toml


Mais uma vez, em outras plataformas, você pode usar a configuração padrão, se você executar o seu recipiente com a opção --net=host.

Iniciar servidor


Agora você pode iniciar o servidor:

./home/start.sh

Você pode receber estes erros:

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

Isso é normal enquanto o servidor está conectado. Você entenderá que tudo funciona se você vir algo como:

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

Teste no navegador


Abra https: // localhost: 3004 / em um navegador na máquina local. Você precisará ativar o certificado, pois o navegador terá problemas com ele.


Além disso, você precisa habilitar o servidor websocket no localhost: 8080 . Você pode fazer isso clicando no link " Clique aqui para testar o certificado e atualizar ". Como alternativa, você também pode definir #allow-insecure-localhostsinalizadores chrome: // para evitar problemas de sinalização no Chrome.


Depois de fazer isso, volte para https: // localhost: 3004 / e aceite a resolução da câmera. Selecione imediatamente o identificador do canal de vídeo na lista suspensa "vídeo de" e clique em "startAnalytics".


Por fim, vá para a lista suspensa “subscrever vídeo”, selecione o pipeline de linha longa + ID do vídeo e clique em inscrever-se:


Na imagem recebida do servidor, você deve ver que o rosto é reconhecido.


Adicionando modelos OpenCV


O Analytics Agent contém a arquitetura do plug-in OpenCV GStreamer Video Analytics (GVA) . O GVA inclui uma variedade de módulos que permitem o uso de vários esquemas de previsão, como detecção, classificação e identificação, além de módulos de entrada e saída para enviar vídeo aos usuários (neste caso, de volta ao OWT), fornecendo sobreposição de imagens ou streaming de dados através de mqtt.

Pipelining


Na prática, esses pipelines são implementados alterando algum código C ++. Por exemplo, se olharmos para ele /home/owt/analytics_agent/plugins/samples/cpu_pipeline/mypipeline.cc, veremos vários elementos 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

E esses pipelines estão localizados em uma determinada sequência:

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

Se você deseja alterar qualquer um dos elementos, precisará recompilar o pipeline usando o comando:

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

Em seguida, basta copiar as bibliotecas compiladas sobre a atual usada /home/owt/analytics_agent/lib/.

Obtendo outros modelos


Há um enorme conjunto de modelos hospedados no OpenCV Open Model Zoo no GitHub . Além de todos os modelos populares de CV público , como mobilenet, resnet, squeezenet, vgg e muitos outros, a Intel também suporta um conjunto que inclui uma ampla gama de modelos úteis para detectar objetos, veículos não tripulados e processar ações humanas:
reconhecimento de açãocabeça-pose-estimativapessoa-detecção-ação-reconhecimento-professorsegmentação semântica
reconhecimento de idade e sexoestimativa-pose-humanapessoa-detecção-aslsuper-resolução única imagem
reconhecimento aslrecuperação de imagempessoa-detecção-levantamento-mão-reconhecimentodetecção de texto
motorista-ação-reconhecimentoinstância-segmentação-segurançadetecção de pessoatexto-imagem-super-resolução
reconhecimento de emoçõesmarcos-regressãoidentificação de pessoareconhecimento de texto
detecção de rostobarreira de reconhecimento de placaspessoa-veículo-bicicleta-detecção-encruzilhadalocalização de texto
identificação de rostodetector de pedestres e veículosdetecção de produtoveículo-atributos-reconhecimento-barreira
marcos-faciais-35detecção de pedestresresnet18-xnor-binário-onnxdetecção de veículo
olhar-estimativapessoa-atributos-reconhecimento-encruzilhadaresnet50-binarybinário de detecção de veículo
reconhecimento de pontuação manuscritapessoa-detecção-ação-reconhecimentosegmentação de estradasbarreira-de-detecção-de-placas-de-veículos

A Intel tem mais informações sobre isso aqui .

Adicionando modelos ao agente do OWT Analytics


Para adicionar modelos, é necessário clonar o repositório e obter os correspondentes usando a ferramenta Open Model Zoo Downloader . Depois disso, você precisa garantir que seu pipeline contenha os elementos apropriados (classificação, detecção, identificação) e configure o arquivo /home/owt/analytics_agent/plugin.cfgusando os parâmetros apropriados.

Teste de plug-in


Eu tentei vários modelos de reconhecimento facial e emocional.

Pontos de referência da face


Como já brincava com a detecção de toques no rosto , decidi conferir o modelo facial-landmarks-35-adas-0002 . Este modelo detecta 35 pontos de referência da face.


No meu aplicativo de monitoramento de toque facial, eu poderia adicionar o fluxo MQTT ao pipeline usando o editor de metadados genéricos do gstreamer para capturar e processar pontos de ancoragem. Por exemplo, eu pude ver se os pontos ao redor dos olhos, nariz e boca estão escurecidos, ou até combinar tudo isso com um modelo para avaliar a postura de uma pessoa .

Reconhecimento de emoções


Isso é outra coisa legal. O modelo emoções-reconhecimento-varejo-0003 usa uma rede convolucional para reconhecer expressões neutras, felizes, tristes, surpresas e furiosas.


Parece que minha expressão facial é percebida não como neutra, mas triste - talvez uma permanência tão longa em isolamento comece a me pegar :(

Otimização de aceleração


Para aproveitar os recursos de aceleração de hardware do OWT, instale o dispositivo apropriado /home/owt/analytics_agent/plugin.cfg- ou seja, escreva:

device = "MULTI:HDDL,GPU,CPU"

Infelizmente, não tive tempo suficiente para testar isso, mas, além da aceleração de CPU e GPU, você também pode tirar proveito de vários hardwares de processador de visão de máquina (VPU). Estes são chips especializados para a operação eficiente de redes neurais. Comprei uma placa de computação neural Intel (NCS) há alguns anos para lançar modelos de CV mais avançados no Raspberry Pi 3.

Claro, você sempre pode encontrar um compromisso entre a capacidade de processamento e a taxa / resolução de quadros.

Recomendações


O OpenCV tem uma longa história com uma enorme comunidade de desenvolvedores, ficou em 4º lugar entre todos os projetos de código aberto do Machine Learning no momento da minha análise de popularidade em meados de 2018 . Da mesma forma, o gstreamer é outro projeto que existe há séculos. O Intel OWT Analytics Agent está em uma posição ideal para ajudar essas comunidades a adicionar análises de streaming em tempo real a seus projetos através do WebRTC. Eles devem poder pegar os modelos GST existentes e executá-los em streaming em tempo real usando o OWT.

Se você está apenas começando a experimentar a visão computacional e deseja executar modelos em um servidor OWT, recomendo começar com tutoriais mais básicos sobre o OpenCV. Então você pode acessar os plugins GVA.. Eles exigirão muito esforço se você estiver começando a trabalhar com o OpenCV, mas mais tarde não terá problemas para alterar o Analytics Agent para iniciá-los. Você pode otimizar a pilha para trabalhar com sua plataforma de destino e usar várias opções de aceleração de hardware Intel para melhorar o desempenho.

All Articles