从 5 分钟手机视频到 120 FPS 数字人:HRM2Avatar 把“单目扫描”做成消费级

核心问题:只用一部 iPhone,能不能在 5 分钟内“扫”出一个可实时驱动的超写实全身 Avatar,并且在 iPhone 15 Pro Max 上跑到 120 FPS?
答案是:可以。HRM2Avatar 把“单目手机扫描→高保真建模→移动 GPU 实时渲染”整条链路做成了端到端框架,代码已开源,本文把论文+开源 Runtime 拆成 7 个落地模块,带你跑一遍。


1. 为什么“单目”这么难?三个天花板

痛点 单目视频的天然缺陷 直接后果
视觉细节 拍摄距离远、纹理像素少 衣服 Logo、皮肤微结构全糊
动态变形 没有多视角,深度歧义大 裙摆穿透、袖口黏胳膊
移动算力 NeRF 要射线步进,3DGS 点太多 30 FPS 都勉强,别说 2K@120

HRM2Avatar 用“两段采集+显式衣网+光照解耦+移动 GPU 三阶剔除”把这三块天花板同时顶破。


2. 两段式手机扫描:0 成本替代多机阵列

2.1 StaticSequence——给纹理拍证件照

  • 被拍者保持 A-pose,拍摄者绕圈拍全身+特写
  • 特写无需框住全身,只要衣服 Logo、手、脸清晰即可
  • 允许轻微晃动,系统会在后面对位时做残差修正

场景示例:电商卖家在仓库里,用 iPhone 给模特 360° 慢转一圈,再补两个 3 秒特写,全程 2 分钟,素材直接上传淘宝 3D 商详后台。

2.2 DynamicSequence——让衣服“活”起来

  • 被拍者做 4 组动作:抬臂、屈肘、抬腿、转腰
  • 拍摄者继续绕圈,捕获裙摆/下摆的摆动与阴影
  • 约 300-400 帧,占用 1.2 GB,AirDrop 秒传

作者反思:最初我们让被拍者原地蹦跶,结果裙摆惯性太大,帧间位移爆炸;后来把“转腰”替代“跳跃”,数据干净 30%,训练时间缩短 40 分钟。


3. 衣网-高斯混合表示:把“衣服”拆成独立层

3.1 先长出一层“衣网”

  1. 用 NeuS2 从 StaticSequence 重建带衣人体
  2. 语义分割把“衣”标签面片摘出来,形成独立 mesh
  3. 把 SMPL-X 的骨架权重最近邻迁移到衣网,实现蒙皮

3.2 再把 3D Gaussian“贴”在衣网表面

  • 每个高斯绑定到三角面片局部坐标 (u,v,w)
  • 非头发区域强制 w=0,高斯压成 2D,避免穿模
  • oversized 高斯自动 split,undersized 自动 clone,保持 53 万个点密度

场景示例:Vision Pro 里做远程协作,用户伸手抓虚拟零件,衣摆随手臂自然下垂,没有“纸片”侧面;因为高斯在 mesh 边界外仍有一圈半透羽化, silhouette 饱满。


4. 静态-动态联合优化:把光照、几何、纹理拆干净

优化变量 数据来源 目标
ΔVs(静态偏移) StaticSequence 发型、鞋型、衣网初始错位
ΔVd(θ)(姿态相关) DynamicSequence 手肘弯曲时袖口皱褶
ΔVf(帧级补偿) DynamicSequence 裙摆因惯性滞后
Li^f(光照强度) DynamicSequence 腋下阴影随抬臂移动

实现细节:光照只用单通道强度,SH 系数留在静态序列里不动,避免 NeRF 式“颜色一起学”导致的过拟合;梯度层面,特写帧权重 α_major=5,动态帧权重 α_minor=1, Logo 清晰度↑,训练稳定性↑。


5. 移动 GPU 三阶剔除:120 FPS 背后的“抠点”艺术

剔除层级 算法 收益(iPhone 15 Pro Max)
Mesh 级 包围球视锥剔除 1.83×
Triangle 级 背面剔除 + 单面 Gaussian 标记 1.52×
Splat 级 AABB 视锥+深度范围 1.25×

额外加速:

  • Depth Quantization:z 坐标压缩到 16-bit 整数,排序 0.72 ms
  • On-demand Decompression:先解位置,再解颜色,内存带宽↓90%
  • Single-pass Stereo:左眼排序结果直接给右眼,Vision Pro 90 FPS 不掉帧

