如果熟悉Bilibili或YouTube,你应该不会对,虚拟UP主/虚拟主播/VTuber感到陌生。这是指使用虚拟形象在视频网站进行投稿活动的主播。
拥有4000多万客户的日本电信运营商KDDI正在利用5G网络实验一系列的技术,但团队发现实时获得准确的动作和类人表情是一项挑战。所以,他们与谷歌进行合作,通过MediaPipe Face Landmarker解决方案来为虚拟形象带来真实感。
实时创建逼真虚拟主播
MediaPipe Face Landmarker解决方案最初于5月的Google I/O 2023发布。它可以检测面部landmark并输出blendshape score,以渲染与用户匹配的3D面部模型。通过MediaPipe Face Landmarker解决方案,KDDI和谷歌成功地为虚拟主播带来了真实感。
技术实现
使用Mediapipe强大而高效的Python包,KDDI开发人员能够检测表演者的面部特征并实时提取52个混合形状。
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数据库储储了52个blendshape浮动值的集合。每行对应一个特定的blendshape,按顺序列出。
_neutral, browDownLeft, browDownRight, browInnerUp, browOuterUpLeft, ...
当摄像头开启和FaceMesh模型运行时,blendshape值会不断实时更新。在每一帧中,数据库都反映最新的blendshape值,捕获FaceMesh模型检测到的面部表情的动态变化。
提取blendshapes数据后,下一步是将其传输到Firebase Realtime Database。通过利用这种先进的数据库系统,这可以确保实时数据无缝地流向客户端,从而消除了对服务器可扩展性的担忧,并确保KDDI能够专注于交付简化的用户体验。
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()
为了继续这一进程,开发人员将blendshapes数据实时从Firebase Realtime Database数据库无缝传输到Google Cloud的Immersive Stream for XR实例。作为说明,Google Cloud的Immersive Stream for XR是一项托管服务,它可以在云中运行Unreal引擎项目,实时渲染沉浸式逼真3D和增强现实体验,并将其传输到智能手机和浏览器。
这种集成确保KDDI能够驱动面部动画,并以最小的延迟实现面部动画的实时流式传输。
在Unreal引擎端,团队使用Firebase C++ SDK从Firebase无缝接收数据。通过建立数据库侦听器,可以在Firebase Realtime数据库表中发生更新时立即检索blendshape值。这种集成允许实时访问最新的blendshape数据,在Unreal引擎项目中实现动态和响应式面部动画。
从Firebase SDK中检索blendshape值后,可以在Unreal引擎中使用动画蓝图中的“Modify Curve修改曲线”节点来驱动人脸动画。每个blendshape值在每一帧单独分配给虚拟角色,允许对角色的面部表情进行精确和实时控制。
在虚Unreal擎中实现实时数据库侦听器的一个有效方法是利用GameInstance Subsystem,而它可以作为一个备选的单例模式。这允许创建一个专用的BlendshapesReceiver实例,负责在后台处理数据库连接、身份验证和连续数据接收。
通过利用GameInstance Subsystem,可以在游戏会话的整个生命周期中实例化和维护BlendshapesReceiver实例。当动画蓝图使用接收到的blendshape数据读取和驱动面部动画时,这确保了持久的数据库连接。
仅使用一台运行MediaPipe的本地PC,KDDI成功捕获了真人演员的面部表情和动作,并实时创建了高质量的3D重定向动画。
团队表示,这个MediaPipe集成是KDDI消除真实世界和虚拟世界之间界限的一个例子。KDDI正在Web3时代提供服务,包括虚拟世界、虚拟直播和虚拟购物,塑造一个任何人都可以成为创造者的生态系统,并支持新一代用户在现实世界和虚拟世界之间轻松移动。
来源:映维网
投稿:tougao@arinchina.com
稿件/商务合作: 向前(微信 Shixiangqian7)电话:18700987744
创始人:张明军(微信 13720775110)
更多精彩内容,请关注ARinChina微信公众号(ID:X增强现实)
评论