【MANO】参数化三维手部模型:从1000次扫描到通用手部重建的数学原理与工程实践

手部重建是计算机视觉与人机交互的核心问题之一。MANO(hand Model with Articulated and Non-rigid defOrmations)通过对约1000个高精度三维手部扫描的统计学习,构建了一个紧凑的参数化手部模型:仅用10维形状参数和45维姿态参数即可表达任意人手的几何与运动。本文深入剖析其数学建模(PCA形状空间、姿态混合形变、线性蒙皮)、模型结构(778顶点/16关节/双层混合形变),以及PyTorch工程实现。


论文Embodied Hands: Modeling and Capturing Hands and Bodies Together (SIGGRAPH Asia 2017)

代码hassony2/manopth - PyTorch MANO Layer


一、问题背景:为什么需要参数化手部模型

三维手部重建面临三重困难:

  1. 高自由度:人手有15个关节、每个关节3个旋转自由度,姿态空间高达45维
  2. 非刚性形变:手指弯曲时肌肉、皮肤产生复杂的非线性变形,纯骨架驱动不够
  3. 个体差异:不同人的手掌大小、手指粗细差异显著,需要形状空间建模

传统方法要么用关节角直接驱动骨架(丢失表面细节),要么用自由形变网格(参数爆炸、难以约束)。MANO的思路是:从大量真实扫描中学习统计先验,将高维形变空间压缩为低维流形。
#mermaid-svg-EWqE7d1l7SGTb1cB{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-EWqE7d1l7SGTb1cB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EWqE7d1l7SGTb1cB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EWqE7d1l7SGTb1cB .error-icon{fill:#552222;}#mermaid-svg-EWqE7d1l7SGTb1cB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EWqE7d1l7SGTb1cB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EWqE7d1l7SGTb1cB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EWqE7d1l7SGTb1cB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EWqE7d1l7SGTb1cB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EWqE7d1l7SGTb1cB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EWqE7d1l7SGTb1cB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EWqE7d1l7SGTb1cB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EWqE7d1l7SGTb1cB .marker.cross{stroke:#333333;}#mermaid-svg-EWqE7d1l7SGTb1cB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EWqE7d1l7SGTb1cB p{margin:0;}#mermaid-svg-EWqE7d1l7SGTb1cB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EWqE7d1l7SGTb1cB .cluster-label text{fill:#333;}#mermaid-svg-EWqE7d1l7SGTb1cB .cluster-label span{color:#333;}#mermaid-svg-EWqE7d1l7SGTb1cB .cluster-label span p{background-color:transparent;}#mermaid-svg-EWqE7d1l7SGTb1cB .label text,#mermaid-svg-EWqE7d1l7SGTb1cB span{fill:#333;color:#333;}#mermaid-svg-EWqE7d1l7SGTb1cB .node rect,#mermaid-svg-EWqE7d1l7SGTb1cB .node circle,#mermaid-svg-EWqE7d1l7SGTb1cB .node ellipse,#mermaid-svg-EWqE7d1l7SGTb1cB .node polygon,#mermaid-svg-EWqE7d1l7SGTb1cB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EWqE7d1l7SGTb1cB .rough-node .label text,#mermaid-svg-EWqE7d1l7SGTb1cB .node .label text,#mermaid-svg-EWqE7d1l7SGTb1cB .image-shape .label,#mermaid-svg-EWqE7d1l7SGTb1cB .icon-shape .label{text-anchor:middle;}#mermaid-svg-EWqE7d1l7SGTb1cB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EWqE7d1l7SGTb1cB .rough-node .label,#mermaid-svg-EWqE7d1l7SGTb1cB .node .label,#mermaid-svg-EWqE7d1l7SGTb1cB .image-shape .label,#mermaid-svg-EWqE7d1l7SGTb1cB .icon-shape .label{text-align:center;}#mermaid-svg-EWqE7d1l7SGTb1cB .node.clickable{cursor:pointer;}#mermaid-svg-EWqE7d1l7SGTb1cB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EWqE7d1l7SGTb1cB .arrowheadPath{fill:#333333;}#mermaid-svg-EWqE7d1l7SGTb1cB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EWqE7d1l7SGTb1cB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EWqE7d1l7SGTb1cB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EWqE7d1l7SGTb1cB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EWqE7d1l7SGTb1cB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EWqE7d1l7SGTb1cB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EWqE7d1l7SGTb1cB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EWqE7d1l7SGTb1cB .cluster text{fill:#333;}#mermaid-svg-EWqE7d1l7SGTb1cB .cluster span{color:#333;}#mermaid-svg-EWqE7d1l7SGTb1cB 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-EWqE7d1l7SGTb1cB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EWqE7d1l7SGTb1cB rect.text{fill:none;stroke-width:0;}#mermaid-svg-EWqE7d1l7SGTb1cB .icon-shape,#mermaid-svg-EWqE7d1l7SGTb1cB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EWqE7d1l7SGTb1cB .icon-shape p,#mermaid-svg-EWqE7d1l7SGTb1cB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EWqE7d1l7SGTb1cB .icon-shape .label rect,#mermaid-svg-EWqE7d1l7SGTb1cB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EWqE7d1l7SGTb1cB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EWqE7d1l7SGTb1cB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EWqE7d1l7SGTb1cB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1000个3D手部扫描

