No I/O 2023, a Google lançou o Project Gameface, um "mouse" de código aberto para jogos que dispensa o uso das mãos e permite que as pessoas controlem o cursor do computador usando movimentos da cabeça e gestos faciais. As pessoas podem levantar as sobrancelhas para clicar e arrastar ou abrir a boca para mover o cursor, tornando os jogos mais acessíveis.
O projeto foi inspirado na história do streamer de videogames tetraplégico Lance Carr, que convive com a distrofia muscular, uma doença progressiva que enfraquece os músculos. Nós trabalhamos em colaboração com Lance para dar vida ao Project Gameface. A história completa por trás do produto está disponível no blog Google Keyword, aqui.
Foi uma experiência extremamente interessante pensar em como um cursor de mouse poderia ser controlado de uma forma tão inovadora. Realizamos muitos experimentos e descobrimos que os movimentos da cabeça e as expressões faciais podem ser uma forma diferenciada de programar o cursor do mouse. A nova API Face Landmarks Detection do MediaPipe com a opção blendshape tornou isso possível, pois permite que qualquer desenvolvedor use 478 pontos de referência faciais tridimensionais e 52 pontuações de blendshape (coeficientes que representam a expressão facial) para inferir superfícies faciais detalhadas em tempo real.
Neste artigo, compartilhamos detalhes técnicos de como criamos o Project Gameface e as várias tecnologias de código aberto que usamos para criar esse interessante produto!
Legenda: controle dos movimentos da cabeça para mover cursores de mouse e personalização da velocidade do cursor para adaptação a diferentes resoluções de tela.
Nesse projeto, exploramos o conceito de usar os movimentos da cabeça para conseguir mover o cursor do mouse. Nós nos concentramos na testa e na íris como os dois locais de pontos de referência, que são conhecidos por sua estabilidade. No entanto, Lance notou que o cursor não funcionava bem ao usar a íris como referência. O motivo era que a íris pode se mover ligeiramente quando as pessoas piscam, causando movimentos involuntários do cursor. Portanto, decidimos usar o ponto de referência da testa como uma opção de rastreamento padrão.
Há casos em que as pessoas podem ter dificuldades para mover a cabeça em algumas direções. Por exemplo, Lance consegue mover a cabeça mais rapidamente para a direita do que para a esquerda. Para lidar com essa questão, introduzimos uma solução fácil de usar: o ajuste separado da velocidade do cursor para cada direção. Esse recurso permite que as pessoas personalizem a movimentação do cursor de acordo com suas preferências, facilitando uma navegação mais suave e confortável.
Queríamos que a experiência fosse tão simples quanto usar um controlador de mão. A instabilidade do cursor do mouse é um dos principais problemas que queríamos resolver. A aparência de instabilidade do cursor é influenciada por vários fatores, incluindo a configuração do usuário, a câmera, o ruído e as condições de iluminação. Implementamos um recurso de suavização de cursor ajustável para proporcionar aos usuários a conveniência de ajustar facilmente esse recurso de acordo com a configuração específica.
Logo no início, um dos nossos principais insights foi que as pessoas têm diferentes níveis de conforto em diferentes expressões faciais. Um gesto fácil para um usuário pode ser extremamente difícil para outro usuário fazer deliberadamente. Por exemplo, Lance consegue mover as sobrancelhas de maneira independente com facilidade, enquanto o restante da equipe teve dificuldades para acompanhar a habilidade de Lance. Por isso, decidimos criar uma funcionalidade para que as pessoas personalizem as expressões usadas para controlar o mouse.
Legenda: uso de expressões faciais para controlar o mouse
Pense nisso como uma vinculação personalizada de um gesto a uma ação do mouse. Ao decidir sobre quais ações do mouse o produto deveria abranger, tentamos capturar cenários comuns, como clicar com o botão esquerdo e direito para rolar para cima e para baixo. No entanto, usar a cabeça para controlar o movimento do cursor do mouse é uma experiência diferente da convencional. Queríamos dar aos usuários a opção de redefinir o cursor do mouse para o centro da tela usando um gesto facial também.
Legenda: uso de expressões faciais para controlar o teclado
O lançamento mais recente do MediaPipe Face Landmarks Detection traz uma adição muito interessante: a saída de blendshapes. Com esse aprimoramento, a API gera 52 valores de blendshape faciais que representam a expressividade de 52 gestos faciais, tais como levantar a sobrancelha esquerda ou abrir a boca. Esses valores podem ser efetivamente mapeados para controlar uma ampla gama de funções, oferecendo aos usuários mais possibilidades de personalização e manipulação.
Conseguimos estender a mesma funcionalidade e adicionar a opção de vinculação do teclado. Isso ajuda a usar os gestos faciais também para pressionar algumas teclas, com uma vinculação similar.
Legenda: definição do tamanho do gesto para disparar uma ação
Ao testar o software, descobrimos que as expressões faciais eram mais ou menos marcantes em cada um de nós. Por isso, incorporamos a ideia de um tamanho de gesto, que permite que as pessoas controlem até que ponto precisam gesticular para disparar uma ação do mouse. Os coeficientes de blendshape foram úteis aqui, e diferentes usuários agora podem definir limites diferentes em cada expressão específica, o que ajuda a personalizar a experiência para garantir o conforto.
Outro insight importante que recebemos de Lance foi que os jogadores geralmente têm várias câmeras. Para que nossos modelos de aprendizado de máquina funcionem da melhor maneira possível, é melhor ter uma câmera apontando diretamente para o rosto do usuário com uma iluminação adequada. Por isso, incorporamos a capacidade de o usuário selecionar a câmera correta para que seja possível ter enquadramento e oferecer o melhor desempenho.
A interface do usuário de nosso produto incorpora um feed de câmera ao vivo, fornecendo aos usuários visibilidade em tempo real de seus gestos e movimentos de cabeça. Esse recurso traz diversas vantagens. Em primeiro lugar, os usuários podem definir limites com mais eficácia, observando diretamente seus próprios movimentos. A representação visual possibilita decisões embasadas sobre valores de limite apropriados. Além disso, o feed da câmera ao vivo melhora a compreensão dos diferentes gestos dos usuários, pois há a correlação visual dos movimentos com as ações correspondentes no aplicativo. No geral, o feed da câmera melhora muito a experiência do usuário, facilitando configurações de limite precisas e proporcionando uma compreensão melhor dos gestos.
Nosso próximo passo foi criar a capacidade de controlar o mouse e o teclado usando nossa lógica personalizada. Para ativar o controle do mouse e do teclado em nosso aplicativo Python, utilizamos duas bibliotecas: PyAutoGUI para controle do mouse e PyDirectInput para controle do teclado. A biblioteca PyAutoGUI foi escolhida devido aos recursos robustos de controle do mouse, o que nos permite simular movimentos do mouse, cliques e outras ações. Por outro lado, usamos a biblioteca PyDirectInput para controle do teclado, pois ela oferece compatibilidade avançada com vários aplicativos, incluindo jogos e aqueles que dependem do DirectX.
Para o empacotamento do aplicativo, usamos o PyInstaller para transformar o aplicativo baseado em Python em um executável, tornando mais fácil para os usuários executar o software sem a necessidade de instalar o Python ou outras dependências. O PyInstaller fornece um meio confiável e eficiente para distribuir o aplicativo, garantindo uma experiência tranquila para o usuário.
O produto introduz um formato inovador para envolver os usuários em uma função importante, como manusear o cursor do mouse. Fazer com que o produto e sua IU fossem intuitivos e fáceis de acompanhar foi uma das principais prioridades da equipe de design e engenharia. Trabalhamos em colaboração direta com Lance para incorporar o feedback dele em nossas considerações de UX e descobrimos que o CustomtKinter era capaz de lidar com a maioria de nossas considerações de IU no Python.
Mal podemos esperar para ver o potencial do Project GameFace e como ele será usado por desenvolvedores e empresas para criar novas experiências. O código do GameFace é aberto no Github, aqui.
Gostaríamos de agradecer as inestimáveis contribuições destas pessoas para esse projeto: Lance Carr, David Hewlett, Laurence Moroney, Khanh LeViet, Glenn Cameron, Edwina Priest, Joe Fry, Feihong Chen, Boon Panichprecha, Dome Seelapun, Kim Nomrak, Pear Jaionnom e Lloyd Hightower