从 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 先长出一层“衣网”
-
用 NeuS2 从 StaticSequence 重建带衣人体 -
语义分割把“衣”标签面片摘出来,形成独立 mesh -
把 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. 失败案例 & 未来补丁
-
大笑时嘴角撕裂:未采集面部 blendShape,后续加 Head-only 序列微调 -
长发女生甩头“钢盔化”:头发没单独 mesh,下一版用分层绑定+轻量粒子 -
大角度坐姿裙摆穿透:训练集缺“盘腿”动作,采集手册已加 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)
-
问:没有 iPhone 15 Pro Max,旧设备能跑吗?
答:iPhone 13 可降分辨率到 0.7×,维持 30 FPS;更老机型建议云端渲染。 -
问:训练一定要 7 小时?
答:RTX 4090 200k 步约 7 h,换 RTX 3080 约 11 h;后续会放预训练几何先验,目标 <2 h。 -
问:能否把衣服换到另一个人身上?
答:论文已给 cloth transfer 示例,只需碰撞-aware 位置微调,虚拟试衣链路通。 -
问:是否支持 Android?
答:当前 Runtime 用 Metal,Android 版需改 Vulkan,代码框架已预留接口,社区正在移植。 -
问:商用授权?
答:项目采用 Apache 2.0,可闭源商用,但需遵守第三方依赖(MNN、nlohmann-json 等)原协议。 -
问:扫描时灯光有要求吗?
答:室内柔光即可,避免强烈逆光;DynamicSequence 若出现影子跳动,可在优化阶段被当作光照变化自动分解,无需额外打光。 -
问:训练显存占用?
答:峰值约 9 GB(533K 高斯+衣网+MLP),RTX 3080 10 GB 可跑;调小initial_points到 250K 可压到 6 GB。
图片来源:Unsplash
把 5 分钟的手机视频变成 120 FPS 的超写实 Avatar,HRM2Avatar 已经帮你把“采集-建模-渲染”最难的坑填平。下一步,轮到你来定义数字人的玩法。

