基于稠密对应关系的3D人体网格回归技术详解

📌 前言

从单张2D图像估计人体的3D网格模型是计算机视觉领域的重要任务,在增强现实(AR)、人机交互、动作识别等应用中有着广泛的应用前景。然而,现有方法大多依赖CNN提取的全局图像特征来重建3D网格,忽略了网格表面与图像像素之间的稠密对应关系,导致重建效果不够理想。

本文将详细解读CVPR 2020论文《3D Human Mesh Regression with Dense Correspondence》,该论文提出了一种名为DecoMR的模型无关框架,通过在UV空间中显式建立网格与局部图像特征之间的稠密对应关系,实现了更精确的3D人体网格重建。


1. 研究背景与动机

1.1 现有方法的局限性

现有的3D人体网格估计方法主要分为两类:

基于模型的方法(Model-based)

  • 代表方法:HMR、SPIN、CMR等
  • 核心思路:回归SMPL模型参数
  • 局限性:参数空间对网络学习不够友好,表征能力受限于预定义的人体模型

模型无关方法(Model-free)

  • 代表方法:BodyNet(体素表示)、CMR(Graph-CNN)、DenseBody(UV位置图)
  • 局限性:仍然依赖全局图像特征,缺乏网格与图像之间的稠密对应关系

1.2 核心问题

如图所示,传统方法(如SPIN和CMR)从全局图像特征向量重建3D网格,丢失了网格表面与图像像素之间的稠密对应关系:

复制代码
传统方法流程:
输入图像 → CNN提取全局特征 → SMPL参数/Graph-CNN → 3D网格
           ↑
        丢失了局部对应关系

关键洞察:输入与输出之间的稠密对应关系对于各类视觉任务至关重要,但在3D网格表示中这种对应关系是缺失的。


2. DecoMR框架详解

2.1 整体架构

DecoMR框架由两个核心组件构成:

  1. 稠密对应网络(CNet,Correspondence Net):在图像空间工作,预测IUV图像并提取局部特征

  2. 定位网络(LNet,Location Net):在UV空间工作,回归位置图生成3D网格

    整体流程:
    输入图像 → CNet → IUV图像 + 局部特征图

    UV特征迁移

    LNet → 位置图(Location Map) → 3D人体网格

2.2 核心创新:连续UV映射

2.2.1 SMPL默认UV映射的问题

SMPL模型的默认UV映射将人体网格分割成多个独立的部分放置在UV平面上,这破坏了原始网格表面的邻接关系:

  • 手臂与手掌在UV平面上距离较远
  • 不同身体部位之间的连接关系丢失
  • 对网络学习不友好
2.2.2 新型连续UV映射的设计

DecoMR提出了一种保持更多邻接关系的连续UV映射:

设计步骤

  1. 将模板网格切割成开放网格,同时保持整个网格表面为一个整体
  2. 使用面积保持的3D网格平面参数化算法,最小化UV映射与原始网格表面之间的面积失真
  3. 通过对称轴对齐和UV坐标平均来保持对称顶点的对称性

量化对比

UV映射类型 2D相关系数(S1) 余弦相似度(S2)
SMPL默认 0.2132 0.8306
DecoMR 0.7758 0.9458

其中,S1计算公式为:

S1=∑m∑n(Amn−Aˉ)(Bmn−Bˉ)∑m∑n(Amn−Aˉ)2∑m∑n(Bmn−Bˉ)2S_1 = \frac{\sum_m\sum_n(A_{mn}-\bar{A})(B_{mn}-\bar{B})}{\sqrt{\sum_m\sum_n(A_{mn}-\bar{A})^2}\sqrt{\sum_m\sum_n(B_{mn}-\bar{B})^2}}S1=∑m∑n(Amn−Aˉ)2 ∑m∑n(Bmn−Bˉ)2 ∑m∑n(Amn−Aˉ)(Bmn−Bˉ)