31个受试者
配准到统一拓扑

778顶点
PCA学习

形状空间 β
姿态相关形变学习

混合形变 Bp
MANO模型

M β,θ
下游任务

手部重建/追踪/交互

MANO模型架构:从输入参数到输出网格的完整数据流

图 1:MANO模型架构。左侧10D形状参数和45D姿态参数输入,经过Shape Blend Shapes、Pose Blend Shapes、Forward Kinematics三个并行处理模块,最终在LBS(红色高亮)中组装为778顶点网格。重绘自 design skill,参考原论文 Fig.2。

二、核心方法

2.1 模型总公式

MANO继承SMPL的建模范式,将手部网格表示为形状参数 β \boldsymbol{\beta} β 和姿态参数 θ \boldsymbol{\theta} θ 的函数:

M ( β , θ ) = W  ⁣ ( T ˉ + B S ( β ) + B P ( θ ) ,    J ( β ) ,    θ ,    W ) M(\boldsymbol{\beta}, \boldsymbol{\theta}) = W\!\left(\bar{\mathbf{T}} + B_S(\boldsymbol{\beta}) + B_P(\boldsymbol{\theta}),\; \mathbf{J}(\boldsymbol{\beta}),\; \boldsymbol{\theta},\; \mathcal{W}\right) M(β,θ)=W(Tˉ+BS(β)+BP(θ),J(β),θ,W)

其中:

  • T ˉ ∈ R 778 × 3 \bar{\mathbf{T}} \in \mathbb{R}^{778 \times 3} Tˉ∈R778×3 为平均模板网格(rest pose)
  • B S ( β ) B_S(\boldsymbol{\beta}) BS(β) 为形状混合形变(Shape Blend Shapes)
  • B P ( θ ) B_P(\boldsymbol{\theta}) BP(θ) 为姿态混合形变(Pose Blend Shapes)
  • J ( β ) ∈ R 16 × 3 \mathbf{J}(\boldsymbol{\beta}) \in \mathbb{R}^{16 \times 3} J(β)∈R16×3 为依赖形状的关节位置
  • W ( ⋅ ) W(\cdot) W(⋅) 为线性蒙皮函数(LBS)
  • W ∈ R 778 × 16 \mathcal{W} \in \mathbb{R}^{778 \times 16} W∈R778×16 为蒙皮权重矩阵

2.2 形状空间:PCA降维

从31个受试者的扫描中,通过PCA提取主成分:

B S ( β ) = ∑ n = 1 ∣ β ∣ β n S n B_S(\boldsymbol{\beta}) = \sum_{n=1}^{|\boldsymbol{\beta}|} \beta_n \mathbf{S}_n BS(β)=n=1∑∣β∣βnSn

其中 S n ∈ R 778 × 3 \mathbf{S}_n \in \mathbb{R}^{778 \times 3} Sn∈R778×3 为第 n n n 个形状主成分, β ∈ R 10 \boldsymbol{\beta} \in \mathbb{R}^{10} β∈R10 为形状系数。仅10个参数即可解释绝大部分个体间变异(手掌宽窄、手指长短粗细)。

关节位置同样是形状的线性函数:

