MediaPipe: mejorar a los humanos virtuales para que sean más realistas

JUL 10, 2023
Daniel Ta QA Test Team

Una publicación de invitado del equipo de desarrollo de XR en KDDI & Alpha-U

Ten en cuenta que la información, los usos y las aplicaciones que se detallan en la siguiente publicación son únicamente los de nuestro autor invitado, KDDI.

kddi1
KDDI está integrando la renderización & en la nube de texto a voz al humano virtual "Metako"

Los VTubers, o YouTubers virtuales, son artistas en línea que utilizan un avatar virtual generado mediante gráficos por computadora. Esta tendencia digital se originó en Japón a mediados de la década de 2010 y se ha convertido en un fenómeno internacional en internet. La mayoría de los VTubers son YouTubers de habla inglesa y japonesa o streamers que transmiten en vivo y usan diseños de avatar.

KDDI, un operador de telecomunicaciones de Japón con más de 40 millones de clientes, quería experimentar con varias tecnologías basadas en su red 5G, pero descubrió que lograr movimientos precisos y expresiones faciales similares a las humanas en tiempo real era todo un desafío.

Creación de humanos virtuales en tiempo real

Anunciada en Google I/O 2023 en mayo, la solución MediaPipe Face Landmarker detecta puntos de referencia faciales y genera puntuaciones de blendshapes para renderizar un modelo facial 3D que coincida con el usuario. Con la solución MediaPipe Face Landmarker, KDDI y el equipo de Google Partner Innovation aportaron de manera exitosa realismo a sus avatares.

Implementación técnica

Utilizando el potente y eficiente paquete Python de Mediapipe, los desarrolladores de KDDI pudieron detectar los rasgos faciales del intérprete y extraer 52 blendshapes en tiempo real.

import mediapipe as mp
from mediapipe.tasks import python as mp_python
 
MP_TASK_FILE = "face_landmarker_with_blendshapes.task"
 
class FaceMeshDetector:
 
    def __init__(self):
        with open(MP_TASK_FILE, mode="rb") as f:
            f_buffer = f.read()
        base_options = mp_python.BaseOptions(model_asset_buffer=f_buffer)
        options = mp_python.vision.FaceLandmarkerOptions(
            base_options=base_options,
            output_face_blendshapes=True,
            output_facial_transformation_matrixes=True,
            running_mode=mp.tasks.vision.RunningMode.LIVE_STREAM,
            num_faces=1,
            result_callback=self.mp_callback)
        self.model = mp_python.vision.FaceLandmarker.create_from_options(
            options)
 
        self.landmarks = None
        self.blendshapes = None
        self.latest_time_ms = 0
 
    def mp_callback(self, mp_result, output_image, timestamp_ms: int):
        if len(mp_result.face_landmarks) >= 1 and len(
                mp_result.face_blendshapes) >= 1:
 
            self.landmarks = mp_result.face_landmarks[0]
            self.blendshapes = [b.score for b in mp_result.face_blendshapes[0]]
 
    def update(self, frame):
        t_ms = int(time.time() * 1000)
        if t_ms <= self.latest_time_ms:
            return
 
        frame_mp = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame)
        self.model.detect_async(frame_mp, t_ms)
        self.latest_time_ms = t_ms
 
    def get_results(self):
        return self.landmarks, self.blendshapes

Firebase Realtime Database almacena una colección de 52 valores flotantes de blendshape. Cada fila corresponde a un blendshape específico, listado en orden.

_neutral, 
browDownLeft, 
browDownRight, 
browInnerUp,
browOuterUpLeft,
...

Estos blendshapes se actualizan continuamente en tiempo real mientras la cámara esté abierta y el modelo FaceMesh se ejecute. Con cada fotograma, la base de datos refleja los últimos valores de blendshape, lo que captura los cambios dinámicos en las expresiones faciales detectados por el modelo FaceMesh.

kddi2

Después de extraer los datos de los blendshapes, el siguiente paso consiste en transmitirlos a la base de datos Firebase Realtime Database. Aprovechar este sistema avanzado de base de datos garantiza un flujo continuo de datos en tiempo real a los clientes, lo que elimina las preocupaciones sobre la escalabilidad del servidor y permite a KDDI enfocarse en ofrecer una experiencia de usuario optimizada.

import concurrent.futures
import time
 
import cv2
import firebase_admin
import mediapipe as mp
import numpy as np
from firebase_admin import credentials, db
 
