【HaMeR】全Transformer架构的单目3D手部网格重建:ViT-H骨干+跨注意力MANO解码器源码深度解析

摘要

HaMeR(Hand Mesh Recovery)是 UC Berkeley 提出的全 Transformer 架构单目 3D 手部重建方法,采用 ViT-Huge(32层、1280维、16头)作为视觉骨干,配合 6 层跨注意力 Transformer 解码器直接回归 MANO 参数模型的手部姿态(6D旋转表示)、形状(10维 β\betaβ)和相机参数。结合对抗训练与多数据集混合策略,HaMeR 在 FreiHAND、HO-3D 等主流基准上显著超越现有方法,并在 Ego-Exo4D Challenge 2024 中获第二名。

一、问题背景

1.1 现有方法局限

  • CNN 骨干容量有限:传统方法(HMR、MobRecon)使用 ResNet 提取特征,面对遮挡、截断、极端姿态时鲁棒性不足
  • 回归头设计简单:多数方法用 MLP 迭代回归 MANO 参数,缺乏对全局上下文的建模能力
  • 训练数据孤立:各数据集标注格式不统一(2D vs 3D),难以联合利用

1.2 HaMeR 的核心思路

全面拥抱 Transformer:用 ViT-H 替换 CNN 骨干获得强大视觉特征,用 Cross-Attention Transformer Decoder 替代 MLP 回归头,实现从图像 token 到 MANO 参数的端到端映射。同时通过多数据集混合训练充分利用 2D/3D 标注。

二、核心方法

2.1 整体架构

图 1:HaMeR 完整系统架构。上半部分为推理流水线(ViT-H → Transformer Decoder → MANO),下半部分为训练管线(多损失 + 三路判别器)。重点关注紫色解码器中 Cross-Attention 如何从视觉 token 中提取手部信息。重绘自 design skill

系统分为三个核心模块:
#mermaid-svg-LK0pZAhWHmj6ubD4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LK0pZAhWHmj6ubD4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LK0pZAhWHmj6ubD4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LK0pZAhWHmj6ubD4 .error-icon{fill:#552222;}#mermaid-svg-LK0pZAhWHmj6ubD4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LK0pZAhWHmj6ubD4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LK0pZAhWHmj6ubD4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LK0pZAhWHmj6ubD4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LK0pZAhWHmj6ubD4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LK0pZAhWHmj6ubD4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LK0pZAhWHmj6ubD4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LK0pZAhWHmj6ubD4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LK0pZAhWHmj6ubD4 .marker.cross{stroke:#333333;}#mermaid-svg-LK0pZAhWHmj6ubD4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LK0pZAhWHmj6ubD4 p{margin:0;}#mermaid-svg-LK0pZAhWHmj6ubD4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LK0pZAhWHmj6ubD4 .cluster-label text{fill:#333;}#mermaid-svg-LK0pZAhWHmj6ubD4 .cluster-label span{color:#333;}#mermaid-svg-LK0pZAhWHmj6ubD4 .cluster-label span p{background-color:transparent;}#mermaid-svg-LK0pZAhWHmj6ubD4 .label text,#mermaid-svg-LK0pZAhWHmj6ubD4 span{fill:#333;color:#333;}#mermaid-svg-LK0pZAhWHmj6ubD4 .node rect,#mermaid-svg-LK0pZAhWHmj6ubD4 .node circle,#mermaid-svg-LK0pZAhWHmj6ubD4 .node ellipse,#mermaid-svg-LK0pZAhWHmj6ubD4 .node polygon,#mermaid-svg-LK0pZAhWHmj6ubD4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LK0pZAhWHmj6ubD4 .rough-node .label text,#mermaid-svg-LK0pZAhWHmj6ubD4 .node .label text,#mermaid-svg-LK0pZAhWHmj6ubD4 .image-shape .label,#mermaid-svg-LK0pZAhWHmj6ubD4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-LK0pZAhWHmj6ubD4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LK0pZAhWHmj6ubD4 .rough-node .label,#mermaid-svg-LK0pZAhWHmj6ubD4 .node .label,#mermaid-svg-LK0pZAhWHmj6ubD4 .image-shape .label,#mermaid-svg-LK0pZAhWHmj6ubD4 .icon-shape .label{text-align:center;}#mermaid-svg-LK0pZAhWHmj6ubD4 .node.clickable{cursor:pointer;}#mermaid-svg-LK0pZAhWHmj6ubD4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LK0pZAhWHmj6ubD4 .arrowheadPath{fill:#333333;}#mermaid-svg-LK0pZAhWHmj6ubD4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LK0pZAhWHmj6ubD4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LK0pZAhWHmj6ubD4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LK0pZAhWHmj6ubD4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LK0pZAhWHmj6ubD4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LK0pZAhWHmj6ubD4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LK0pZAhWHmj6ubD4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LK0pZAhWHmj6ubD4 .cluster text{fill:#333;}#mermaid-svg-LK0pZAhWHmj6ubD4 .cluster span{color:#333;}#mermaid-svg-LK0pZAhWHmj6ubD4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LK0pZAhWHmj6ubD4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LK0pZAhWHmj6ubD4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-LK0pZAhWHmj6ubD4 .icon-shape,#mermaid-svg-LK0pZAhWHmj6ubD4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LK0pZAhWHmj6ubD4 .icon-shape p,#mermaid-svg-LK0pZAhWHmj6ubD4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LK0pZAhWHmj6ubD4 .icon-shape .label rect,#mermaid-svg-LK0pZAhWHmj6ubD4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LK0pZAhWHmj6ubD4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LK0pZAhWHmj6ubD4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LK0pZAhWHmj6ubD4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输入手部裁剪图