J ( β ) = J  ⁣ ( T ˉ + B S ( β ) ) \mathbf{J}(\boldsymbol{\beta}) = \mathcal{J}\!\left(\bar{\mathbf{T}} + B_S(\boldsymbol{\beta})\right) J(β)=J(Tˉ+BS(β))

J \mathcal{J} J 为从顶点到关节的线性回归矩阵。

2.3 姿态混合形变:捕获非刚性效应

纯LBS在关节弯曲处会产生"糖果纸"(candy wrapper)伪影。MANO引入姿态相关的修正项:

B P ( θ ) = ∑ n = 1 9 K ( R n ( θ ) − R n ( θ ∗ ) ) ⋅ P n B_P(\boldsymbol{\theta}) = \sum_{n=1}^{9K} (R_n(\boldsymbol{\theta}) - R_n(\boldsymbol{\theta}^*)) \cdot \mathbf{P}_n BP(θ)=n=1∑9K(Rn(θ)−Rn(θ∗))⋅Pn

其中 R n ( θ ) R_n(\boldsymbol{\theta}) Rn(θ) 为各关节旋转矩阵的元素(展开为 9 × 15 = 135 9 \times 15 = 135 9×15=135 维), θ ∗ \boldsymbol{\theta}^* θ∗ 为rest pose, P n \mathbf{P}_n Pn 为从训练数据中学得的混合形变基。

物理直觉:当手指弯曲时,掌面肌肉隆起、关节处皮肤褶皱------这些非刚性变形被编码在 B P B_P BP 中。

2.4 线性蒙皮(LBS)

最终网格顶点由标准线性蒙皮生成:

t i ′ = ∑ k = 1 K w k , i ⋅ G k ( θ , J ) ⋅ t i \mathbf{t}'i = \sum{k=1}^{K} w_{k,i} \cdot G_k(\boldsymbol{\theta}, \mathbf{J}) \cdot \mathbf{t}_i ti′=k=1∑Kwk,i⋅Gk(θ,J)⋅ti

其中 w k , i w_{k,i} wk,i 为顶点 i i i 关于关节 k k k 的蒙皮权重, G k G_k Gk 为关节 k k k 的全局变换矩阵(通过运动链累积), t i \mathbf{t}_i ti 为加入形状和姿态修正后的顶点位置。

2.5 姿态PCA(Pose Synergies)

由于45维姿态空间中大量组合物理上不可能(如小指单独反向弯曲),MANO提供姿态PCA空间:

θ = θ ∗ + C ⋅ α \boldsymbol{\theta} = \boldsymbol{\theta}^* + \mathbf{C} \cdot \boldsymbol{\alpha} θ=θ∗+C⋅α

C ∈ R 45 × n c o m p \mathbf{C} \in \mathbb{R}^{45 \times n_{comp}} C∈R45×ncomp 为姿态主成分矩阵, α \boldsymbol{\alpha} α 为低维姿态编码(通常取6-15维即可覆盖自然手势空间)。这为手部重建提供了强正则化。

三、模型规格与工程实现

3.1 模型参数一览

参数 维度 说明
网格顶点 778 三角面片1538个
关节数 16 15指关节 + 1腕关节
姿态参数 θ \boldsymbol{\theta} θ 45 (+ 3全局旋转) 15关节 x 3 axis-angle
形状参数 β \boldsymbol{\beta} β 10 PCA系数
姿态混合形变 778 x 3 x 135 每个旋转矩阵元素对应一个基
蒙皮权重 778 x 16 每顶点对16关节的权重
训练数据 ~1000扫描 31受试者,多种姿态

3.2 PyTorch实现(manopth)

python 复制代码
import torch
from manopth.manolayer import ManoLayer

# 初始化MANO层(右手,使用姿态PCA)
mano_layer = ManoLayer(
    mano_root='mano/models',
    use_pca=True,
    ncomps=45,       # PCA分量数
    flat_hand_mean=False
)

batch_size = 2
# 姿态参数(PCA空间)和形状参数
pose = torch.randn(batch_size, 45)   # 或 ncomps 维
shape = torch.randn(batch_size, 10)  # beta

# 前向传播:输出顶点和关节
vertices, joints = mano_layer(pose, shape)
# vertices: (B, 778, 3)
# joints:   (B, 16, 3)