其中A和B分别是原始网格和UV映射的顶点距离矩阵。

2.3 稠密对应网络(CNet)

CNet采用编码器-解码器架构:

编码器

  • 主干网络:ResNet50
  • 输出:局部特征图 Fim\mathcal{F}_{im}Fim + 全局特征向量 + 相机参数

解码器

  • 结构:上采样卷积层 + 跳跃连接
  • 输出1:人体掩码(前景/背景分类)
  • 输出2:前景像素的UV坐标(构成IUV图像)

损失函数

LIUV=λcLc+λrLr\mathcal{L}_{IUV} = \lambda_c\mathcal{L}_c + \lambda_r\mathcal{L}_rLIUV=λcLc+λrLr

其中:

  • Lc\mathcal{L}_cLc:二值交叉熵损失(前景/背景分类)
  • Lr\mathcal{L}_rLr:L1回归损失(UV坐标预测)

2.4 顶点坐标回归(LNet)

2.4.1 特征迁移

通过预测的IUV图像,将图像空间的特征迁移到UV空间:

FUV(u,v)=Fim(x,y)\mathcal{F}{UV}(u,v) = \mathcal{F}{im}(x,y)FUV(u,v)=Fim(x,y)

其中(x,y)(x,y)(x,y)是被分类为前景的像素坐标,(u,v)(u,v)(u,v)是预测的UV坐标。

关键优势 :迁移后的特征图FUV\mathcal{F}_{UV}FUV与输出的位置图在UV空间中完美对齐。

2.4.2 位置图回归

LNet是一个轻量级CNN,输入包含:

  • 迁移后的局部图像特征
  • 扩展的全局图像特征
  • 参考位置图

位置图损失

Lmap=∑u∑vW(u,v)⋅∥X(u,v)−X^(u,v)∥1\mathcal{L}_{map} = \sum_u\sum_v W(u,v) \cdot \|X(u,v) - \hat{X}(u,v)\|_1Lmap=u∑v∑W(u,v)⋅∥X(u,v)−X^(u,v)∥1

其中WWW是权重图,远离躯干的区域被赋予更高的权重。

3D关节损失

LJ3D=∑ik∥Zi−Z^i∥1\mathcal{L}_J^{3D} = \sum_i^k \|Z_i - \hat{Z}_i\|_1LJ3D=i∑k∥Zi−Z^i∥1

2D投影损失

LJ2D=∑ik∥vi(zi−z^i)∥22\mathcal{L}_J^{2D} = \sum_i^k \|v_i(z_i - \hat{z}_i)\|_2^2LJ2D=i∑k∥vi(zi−z^i)∥22

2.4.3 一致性损失

为了提高3D网格与图像的对齐精度,引入一致性损失:

Lcon=∑(x,y)∥(x,y)−π(X(u,v),c)∥22\mathcal{L}{con} = \sum{(x,y)} \|(x,y) - \pi(X(u,v), c)\|_2^2Lcon=(x,y)∑∥(x,y)−π(X(u,v),c)∥22

其中π(X,c)\pi(X,c)π(X,c)表示使用相机参数ccc的投影函数。

原理:通过IUV图像将位置图从UV空间迁移回图像空间,投影后的2D坐标应该与原始像素坐标一致。

2.5 总体损失函数

L=LIUV+LLoc+λconLcon\mathcal{L} = \mathcal{L}{IUV} + \mathcal{L}{Loc} + \lambda_{con}\mathcal{L}_{con}L=LIUV+LLoc+λconLcon

其中:

  • LLoc=Lmap+LJ3D+LJ2D\mathcal{L}{Loc} = \mathcal{L}{map} + \mathcal{L}_J^{3D} + \mathcal{L}_J^{2D}LLoc=Lmap+LJ3D+LJ2D

3. 实验结果与分析

3.1 数据集

数据集 类型 用途
Human3.6M 大规模室内数据集 训练+评估
UP-3D 室外3D姿态数据集 训练
SURREAL 合成数据集 训练+评估
LSP 2D姿态基准 分割评估