256×192 RGB
ViT-Huge Backbone

32层, dim=1280, 16头
Patch Token 序列

12×16=192 tokens
Cross-Attention

Transformer Decoder

6层, 8头, dim=1024
Zero/Mean Token

查询向量
解码头
手部姿态

16×6D → rotmat
形状参数

β ∈ ℝ¹⁰
相机参数

s, t_x, t_y
MANO 模型
3D Mesh

778顶点 + 21关节
透视投影

→ 2D关节

2.2 ViT-Huge 视觉骨干

HaMeR 使用 ViTPose-H 预训练权重初始化骨干网络,具体配置:

参数
输入尺寸 256×192(裁去左右各32像素 → 256×192 有效区域)
Patch 大小 16×16
特征维度 1280
Transformer 层数 32
注意力头数 16
MLP 比率 4
Drop Path Rate 0.55
输出 特征图 F∈RB×1280×H×W\mathbf{F} \in \mathbb{R}^{B \times 1280 \times H \times W}F∈RB×1280×H×W

关键设计:输入图像裁去两侧各 32 像素(x[:,:,:,32:-32]),适配 ViTPose 训练时的长宽比。

2.3 Cross-Attention Transformer 解码器

图 2:MANOTransformerDecoderHead 前向传播三步详解。左:ViT 特征提取与 reshape;中:6 层跨注意力解码器迭代精化;右:MANO 正向运动学 + 透视投影。右侧面板解释五个关键设计决策。重绘自 design skill

这是 HaMeR 最核心的创新模块(MANOTransformerDecoderHead)。

架构:6 层 TransformerCrossAttn,每层包含:

  1. Self-Attention:查询 token 自注意力
  2. Cross-Attention:查询 token 与 ViT 输出 token 序列交互
  3. FeedForward:GELU 激活的两层 MLP

输入 token 策略 :默认使用零向量(token = zeros(B, 1, 1))作为初始查询,通过与骨干特征的跨注意力交互"吸收"手部信息。

迭代精化(IEF):支持多轮迭代,每轮输出残差累加到预测参数:

θ^(i)=θ^(i−1)+Δθ(i) \hat{\theta}^{(i)} = \hat{\theta}^{(i-1)} + \Delta\theta^{(i)} θ^(i)=θ^(i−1)+Δθ(i)

β^(i)=β^(i−1)+Δβ(i) \hat{\beta}^{(i)} = \hat{\beta}^{(i-1)} + \Delta\beta^{(i)} β^(i)=β^(i−1)+Δβ(i)

其中 Δθ(i),Δβ(i)\Delta\theta^{(i)}, \Delta\beta^{(i)}Δθ(i),Δβ(i) 由第 iii 轮 Transformer 输出经线性层解码得到。

6D 旋转表示 :手部姿态使用 6D 连续旋转表示(Zhou et al.),避免旋转矩阵/轴角的不连续性问题。每个关节 6 维向量经 Gram-Schmidt 正交化转换为 3×33\times33×3 旋转矩阵:

R=rot6d_to_rotmat(v)∈SO(3),v∈R6 \mathbf{R} = \text{rot6d\_to\_rotmat}(\mathbf{v}) \in SO(3), \quad \mathbf{v} \in \mathbb{R}^6 R=rot6d_to_rotmat(v)∈SO(3),v∈R6

2.4 MANO 参数化手部模型

MANO 接收全局朝向(1个关节)+ 手部姿态(15个关节)的旋转矩阵和 10 维形状参数,输出:

  • 778 个顶点 的 3D 手部网格
  • 21 个 3D 关键点 位置

相机参数 (s,tx,ty)(s, t_x, t_y)(s,tx,ty) 通过弱透视投影将 3D 关节映射到 2D:

tcam=tx,  ty,  2fs⋅Wimg \mathbf{t}_{cam} = \leftt_x, \\; t_y, \\; \\frac{2f}{s \\cdot W_{img}}\\right tcam=tx,ty,s⋅Wimg2f

其中 fff 为焦距,WimgW_{img}Wimg 为图像宽度。

2.5 对抗训练策略

HaMeR 引入 Discriminator 判别器对 MANO 参数施加先验约束,防止回归出不合理的手部姿态:

