Recentemente, os pesquisadores do GoogleAI mostraram sua abordagem à tarefa de rastrear mãos e determinar gestos em tempo real. Eu estava envolvido em uma tarefa semelhante e, portanto, decidi descobrir como eles abordavam a solução, quais tecnologias usavam e como alcançavam boa precisão durante o trabalho em tempo real em um dispositivo móvel. Também lançou o modelo no Android e testado em condições reais.
Por que isso é importante?
O reconhecimento das mãos é uma tarefa não trivial, que ao mesmo tempo é amplamente procurada. Essa tecnologia pode ser usada em aplicativos de realidade adicional para interação com objetos virtuais. Também pode ser a base para entender a linguagem de sinais ou para criar interfaces de controle baseadas em gestos.
Qual é a dificuldade?
A percepção natural das mãos em tempo real é um verdadeiro desafio para a visão computacional; as mãos geralmente se sobrepõem umas às outras (dedos cruzados ou mãos trêmulas). Embora os rostos possuam padrões de alto contraste, por exemplo, na área dos olhos e da boca, a ausência de tais sinais nas mãos faz uma detecção confiável apenas pelos sinais visuais.
As mãos estão constantemente em movimento, mudam os ângulos de inclinação e se sobrepõem. Para uma experiência aceitável do usuário, o reconhecimento precisa funcionar com alto FPS (25+). Além disso, tudo isso deve funcionar em dispositivos móveis, o que aumenta os requisitos de velocidade e os limites de recursos.
O que o GoogleAI fez?
Eles implementaram tecnologia para rastreamento preciso de mãos e dedos usando o aprendizado de máquina (ML). O programa determina 21 pontos-chave da mão no espaço 3D (altura, comprimento e profundidade) e, com base nesses dados, classifica os gestos que a mão mostra. Tudo isso com base em apenas um quadro de vídeo, funciona em tempo real em dispositivos móveis e é dimensionado por várias mãos.
Como eles fizeram isso?
A abordagem é implementada usando o
MediaPipe , uma estrutura de plataforma aberta de código aberto para a construção de pipelines de processamento de dados (vídeo, áudio, séries temporais). Algo como o Deepstream da Nvidia, mas com vários recursos e plataformas cruzadas.
A solução consiste em 3 modelos principais trabalhando juntos:
Detector de palma (BlazePalm)- tira imagem completa do vídeo
- retorna caixa delimitadora orientada (caixa delimitadora)
Modelo para determinar pontos-chave na mão- tira uma foto cortada de uma mão
- retorna 21 pontos-chave de uma mão no espaço 3D + indicador de confiança (mais detalhes adiante neste artigo)
Algoritmo de reconhecimento de gestos- leva pontos-chave da mão
- retorna o nome do gesto que a mão mostra
A arquitetura é semelhante à usada na tarefa de
estimativa de pose . Ao fornecer uma imagem manual cortada e alinhada com precisão, a necessidade de aumento de dados (rotações, traduções e redimensionamento) é significativamente reduzida e, em vez disso, o modelo pode se concentrar na precisão da previsão de coordenadas.
Detector de palma
Para encontrar a palma da mão, é usado um modelo chamado BlazePalm - um modelo de
detector de tiro único (SSD) otimizado para trabalhar em um dispositivo móvel em tempo real.
Um estudo do GoogleAI treinou um detector de palma em vez de um detector de braço inteiro (a palma é a base de uma palma sem dedos). A vantagem dessa abordagem é que é mais fácil reconhecer uma palma ou punho do que toda a mão com dedos gestos, e a palma também pode ser selecionada usando caixas delimitadoras quadradas (âncoras), ignorando as proporções de aspecto e, assim, reduzindo o número de âncoras necessárias em 3-5 vezes
As redes de pirâmide de recursos para o extrator de recursos de
detecção de objetos (FPN) também foram usadas para entender melhor o contexto da imagem, mesmo para objetos pequenos.
Como função de perda, foi adotada a perda focal, que lida bem com o desequilíbrio de classes que ocorrem ao gerar um grande número de âncoras.
Entropia cruzada clássica:
CE (pt) = -log (pt)Perda focal:
FL (pt) = - (1-pt) log (pt)Mais informações sobre a perda de Focall podem ser encontradas no excelente
pager do Facebook AI Research (leitura recomendada)
Utilizando as técnicas acima, foi alcançada uma precisão média de 95,7%. Ao usar entropia cruzada simples e sem FPN - 86,22%.
Definindo pontos principais
Depois que o detector de palma determina a posição da palma da mão em toda a imagem, a região muda um certo fator para cima e se expande para cobrir a mão inteira. Mais adiante na imagem cortada, o problema de regressão é resolvido - a posição exata de 21 pontos no espaço 3D é determinada.
Para o treinamento, 30.000 imagens reais foram marcadas manualmente. Um modelo 3D realista da mão também foi feito com a ajuda dos quais mais exemplos artificiais foram gerados em diferentes contextos.
Acima: Imagens reais de mãos com pontos-chave marcados. Abaixo: imagens artificiais da mão feitas usando um modelo 3DReconhecimento de gestos
Para o reconhecimento de gestos, foi utilizado um algoritmo simples que determina o estado de cada dedo (por exemplo, curvado ou reto) pelos pontos principais da mão. Todas essas condições são comparadas com o conjunto de gestos existente. Este método simples, porém eficaz, permite reconhecer gestos básicos com boa qualidade.
Otimizações
O principal segredo da inferência rápida em tempo real está oculto em uma importante otimização. O detector de palma, que leva mais tempo, inicia somente quando necessário (muito raramente). Isso é obtido calculando a posição da mão no próximo quadro, com base nos pontos-chave anteriores da mão.
Para a sustentabilidade dessa abordagem, outra saída foi adicionada ao modelo para determinar os principais pontos - um escalar, que mostra quão confiante o modelo está de que a mão está presente na imagem cortada e que está sendo implantada corretamente. Quando o valor de confiança cai abaixo de um determinado limite, o detector de palma é iniciado e aplicado a todo o quadro.
Teste de realidade
Lancei esta solução em um dispositivo Android (Xiaomi Redmi Note 5) para um teste em condições reais. O modelo se comporta bem, mapeia corretamente o esqueleto da mão e calcula a profundidade com um número decente de quadros por segundo.
Das desvantagens, é possível observar como a precisão e a velocidade começam a afundar com um movimento constante da mão ao longo da estrutura. Isso se deve ao fato de o modelo precisar constantemente reiniciar o detector, pois perde a posição da mão ao se mover. Se a velocidade de encontrar uma mão em movimento é mais importante para você do que a definição de gestos, você deve procurar outras abordagens.
Alguns problemas também ocorrem quando a mão cruza com o rosto ou fundos complexos semelhantes. Caso contrário, excelente trabalho do GoogleAI, essa é uma grande contribuição para o desenvolvimento futuro da tecnologia.
Artigo do blog do GoogleAIGithub mediapipe hand tracking