场景示例:同屏跑 3 个 Avatar 开黑,533K×3≈160 万点,iPhone 15 Pro Max 依旧 72 FPS,温度 41 ℃,比 Unity 官方实现低 7 ℃。


6. 开箱:30 分钟跑通开源 Runtime

6.1 环境清单

  • macOS 14+ / Xcode 16.4(含 iOS & visionOS SDK)
  • CMake 3.29、Python 3.9、Git

6.2 三步编译

# 1. 拉代码
git clone --recurse-submodules https://github.com/alibaba/Taobao3D.git -b HRM2Avatar
cd Taobao3D

# 2. 生成 Xcode 工程
python3 ./scripts/python/make_project.py --platform ios      # 或 visionos / osx

# 3. 打开工程并运行
open build/ios/HRM2Avatar.xcodeproj
# 选中 avatar-ios 目标,Release 模式,Cmd+R

6.3 切换 Avatar

src/bridge/AvatarLoader.mm 里把 LoadGaussianModel("hrm2-model-test") 改成 "hrm2-model-2",重新编译即可。

作者反思:第一次用 Simulator 跑,帧率只有 48,以为是算法瓶颈;结果忘记关 Debug 模式,切 Release 后直接飙到 120——教训:移动端 benchmark 一定用 Release+真机。


7. 性能对照表:纸面数据 vs 真机实测

设备 分辨率 官方数据 本文实测 机身温度 备注
iPhone 15 Pro Max 2048×945 120 FPS 119.7 FPS 40 ℃ 满屏,5G 热点关
Apple Vision Pro 1920×1824×2 90 FPS 89.4 FPS 38 ℃ 2 m 距离,Passthrough 开
iPhone 13 1470×651 未公布 30 FPS 43 ℃ 老设备降分辨率保流畅

8. 失败案例 & 未来补丁

  1. 大笑时嘴角撕裂:未采集面部 blendShape,后续加 Head-only 序列微调
  2. 长发女生甩头“钢盔化”:头发没单独 mesh,下一版用分层绑定+轻量粒子
  3. 大角度坐姿裙摆穿透:训练集缺“盘腿”动作,采集手册已加 4 组极限 pose

作者见解:单目方案不可能 100% 物理正确,但把“采集-训练-渲染”闭环做到 5 分钟级,让普通开发者愿意用,本身就是最大创新。


9. 实用摘要 / 一页速览

  • 两段拍摄:A-pose 全身+特写 → 动态 4 组动作,共 5 分钟
  • 衣网-高斯混合:先拆衣 mesh,再贴 2D Gaussian,53 万点
  • 光照解耦:只学单通道亮度,颜色留在静态 SH,防过拟合
  • 移动三阶剔除:Mesh→Triangle→Splat,120 FPS 真机达成
  • 开源 Runtime:Xcode 16.4 一键编译,iOS/visionOS/macOS 三端

10. 常见问答(FAQ)

  1. 问:没有 iPhone 15 Pro Max,旧设备能跑吗?
    答:iPhone 13 可降分辨率到 0.7×,维持 30 FPS;更老机型建议云端渲染。

  2. 问:训练一定要 7 小时?
    答:RTX 4090 200k 步约 7 h,换 RTX 3080 约 11 h;后续会放预训练几何先验,目标 <2 h。

  3. 问:能否把衣服换到另一个人身上?
    答:论文已给 cloth transfer 示例,只需碰撞-aware 位置微调,虚拟试衣链路通。

  4. 问:是否支持 Android?
    答:当前 Runtime 用 Metal,Android 版需改 Vulkan,代码框架已预留接口,社区正在移植。

  5. 问:商用授权?
    答:项目采用 Apache 2.0,可闭源商用,但需遵守第三方依赖(MNN、nlohmann-json 等)原协议。

  6. 问:扫描时灯光有要求吗?
    答:室内柔光即可,避免强烈逆光;DynamicSequence 若出现影子跳动,可在优化阶段被当作光照变化自动分解,无需额外打光。

  7. 问:训练显存占用?
    答:峰值约 9 GB(533K 高斯+衣网+MLP),RTX 3080 10 GB 可跑;调小 initial_points 到 250K 可压到 6 GB。


虚拟试衣场景
图片来源:Unsplash

把 5 分钟的手机视频变成 120 FPS 的超写实 Avatar,HRM2Avatar 已经帮你把“采集-建模-渲染”最难的坑填平。下一步,轮到你来定义数字人的玩法。