Publicado por Avneet Singh, Gerente de Producto, y Sisi Jin, Diseñadora de UX en Google PI, y Lance Carr, Colaborador


En I/O 2023, Google lanzó Project Gameface, un 'mouse' para juegos de código abierto y manos libres que permite a las personas controlar el cursor de una computadora utilizando el movimiento de su cabeza y los gestos faciales. Las personas pueden levantar las cejas para hacer clic y arrastrar, o abrir la boca para mover el cursor, haciendo que los juegos sean más accesibles.

El proyecto fue inspirado por la historia de Lance Carr, un streamer de videojuegos cuadripléjico que vive con distrofia muscular, una enfermedad progresiva que debilita los músculos. Y colaboramos con Lance para dar vida al Project Gameface. La historia completa detrás del producto está disponible en el blog Google Keyword aquí.

Ha sido una experiencia extremadamente interesante pensar en cómo un cursor de mouse puede ser controlado de una manera tan novedosa. Realizamos muchos experimentos y descubrimos que el movimiento de la cabeza y las expresiones faciales pueden ser una forma única de programar el cursor del mouse. La nueva API de detección de marcas faciales de MediaPipe con opción de blendshape hizo esto posible, ya que permite a cualquier desarrollador aprovechar 478 marcas faciales tridimensionales y 52 puntuaciones de blendshape (coeficientes que representan la expresión facial) para inferir superficies faciales detalladas en tiempo real.

Construcción y detalles del producto
En este artículo, compartimos detalles técnicos de cómo construimos el Project Gameface y las diversas tecnologías de código abierto que utilizamos para crear el emocionante producto.

Uso del movimiento de la cabeza para mover el cursor del mouse


Caption: Controlando el movimiento de la cabeza para mover los cursores del mouse y personalizando la velocidad del cursor para adaptarse a diferentes resoluciones de pantalla.

A través de este proyecto, exploramos el concepto de usar el movimiento de la cabeza para poder mover el cursor del mouse. Nos enfocamos en la frente y el iris como nuestras dos ubicaciones de referencia. Se conoce que tanto la frente como el iris son puntos de referencia estables. Sin embargo, Lance notó que el cursor no funcionaba bien al usar el punto de referencia del iris. La razón era que el iris puede moverse ligeramente cuando las personas parpadean, haciendo que el cursor se mueva involuntariamente. Por lo tanto, decidimos usar el punto de referencia de la frente como opción de seguimiento predeterminada.

Hay casos en los que las personas pueden encontrar dificultades al mover la cabeza en ciertas direcciones. Por ejemplo, Lance puede mover su cabeza más rápido hacia la derecha que hacia la izquierda. Para abordar este problema, introdujimos una solución amigable para el usuario: ajuste de velocidad del cursor separado para cada dirección. Esta característica permite a las personas personalizar el movimiento del cursor de acuerdo con sus preferencias, facilitando una navegación más suave y cómoda.

Queríamos que la experiencia fuera tan fluida como un controlador de mano. La inestabilidad del cursor del mouse es uno de los principales problemas que queríamos superar. La aparición de inestabilidad del cursor está influenciada por varios factores, incluida la configuración del usuario, la cámara, el ruido y las condiciones de iluminación. Implementamos una función de suavizado de cursor ajustable para permitir a los usuarios la comodidad de ajustar fácilmente esta característica para adaptarse mejor a su configuración específica.

Uso de expresiones faciales para realizar acciones de mouse y presionar teclas del teclado

Desde muy temprano, una de nuestras principales percepciones fue que las personas tienen diferentes niveles de comodidad al hacer diferentes expresiones faciales. Un gesto que le resulta fácil a un usuario puede ser extremadamente difícil de hacer deliberadamente para otro. Por ejemplo, Lance puede mover sus cejas de forma independiente con facilidad, mientras que el resto del equipo luchó por igualar la habilidad de Lance. Por lo tanto, decidimos crear una funcionalidad para que las personas personalicen las expresiones que utilizan para controlar el mouse.


Caption: Uso de expresiones faciales para controlar el mouse

Piénselo como una asignación personalizada de un gesto a una acción de mouse. Al deliberar sobre qué acciones de mouse debería cubrir el producto, tratamos de capturar escenarios comunes como hacer clic izquierdo y derecho hasta desplazarse hacia arriba y hacia abajo. Sin embargo, usar la cabeza para controlar el movimiento del cursor del mouse es una experiencia diferente a la forma convencional. Queríamos dar a los usuarios la opción de restablecer el cursor del mouse al centro de la pantalla utilizando también un gesto facial.


Caption: Uso de expresiones faciales para controlar el teclado