核心前向计算流程:
#mermaid-svg-bviGskh0Lm0gWAvU{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-bviGskh0Lm0gWAvU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bviGskh0Lm0gWAvU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bviGskh0Lm0gWAvU .error-icon{fill:#552222;}#mermaid-svg-bviGskh0Lm0gWAvU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bviGskh0Lm0gWAvU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bviGskh0Lm0gWAvU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bviGskh0Lm0gWAvU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bviGskh0Lm0gWAvU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bviGskh0Lm0gWAvU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bviGskh0Lm0gWAvU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bviGskh0Lm0gWAvU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bviGskh0Lm0gWAvU .marker.cross{stroke:#333333;}#mermaid-svg-bviGskh0Lm0gWAvU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bviGskh0Lm0gWAvU p{margin:0;}#mermaid-svg-bviGskh0Lm0gWAvU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bviGskh0Lm0gWAvU .cluster-label text{fill:#333;}#mermaid-svg-bviGskh0Lm0gWAvU .cluster-label span{color:#333;}#mermaid-svg-bviGskh0Lm0gWAvU .cluster-label span p{background-color:transparent;}#mermaid-svg-bviGskh0Lm0gWAvU .label text,#mermaid-svg-bviGskh0Lm0gWAvU span{fill:#333;color:#333;}#mermaid-svg-bviGskh0Lm0gWAvU .node rect,#mermaid-svg-bviGskh0Lm0gWAvU .node circle,#mermaid-svg-bviGskh0Lm0gWAvU .node ellipse,#mermaid-svg-bviGskh0Lm0gWAvU .node polygon,#mermaid-svg-bviGskh0Lm0gWAvU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bviGskh0Lm0gWAvU .rough-node .label text,#mermaid-svg-bviGskh0Lm0gWAvU .node .label text,#mermaid-svg-bviGskh0Lm0gWAvU .image-shape .label,#mermaid-svg-bviGskh0Lm0gWAvU .icon-shape .label{text-anchor:middle;}#mermaid-svg-bviGskh0Lm0gWAvU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bviGskh0Lm0gWAvU .rough-node .label,#mermaid-svg-bviGskh0Lm0gWAvU .node .label,#mermaid-svg-bviGskh0Lm0gWAvU .image-shape .label,#mermaid-svg-bviGskh0Lm0gWAvU .icon-shape .label{text-align:center;}#mermaid-svg-bviGskh0Lm0gWAvU .node.clickable{cursor:pointer;}#mermaid-svg-bviGskh0Lm0gWAvU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bviGskh0Lm0gWAvU .arrowheadPath{fill:#333333;}#mermaid-svg-bviGskh0Lm0gWAvU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bviGskh0Lm0gWAvU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bviGskh0Lm0gWAvU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bviGskh0Lm0gWAvU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bviGskh0Lm0gWAvU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bviGskh0Lm0gWAvU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bviGskh0Lm0gWAvU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bviGskh0Lm0gWAvU .cluster text{fill:#333;}#mermaid-svg-bviGskh0Lm0gWAvU .cluster span{color:#333;}#mermaid-svg-bviGskh0Lm0gWAvU 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-bviGskh0Lm0gWAvU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bviGskh0Lm0gWAvU rect.text{fill:none;stroke-width:0;}#mermaid-svg-bviGskh0Lm0gWAvU .icon-shape,#mermaid-svg-bviGskh0Lm0gWAvU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bviGskh0Lm0gWAvU .icon-shape p,#mermaid-svg-bviGskh0Lm0gWAvU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bviGskh0Lm0gWAvU .icon-shape .label rect,#mermaid-svg-bviGskh0Lm0gWAvU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bviGskh0Lm0gWAvU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bviGskh0Lm0gWAvU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bviGskh0Lm0gWAvU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输入: β(10D), θ(45D)
Shape Blend Shapes

T + Σ βn·Sn
Joint Regression

J = J_regressor × V_shaped
Pose Blend Shapes

Σ (Rn-Rn*) · Pn
V_posed = V_shaped + Bp
Forward Kinematics

计算全局变换 Gk
Linear Blend Skinning

Σ wk·Gk·vi
输出: 778顶点 + 16关节

3.3 可微分特性

