摘要
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,每层包含:
- Self-Attention:查询 token 自注意力
- Cross-Attention:查询 token 与 ViT 输出 token 序列交互
- 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 参数的映射。
三个设计亮点:
- 零 token 查询:无需显式姿态先验,让网络自行从图像中"拉取"信息
- 6D 旋转表示:避免轴角/欧拉角的万向锁和不连续问题
- 三路判别器:逐关节 + 全局 + 形状三级约束,既保证局部合理性又保证全局一致性
局限:依赖准确的手部检测框和左右手分类;MANO 模型本身对极端姿态的表达能力有限;ViT-H 的计算开销较大(~300M 参数骨干)。