3.2 与SOTA方法对比

Human3.6M测试集结果(MPJPE-PA,mm)

方法 MPJPE-PA
SMPLify 82.3
HMR 56.8
CMR 50.1
DenseRaC 48.0
SPIN 41.1
DecoMR 39.3

SURREAL数据集结果(平均顶点误差,mm)

方法 Surface Error
SMPLify++ 75.3
BodyNet 73.6
DecoMR 56.5

3.3 消融实验

不同输入配置对比(Human3.6M)

UV映射 全局特征 局部特征 原始像素 MPJPE-PA (P2)
SMPL 49.1
SMPL 44.8
SMPL 42.6
Ours 47.1
Ours 42.3
Ours 39.3

关键发现

  1. 局部特征比全局特征带来更大的性能提升
  2. 结合全局和局部特征效果最佳
  3. 迁移原始像素的改进远小于迁移特征(缺乏姿态信息)
  4. 连续UV映射在所有配置下均优于SMPL默认UV映射

3.4 失败案例分析

典型失败情况包括:

  • 训练集中罕见的极端姿态
  • 不常见的视角
  • 严重的自遮挡
  • 多人交互导致的混淆

4. 方法优势总结

特性 传统方法 DecoMR
特征利用 仅全局特征 全局+局部特征
对应关系 隐式/缺失 显式稠密对应
UV映射 SMPL默认(不连续) 连续UV映射
邻接保持
网格细节 一般 更精细

5. 核心代码实现思路

5.1 UV特征迁移

python 复制代码
def uv_transfer(feature_map, iuv_image, uv_map_size):
    """
    将图像空间特征迁移到UV空间
    
    Args:
        feature_map: 图像空间特征图 [B, C, H, W]
        iuv_image: 预测的IUV图像 [B, 3, H, W]
        uv_map_size: UV映射尺寸
    
    Returns:
        transferred_feature: UV空间特征图 [B, C, uv_H, uv_W]
    """
    B, C, H, W = feature_map.shape
    transferred_feature = torch.zeros(B, C, uv_map_size, uv_map_size)
    
    # 获取前景掩码
    foreground_mask = iuv_image[:, 0] > 0  # I通道 > 0表示前景
    
    # 获取UV坐标
    u_coords = iuv_image[:, 1]  # U通道
    v_coords = iuv_image[:, 2]  # V通道
    
    # 迁移特征
    for b in range(B):
        fg_pixels = foreground_mask[b]
        u = (u_coords[b][fg_pixels] * uv_map_size).long()
        v = (v_coords[b][fg_pixels] * uv_map_size).long()
        
        # 从图像空间采样特征并放置到UV空间
        transferred_feature[b, :, v, u] = feature_map[b, :, fg_pixels]
    
    return transferred_feature

5.2 位置图到3D网格

python 复制代码
def location_map_to_mesh(location_map, uv_coords):
    """
    从位置图重建3D网格
    
    Args:
        location_map: UV空间位置图 [B, 3, H, W]
        uv_coords: 每个顶点的UV坐标 [N, 2]
    
    Returns:
        vertices: 3D顶点坐标 [B, N, 3]
    """
    B = location_map.shape[0]
    N = uv_coords.shape[0]
    
    # 双线性插值获取顶点坐标
    vertices = F.grid_sample(
        location_map,
        uv_coords.unsqueeze(0).unsqueeze(0).expand(B, -1, -1, -1),
        mode='bilinear',
        align_corners=True
    )
    
    return vertices.squeeze(2).permute(0, 2, 1)  # [B, N, 3]

5.3 一致性损失计算

