En I/O 2023, Google lanzó el Proyecto GameFace, un “mouse” de videojuegos de código abierto y manos libres que permite controlar el cursor de una computadora utilizando el movimiento de la cabeza y los gestos faciales. Quien lo use puede levantar las cejas para hacer clic y arrastrar, o abrir la boca para mover el cursor, lo que hace que los videojuegos ofrezcan un mayor grado de accesibilidad.
El proyecto se inspiró en la historia del streamer de videojuegos tetrapléjico Lance Carr, que vive con distrofia muscular, una enfermedad progresiva que debilita los músculos. Colaboramos con Lance para dar vida al Proyecto GameFace. La historia completa en que se basa el producto está disponible aquí en el blog de Google Keyword.
Fue una experiencia muy interesante pensar en cómo se puede controlar un cursor del mouse de una manera tan novedosa. Hicimos 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 puntos de referencia faciales de MediaPipe con opción de formas de mezcla lo hizo posible, ya que permite a cualquier desarrollador aprovechar 478 puntos de referencia faciales tridimensionales y 52 puntuaciones de formas de mezcla (coeficientes que representan la expresión facial) para inferir superficies faciales detalladas en tiempo real.
¡En este artículo, compartimos detalles técnicos sobre cómo construimos el Proyecto GameFace y las diversas tecnologías de código abierto que aprovechamos para crear este producto tan increíble!
Subtítulo: Controlar el movimiento de la cabeza para mover los cursores del mouse y personalizar la velocidad del cursor para adaptarse a diferentes resoluciones de pantalla.
Gracias a este proyecto, exploramos el concepto de usar el movimiento de la cabeza para poder mover el cursor del mouse. Nos centramos en la frente y el iris, que consideramos nuestros dos lugares emblemáticos. Tanto los puntos de referencia de la frente como los del iris son conocidos por su estabilidad. Sin embargo, Lance notó que el cursor no funcionaba bien si se usaba el punto de referencia del iris. La razón fue que el iris puede moverse ligeramente cuando las personas parpadean, lo que hace que el cursor se mueva involuntariamente. Por lo tanto, decidimos utilizar el punto de referencia de la frente como una opción de seguimiento predeterminada.
En algunos casos, las personas pueden encontrarse con desafíos al mover la cabeza en ciertas direcciones. Por ejemplo, Lance puede mover la cabeza más rápidamente hacia la derecha que hacia la izquierda. Para abordar este problema, presentamos una solución fácil de usar: ajuste de la velocidad del cursor por separado para cada dirección. Esta función permite a las personas personalizar el movimiento del cursor según sus preferencias, lo que facilita la navegación y la transforma en una experiencia más fluida y cómoda.
Queríamos que la experiencia fuera tan fluida como la de usar un control de mano. La fluctuación del cursor del mouse es uno de los principales problemas que queríamos superar. La aparición de fluctuaciones del cursor se ve afectada por varios factores, entre los que se incluyen la configuración del usuario, la cámara, el ruido y las condiciones de iluminación. Implementamos una función modificable que permite suavizar cursor y que ofrece a los usuarios la comodidad de ajustarla fácilmente para que se adapte mejor a su configuración específica.
Desde el principio, una de nuestras ideas principales fue que las personas se sintieran cómodas al gesticular con la cara. Un gesto que le resulta fácil de hacer a un usuario puede ser extremadamente difícil para otro. Por ejemplo, Lance puede mover las cejas de forma independiente con facilidad, mientras que el resto del equipo tuvo dificultades para hacer lo mismo. Por lo tanto, decidimos crear una funcionalidad que permitiera personalizar las expresiones que se usan para controlar el mouse.
Subtítulo: Usar expresiones faciales para controlar el mouse
Considéralo como una unión personalizada entre un gesto y una acción del mouse. Cuando nos pusimos a pensar en qué acciones del mouse debería cubrir el producto, intentamos imaginarnos escenarios comunes, como hacer clic con el botón izquierdo y derecho para 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 convencional. Queríamos brindar a los usuarios la posibilidad de restablecer el cursor del mouse en el centro de la pantalla también con un gesto facial.
Subtítulo: Usar expresiones faciales para controlar el teclado
La versión más reciente de la función de detección de puntos de referencia faciales de MediaPipe trae una agregado emocionante: las formas de mezcla. Gracias a esta mejora, la API genera 52 valores de formas de mezcla faciales que representan la expresividad de 52 gestos faciales, como levantar la ceja izquierda o abrir la boca. Estos valores se pueden asignar de manera efectiva para controlar una amplia gama de funciones, lo que permite ofrecer a los usuarios mayores posibilidades de personalización y manipulación.
También logramos ampliar la misma funcionalidad y agregar la opción de combinación de teclas. De esta manera, los gestos faciales también sirven para presionar algunas teclas del teclado.
Subtítulo: Establecer el tamaño del gesto para activar una acción
Cuando probábamos el software, descubrimos que cada uno de nosotros enfatizaba las expresiones faciales de manera distinta, por lo que incorporamos la idea del “tamaño de gesto”, que permite controlar cuánto es necesario gesticular para activar una acción del mouse. En este aspecto, los coeficientes de las formas de mezcla fueron y ahora distintos usuarios pueden establecer diferentes umbrales en relación con cada expresión específica. En este sentido, se les permite personalizar la experiencia y contribuir a su comodidad.
Otra información clave que recibimos de Lance fue que los jugadores suelen tener varias cámaras. Para que nuestros modelos de aprendizaje automático funcionen de manera óptima, es mejor disponer de una cámara que apunte directamente a la cara del usuario con una iluminación decente. Por tal motivo, incorporamos la posibilidad de que el usuario seleccione la cámara correcta para que lo enmarque y, de esta manera, contribuir a que el rendimiento sea óptimo.
La interfaz de usuario de nuestro producto incorpora una cámara en vivo, que proporciona a los jugadores visibilidad en tiempo real de los movimientos y gestos de su cabeza. Esta funcionalidad brinda varias ventajas. En primer lugar, los usuarios pueden establecer umbrales de manera más efectiva si observan directamente sus propios movimientos. La representación visual permite tomar decisiones informadas sobre los valores umbrales apropiados. Además, la transmisión de la cámara en vivo mejora la comprensión que tienen los usuarios de sus diferentes gestos, ya que correlacionan visualmente sus movimientos con las acciones que activan en la aplicación. En general, las imágenes de la cámara mejoran significativamente la experiencia del usuario, y facilitan la configuración precisa de los umbrales y una comprensión más profunda de los gestos.
Nuestro paso siguiente fue crear la posibilidad de controlar el mouse y el teclado utilizando nuestra lógica personalizada. Para habilitar el control del mouse y el teclado dentro de nuestra aplicación de Python, usamos dos bibliotecas: PyAutoGUI para el control del mouse y PyDirectInput para el control del teclado. Elegimos PyAutoGUI por sus sólidas capacidades de control del mouse, lo que nos permite simular los movimientos del mouse, los clics y otras acciones. Por otro lado, utilizamos PyDirectInput para controlar el teclado, ya que ofrece una mayor compatibilidad con diversas aplicaciones, incluidos los juegos y las que dependen de DirectX.
En cuanto a nuestro empaquetado de aplicaciones, utilizamos PyInstaller para convertir nuestra aplicación basada en Python en un ejecutable, lo que facilita la tarea cuando los usuarios ejecutan nuestro software, ya que no tienen que instalar Python ni dependencias adicionales. PyInstaller proporciona un medio confiable y eficiente para distribuir nuestra aplicación y garantiza que los usuarios tengan una experiencia sin contratiempos.
El producto presenta un nuevo factor de forma para que los usuarios puedan disfrutar de una función importante como manejar el cursor del mouse. Nuestro equipo de diseño e ingeniería estableció como prioridad que el producto y su interfaz de usuario fueran intuitivos y fáciles de seguir. Trabajamos en estrecha colaboración con Lance para incorporar sus comentarios en nuestras consideraciones relativas a la UX y descubrimos que CustomtKinter logró dar respuesta a la mayoría de nuestras consideraciones de IU en Python.
Nos entusiasma ver el potencial del Proyecto GameFace y no vemos la hora de que los desarrolladores y las empresas lo utilicen para crear nuevas experiencias. GameFace está configurado con código abierto en Github y lo puedes encontrar aquí.
Queremos agradecer los valiosos aportes a este proyecto que hicieron las siguientes personas: Lance Carr, David Hewlett, Laurence Moroney, Khanh LeViet, Glenn Cameron, Edwina Priest, Joe Fry, Feihong Chen, Boon Panichprecha, Dome Seelapun, Kim Nomrak, Pear Jaionnom y Lloyd Hightower.