Summary——BodyNet: Volumetric Inference of 3D Human Body Shapes

本文介绍了一个端到端模型,可从一张照片得到3D人体。模型包括四个子网络,分别预测2D pose、2D分割、3D pose和3D shape,采用多视角—重映射损失进行fine - tune,用相关信息监督训练。不过,该模型存在训练图片理想化、深度二义性等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Research question:从一张照片得到3D人体

(本文是训练的是端到端模型,特意查了一下end-to-end的概念:与之对应的是多步骤解决问题,即一个问题拆分成多个步骤分布解决。而端到端的是由输入端的数据直接得到输出端的结果,即一端数据,一端结果。

对应本文就是输入一张图片(data),直接输出3D人体(result))

Contributions:

  • 体素表示来估计人体形态
  • 多视角—重映射损失来 fine-tune。用2D pose,2D分割以及3D pose信息来监督训练。
  • 网络完全可微,并可做体素化人体分割

Empirics:

SURREAL、UP、MPII

Methods:

BodyNet结构如下:

包括四个子网络,分别预测2D pose、2D 分割、 3D pose 以及 3D shape。

  1. 输入图片,输出 2D pose 。
  2. 输入图片,输出 2D 分割。
  3. 输入图片 + 2D pose + 2D 分割结果,输出 3D pose。
  4. 输入图片 + 2D pose + 2D 分割结果 + 3D pose,输出 3D shape。

 

 

(1)2D pose 网络

用热图表示2D pose,对每个关节分别预测热图,每个二维高斯分布以关节点位置为中心,有固定偏差。最终关节点位置就是每个输出通道(这里的通道不是RGB通道,而是对应每个关节点的通道,有16个)的最大值的像素索引。用两个堆叠的hourglass网络,将3×256×256的RGB特征图像映射到热图16×64×64,预测16个身体关节。真值和热图的平方误差记为\mathfrak{L}_{j}^{2D}

(2)2D part 分割网络

结构和2D pose 网络类似,也堆叠两个hourglass网络。输入RGB图片,为每个body part 输出一张热图,输出结果分辨率为15×64×64(15个body part)。空间交叉熵损失记为\mathfrak{L}_{s}

(3)3D pose 网络

堆叠两个hourglass网络。

估计3D 关节点位置存在二义性问题。为缓解不确定性,假定相机内参已知,并在相机坐标系预测3D pos。将二维热图的概念扩展到三维,将3D高斯定义在体素网格上。

对于每个关节点,以它的位置为中心,用单独3D高斯分布定义固定分辨率的体积 。网格的xy轴和图片坐标对齐,z轴代表深度。

体素网格与3D人体配准,所以根关节点也对应3D体积的中心。定义人体深度范围,大概85cm,划分为19bins,即,三维网格分辨率为注意这里的3D pose分辨率是304×64×64(304=16×19,有16个关节点,每个关节点划分为19个bins),大小是输入图片的四分之一。每个关节点的平方误差为\mathfrak{L}_{j}^{3D}

该网络也堆叠两个hourglass网络,这里的输入是图片 + 2D pose + 2D 分割结果,即有三个输入,要将它们串联起来。

2D pose和2D 分割结果是热图,分辨率分别为16×64×64和15×64×64,比图片分辨率小,无法直接串联,所以对它们上采样,结果分辨率为16×256×256和15×256×256,串联它们,输入就是(3+16+15)×256×256。

加入2D 分割信息的意义:2D pose提供关节点xy坐标信息,2D 分割隐含关节点深度信息。因为不像剪影,body part的遮挡关系能提供很强的3D 线索。如手臂分割引起的躯干不连续,是因为手在身前。

(4)体素化推断 3D 人体——3D shape网络

堆叠两个hourglass网络。

本文用体素来表示人体。给定一个3D人体,以根关节点(臀部)为中心,所有在体内的体元标记为占用。缩放3D体素,使3D人体的xy平面与2D 分割配准,保证与输入图片空间对应。在缩放之后,body以z轴为中心,剩下的区域用0做padding。

网络得到输出,经过sigmoid函数后,最小化交叉熵损失:

\mathfrak{L}_{v}=\sum_{x=1}^{W}\sum_{y=1}^{H}\sum_{z=1}^{D}V_{xyz}log\hat{V}_{xyz}+(1-V_{xyz})log(1-\hat{V}_{xyz})

其中 V_{xyz}\hat{V}_{xyz}分别表示真值和预测体素。这里W=128,H=128,D=128,即人体的空间分别率是128*128*128,文章认为这能表示足够的细节。损失L_{v}用于前景—背景分割,即区分该体素是否在人体内部,即是否被占用。子网络结构如下:

RGB、2D pose、2D segmentation的空间分辨率都是256×256,四分之一下采样后得到与3D pose 分辨率相同的64×64,即可将四个信息直接串联,输出结果分辨率为64×64,经过双线性插值,ReLU、3×3卷积,得到最终3D shape的分辨率128×128×128。

另外,本文还有另一个应用,即3D人体分割,将L_{v}扩展到多类交叉熵损失,定义人体为6个部分(头、躯干、左/右腿、左/右手臂),第7类为背景。该扩展能使网路直接推断3D part,而不需要经过难算的SMPL模型。

(5)fine-tuning过程

肢体的置信度一般比躯干低,为解决这个问题,用2D 重投影(re-projection loss)损失,增加边界体素的重要性。\hat{S}^{FV}是沿着z轴投影体素网格到平面上,可看作体素的主视图。\hat{S}^{SV}则是沿着x轴投影,可看作体素的左视图。

\hat{S}^{FV}=\underset{z}{max}\hat{V}_{xyz}\hat{S}^{SV}=\underset{x}{max}\hat{V}_{xyz}

S^{FV}由数据集2D真值的part分割提供。而体素表示左视图的真值由3D网格真值计算而得:{S}^{SV}=\underset{x}{max}\hat{V}_{xyz}

因为只要体元和表面有交叉,它就会被标记为占用,所以最终的体素化表示比原始网格大。按视角定义二元交叉熵损失如下:

\mathfrak{L}_{p}^{FV}=\sum_{x=1}^{W}\sum_{y=1}^{H}S(x,y)log\hat{S}^{FV}(x,y)+(1-S(x,y))log(1-\hat{S}^{FV}(x,y))

\mathfrak{L}_{p}^{SV}=\sum_{x=1}^{H}\sum_{y=1}^{SV}S(y,z)log\hat{S}^{SV}(y,z)+(1-S(y,z))log(1-\hat{S}^{SV}(y,z))

一开始训练shape网络用的是(4)中的\mathfrak{L}_{v},之后fine-tuning该网络,使用二者结合的损失函数:\lambda _{v}\mathfrak{\mathfrak{L}}_{v}+\lambda_{p}^{FV}\mathfrak{L}_{p}^{FV}+\lambda_{p}^{SV}\mathfrak{L}_{p}^{SV}

(6)总体损失函数和训练细节

子网络开始都由各自loss函数分开训练,再用总体损失函数,联合fine-tuned:

L=\lambda_{j}^{2D}\mathfrak{L}_{j}^{2D}+\lambda _{s}\mathfrak{\mathfrak{L}}_{s}+\lambda_{j}^{3D}\mathfrak{L}_{j}^{3D}+\lambda _{v}\mathfrak{\mathfrak{L}}_{v}+\lambda_{p}^{FV}\mathfrak{L}_{p}^{FV}+\lambda_{p}^{SV}\mathfrak{L}_{p}^{SV}

权重系数定为(\lambda_{j}^{2D},\lambda _{s},\lambda_{j}^{3D},\lambda _{v},\lambda_{p}^{FV},\lambda_{p}^{SV})\propto (10^{7},10^{3},10^{6},10^{1},1,1),保证在fine-tuning之前,每个loss平均梯度在同一尺度上,并保证\lambda_{j}^{2D}+\lambda _{s}+\lambda_{j}^{3D}+\lambda _{v}+\lambda_{p}^{FV}+\lambda_{p}^{SV}=1

一开始在SURREAL上设定权重,之后的实验都应用它们。文章发现这样很有必要,保证网络不遗忘中间task,并同时提高所有工作的performance。

网络整体训练过程如下:

  • 训练2D pose和分割网络
  • 固定2D pose和分割网络权重,训练3D pose网络
  • 固定前三个子网络的权重,训练3D shape网络
  • 用额外的重投影损失继续训练3D shape网络
  • 用总体loss fine-tuning整个网络

(7)

在一些应用中,仍需要人体的3D表面网格,或是参数化模型,便于认为修改。所以得到体素化人体后,需要代入SMPL模型,得到SMPL的形状参数,pose参数。损失函数是权重chamfer distance加上3D关节点的2-范数距离。步骤如下:

  • 提取预测体素的等值面
  • 拟合SMPL模型参数

输出的分辨率为128*4*4,经过三个全连接层得到一个10维向量,该向量即为SMPL模型的形状参数。

Constructive critiques:

首先本文用的训练和测试图片,基本都是沿着人的bounding box裁剪过的,便于网络识别,现实照片不会这么理想。在支撑材料就提到了一些 failure case ,如果图片里有多人干扰,恢复出的人体也是畸形的。

除此之外,深度二义性也无法避免。预测的 3D 人体从图片视角看上去是准确的,但把人体转换了角度再观察,发现完全不是那么回事,这个人体的 pose 没有从原视角看起来那么准确了。