pool = concurrent.futures.ThreadPoolExecutor(max_workers=4)
 
cred = credentials.Certificate('your-certificate.json')
firebase_admin.initialize_app(
    cred, {
        'databaseURL': 'https://your-project.firebasedatabase.app/'
    })
ref = db.reference('projects/1234/blendshapes')
 
def main():
    facemesh_detector = FaceMeshDetector()
    cap = cv2.VideoCapture(0)
 
    while True:
        ret, frame = cap.read()
 
        facemesh_detector.update(frame)
        landmarks, blendshapes = facemesh_detector.get_results()
        if (landmarks is None) or (blendshapes is None):
            continue
 
        blendshapes_dict = {k: v for k, v in enumerate(blendshapes)}
        exe = pool.submit(ref.set, blendshapes_dict)
 
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
 
    cap.release()
    cv2.destroyAllWindows()
    exit()

Para continuar progresando, los desarrolladores transmiten con fluidez los datos de los blendshapes de Firebase Realtime Database a las instancias de Immersive Stream for XR de Google Cloud. Immersive Stream for XR de Google Cloud es un servicio administrado en el que se ejecuta el proyecto de Unreal Engine en la nube, se renderizan y se transmiten experiencias inmersivas fotorrealistas en 3D y realidad aumentada (AR) a teléfonos inteligentes y navegadores en tiempo real.

Esta integración permite a KDDI mejorar la animación facial de los personajes y lograr una transmisión en tiempo real de la animación con una latencia mínima, lo que garantiza una experiencia del usuario inmersiva.

Por el lado de Unreal Engine ejecutado por Immersive Stream for XR, usamos el SDK de Firebase C++ para recibir datos de Firebase sin problemas. Al establecer un objeto de escucha de base de datos, podemos recuperar de manera instantánea los valores de los blendshapes tan pronto como se produzcan actualizaciones en la tabla de base de datos Firebase Realtime. Esta integración permite el acceso en tiempo real a los últimos datos de los blendshapes para así lograr una animación facial dinámica y receptiva en los proyectos de Unreal Engine.

kddi5

Después de recuperar los valores de los blendshapes del SDK de Firebase, podemos controlar la animación facial en Unreal Engine utilizando el nodo "Modificar curva" en el plano de animación. Cada valor de blendshape se asigna al personaje individualmente en cada fotograma, lo que permite un control preciso y en tiempo real sobre las expresiones faciales del personaje.

kddi6

Un enfoque eficaz para implementar un objeto de escucha de base de datos en tiempo real en Unreal Engine es utilizar el subsistema GameInstance, que sirve como un patrón de singleton alternativo. Esto permite la creación de una instancia BlendshapesReceiver dedicada responsable de manejar la conexión de la base de datos, la autenticación y la recepción continua de datos en segundo plano.

Al aprovechar el subsistema GameInstance, se puede crear una instancia de la instancia BlendshapesReceiver y mantenerla durante toda la vida útil de la sesión de juego. Esto garantiza una conexión a la base de datos persistente mientras el plano de animación lee y controla la animación facial utilizando los datos de blendshape recibidos.

Con la utilización de tan solo una PC local en la que se ejecuta MediaPipe, KDDI logró capturar la expresión facial y el movimiento del artista real y creó una animación de reorientación 3D de alta calidad en tiempo real.


KDDI está colaborando con desarrolladores de moda de anime del metaverso como Adastria Co., Ltd.

Cómo comenzar

Para obtener más información, ve las sesiones de Google I/O 2023: Aprendizaje automático en el dispositivo fácil de usar con MediaPipe, Potencia apps web con aprendizaje automático y MediaPipe, Novedades del aprendizaje automático, y consulta la documentación oficial en developers.google.com/mediapipe.

Lo que viene

Esta integración de MediaPipe es un ejemplo de cómo KDDI está eliminando el límite entre el mundo real y el virtual, lo que permite a los usuarios vivir experiencias cotidianas como asistir a conciertos musicales en vivo, disfrutar del arte, tener conversaciones con amigos y comprar, en cualquier momento y en cualquier lugar. 

En αU de KDDI se brindan servicios para la era Web3, incluidos el metaverso, la transmisión en vivo y las compras virtuales, lo que da forma a un ecosistema donde cualquiera puede convertirse en creador, y apoyar a la nueva generación de usuarios que se mueven fácilmente entre el mundo real y el virtual.