python 复制代码
def consistency_loss(location_map, iuv_image, camera_params):
    """
    计算一致性损失
    
    Args:
        location_map: 预测的位置图
        iuv_image: GT IUV图像
        camera_params: 相机参数
    
    Returns:
        loss: 一致性损失值
    """
    # 获取前景像素的图像坐标
    foreground_mask = iuv_image[:, 0] > 0
    image_coords = get_pixel_coordinates(foreground_mask)  # (x, y)
    
    # 获取对应的UV坐标
    uv_coords = iuv_image[:, 1:3][foreground_mask]
    
    # 从位置图获取3D坐标
    coords_3d = sample_from_location_map(location_map, uv_coords)
    
    # 投影到图像平面
    projected_2d = project_to_image(coords_3d, camera_params)
    
    # 计算L2损失
    loss = F.mse_loss(projected_2d, image_coords)
    
    return loss

6. 应用场景与展望

6.1 应用场景

  • 增强现实(AR):虚拟试衣、虚拟人物叠加
  • 人机交互:机器人理解人体姿态和形状
  • 视频编辑:人体动作捕捉与重定向
  • 健身运动分析:姿态分析与动作纠正
  • 安防监控:人体检测与追踪

6.2 未来研究方向

论文指出,未来工作可以关注:

  • 重建超越现有人体模型的表面细节(如衣物褶皱、发型等)
  • 处理多人场景中的相互遮挡问题
  • 提升对极端姿态和罕见视角的鲁棒性

7. 总结

DecoMR通过以下创新解决了3D人体网格估计中缺乏稠密对应关系的问题:

  1. 连续UV映射:设计了保持更多邻接关系的UV映射,使网络学习更加友好
  2. 显式稠密对应:通过IUV图像和特征迁移,在UV空间建立图像特征与网格表面的稠密对应
  3. 局部特征利用:充分利用局部图像特征而非仅依赖全局特征,提升重建细节

实验表明,DecoMR在多个公开基准测试上取得了当时的SOTA性能,证明了显式建立稠密对应关系对于3D人体网格估计的重要性。


参考文献

  1. Zeng W, Ouyang W, Luo P, et al. 3D Human Mesh Regression with Dense Correspondence[C]//CVPR 2020.
  2. Loper M, et al. SMPL: A skinned multi-person linear model[J]. TOG, 2015.
  3. Kanazawa A, et al. End-to-end recovery of human shape and pose[C]//CVPR 2018.
  4. Kolotouros N, et al. Learning to reconstruct 3D human pose and shape via model-fitting in the loop[C]//ICCV 2019.
  5. Guler R A, et al. DensePose: Dense human pose estimation in the wild[C]//CVPR 2018.

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔!有任何问题欢迎在评论区讨论交流!

相关推荐
蚁巡信息巡查系统3 小时前
网站信息发布再巡查机制怎么建立?
大数据·人工智能·数据挖掘·内容运营
qq_532453534 小时前
使用 GaussianSplats3D 在 Vue 3 中构建交互式 3D 高斯点云查看器
前端·vue.js·3d
CoLiuRs4 小时前
Image-to-3D — 让 2D 图片跃然立体*
python·3d·flask
2501_941337065 小时前
蓝莓成熟度自动检测与分类_基于YOLO11-C3k2-AdditiveBlock-CGLU的深度学习实现
深度学习·分类·数据挖掘
新启航光学频率梳6 小时前
特种爆破装置传爆深孔孔深光学3D轮廓测量-激光频率梳3D轮廓技术
科技·3d·制造
Lun3866buzha6 小时前
涡轮叶片表面缺陷识别与分类使用YOLOv8与特征金字塔共享卷积详解及代码实现
yolo·分类·数据挖掘
OLOLOadsd1236 小时前
改进YOLO11-EMBSFPN-SC用于矿石矿物识别分类原创
人工智能·分类·数据挖掘
赤狐先生6 小时前
NO.1一个线性回归模型 - 用colab的第一步
算法·回归·线性回归
高洁016 小时前
基于Transformer的人工智能模型搭建与fine-tuning
人工智能·算法·机器学习·数据挖掘·知识图谱