La versión más reciente de la detección de puntos de referencia faciales de MediaPipe trae una adición emocionante: salida de blendshapes. Con esta mejora, la API genera 52 valores de blendshapes faciales que representan la expresividad de 52 gestos faciales como levantar la ceja izquierda o abrir la boca. Estos valores se pueden mapear de manera efectiva para controlar una amplia gama de funciones, ofreciendo a los usuarios amplias posibilidades de personalización y manipulación.

Hemos podido extender la misma funcionalidad y agregar la opción para también enlazar el teclado. Esto ayuda a usar sus gestos faciales para también presionar algunas teclas del teclado de manera similar.

Establecer el tamaño del gesto para ver cuándo desencadenar una acción de mouse / teclado


Caption: Establecer el tamaño del gesto para desencadenar una acción

Mientras probábamos el software, descubrimos que las expresiones faciales eran más o menos pronunciadas por cada uno de nosotros, por lo que incorporamos la idea de un tamaño de gesto, que permite a las personas controlar hasta qué punto necesitan gesticular para desencadenar una acción de mouse. Los coeficientes de blendshapes fueron útiles aquí y ahora diferentes usuarios pueden establecer diferentes umbrales en cada expresión específica y esto les ayuda a personalizar la experiencia a su comodidad.

Manteniendo la alimentación de la cámara disponible
Otra percepción clave que recibimos de Lance fue que los jugadores a menudo tienen múltiples cámaras. Para que nuestros modelos de aprendizaje automático funcionen de manera óptima, es mejor tener una cámara apuntando directamente a la cara del usuario con una iluminación decente. Por lo tanto, hemos incorporado la capacidad para que el usuario seleccione la cámara correcta para ayudar a encuadrarlos y brindar el rendimiento más óptimo.

La interfaz de usuario de nuestro producto incorpora una alimentación de cámara en vivo, proporcionando a los usuarios visibilidad en tiempo real de sus movimientos de cabeza y gestos. Esta característica trae varias ventajas. En primer lugar, los usuarios pueden establecer umbrales de manera más efectiva al observar directamente sus propios movimientos. La representación visual permite decisiones informadas sobre valores de umbral apropiados. Además, la alimentación de la cámara en vivo mejora la comprensión de los usuarios de los diferentes gestos, ya que correlacionan visualmente sus movimientos con las acciones correspondientes en la aplicación. En general, la alimentación de la cámara mejora significativamente la experiencia del usuario, facilitando la configuración precisa de los umbrales y una comprensión más profunda de los gestos.

Empaquetado del producto
Nuestro próximo paso fue crear la capacidad para controlar el mouse y el teclado utilizando nuestra lógica definida por el usuario. Para habilitar el control del mouse y el teclado dentro de nuestra aplicación Python, utilizamos dos bibliotecas: PyAutoGUI para el control del mouse y PyDirectInput para el control del teclado. PyAutoGUI es elegida por sus sólidas capacidades de control del mouse, que nos permiten simular movimientos, clics y otras acciones del mouse. Por otro lado, aprovechamos PyDirectInput para el control del teclado, ya que ofrece una mayor compatibilidad con diversas aplicaciones, incluidos juegos y aquellos que dependen de DirectX.

Para el empaquetado de nuestra aplicación, utilizamos PyInstaller para convertir nuestra aplicación basada en Python en un ejecutable, lo que facilita a los usuarios ejecutar nuestro software sin necesidad de instalar Python ni dependencias adicionales. PyInstaller proporciona un medio confiable y eficiente para distribuir nuestra aplicación, garantizando una experiencia de usuario fluida.

El producto introduce un factor de forma novedoso para involucrar a los usuarios en una función importante como el manejo del cursor del mouse. Hacer que el producto y su interfaz de usuario sean intuitivos y fáciles de seguir fue una prioridad para nuestro equipo de diseño e ingeniería. Trabajamos en estrecha colaboración con Lance para incorporar sus comentarios en nuestras consideraciones de UX, y descubrimos que CustomtKinter podía manejar la mayoría de nuestras consideraciones de UI en Python.

Estamos emocionados de ver el potencial de Project GameFace y no podemos esperar a que los desarrolladores y las empresas lo aprovechen para construir nuevas experiencias. El código para GameFace es de código abierto en Github aquí.

Agradecimientos
Nos gustaría reconocer las valiosas contribuciones de las siguientes personas a este proyecto: Lance Carr, David Hewlett, Laurence Moroney, Khanh LeViet, Glenn Cameron, Edwina Priest, Joe Fry, Feihong Chen, Boon Panichprecha, Dome Seelapun, Kim Nomrak, Pear Jaionnom, Lloyd Hightower