判别器架构(三路并行):

  • 逐关节判别 :每个关节的 3×33\times33×3 旋转矩阵 → 1D Conv → 独立 FC → 15 个真假分数
  • 全关节联合判别:所有关节拼接 → FC(480→1024→1024→1) → 1 个全局分数
  • 形状判别 :β\betaβ → FC(10→10→5→1) → 1 个形状分数

总判别输出为 17 维向量(15 + 1 + 1),训练目标为 LSGAN:

Ladv=E(D(θ\^,β\^)−1)2 \mathcal{L}_{adv} = \mathbb{E}\left(D(\\hat{\\theta}, \\hat{\\beta}) - 1)\^2\\right Ladv=E(D(θ\^,β\^)−1)2

三、训练细节

3.1 损失函数

损失项 权重 计算方式
3D 关键点 L1 0.05 根关节对齐后的 L1 距离
2D 重投影 L1 0.01 透视投影后 2D 关键点 L1
全局朝向 MSE 0.001 旋转矩阵 L2 损失
手部姿态 MSE 0.001 旋转矩阵 L2 损失
形状参数 MSE 0.0005 β\betaβ 向量 L2 损失
对抗损失 0.0005 LSGAN 生成器损失

3.2 训练配置

配置
优化器 AdamW(生成器 + 判别器各一个)
学习率 1e-5
权重衰减 1e-4
总训练步数 1,000,000
Batch Size 8
数据集 多数据集混合(mix_all):2D + 3D 标注联合
骨干初始化 ViTPose-H 预训练权重

3.3 数据增强

  • 2D 关键点噪声:0.01 比率
  • MANO 参数噪声:0.005 比率
  • 标准 ImageNet 归一化:mean=0.485, 0.456, 0.406, std=0.229, 0.224, 0.225

四、实验结果

4.1 评估基准

数据集 特点
FreiHAND 实验室环境,精确 3D GT
HO-3D 手-物交互场景
HInt(新提出) 来自 New Days、EpicKitchens、Ego4D 的野外手部交互
NEWDAYS / EPICK / EGO4D 第一人称视频手部标注

4.2 核心优势

相较于 FrankMocap、Mesh Graphormer 等基线:

  • 遮挡鲁棒性:ViT 的全局注意力机制能"看到"被遮挡部分的上下文
  • 时序稳定性:尽管逐帧处理,输出抖动显著低于基线
  • 极端姿态:大规模多数据集训练覆盖更多手部姿态分布

4.3 失败案例

  • 虚假手部检测(非手部区域误判)
  • 左右手分类错误
  • 极端手指弯曲超出 MANO 表达范围
  • 严重遮挡(>80%)导致歧义

小结

HaMeR 的工程价值在于证明了**"大骨干 + 简单解码器"** 的范式在手部重建任务上的有效性。ViT-H 的 32 层全局注意力提供了远超 ResNet 的特征质量,而 6 层跨注意力解码器以极简设计(单 token 查询)即可完成从视觉特征到 MANO 参数的映射。

三个设计亮点

  1. 零 token 查询:无需显式姿态先验,让网络自行从图像中"拉取"信息
  2. 6D 旋转表示:避免轴角/欧拉角的万向锁和不连续问题
  3. 三路判别器:逐关节 + 全局 + 形状三级约束,既保证局部合理性又保证全局一致性

局限:依赖准确的手部检测框和左右手分类;MANO 模型本身对极端姿态的表达能力有限;ViT-H 的计算开销较大(~300M 参数骨干)。

相关推荐
五月君_2 小时前
继 React、Vue 之后,Three.js 也有 Skills 了!AI 写 3D 终于不“晕”了
javascript·vue.js·人工智能·react.js·3d
神仙别闹2 小时前
基于Object3D 实现光线追踪
数码相机·3d
钓了猫的鱼儿2 小时前
基于深度学习+AI的红外电力设备故障目标检测与预警系统(Python源码+数据集+UI可视化界面+YOLOv11训练结果)
人工智能·深度学习·目标检测
LaughingZhu2 小时前
Product Hunt 每日热榜 | 2026-05-30
人工智能·经验分享·深度学习·神经网络·产品运营
vensli2 小时前
AutoGLM vs 豆包手机:拆解两条 GUI Agent 的技术路线
人工智能·智能手机·transformer
蒟蒻的贤2 小时前
深度学习底层核心原理:损失函数、梯度与参数更新
人工智能·深度学习
谷哥的小弟2 小时前
大模型核心基础知识(14)—神经网络的结构
人工智能·深度学习·神经网络·大模型·大语言模型
大模型最新论文速读3 小时前
SkillOpt:把 skill 文档当成模型权重来训练
论文阅读·人工智能·深度学习·机器学习·自然语言处理
z小猫不吃鱼4 小时前
15 InstructGPT 论文精读:SFT + RLHF 如何让模型听懂指令?
人工智能·深度学习·算法·机器学习·语言模型·自然语言处理·gpt-3