<think>好的,我需要帮助用户了解如何使用PoseC3D进行行为识别。首先,我需要先理解PoseC3D的基本信息。根据用户提供的引用[2],PoseC3D是一种基于3D-CNN的骨骼动作识别方法,它使用3D热图体积作为输入,解决了GCN方法在鲁棒性、互操作性和可扩展性方面的限制,并且在准确性和效率上都优于GCN方法。 接下来,用户询问的是使用教程或实现方法。我需要先查看提供的引用,尤其是引用[1]中的GitHub仓库链接,因为通常代码库会包含相关的文档和示例。引用[1]指向的是https://github.com/kennymckormick/pyskl,这可能就是PoseC3D的实现代码库。用户可能需要指导如何安装和使用这个仓库中的代码。 根据常见的开源项目结构,用户可能需要按照README文件中的步骤进行安装和配置。通常步骤包括克隆仓库、安装依赖项、准备数据集、运行训练或测试脚本。此外,引用[4]提到了UCF101数据集的预处理,这可能与PoseC3D的数据准备有关,因为UCF101是一个常用的动作识别数据集。 我需要确保回答涵盖以下几个关键点: 1. 环境配置:安装PyTorch、MMAction2等依赖。 2. 数据预处理:如何将视频或骨骼数据转换为3D热图体积,可能需要参考引用[4]中的预处理步骤。 3. 模型训练:使用提供的脚本进行训练,可能需要调整参数。 4. 模型推理:使用训练好的模型进行行为识别。 5. 相关资源:如GitHub仓库、文档链接等。 同时,我需要确保回答中的LaTeX格式正确,例如变量使用$...$,独立公式用$$...$$。另外,需要生成相关问题,这可能涉及PoseC3D的优势、数据准备、性能优化等。 还要注意用户提供的引用[3]是一个实时动作识别的学习笔记,可能与PoseC3D的结合使用或优化有关,但当前用户主要问的是使用教程,所以可能不需要深入这部分,但可以作为相关问题提及。 最后,确保回答结构清晰,分步骤说明,并正确引用提供的资料,比如在提到代码库时引用[^1],提到PoseC3D方法时引用[^2]。</think>### PoseC3D 行为识别实现方法详解 PoseC3D 是一种基于3D卷积神经网络(3D-CNN)的骨骼动作识别方法,通过将人体关键点转换为3D热图体积进行高效建模[^2]。以下是具体实现步骤: --- #### **1. 环境配置** - **依赖库安装** 需要安装PyTorch、MMAction2(OpenMMLab的多模态动作识别工具包)及相关依赖: ```bash pip install torch torchvision pip install mmaction2 git clone https://github.com/kennymckormick/pyskl # PoseC3D官方代码库 cd pyskl && pip install -r requirements.txt ``` --- #### **2. 数据预处理** - **输入数据格式** PoseC3D 的输入为3D热图体积,需将原始骨骼关键点(如OpenPose检测结果)转换为热图。 **关键步骤**: 1. 提取视频中的骨骼关键点坐标(如$x$, $y$, $z$坐标)。 2. 对每个关键点生成3D高斯热图,公式为: $$H(x,y,z) = \exp\left(-\frac{(x-x_0)^2 + (y-y_0)^2 + (z-z_0)^2}{2\sigma^2}\right)$$ 其中$(x_0, y_0, z_0)$为关键点真实坐标,$\sigma$控制热图范围。 3. 堆叠所有关键点的热图形成输入体积(维度示例:$T \times K \times H \times W \times D$,$T$为时间步,$K$为关键点数)[^2]。 - **数据集准备** 以UCF101为例,需将视频分割为训练集和测试集,并提取帧图像或骨骼数据[^4]。 --- #### **3. 模型训练** - **配置文件修改** 在`pyskl/configs/posec3d`中选择配置文件(如`slowonly_r50_ucf101.py`),指定数据集路径和超参数。 - **启动训练** ```bash python tools/train.py configs/posec3d/slowonly_r50_ucf101.py --work-dir work_dir ``` 模型将自动加载预训练权重并优化分类损失。 --- #### **4. 模型推理** - **测试脚本** ```bash python tools/test.py configs/posec3d/slowonly_r50_ucf101.py checkpoints/model.pth --eval top_k_accuracy ``` - **实时应用** 可结合YOWOv2等实时检测框架(参考[^3])实现视频流行为识别。 --- #### **5. 性能优化建议** - **轻量化设计**:使用更小的3D-CNN(如SlowOnly-Res50)平衡速度与精度。 - **数据增强**:随机裁剪、时序插值提升泛化能力。 - **多模态融合**:结合RGB视频与骨骼数据进一步提高准确率。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值