manopth的关键设计是全流程可微 。梯度可以从输出网格反向传播到 ( β , θ ) (\boldsymbol{\beta}, \boldsymbol{\theta}) (β,θ),使其能直接嵌入深度学习流水线:

  • 回归任务 :CNN输出 ( β , θ ) (\boldsymbol{\beta}, \boldsymbol{\theta}) (β,θ),MANO层生成网格,与GT顶点计算L2 loss
  • 优化任务 :给定2D关键点,通过梯度下降优化 ( β , θ ) (\boldsymbol{\beta}, \boldsymbol{\theta}) (β,θ) 使重投影误差最小

四、MANO生态与下游应用

MANO从数据采集到下游应用的完整生态链

图 2:MANO完整生态。从左到右:数据采集(1000扫描)→ 统计学习(PCA/混合形变/蒙皮优化)→ MANO核心模型及衍生(SMPL+H、SMPL-X)→ 下游任务(手部重建、手物交互、AR/VR、机器人抓取)。重绘自 design skill。

4.1 主要衍生模型

模型 关系 特点
SMPL+H MANO + SMPL body 手体联合建模
SMPL-X SMPL+H + FLAME face 全身表情手部统一
HTML MANO + appearance 带外观的手部模型
NIMBLE MANO启发 骨骼+肌肉+皮肤分层建模

4.2 下游Benchmark

数据集 规模 任务
FreiHAND 130K训练 + 3960评估 单手重建
InterHand2.6M 2.6M帧 双手交互
HO-3D 手-物交互 抓取姿态估计
DEX-YCB 1000序列 抓取重建
GRAB 全身抓取 手体协同

4.3 典型下游方法

  • HaMeR (CVPR 2024):Transformer回归MANO参数,单张RGB图输入
  • HandOccNet:遮挡感知的手部网格恢复
  • FrankMocap:实时全身(含手)运动捕捉
  • ARCTIC:双手-物体交互建模

小结

MANO的核心贡献在于将统计形状建模(SMPL范式)成功迁移到手部领域:

  1. 数学优雅:形状PCA + 姿态混合形变 + LBS三层叠加,各司其职,总共仅55个参数控制778顶点网格
  2. 工程友好:可微分设计使其无缝嵌入PyTorch/TensorFlow流水线,成为3D手部重建事实上的标准表示
  3. 生态完整:FreiHAND/InterHand/HO-3D等主流benchmark均以MANO参数为GT格式

局限性

  • 778顶点分辨率较低,指尖/指甲等细节表达不足
  • 线性蒙皮在极端姿态下仍有伪影(如拇指对掌)
  • 缺乏显式的接触/碰撞建模

个人判断 :MANO作为2017年的工作,至今仍是手部建模的事实标准(类似SMPL之于人体)。后续的NIMBLE、DART等尝试超越但均未形成生态替代。对于工程应用,直接使用manopthsmplx是最稳妥选择;对于研究,理解其PCA+混合形变+LBS的三层架构是进入手部相关方向的必经之路。

相关推荐
闻道且行之3 小时前
Hair Segmentation:MediaPipe 头发分割模块 CMake 独立编译
c++·人工智能·深度学习·神经网络·opencv·计算机视觉
zhqh1003 小时前
MOT16数据集做目标检测的预处理(类别合并与清理)
人工智能·目标检测·计算机视觉
Σίσυφος190012 小时前
激光三角 光平面标定-多高度误差分析
人工智能·计算机视觉·平面
zhangfeng113317 小时前
计算机视觉vc 3D 希尔伯特曲线 基础介绍,人工智能
人工智能·计算机视觉·3d
CV-deeplearning18 小时前
YOLO26 正式发布!6 大任务一战封神,n 模型 mAP 40.9 跑 1.7ms,从检测到分割到姿态一条龙
yolo·目标检测·计算机视觉·ultralytics·yolo26
CC数学建模21 小时前
2026年江西省研究生数学建模竞赛1题:空间数据分析中的过拟合识别完整思路、代码、模型、文章,全网首发高质量分享!
python·算法·数学建模
Tian_Hang1 天前
Linux基础知识(四)
linux·ide·驱动开发·计算机视觉·硬件工程·动画
逻辑君1 天前
Foresight研究报告【20260023】
人工智能·深度学习·机器学习·数学建模
茜茜数模1 天前
2026年江西省研究生数学建模竞赛赛题1 全套获奖级解决方案 全套成品word论文+代码+思路+结果图表
数学建模