MediaPipe: Menyempurnakan Manusia Virtual agar lebih realistis

JUL 10, 2023
Daniel Ta QA Test Team

Postingan tamu dari tim Pengembangan XR di KDDI & Alpha-U

Harap perhatikan bahwa informasi, penggunaan, dan aplikasi yang disampaikan dalam postingan di bawah ini adalah milik penulis tamu kami, KDDI.

kddi1
KDDI mengintegrasikan text-to-speech & Cloud Rendering ke manusia virtual 'Metako'

VTuber, atau YouTuber virtual, adalah penghibur online yang menggunakan avatar virtual yang dibuat dengan menggunakan grafik komputer. Tren digital ini berasal dari Jepang pada pertengahan tahun 2010-an, dan menjadi fenomena online internasional. Mayoritas VTuber adalah YouTuber berbahasa Inggris dan Jepang atau live streamer yang menggunakan desain avatar.

KDDI, operator telekomunikasi di Jepang yang memiliki pelanggan lebih dari 40 juta, ingin bereksperimen dengan berbagai teknologi yang dibangun pada jaringan 5G, tetapi mengalami kesulitan untuk membuat gerakan yang akurat dan ekspresi wajah yang mirip manusia secara real-time.

Menciptakan manusia virtual secara real-time

Diumumkan di acara Google I/O 2023 pada bulan Mei, solusi MediaPipe Face Landmarker mendeteksi titik wajah dan menghasilkan skor blendshape untuk merender model wajah 3D yang sesuai dengan pengguna. Dengan solusi MediaPipe Face Landmarker, KDDI dan tim Google Partner Innovation berhasil menghadirkan realisme pada avatar mereka.

Implementasi Teknis

Dengan menggunakan paket Python Mediapipe yang ampuh dan efisien, developer KDDI dapat mendeteksi fitur wajah pemain dan mengekstrak 52 blendshape secara real-time.

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 menyimpan koleksi 52 nilai float blendshape. Setiap baris terhubung dengan blendshape tertentu, yang terdaftar secara urut.

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

Nilai blendshape ini terus diupdate secara real-time saat kamera terbuka dan model FaceMesh berjalan. Dalam setiap bingkai, database mencerminkan nilai blendshape terbaru, menangkap perubahan dinamis ekspresi wajah yang terdeteksi oleh model FaceMesh.

kddi2

Setelah mengekstrak data blendshape, langkah berikutnya adalah mengirimkannya ke Firebase Realtime Database. Memanfaatkan sistem database canggih ini memastikan aliran data real time yang mulus ke klien, menghilangkan kekhawatiran tentang skalabilitas server dan memungkinkan KDDI untuk berfokus memberikan pengalaman pengguna yang lancar.

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()

Untuk melanjutkan progres, developer dengan mudah mengirimkan data blendshape dari Firebase Realtime Database ke instance Immersive Stream for XR Google Cloud secara real-time. Immersive Stream for XR dari Google Cloud adalah layanan terkelola yang menjalankan proyek Unreal Engine di cloud, merender dan melakukan streaming pengalaman 3D fotorealistik yang imersif dan Augmented Reality (AR) ke smartphone dan browser secara real time.

Integrasi ini memungkinkan KDDI untuk menggerakkan animasi wajah karakter dan mencapai streaming animasi wajah secara real time dengan latensi minimal, memastikan pengalaman pengguna yang imersif.

Pada sisi Unreal Engine yang dijalankan oleh Immersive Stream for XR, kami menggunakan Firebase C++ SDK untuk menerima data dari Firebase secara mudah. Dengan menyediakan pemroses database, kita bisa langsung mengambil nilai blendshape segera setelah muncul update di tabel database Firebase Realtime. Integrasi ini memungkinkan akses real-time ke data blendshape terbaru, sehingga memungkinkan animasi wajah yang dinamis dan responsif dalam proyek Unreal Engine.

kddi5

Setelah mengambil nilai blendshape dari Firebase SDK, kita bisa menggerakkan animasi wajah di Unreal Engine dengan menggunakan node "Modify Curve" dalam cetak biru animasi. Setiap nilai blendshape ditetapkan ke karakter secara individual pada setiap bingkai, sehingga memungkinkan kontrol yang akurat dan real-time atas ekspresi wajah karakter.

kddi6

Pendekatan yang efektif untuk mengimplementasikan pemroses database realtime di Unreal Engine adalah dengan memanfaatkan GameInstance Subsystem, yang berfungsi sebagai pola singleton alternatif. Ini memungkinkan pembuatan instance BlendshapesReceiver khusus yang bertanggung jawab untuk menangani koneksi database, autentikasi, dan penerimaan data berkelanjutan di latar belakang.

Dengan memanfaatkan GameInstance Subsystem, instance BlendshapesReceiver bisa dibuat instance dan dipertahankan sepanjang masa aktif sesi game. Ini memastikan koneksi database yang persisten sementara cetak biru animasi membaca dan menggerakkan animasi wajah menggunakan data blendshape yang diterima.

Hanya dengan menggunakan PC lokal yang menjalankan MediaPipe, KDDI berhasil menangkap ekspresi wajah dan gerakan pemain sesungguhnya, dan menciptakan animasi target 3D berkualitas tinggi secara real time.


KDDI bekerja sama dengan developer fashion anime Metaverse seperti Adastria Co., Ltd.

Memulai

Untuk mempelajari lebih lanjut, tonton sesi Google I/O 2023: Mudahnya ML di perangkat dengan MediaPipe, Mempercepat aplikasi web Anda dengan machine learning dan MediaPipe, Apa yang baru dalam machine learning, dan lihat dokumentasi resminya di developers.google.com/mediapipe.

Apa berikutnya?

Integrasi MediaPipe ini merupakan salah satu contoh bagaimana KDDI menghilangkan batas antara dunia nyata dan virtual, sehingga pengguna dapat menikmati pengalaman sehari-hari seperti menghadiri pertunjukan musik langsung, menikmati karya seni, bercakap-cakap dengan teman, dan berbelanja―kapan pun dan di mana pun. 

Layanan αU dari KDDI menyediakan layanan untuk era Web3, termasuk metaverse, live streaming, dan belanja virtual, membentuk ekosistem di mana setiap orang dapat menjadi kreator, mendukung pengguna generasi baru agar dapat dengan mudah berpindah antara dunia nyata dan virtual.