图宾根虚拟人类笔记-全-
图宾根虚拟人类笔记(全)
001:人体模型导论与历史 🧍♂️📜

在本节课中,我们将学习构建人体模型的关键要素,以及如何将模型与数据拟合。我们将特别回顾早期工作的历史,这些工作引领我们走到了今天这一步。


概述
人类自文明伊始,其生活就围绕着与他人的互动和感知展开。人体和人际互动在历史上被无数次描绘。人类通过触摸、操控来改变世界,通过互动建立关系、寻找爱情、缔结友谊、舞蹈和影响他人。为了让计算机成为人类的全面伙伴,它们需要能够“看见”我们,即理解我们的互动、意图、手势、肢体语言以及我们与世界的互动。如果计算机能够“看见”我们,它们就能通过观察来了解我们。
由于人类是许多应用和社交互动的核心,因此有大量应用需要虚拟人类也就不足为奇了。例如,自动驾驶需要理解人类行为以避免事故;人机交互需要理解我们的意图和情感;虚拟/增强现实需要能够无缝、沉浸式地跨全球沟通,这都需要在所谓的“元宇宙”中再现难以区分的虚拟人类。
当然,大型科技公司对投资虚拟人类非常感兴趣,这反映在该领域的大量招聘上。虚拟人类同样也是任何需要3D内容创作的应用所必需的,例如3D电影常利用虚拟人类来制作特效,并且我们希望这个过程尽可能快速高效。
然而,目前许多令人印象深刻的虚拟化身演示都是针对特定个体的,需要长时间制作和昂贵的设备,难以规模化。因此,研究的目标是民主化人体模型的创建,使其尽可能易于访问和快速。为此,我们需要超越个性化模型,构建能够泛化到人群的统计模型。
虚拟人类的构成要素
当谈到虚拟人类时,我们通常考虑外观或行为,并倾向于将这两者分开思考。


- 外观:指我们看起来的样子,即如何构建表面和外观,使其看起来像真人。这些虚拟模型应该像真人一样移动和看起来真实,并且易于控制、动画制作和拟合数据。
- 行为:指人类如何与3D世界互动。这需要将人置于3D环境的背景中进行感知,而不仅仅是孤立地看待。如果我们能够感知人类在3D世界中的行为,就可以构建能够在3D世界中自主互动的虚拟人类模型,并合成适应不同环境的、看起来真实的人类动作。
建模外观和建模行为这两个目标是相互关联的。一个是计算机视觉目标(训练计算机“看见”),另一个是计算机图形学任务(训练化身模仿我们)。这两个领域之间的界限并不十分清晰,因为很多时候解决一个问题需要同时解决另一个问题。
从图像中感知人类的挑战
为什么从图像中感知人类对计算机来说很困难?挑战在于:
- 深度丢失:从2D投影中估计3D深度非常困难。
- 姿态复杂:人类姿态存在于一个高维度的复杂空间中。
- 遮挡:人与人之间或人体自身的部位相互遮挡。
- 其他因素:低对比度、噪声、不同背景、不同体型(儿童、瘦弱、肥胖等)、各种光照条件以及穿着衣物等。
因此,从视觉数据中建模人类是一个极具挑战性的问题,也是计算机视觉领域的核心问题之一。
人体模型的历史回顾
回顾历史,看看早期的模型以及最初构建的人体模型是什么样子,是非常有趣的。这有助于我们了解思想是如何发展的,以及哪些想法在当时取得了突破。
早期影响与关键点追踪
该领域的一个关键影响是Johansson的工作。他在论文中指出,用描述主要关节运动的少量亮点来表示活体的运动,10到12个这样的元素就足以唤起人类行走、奔跑、舞蹈等活动的强烈印象。确实,这些关键点能唤起人类的印象,但显然缺失了很多信息。在某种程度上,这些缺失的东西正是我们在本课程中感兴趣建模的内容。然而,关键点追踪一直是计算机视觉中的主导范式,是进行更复杂工作的基础。
但问题是,关键点就足够了吗?
- 首先,关节在图像中并不可见,它们不是直接可观测的。
- 其次,如果我们想模拟与他人的互动,需要考虑接触,而接触世界的是皮肤表面,而不是关节。
- 最后,我们对其他人的印象不仅基于姿态,还基于面部表情、体型甚至衣着。
从数据推断人体模型的三个组成部分
从数据推断人体模型可以归结为三个组成部分,多年来这些部分变化不大:
- 运动参数化(运动学):定义人体模型如何移动,即用运动模型参数化一些基元或表面。
- 形状定义(身份):定义人的身份。模型从使用简单的圆柱体发展到使用基于神经网络的复杂表面表示。
- 推断(拟合):如何将模型拟合到观测数据。推断技术发生了显著变化,早期工作基于生成式优化或粒子滤波器,现在则主要基于神经网络或其与优化的结合。
推断的目标是找到模型参数 x(控制姿态、形状和身份)的最大后验概率,给定一些观测数据(如图像 I)。这通常通过最大化似然乘以先验来实现。早期技术主要基于优化(如梯度下降、二阶方法或基于粒子的优化)。
大多数算法的步骤相似:从图像中提取特征(如轮廓、边缘),尝试用模型复现这些特征(称为分析综合法),然后通过优化参数来对齐模型与图像特征。
人体模型发展历程
让我们看看人体模型的发展简史:
- 约45年前:Hinton的论文使用基于矩形的木偶,并尝试将其拟合到关键点。论文指出,孤立地拟合每个矩形会产生歧义,但以整体方式联合考虑所有矩形可以获得更好的解释。
- 早期模型:Nevatia、Binford、Marr和Nishihara等人提出了基于圆柱体的基元集合,并建立了如何使这些圆柱体适应不同形状的理论,然后将其拟合到距离扫描仪数据。
- 1983年:Hogg的开创性工作首次将3D人体模型拟合到图像。模型基于将模型线与图像中检测到的边缘进行匹配,这是一个生成式方法。
- 随后十年:该领域进展缓慢。
- 1994-2004年:研究重新兴起,人们能够复现Hogg的结果。出现了使用更精细基元(如超二次曲面)的工作,例如Cerveri等人的工作。Plankers和Fua使用隐式球体来近似人体形状。
- 1999年:Blanz和Vetter的人脸可变形模型取得了突破。他们通过扫描大量人脸,构建了人脸几何、反照率和光照的统计模型,既能合成新面孔,也能通过拟合模型参数从图像重建人脸。这项工作质量极高,至今仍可与当前先进技术媲美。
- 身体扫描与统计模型:将人脸模型方法扩展到身体面临更大挑战,因为身体更复杂、可变性更大。首个身体扫描仪由Cyberware建造。1999年左右,美国军方进行了一项调查,扫描了2000名男性和2000名女性,创建了CAESAR数据集,这对构建身体模型至关重要(尽管其人口代表性有限)。
- 开创性身体模型工作:Allen等人的工作展示了可以通过将模板配准到每个扫描数据来构建统计模型。他们首次建立了身体形状的统计模型,这一思想至今仍很流行,也是SMPL模型的核心。
- 2005年:SCAPE模型取得突破。它建模了形状统计,并使用单个主体建模了身体如何根据姿势变形(如弯曲肘部时肘部的变形)。这是第一个在形状身份和动画质量上都相当真实的模型。
- 其他模型:还有如Allen的模型(包含许多SMPL的组件)、Hasler等人的模型(基于骨骼集合)和T-pose模型(基于姿态和形状的张量分解)等。
- 2010年左右:当时没有广泛可用的人体模型。为了追踪,研究者需要扫描特定主体,手动插入骨架,这是一个非常繁琐的过程。也存在一些无骨架或混合骨架的自由变形模型,它们更灵活但也更脆弱。
总结

本节课我们一起回顾了构建虚拟人类模型的核心要素及其重要性,并深入探讨了人体模型的发展历史。我们从早期基于关键点和简单几何基元的模型,看到了向数据驱动的统计模型(如人脸和身体的可变形模型)的重大转变。历史表明,一个成功的模型需要很好地平衡运动参数化、形状定义和高效的数据拟合能力。当前的研究正致力于构建能够泛化、高真实感且易于从消费级设备数据中重建的模型。在接下来的课程中,我们将更深入地探讨这些模型的技术细节。
002:人体模型介绍与课程概述

在本节课中,我们将学习虚拟人体模型的基本概念、构建方法以及本课程将要涵盖的核心主题。我们将从人体模型的历史与现状入手,逐步深入到其数学原理、数据采集与处理,并预览后续课程内容。
人体模型简介
上一节我们简要回顾了人体模型的发展历史。本节中,我们来看看当前最先进的人体模型是什么样子。
早期的人体模型要么未公开,要么不易使用,这阻碍了其在学术界和工业界的广泛应用。一个理想的虚拟人体模型应满足以下要求:
- 它是一个简单的身体形状数学模型。
- 它看起来和动起来都应像真人。
- 它应该是低维度且可微分的,以便拟合到观测数据。
- 它应包含关节,以支持动作解释。
- 它应易于动画制作和数据拟合。
- 它应与标准图形工具(如 Maya)兼容。
数据采集与3D扫描
若想模拟软组织或衣物的非刚性变形,静态扫描仪是不够的。下图展示的是蒂宾根大学感知系统系微动作实验室建造的动态扫描仪,它能够以高时空分辨率捕捉运动中的人体三维形状。

该扫描仪从多个视角、以高帧率捕捉人体,并基于这些多视角图像重建出3D形状。构建人体模型的基本思路与Alan和Angelngeo在Scape项目中的工作类似:收集数千个不同体型和姿态的人体扫描数据,并将其合成为一个数学函数。
模型构建原理
我们希望学习一个数学函数 M,它接收一组参数(如姿态、形状、软组织、外观),并输出可以渲染为逼真人体的模型顶点。
本质上,我们将整个人体表示为一个3D网格,该网格被分割成多个部分,每个部分在一个运动学树中旋转。这建立在经典的骨骼动画理念之上。一个典型的网格可能包含约7000个顶点,相当于21000个数字。但大多数顶点组合并不对应真实的人体,只是随机数据。因此,我们的任务是学习一个数学函数,它能接收一组低维参数,并生成对应真实人体的顶点组合。
模型的分解与参数化
构建虚拟人体模型时,将其分解为姿态变形和形状变形是有用的。这样我们可以分别合成不同的姿态和形状,然后将这些因子组合起来,生成任意姿态下的任意人体。
模型参数化的是相对于模板网格的偏差。我们可能还对其他因子感兴趣,例如呼吸或软组织动力学,这就需要参数化那些能解释此类变化的位移。
数据配准:关键挑战
构建这些模型遇到的第一个问题是,3D扫描数据是未配准的,它们是没有语义信息的点云。这意味着我们不知道哪些点对应脸部,哪些点对应躯干。没有语义信息,就很难进行统计分析。
通常的做法是,将一个公共模板配准到所有扫描数据上,然后基于此构建统计模型。配准指的是优化模板参数,使其与扫描的3D点云对齐。为每个扫描都执行此操作,就能将所有扫描数据带入良好的对应关系中。
良好的配准对于构建优质人体模型至关重要,但这一步非常困难。原因包括:
- 歧义性:高分辨率扫描与低分辨率模板匹配时,单个模板点可能对应多个扫描点。
- 缺乏特征:人体许多部位缺乏鲜明特征,容易混淆不同点。
- 复杂姿态与自接触:某些姿态需要良好的初始化才能收敛,自接触现象使配准更加困难。
本课程中,你将通过一个专门练习学习如何自己完成配准。

从配准数据到统计模型
配准完成后,将所有形状归一化到一个标准姿态中至关重要。这样我们可以在不考虑姿态影响的情况下研究身体形状的统计特性。然后,每个形状可以被视为一个向量,从而使用线性代数技术计算统计量。

例如,下图展示了来自CAESAR数据集的2000名男性和2000名女性的平均形状。

建模身体形状统计量时,我们可以使用线性高斯模型或PCA模型。形状基向量是相对于模板的位移集合。将所有形状(处于相同姿态)放入一个矩阵,然后对该矩阵执行主成分分析,我们就能用少数几个主成分解释大部分形状方差。

公式:形状 = 平均形状 + 形状基向量矩阵 * 形状系数β
通常,仅需10个左右的β系数就能解释人群中90%以上的形状差异,这大大降低了参数维度。

SMPL模型:业界标准
目前学术界和工业界广泛使用的标准模型是SMPL模型。它主要基于计算机图形学中沿用多年的标准蒙皮技术。

SMPL模型参数化了标准蒙皮中的某些组件(如模板、关节位置)与低维姿态、形状参数之间的关系。其核心思想是学习一个函数,接收低维的姿态参数θ和形状参数β,输出顶点位置。
以下是SMPL模型的关键组成部分:
- 模板网格:在标准姿态下的平均人体网格。
- 形状混合形状:改变人物身份的位移,由形状参数β控制。
- 姿态混合形状:解释肌肉膨胀等姿态相关变形的位移,由姿态参数θ控制。
- 混合权重:定义身体各部分如何刚性移动的权重,从数据中学习得到。
- 关节回归器:一个将网格顶点映射到关节位置的矩阵。


通过从配准的扫描数据中学习这些参数,以最小化表面到表面的误差,我们就能得到SMPL模型。
超越基础形状:表情、手部与软组织
对于许多应用,我们不仅关心形状和姿态,还关心表情、身体语言等。SMPL模型对此是不够的。

因此,出现了如SMPL-X这样的模型,它包含了手部和面部。构建面部和手部模型的技术与构建身体模型的技术非常相似。面部模型将形状、姿态和表情因子分离开来。手部模型(如MANO)也遵循类似SMPL的统计建模原理。



此外,若要建模软组织,需要在模型中添加控制软组织的组件。这需要从动态扫描数据中学习。
课程内容概述
到目前为止,你应该对构建人体模型所需的工作有了大致了解。接下来,我们预览本课程将涵盖的主题。
第二讲:图像形成与表示
我们将学习如何从图像和视频等视觉观测中恢复人体模型。为此,首先需要理解图像是如何形成的。内容将涉及图像形成原理、不同的旋转参数化方法以及表面表示方式。
第三讲:人体模型构建细节
我们将更技术性地深入探讨如何构建像SMPL这样的基于顶点的人体模型,包括其数学形式以及如何从数据中学习它们。
数据拟合与模型配准
我们将学习如何将人体模型拟合到扫描数据,即之前讨论的关键的配准过程。你将在练习中亲自实践。

从图像中推断人体模型
这是单图像三维重建的任务。我们将看到基于优化的方法、基于神经网络回归的方法,以及结合两者优势的混合方法。

基于可穿戴传感器的运动捕捉
在没有外部相机的情况下(如户外运动、跨房间追踪、VR应用),可以使用附着在身体上的惯性测量单元。我们将学习如何仅基于少数IMU数据恢复全身运动。
衣物建模
为了产生真实感,需要考虑衣物建模。
- 基于顶点位移的方法:如ClothCap,将衣物作为单独的网格层进行跟踪和转移。
- 隐式表面与神经表示:为了处理更复杂的衣物和拓扑变化,近期工作转向使用神经网络参数化的隐式表面(如SDF),或神经辐射场。
- NeRF:一种将场景的3D几何和外观存储在神经网络中的方法,通过查询空间点的密度和颜色进行渲染。
行为与交互
我们将研究如何追踪与物体和3D场景交互的人体,构建能够理解场景可供性、合成与场景交互的人类运动模型,最终向构建能够感知并自主与3D场景交互的虚拟人类迈进。
总结
本节课中,我们一起学习了虚拟人体模型的基本概念。我们了解了理想模型的特征、通过动态扫描采集数据的过程、模型构建中关键的配准步骤,以及如何使用统计方法(如PCA)从数据中学习形状和姿态变化。我们还介绍了业界标准的SMPL模型及其核心组件,并预览了本课程将深入探讨的多个前沿主题,包括从图像中恢复模型、衣物建模、神经表示以及人体与场景的交互。在接下来的课程中,我们将对这些主题进行详细的技术性探讨。


003:图像形成过程

在本节课中,我们将学习图像是如何形成的。虽然这是一门虚拟人类课程,但我们常常需要从图像中提取三维人体模型。为了做到这一点,我们首先需要理解图像是如何形成的,真实人物在图像中如何呈现,以及会发生哪些投影效应。我们将从线性透视的直观介绍开始,然后将其形式化,并学习如何用一个投影矩阵来表达整个图像形成过程的几何部分。
线性透视与自然透视
上一节我们介绍了课程目标,本节中我们来看看图像形成的基础——透视原理。
自然透视是指世界中的特征在观察者眼中所张成的视觉角度。其直观事实是:距离更远的物体看起来具有更小的视觉角。这意味着,当物体靠近观察者时,观察者看到的物体张角会增大。
然而,仅凭自然透视不足以绘制出正确的图像。为了将三维场景正确投影到二维图像上,需要考虑线性透视。
线性透视由菲利波·布鲁内莱斯基于1413年发现。它指出,透视图像是由物体发出的光线与一个画面平面(或画布)相交形成的。与自然透视类似,物体离观察者越近,在图像中显得越大。但这种比例关系与自然透视不同。
我们可以用相似三角形来数学描述线性透视。假设物体高度为 H,观察者到图像平面的距离为 f(即焦距),物体到观察者的深度为 Z。根据相似三角形关系,可以得到图像中的高度 y 为:
y = H * f / Z
从这个公式可以得出几点重要结论:
- 投影不是关于物体坐标的线性映射,因为存在除以 Z 的运算。
- 物体越远(Z 越大),在图像中显得越小。
- 焦距 f 越大,物体在图像中显得越大。
消失点与透视效应
由于线性透视不是线性映射,三维世界中的平行线在图像中可能不再平行。随着物体远离相机,它们会显得越来越小,导致平行线汇聚于所谓的“消失点”。
以下是关于消失点的几个关键事实:
- 一幅透视图中可以有无限多个消失点,每一组不平行于视线的平行线都会汇聚到一个消失点。
- 平行于画面平面的直线不会汇聚,在图像中保持平行。
一个有趣的问题是:当观察一个非常长的建筑物正面(视线垂直于该平面)时,其远端在透视图中是否应该比中心部分画得更小?答案是否定的。因为在这种情况下,建筑物各部分的深度 Z 没有变化。根据线性透视公式 y = H * f / Z,当 Z 恒定时,图像高度 y 也恒定。因此,在正确的线性透视图中,建筑物的远端不会变小。如果看起来变小,那是由于观察图画时的自然透视(视觉角变化)造成的,而非图画本身的透视错误。
另一个常见现象是:为什么有时看一幅透视画会觉得扭曲?通常是因为观看距离不对。要正确观看一幅透视画,你需要站在与作画时相机位置相对应的距离上,以尊重其原始的透视关系。
相机模型:从针孔到透镜
理解了透视原理后,我们来看看实现它的物理设备——相机。
最简单的相机模型是针孔相机。光线通过一个小孔,在另一侧的传感器上形成倒立的图像。针孔相机能产生正确的线性透视,并且所有景物都在焦点上。但其主要问题是进光量太少,导致图像非常暗。
为了解决进光量问题,可以增大孔径。但这会导致图像模糊,因为传感器上的每个点会接收到来自物体上多个点的光线,形成一个光锥。
透镜解决了这个问题。透镜可以将从物体同一点发出的光线聚焦到传感器的一个点上,同时允许大量光线进入。因此,现代相机使用透镜代替针孔。透镜有两个基本原理:
- 平行于光轴的光线穿过透镜后,会汇聚在焦点上,该点到透镜的距离称为焦距 f。
- 穿过透镜中心的光线不会发生偏折。
基于这两个原理,我们可以推导出透镜公式,它描述了物体距离 S₀、像距 Sᵢ 和焦距 f 之间的关系:
1/S₀ + 1/Sᵢ = 1/f
这个公式告诉我们,为了对特定距离的物体清晰对焦,需要如何调整传感器与透镜之间的距离。与针孔相机不同,透镜只能使一个平面上的物体完美对焦,这个距离称为对焦距离。
焦距与视野
在计算机视觉的针孔相机模型中,我们使用的焦距 f 是指投影中心到图像平面的距离。而在物理透镜模型中,焦距 f 是透镜本身的属性,不依赖于传感器位置。在实践中,计算机视觉通常使用简化的针孔模型。
焦距 f 和传感器尺寸共同决定了相机的视野。视野 FOV 可以通过以下公式计算:
FOV = 2 * arctan( (传感器尺寸/2) / f )
由此可见:
- 焦距 f 越小,视野 FOV 越宽(广角镜头)。
- 焦距 f 越大,视野 FOV 越窄(长焦镜头)。
- 传感器尺寸越小,视野 FOV 也越小。
焦距的不同会带来显著的透视效果差异。例如,用广角镜头(短焦距)拍摄人像时,需要靠近被摄体以使其在画面中大小合适,但这会夸大近大远小的透视效果,导致鼻子显得很大。而用长焦镜头(长焦距)拍摄时,摄影师会远离被摄体,这减少了不同深度部位(如鼻子和耳朵)之间的透视差异,使人脸看起来更平坦。
在电影摄影中,有一种叫“Dolly Zoom”或“Vertigo Effect”的技巧,就是在移动摄影机的同时改变焦距,使画面中某个主体的大小保持不变,而背景的透视关系发生剧烈变化,产生眩晕感。
图像形成的数学形式化
现在我们已经对图像形成有了直观理解,接下来让我们用数学来形式化这个过程。我们的目标是用一个单一的投影矩阵来表达整个图像形成过程。
图像形成涉及一系列坐标变换:
- 从世界坐标到相机坐标。
- 从相机坐标到图像坐标(通过透视投影)。
- 从图像坐标到像素坐标。
1. 世界坐标到相机坐标
世界坐标是描述三维场景的全局坐标系。相机坐标是以相机光学中心为原点、光轴为Z轴的坐标系。两者之间的变换是一个刚体变换,包括旋转 R 和平移 t。一个世界点 P_w 转换到相机点 P_c 的公式为:
P_c = R * P_w + t
这个变换可以用一个4x4的齐次坐标矩阵来表示。
2. 透视投影:相机坐标到图像坐标
这是核心的投影步骤。根据之前推导的相似三角形原理,相机坐标系中的点 (X, Y, Z) 投影到图像平面上的点 (x, y) 的公式为:
x = f * X / Z
y = f * Y / Z
这里 f 是焦距。注意,这个变换不是线性的,因为涉及除以 Z。为了用矩阵表示,我们引入齐次坐标。齐次坐标下,一个二维点 (x, y) 可以表示为三维向量 (x', y', w),其中 x = x'/w, y = y'/w。利用这一点,透视投影可以写成一个线性矩阵乘法:
[x', y', w]ᵀ = [[f, 0, 0, 0],
[0, f, 0, 0],
[0, 0, 1, 0]] * [X, Y, Z, 1]ᵀ
然后,通过除以 w(即 Z)得到最终的图像坐标:x = x'/w = fX/Z, y = y'/w = fY/Z。
3. 图像坐标到像素坐标
图像坐标是连续的,单位为毫米(或其它物理单位)。我们需要将其转换为离散的像素坐标。这涉及一个仿射变换,包括:
- 缩放:考虑像素的物理尺寸 (s_x, s_y)(毫米/像素)。
- 平移:图像平面原点(主点)通常不在像素阵列的角落,需要偏移 (o_x, o_y)。
- 轴翻转:有时像素坐标系的Y轴方向与图像坐标系相反。
因此,像素坐标 (u, v) 的计算公式为:
u = (x / s_x) + o_x
v = (y / s_y) + o_y
这也可以用一个矩阵来表示。
合成投影矩阵
将上述所有变换矩阵相乘,我们可以得到一个3x4的投影矩阵 P:
P = K * [R | t]
其中:
- [R | t] 是3x4的外参矩阵,负责世界坐标到相机坐标的刚体变换。
- K 是3x3的内参矩阵,它包含了焦距 f、主点偏移 (o_x, o_y) 和像素缩放因子 (s_x, s_y) 等信息。其常见形式为:
K = [[f/s_x, 0, o_x],
[0, f/s_y, o_y],
[0, 0, 1]]
最终,一个齐次世界点 [X_w, Y_w, Z_w, 1]ᵀ 通过以下步骤投影到齐次像素坐标 [u, v, 1]ᵀ:
[u', v', w']ᵀ = P * [X_w, Y_w, Z_w, 1]ᵀ
u = u' / w'
v = v' / w'
这个投影矩阵 P 是计算机视觉和计算机图形学中的核心工具,用于从三维世界渲染二维图像,或反之,为从图像推断三维结构提供几何约束。
正交投影:一种简化模型
当物体距离相机非常远,或者使用长焦镜头时,透视效应变得非常微弱。在这种情况下,可以忽略除以 Z 的步骤,使用一种更简单的模型——正交投影。
正交投影直接丢弃深度 Z 坐标,并将 X 和 Y 坐标按一个固定比例 s 缩放:
u = s * X
v = s * Y
用矩阵表示为:
[u, v, 1]ᵀ = [[s, 0, 0, 0],
[0, s, 0, 0],
[0, 0, 0, 1]] * [X, Y, Z, 1]ᵀ
正交投影计算简单,适用于远景或对精度要求不高的场合。但在近景下,它会错误地表示物体的相对大小,因为忽略了“近大远小”的规律。
总结
本节课中,我们一起学习了图像形成的完整过程。
我们从自然透视和线性透视的直观概念开始,理解了物体在图像中大小与距离的关系由公式 y = H * f / Z 描述。我们探讨了消失点的现象,并分析了不同观看距离对透视画感知的影响。
接着,我们研究了相机如何实现透视,从针孔相机模型到现代透镜相机模型,解释了透镜如何通过聚焦光线来解决进光量问题,并介绍了透镜公式 1/S₀ + 1/Sᵢ = 1/f。我们还明确了焦距 f 与视野 FOV 的关系,以及不同焦距带来的透视效果差异,这对理解人像摄影和三维重建至关重要。
最后,我们将整个过程数学形式化。通过引入齐次坐标,我们将非线性的透视投影表示为线性矩阵运算。我们定义了内参矩阵 K 和外参矩阵 [R | t],并将它们组合成单一的投影矩阵 P,实现了从三维世界坐标到二维像素坐标的完整映射。作为补充,我们也介绍了在特定条件下可用的简化模型——正交投影。

理解图像形成是计算机视觉(从图像恢复三维信息)和计算机图形学(将三维场景渲染为图像)的基石。掌握这些原理,是后续学习虚拟人类建模、姿态估计、三维重建等课题的关键第一步。
004:旋转与运动链

在本节课中,我们将学习如何参数化旋转和运动链,这是参数化人体运动的核心组成部分。我们将探讨旋转矩阵、欧拉角、四元数、轴角以及指数映射等不同参数化方法,并了解它们的优缺点。最后,我们将学习如何使用运动链来建模人体骨架的关节结构。
旋转参数化概述
在上一节中,我们提到建模人体运动需要关注如何参数化其运动。本节中,我们将深入探讨如何表示和处理旋转,这是描述人体姿态变化的基础。
旋转是一种线性变换,它保持角度和距离不变,且不产生镜像效果。在二维空间中,旋转是可交换的,但在三维空间中,旋转的顺序至关重要,因为它们不可交换。
旋转矩阵
旋转矩阵是表示旋转最直接的方式。它是一个3x3的矩阵,其列向量是目标坐标系基向量在参考坐标系中的表示。
公式:给定一个在身体坐标系 B 中的点 P_B,其在空间坐标系 S 中的坐标 P_S 可通过旋转矩阵 R_SB 计算:
P_S = R_SB * P_B
其中,R_SB 的列是 B 坐标系的基轴在 S 坐标系中的表示。
旋转矩阵需要9个数字,但受正交性(R^T * R = I)和行列式为1(det(R) = 1)的约束,其内在维度仅为3。这些约束在数值优化中可能带来挑战,但旋转矩阵因其由正弦和余弦函数构成,在机器学习任务中有时表现良好。
欧拉角
为了用更少的参数(三个)表示旋转,欧拉角是一种流行的方法。它将旋转分解为绕三个坐标轴(如X、Y、Z轴)的连续平面旋转。
公式:一个欧拉角旋转(以Z-Y-X顺序为例)可以表示为:
R(α, β, γ) = R_x(γ) * R_y(β) * R_z(α)
其中,R_x、R_y、R_z 分别是绕X、Y、Z轴的旋转矩阵。
欧拉角直观且易于计算导数,但它存在一个严重问题:万向节锁。当两个旋转轴对齐时,会失去一个自由度,导致参数化不唯一,这在优化和学习中是不希望的。
四元数
四元数是复数在三维空间中的推广,用于表示旋转而无万向节锁问题。一个四元数 q 包含一个实部 q_w 和三个虚部 q_x、q_y、q_z,可以紧凑地表示为 q = q_w + v,其中 v 是向量部分。
公式:单位四元数可以表示为轴角形式:
q = [cos(θ/2), sin(θ/2) * u]
其中,u 是单位旋转轴,θ 是旋转角度。
旋转一个向量 a 使用四元数乘法:
a' = q * a * q_conjugate
四元数乘法不满足交换律,这与三维旋转的特性一致。四元数非常适合旋转插值(如球面线性插值SLERP),但在优化时需要强制其范数为1的约束。
轴角与指数映射
轴角表示用三个数字(一个单位轴向量 u 和一个角度 θ)直接描述旋转,没有奇异性。指数映射提供了从轴角参数到旋转矩阵的封闭形式转换。
公式:给定轴角参数(缩放后的旋转轴 ω = θ * u),其对应的旋转矩阵 R 可以通过指数映射得到:
R = exp(θ * [ω]_×) = I + sin(θ) * [ω]_× + (1 - cos(θ)) * [ω]_×^2
其中,[ω]_× 是向量 ω 的反对称矩阵。
这种表示非常直观,导数易于计算,并且是SMPL等人体模型使用的参数化方法。
运动链
运动链用于建模如人体骨架的关节结构。它通过将多个刚体变换(旋转和平移)串联起来,描述末端效应器(如手部)相对于基础坐标系的位置。
公式:对于一个具有 n 个关节的链,末端效应器的变换 G_SB(θ) 是各个关节变换的乘积:
G_SB(θ) = exp(θ_1 * ξ_1) * exp(θ_2 * ξ_2) * ... * exp(θ_n * ξ_n) * G_SB(0)
其中,θ_i 是关节角度,ξ_i 是描述关节运动的“扭转”坐标(包含旋转轴和可能的平移)。
在解决逆运动学(如让人手到达特定位置)时,我们需要计算雅可比矩阵,该矩阵将参数空间的小变化 Δθ 映射到末端效应器空间的变化 Δx。雅可比矩阵的列由各个关节的扭转贡献构成,这使得基于梯度的优化成为可能。
总结
本节课中,我们一起学习了多种旋转参数化方法:
- 旋转矩阵:最直接的表示,但参数冗余且有约束。
- 欧拉角:直观且参数少,但存在万向节锁问题。
- 四元数:无奇异性,适合插值和累积运动,但需要单位范数约束。
- 轴角与指数映射:直观、无奇异性、导数易算,是现代人体模型(如SMPL)的基础。


我们还学习了如何使用运动链和乘积指数公式来参数化 articulated 骨架,以及如何利用雅可比矩阵进行优化以解决如逆运动学等问题。理解这些概念对于参数化和分析人体运动至关重要。
005:表面表征

在本节课中,我们将学习不同类型的表面表征方法。我们的目标是理解每种表征方式的优缺点。
概述
在之前的课程中我们简要提到,为了建模虚拟人类,你需要考虑如何参数化运动。这涉及到运动学、旋转和变换。本节课的主题将是几何学,即如何建模人的形状。我们将看到这是一个非常有趣且复杂的主题。当然,如果你想生成看起来逼真的人类,还需要考虑材质、光照、纹理等。然而,本讲座的重点将放在如何建模实际的形状,即人类和物体的一般几何结构上。
那么,我们如何描述几何形状呢?
几何表征的多种方式
以下是一些描述几何形状的可能方式。
- 你可以使用语言描述,例如“这是一个单位圆”。
- 你可以使用数学方程。例如,你可以说,这些是满足
x = cos(θ)和y = sin(θ)的 (x, y) 点。 - 你可以使用隐式方程来表示这条曲线,例如
x² + y² = 1。 - 你可以说,这是一条曲率为1的曲线,即一个圆。
- 你可以说,这是一条沿任何轴都对称的曲线。
- 你可以使用无限多条边来近似这个圆,就像一个多边形。
- 你可以使用更复杂的表示,例如,说它是某个微分方程的解。
因此,表示几何形状的方法有很多种。而表征方式的选择,实际上取决于你想要建模的对象。
几何建模的挑战与选择
让我们看一些几何形状的例子。例如,人类的面部非常重要,因为它表达情感,是交流的基本组成部分。身体也是如此。准确捕捉每一个细节至关重要,否则,在远程呈现或元宇宙等场景中,交流就会变得不自然。
观察面部,它有皱纹、嘴巴、牙齿和头发。看起来,即使是面部的不同部分,也可能需要不同的表征方式。也许网格对于建模面部是足够的,但对于头发,你可能需要另一种表征,比如某种体积表征或发丝模型。对于服装,也许你可以用网格,但如果你想处理拓扑变化和复杂的服装,可能需要使用隐式表示。我们将在本课程中看到所有这些内容。
如果你在建模服装和动力学,你必须考虑一种允许你改变形状并使形状对外力做出反应的表示。也许网格对此有好处,因为你有由边连接的顶点,这类似于实际表面的构成方式。对于像流体那样会分裂和合并的形状,网格可能不是一个好的表示。对于在不同尺度上都非常复杂的形状,例如一个完整的城市,你需要考虑可扩展性,单个网格可能不是一个好主意。或者,你可能需要建模复杂的头发,体积表示可能比仅用表面表示更合适。
鉴于所有这些选项,自然会思考编码几何形状的最佳方式是什么?这确实取决于你想要建模的对象。这是图形学和虚拟人类领域的一个反复出现的主题,没有一种最佳选择。因为几何处理本身就很困难。
显式与隐式表征
本质上,数字编码几何形状的方法有很多。我们主要有两种类型的表征:显式和隐式。
- 显式表征:例如点云、多边形网格、细分曲面、NURBS曲线等。显式意味着我们可以非常直接地访问表面上的点。
- 隐式表征:表面由一个方程或函数隐式定义,该方程或函数规定了点需要满足的约束。这里我们也有很多选择,例如需要存储的水平集、代数曲面、Blobs等。
每种选择都最适合于特定的任务。
隐式表征详解
在几何的隐式表示中,点不是直接已知的,但它们满足某种关系。例如,一个隐式曲面由方程 x² + y² + z² = 1 定义,这就是单位球体。但我们不一定需要数学方程,我们可以有一个存储在计算机中的函数,对于每个 (x, y, z),它给出一个数字来定义该点是在表面内部还是外部。例如,你可以有一个函数,如果点在外面(如图中的蓝点)则取值为0,如果在里面则取值为1。现在,表面将是所有满足 F(P) 处于内部和外部决策边界上的点。
正如我所说,隐式表示有很多种,比如代数曲面、构造实体几何、水平集、Blobs、分形等。我们将看到其中的一些表示。
隐式表面的优缺点
首先,让我们通过一个小游戏来理解隐式表面的优点和缺点。
假设我正在考虑一个隐式表面,例如 F(x, y, z) = 0,就像我之前展示的那个。我要求你:给我一个表面上的点。你可以使用 F 来评估。游戏是你可以以任何你想要的方式使用 F,任务是找到表面上的点。你该怎么做?这并不简单,因为你可以查询一个点,函数会告诉你它是在内部还是外部。但你必须查询很多点,直到找到一个实际上在边界上的点。所以,我们将展示有方法可以有效地找到边界,但它永远不会像显式方法那样高效。
让我们看看你可能感兴趣的另一个方面,例如,知道一个点是在表面内部还是外部。这在考虑相交问题时很重要,例如,你想知道一个虚拟人类是否与3D世界相交。并且你想避免穿透,例如服装和身体的穿透,能够有效地知道一个点是在表面内部还是外部很重要。
例如,如果我问你,点 (0.75, 0.5, 0.25) 是在单位球体内部还是外部?这很容易检查。我可以直接代入方程 x² + y² + z² = 1,然后我看到 x² + y² + z² 是 9/16 + 4/16 + 1/16 = 14/16 = 7/8,小于1,这意味着该点在单位球体内部。所以这非常快速和容易做到。
因此,隐式表面使得像内外测试这样的任务变得非常容易。这对于相交和穿透检测等非常有用。
显式表征详解
几何的显式表示是那些点被直接给出的表示。你有一些参数,它们参数化了表面,然后你基本上可以访问这些点。例如,球体上的点可以用以下显式参数化定义:(cos(u) * sin(v), sin(u) * sin(v), cos(v)),其中 u 和 v 在区间 [0, 2π) 和 [0, π] 内的任何值都会给我一个表面上的3D点。
通常,显式表示是从 R² 到 R³ 的映射,因为表面的内在维度是二维的。对于一个嵌入在3D中的二维表面,你可能没有整个表面的表达式,但可能有表面局部区域的表达式。我们将看到,通过拥有许多局部面片来编码表面是一种方法。
同样,在图形学中有许多显式表示,如三角形网格、细分曲面、NURBS、点云。你将看到其中的许多,并会使用其中的一些。
显式表面的优缺点
现在,让我们用显式表面玩另一个游戏。
我给你一个显式表面,你必须找到上面的点。表面是 F(u, v) = (1, 2, 3) + u * b。你如何找到表面上的点?你只需选择任何 (u, v) 值,就完成了。显式表示会直接给你表面上的点。任何 (u, v) 值对都会给我平面上的一个3D点。所以,显式表面使得像在表面上采样点这样的任务变得非常容易。
现在,我有一个新的表面 F(u, v),我想检查一个点是否在里面。例如,这是我的表面,它在这里有这个表达式,基本上是这里的这个哑铃形状,我想检查这个点实际上是在内部还是外部。嗯,这不像以前那么容易了,因为这里的这个函数只告诉我如何在表面上采样点,但它没有告诉我一个点是在内部还是外部。所以这是你无法用显式表面轻易做到的事情。
总结与比较

总之,一些表示方法比其他方法更适合,这取决于任务和你想做什么。

回到隐式表面。也许在计算机图形学中最基本和历史悠久的隐式表面用法是代数曲面。这基本上是用数学方程组合形状。所以,表面是 X, Y, Z 多项式的零集。本质上,例如,对于球体你有这个隐式方程 x² + y² + z² = 1,但如果你想要更复杂的形状,比如一个心形,你有像 (x² + (9y²)/4 + z² - 1)³ = x²z³ ... 这样的方程。你看,这不容易定义,而这只是一个简单的心形。如果你想用数学方程建模像牛或汽车这样的东西,那将非常困难。
然而,你可以通过组合更简单的形状来构造复杂的形状,这是计算机图形学中经常使用的主题。使用隐式,你可以非常容易地进行操作和组合形状,例如并集、交集和差集。它允许你非常容易地完成所有这些操作,而用显式表示则不然。如果你有两个网格,你必须找到并集形状,这并不简单。
所以,你可以基本上链接不同的操作,如并集、交集和差集等,以产生更复杂的形状。你还可以扩展这个想法,不是用布尔运算组合形状,而是以平滑的方式混合它们。为此,你可以使用例如距离函数,它给你空间中每一点到表面上最近点的距离。然后,你可以混合任意两个距离函数。
本质上,实现两个距离函数的布尔并集,你只需取两个距离函数的最小值,这将创建并集。所以,使用隐式表示组合形状是相当简单的。
使用这些基本形状,你可以组合它们来生成非常复杂的场景。虽然这在艺术上非常有趣且美丽,但很难做到,因为很难用数学方程表示世界上的每一个几何形状,即使我们组合它们,即使我们生成由更简单对象组成的场景。
解决这个问题的一种方法是使用水平集。我们已经看到隐式表面有一些很好的特性,如合并和分裂,但当然很难用封闭形式描述复杂的形状。水平集是一种替代方案,因为你可以存储一个近似函数的数值网格。本质上,你会有一个3D立方体,并为每个点(每个体素,即空间中的一个点)存储该点是在内部还是外部,或者存储到表面的距离。
这基本上是将整个函数存储在内存中,所以更灵活。你不需要数学方程,因为它都存储在那里。然而,它提供了对形状的更多控制,但你需要存储空间,并且需要大量的体素才能有足够详细的形状,这可能是个问题。这在今天可能是个问题,我们将看到这一点。
一个常见的趋势是用神经网络替换这些水平集。本质上,你不是将形状存储在这些网格中,而是使用一个神经网络,你可以查询空间中的每个3D点,它会给你到表面的距离。你可以在一个神经网络中存储许多对象,根据你对网络的调节,你会得到一个或另一个对象。例如,这是我们几年前发表的一篇论文的例子,它本质上使用一个隐式表示表面的神经网络,可以从稀疏点云恢复场景的密集点云。这里你可以看到,这是一个单一的神经网络,经过训练以完成场景。所以,这里的网络接收空间中的一个点,并输出到表面的距离。然后基于这个信息,我们可以恢复实际的表面。
我们将在后面的课程中解释为什么这是一个好主意,以及为什么这种表示对深度学习如此有益。
隐式表面在医学成像中非常广泛地使用,因为你有不同的层,这非常适合用这些体积的水平集编码。在每个“切片”上,你可能有不同的身体表面。
当然,水平集的缺点是现在你有 O(N³) 的复杂度,因为你有三个维度,所以如果你想要越来越高的分辨率,这会以立方级增长,对于存储来说不是好消息,对于处理(如果你在做学习)也是如此。你可以通过仅存储表面周围的窄带来降低成本,但这仍然是使用这些水平集的主要限制之一。
选择表示时需要考虑的另一件事是计算法线和最近点有多容易。这对于渲染通常非常重要,例如,我们需要知道法线,或者为了将一个点云注册到另一个点云,我们需要能够轻松地找到空间中点到表面的最近点。
如果你使用隐式表示并使用距离场,到表面的距离很容易,因为它由距离场本身给出。所以距离场 F(P) 给出了从 P 到 Q 的距离,其中 Q 是表面上最近的点。F(P) 已经给了我们距离,这是个好消息。现在,我们如何得到表面的法线呢?
表面上给定点 P 的法线等于这个函数 F(P) 的梯度。为什么是这样呢?F(P) 给出了到表面的距离。梯度会告诉我们距离增加最快的方向。我们知道,如果我们沿着表面移动,距离应该如何变化?它不应该改变,距离应该等于零。所以沿着表面,水平集没有变化,没有梯度。因此,垂直于这个表面的方向应该是梯度,即变化最大的方向。法线不能与这个梯度不同,因为否则意味着它在切平面上有分量,这对于法线来说是不可能的。所以这就是为什么 F(P) 的梯度等于该点的法线。这也容易计算。
对于最近点,如果你有一个距离场,事实证明有一个非常简单的公式,我们在一些研究中使用了它,它基本上是如何将一个点投影到表面,并找到给定点的最近表面点。如果我有一个点,梯度告诉我方向,因为我应该移动多少个距离单位才能落在表面上?嗯,想象查询点 P 在这里,我离表面有多远?我离表面有 F(P) 个距离单位远,所以我需要做的就是取梯度,它告诉我方向,然后乘以 F(P),即到表面的距离。我没有提到的一点很重要,在距离场中,梯度将具有单位范数。因为距离在最大变化方向上,一次只会改变一个单位。
隐式表面的优点是,如果你使用这些代数表示和Blobs,描述可以非常紧凑。很容易确定一个点是否在形状内部,你只需查询函数,它会告诉你。其他查询可能很容易,例如到表面的距离。对于简单形状,有精确的描述,没有采样误差,并且易于处理拓扑变化。
问题是,在形状中找到点很昂贵,很难知道哪些点在形状上,这不太容易做到。而且,除非你存储这些水平集或用神经网络编码形状,否则建模非常复杂的形状并不容易。
显式表征详解
那么显式表示呢?也许最简单的是点。你可以将表面表示为一个点列表 (x, y, z)。这尤其重要,因为这是任何3D扫描设备或任何计算机视觉重建算法的输出。点通常带有法线,可以轻松表示任何类型的几何形状,它们可以处理拓扑变化,因为我们实际上忽略了连接性,这有点像作弊。如果你有一个密集的点云,那么很容易渲染它。然而,在实践中,你通常有一个稀疏的点云,不容易渲染,你必须做点什么,比如在那里放置一个圆盘或球体,做一些近似,更难知道遮挡,更难推理遮挡。
这使得点云有时不太适合计算机视觉任务。而且,很难在采样不足的区域进行插值,也很难进行处理,因为你不知道什么连接着什么。例如,如果你必须考虑动力学,你不知道连接性,你不知道什么连接着什么,如果你在做服装动力学而不知道连接性,这很难做到。
一个更强大但处理起来更棘手的表示是多边形网格。你存储顶点和多边形,基本上你存储点以及告诉你这些点应该如何连接的多边形。这可能是三角形或四边形,如果你一次连接三个或四个顶点。
所以更容易进行处理和模拟,你可以进行自适应采样,所以你可以对形状的某些部分使用大量的面(我指的是三角形,有时我也会用“面”来表示三角形),对其他部分使用较少的三角形,等等。然而,数据结构可能变得更复杂,而且一般来说,处理拓扑变化确实是个问题。想象一下,我正在处理之前我们有的这个形状,这个形状分裂了。如果我使用隐式表示,没问题,因为我只是改变了 F(P)。我可以想象这可能由一个神经网络参数化,或者我把它存储在内存中的网格里,我可以只改变 F(P),这将处理拓扑变化。如果我现在用网格表示表面,从这里到这里是一个真正的痛苦,因为我必须知道分裂后的新顶点,例如,一个细胞分裂成两个,我必须知道哪些顶点现在彼此连接,跟踪这些变化非常复杂。更重要的是,这个过程是不可微分的。如果你使用隐式函数,你可以有这个分裂,一切仍然是可微的,因为我们只关心 F(P) 和 F(P) 的导数。
所以你已经可以看到隐式函数可能比显式函数更适合的地方。
要建模网格,你基本上将顶点存储为坐标三元组,然后你有三角形或面,指示如何连接这些顶点。所以它们有索引,指示哪个顶点连接到哪个其他顶点。或者对于体积,你可能有四面体,基本上由连接顶点的不同三角形定义。
那么三角形内部的点呢,你怎么知道?例如,你可以使用重心插值,这很容易做到。你有三个点,例如 P_i, P_j, P_k,如果你想知道中间的点,它们将是这些顶点上点的凸组合。所以你可能会得到三角形中间的一个点 P 为 φ_i * P_i + φ_j * P_j + φ_k * P_k。
计算法线有多容易?一个选项是你可以计算每个面的法线,这很容易做到,因为你可以考虑从 P_2 到 P_1 和从 P_3 到 P_1 的向量,你可以取叉积,这将给你平面的法线。你可以有一个每个三角形的法线。这可能看起来不太平滑,所以光照可能看起来有点三角化。
获得更平滑法线的另一个选项是插值面法线。例如,通过查看相邻三角形在顶点处插值,然后你可以使用重心插值在三角形内部插值法线。所以对于三角形内部的一个点,它的法线由 φ_1, φ_2, φ_3 这些凸系数参数化,然后它基本上是顶点 P_1, P_2, P_3 处法线的凸组合。所以,在网格中计算法线不是大问题,很容易做到。对于点云则不那么容易,对于点云你必须做点什么,通常必须进行某种局部PCA来近似法线,因为你不知道连接性。
那么距离呢?如果我们有一个参数化表面,例如这些数学表达式,对于每个 (u, v) 对,给我 (x, y, z) 点,即从 R² 到 R³ 的映射,那么我可以通过取切平面上两个向量的叉积来得到法线,即沿 u 的导数和沿 v 的导数,我可以取这两个切平面向量的叉积,就得到了法线。如何计算距离?嗯,我必须找到一个给定点的表面上的点,使得连接该点和表面上点的线段垂直于切平面,或者平行于法线。所以我需要找到点 F(u, v),使得 (Q - F(u, v)) 与法线的叉积等于0。
对于网格,你没有这种从 (u, v) 到 R³ 的数学方程映射。在那里,你通常必须找到最近的三角形,然后找到三角形中满足这个方程的最近点。为此,你需要使用一些加速,比如一些数据结构来加速搜索,以找到给定点的最近三角形。这是你必须经常做的事情,例如,当你进行配准时。
从线性到多项式:贝塞尔曲线
我们说过,对于中间的点,我们可以使用重心插值,这基本上是一种线性插值方法,其中 F 基本上是极值点处函数值的凸组合。当然,问题是,为什么我们要把自己限制在线性基函数上?这个凸组合,你可以把它看作是两个函数的线性组合。那么,我们能否用其他基得到更有趣的几何形状呢?答案是肯定的,例如,我们可以使用多项式。线性插值是一阶多项式。但我们可以使用更高阶的多项式来获得更大的灵活性。
首先想到的基基本上是 1, x, x², x³ 用于多项式。但人们通常使用伯恩斯坦基,它遵循这个方程:B(k, n, x) = C(n, k) * x^k * (1-x)^(n-k),其中 k 索引基,n 是多项式的次数,x 是0到1之间的值。为什么你想使用这样的多项式?原因是它更灵活,允许你更容易地调整高度。例如,注意只有一个基在一个端点取值为1,只有另一个基在另一个端点取值为1。所以如果我想匹配一个给定的端点,我只需要处理这些基。如果我想匹配另一个端点,我只需要处理那个基。对于通常的多项式基,情况并非如此。本质上,中间的点也是,每个基在0到1的区间内主导一个区域。
本质上,贝塞尔曲线是用伯恩斯坦基表示的曲线。为了参数化曲线,你有用 s 参数化的曲线,基本上是这些基函数的线性组合,由控制点调制。所以控制点调制不同的基。对于 n=1,我们得到一个线段。对于 n=3,我们得到这个三次贝塞尔曲线。例如,如果我们有这些控制点 P0, P1, P2, P3,我们得到的曲线将是一条平滑曲线,它插值端点 P0 和 P3,并平滑地接近其他控制点。另一个重要的特性是,曲线将在末端段相切,并且始终在凸包内。例如,这对于我们想要进行光栅化时很有用。
但是,如果我们想建模一条更复杂的曲线,比如由这些控制点给出的曲线,会发生什么?你将没有足够的自由度。如果你开始增加自由度,它不会很好地插值,很难控制,如果有太多控制点,效果就不好。那么,如果我们有很多控制点,如何解决这个问题呢?你可以做的是,基本上将许多贝塞尔曲线拼接在一起,并在连接处施加一些约束。
本质上,你将要求贝塞尔曲线在点处匹配,并且它们的切线也匹配。这个非常简单的技术被广泛使用。实际上,任何程序如PowerPoint、Illustrator、Keynote,你在屏幕上看到的每种字体都是由贝塞尔曲线组成的。所以每次你看文本时,你都在看这些贝塞尔曲线多项式。也用于文件格式等。
在数学上,你所做的是拼接所有这些贝塞尔曲线,然后基本上在一个单一的贝塞尔曲线中,区间从0到1。实际上,为了让它从0到1,我们必须做 (u - U_i) / (U_{i+1} - U_i)。所以你只需要看到,当你取值 U_i 时,我们在0,当 u 取值 U_{i+1} 时,这取值为1,所以这个小贝塞尔曲线从0到1。
为了获得无缝曲线,我们需要点和切线对齐。例如,这不是我们想要的,因为这些点没有连接。这里它们连接了,但切线不匹配,所以这是切线,你看它们不匹配。我们想要的是在点和一阶导数上都匹配的曲线。为了让它更平滑,你还可以施加二阶导数也匹配,以获得更平滑的曲线。
所以,第一个自然问题是,我们如何实现这一点?每条曲线都是三次的,所以你有以下多项式。当然,它是三次的,自然问题是,我们有多少自由度,我们有多少约束?让我们考虑一条给定的曲线。我们有这四个控制点。所以,从向量角度思考,我们有四个向量自由度。但是我们需要点和切线匹配。所以我们有两个向量约束。所以我们没问题,因为我们有足够的自由度。如果我们只关注一个连接处,对于每条曲线,我们有四个自由度,我们有两个约束。所以我们没问题。
现在,如果我想创建一个闭合循环,它还能工作吗?是的,因为对于每条曲线,我有四个自由度,我有四个约束,每端两个。所以自由度的数量仍然匹配约束的数量。这也许是使用这些三次贝塞尔曲线的一个原因。
那么对于二次或线性贝塞尔曲线,它能工作吗?不能,因为自由度不够。
从曲线到曲面:贝塞尔曲面片
但这些是曲线,问题是如何为曲面做这个?你可以利用曲线,通过做曲线之间的张量积来获得曲面片。这只是一个花哨的名字,但你基本上做的是通过将 F(u) 乘以 F(v) 来获得中间的点,这就是你获得这个 F(u, v) 函数的方式。所以现在,我们有贝塞尔曲面片,而不是贝塞尔曲线。
所以基看起来像这样,同样,你将有控制点来调制这些基中的每一个。有了控制点,你将得到不同的曲面片。所以你有这个基多项式的线性组合,权重由控制点给出。
你可以玩同样的游戏,你可以要求曲面片在连接时匹配,并且要求它们的切线匹配。这样,我们可以获得平滑的曲面。现在我们可以问和以前一样的问题:我们总能得到连续性和切线连续性(C1连续性)吗?你必须思考,这不容易回答,你必须考虑每个面片的自由度以及我有多少约束。
事实证明,如果我有一个简单的连接性,比如这里的这个东西,其中每个顶点基本上被四个面片共享,那么一切都会解决,你有足够的自由度来满足约束等等。然而,这种连接性只适用于这种连接性,但不适用于其他更复杂的连接性。事实证明,许多曲面不能用这种简单的连接性表示。实际上,任何看起来不像甜甜圈的曲面都不能用这种连接性表示,在曲面的某个点,你需要其他连接性。
贝塞尔曲线的另一个问题是,它们甚至不能表示圆锥曲线。但有一个解决方案。同样,解决方案是使用齐次坐标。这是一个有趣的想法,所以你将在连续的齐次坐标中建模曲线,然后你将进行投影到平面上以获得圆锥曲线。所以这有点像你在那里用额外的一个维度建模曲线,然后你把它投影回来。我们在图像形成中已经看到过这个想法,四元数也像是增加一个维度以便能够做新事情,所以这里再次出现。这样做的结果称为有理贝塞尔曲线。
这推动了NURBS(非均匀有理B样条)的使用。名字从何而来?首先,节点在任意位置,这就是为什么它被称为非均匀。它基于有理贝塞尔曲线,这就是为什么它被称为有理,因为你有一个商,你除以齐次坐标,正如我们在图像形成课程中看到的。你有一个分段多项式曲线,这就带来了B样条的名字。
NURBS的一个有趣特性是,齐次坐标控制顶点的强度。例如,这里我们展示了对于这些控制点,不同的齐次坐标使曲线更接近控制点,或者对于较低的权重,它更忽略控制点。如果你想要表面的一部分平滑而另一部分有尖锐的曲线,这可能很有趣。
我们如何从曲线到曲面?你猜对了,我们再次使用张量积,我们再次有相同的故事,我们可以有面片,我们可以连接它们以产生曲面,这很好,因为它们易于评估,可以产生精确的圆锥曲线,具有高度的连续性,并且仍然广泛用于医学应用和图形学。然而,它们仍然很难拼接在一起,很难编辑。
细分曲面
一个更简单或更容易控制的、自由度更少的显式表示是细分曲面。本质上,有一个有趣的特性,如果你从一些控制点开始(称为控制曲线),并反复分割边,并对现有顶点进行精心设计的平均(平均规则),你会得到一条比前一条曲线更平滑的曲线。如果你迭代这个过程,再次分割边,然后进行某种平均,有许多平均方案会产生不同的极限曲面或极限曲线。有趣的是,在极限处,你会得到一条具有可证明平滑度的漂亮的极限平滑曲线。这通常与我们之前见过的一些众所周知的样条曲线完全相同。
当然,这里你可能会问自己,细分是显式还是隐式表示?你怎么想?它没有提供立即获取表面上点的方法,你需要做一些操作。然而,你没有表示点上某些约束的函数,因此它并不是真正的隐式表面,而是一种显式表示。
细分曲面已在计算机视觉中使用,例如表示海豚的形状。这是一篇非常酷的论文,基本上直接从图像重建并建立了海豚形状的统计模型。这对于当今人体建模的许多工作非常有启发性。
当然,如何将这种细分曲线方案推广到细分曲面?你基本上有相同的过程,但你从一个控制笼开始,而不是控制曲线,然后用一些局部平均细分每个元素,有许多可能的规则,比如两个著名的是用于四边形结构的Catmull-Clark和用于三角形网格的Loop细分。然后你得到平滑的细分曲面。
细分曲面的常见问题或常见问题是,在它们是否插值控制点还是近似控制点之间存在权衡。然后你必须考虑顶点处的连续性等等。然而,它们非常容易使用,因为你完全用控制点控制形状,所以比样条和其他多项式更容易,因为你需要处理的参数更少,所以更容易控制。在某些情况下实现起来可能有点棘手,你必须设计这些平均方案等等,并计算导数。例如,点到表面的距离可能有点复杂,但可以做到。实际上它在实践中被广泛使用,获得了学院奖,并且仍然非常常用于制作动画电影。
课程总结
好的,这就是我想描述的关于表面表示的全部内容。当我们看到更先进的技术时,我们会看到更多,但这些是基础。
这些幻灯片几乎完全基于Keenan Crane的计算机图形学讲座。你可以查看那个讲座,它涵盖了我们无法涵盖的更多计算机图形学主题,我们将更专注于虚拟人类。
也许总结一下,没有最好的表面表示方法。隐式表面对于拓扑变化非常好,对于内外测试非常好。显式表面更直接地给我们点,有时变形表面更容易。这些基于多项式的显式表示被使用,在图形学、计算机视觉和机器学习中非常流行。在机器学习中它们不那么流行,因为本质上,多项式的这些基函数给了我们一些平滑特性,这些特性存在于我们感兴趣的这些形状中,但那些也可以通过神经网络学习,如果你可以直接从训练数据中学习这些特性,那么通常就不那么必要了。

本节课中,我们一起学习了表面表征的两种主要类型:显式和隐式。我们探讨了各自的优缺点、适用场景以及一些具体实现如点云、网格、贝塞尔曲线/曲面、NURBS和细分曲面。理解这些基础对于后续学习虚拟人类的几何建模至关重要。
006:普洛克路斯忒斯对齐 🧍♂️➡️🧍♂️

在本节课中,我们将学习最基础的形状对齐方法,称为普洛克路斯忒斯对齐。这是一种刚性对齐技术,用于寻找最优的缩放、旋转和平移参数,将一个源形状与一个目标形状对齐。
概述
之前我们提到,我们希望构建一个能够控制人体姿态和形状的模型。为此,我们需要收集大量不同形状和姿态的人体扫描数据。然而,这些扫描数据通常只是无序的点云。为了进行后续的统计形状分析,我们必须首先将这些数据“对齐”,即建立点与点之间的一一对应关系。本节课将介绍实现这种对齐的最基本形式——刚性对齐。
形状表示:网格
在深入对齐算法之前,我们先回顾一下三维形状的表示方法。在接下来的课程中,我们将主要使用网格来表示表面。
一个网格由两部分组成:
- 顶点:一个
n x 3的矩阵V,其中每一行代表一个顶点的(x, y, z)坐标。 - 面:一个
m x 3的矩阵F,其中每一行包含三个顶点的索引,表示一个三角形面片。
因此,网格是表面的分段线性近似,可以看作是从二维空间到三维空间的映射。
# 示例:一个简单的三角形网格
V = np.array([[0, 0, 0], # 顶点0
[1, 0, 0], # 顶点1
[0, 1, 0]]) # 顶点2
F = np.array([[0, 1, 2]]) # 一个由顶点0,1,2构成的面
刚性变换
刚性对齐的目标是找到一个刚性变换,将源形状 V 最优地对齐到目标形状 V‘。一个刚性变换由三个参数定义:
- 缩放:一个标量
s。 - 旋转:一个属于特殊正交群
SO(3)的旋转矩阵R。 - 平移:一个平移向量
t。
对一个顶点 v 应用刚性变换的公式为:
v‘ = s * R * v + t
在矩阵形式下,我们可以将变换后的所有顶点表示为:
V‘ = s * V * R^T + t
(这里 t 被广播加到每一行)。
几何上,旋转是让点绕原点转动,缩放是让点沿其与原点的连线方向移动,平移则是直接给点的坐标加上一个偏移量。
普洛克路斯忒斯问题
现在,我们正式定义要解决的问题:普洛克路斯忒斯对齐。
给定源形状点集 X(n x 3 矩阵)和目标形状点集 Y(n x 3 矩阵),我们希望找到缩放 s、旋转 R 和平移 t,以最小化以下目标函数:
E(s, R, t) = Σ_i || (s * R * x_i + t) - y_i ||^2
其中 R ∈ SO(3),即 R 是一个行列式为1的正交矩阵。
这个名字来源于希腊神话中的强盗普洛克路斯忒斯,他有一张铁床,会让过路的旅客躺上去,身高不足者会被拉长,身高超过者则会被砍掉腿脚,以“完美”适应床的长度。我们的算法只进行“拉伸”(缩放、旋转、平移),而不会“砍脚”。
奇异值分解回顾
在介绍解法之前,我们需要回顾一个核心数学工具:奇异值分解。
SVD定理指出,任何矩阵 A 都可以分解为三个矩阵的乘积:
A = U * Σ * V^T
其中:
U和V是正交矩阵。Σ是一个对角矩阵,其对角线上的元素称为奇异值。
几何上,这意味着任何线性变换都可以分解为“旋转-拉伸-再旋转”的组合。SVD将是普洛克路斯忒斯对齐算法的核心。
普洛克路斯忒斯算法
普洛克路斯忒斯对齐问题有一个闭式解,无需使用梯度下降等迭代方法。以下是算法的步骤:
-
计算中心:分别计算源形状
X和目标形状Y的质心(所有点的平均值)。
x̄ = mean(X),ȳ = mean(Y)
然后得到中心化后的点集:
X_c = X - x̄,Y_c = Y - ȳ -
计算缩放因子
s:
s = trace( X_c^T * Y_c ) / ||X_c||_F^2
其中||.||_F表示弗罗贝尼乌斯范数。这个比值给出了两个形状在尺寸上的比例关系。 -
计算旋转矩阵
R:- 计算协方差矩阵
H = X_c^T * Y_c。 - 对
H进行奇异值分解:H = U * Σ * V^T。 - 最优旋转矩阵为:
R = V * U^T。
(注意:需要检查det(R) = 1,如果为 -1,则需要对结果进行修正以确保是纯旋转)。
- 计算协方差矩阵
-
计算平移向量
t:
t = ȳ - s * R * x̄
这确保了变换后源形状的质心与目标形状的质心重合。
算法推导思路
上一节我们给出了算法的步骤,本节我们简要看看其背后的推导思路,以加深理解。推导主要分为三步:
1. 求解最优平移 t
将目标函数对 t 求导并令其为零,可以发现最优平移仅依赖于两个形状的质心,其表达式正是 t = ȳ - s * R * x̄。这意味着,在已知缩放和旋转的情况下,只需对齐质心即可得到最优平移。
2. 求解最优旋转 R
在去除平移的影响(即使用中心化后的点 X_c, Y_c)后,最小化问题可以转化为最大化 trace( R * H ),其中 H = X_c^T * Y_c。
对 H 进行SVD分解后,利用正交矩阵的性质,可以证明当 R = V * U^T 时,该迹达到最大。
3. 求解最优缩放 s
在已知最优旋转 R 后,将目标函数对 s 求导并令其为零,即可得到 s = trace( X_c^T * Y_c ) / ||X_c||_F^2 的表达式。
总结
本节课我们一起学习了普洛克路斯忒斯对齐,这是三维形状刚性对齐的基础方法。我们首先回顾了用网格表示形状的方式,然后定义了由缩放、旋转和平移构成的刚性变换。接着,我们引出了需要解决的优化问题,并介绍了核心数学工具SVD。最后,我们详细讲解了普洛克路斯忒斯算法的闭式解步骤及其背后的推导思路。该算法通过计算形状的质心、协方差矩阵及其SVD分解,高效地找到了对齐两个形状的最优刚性变换参数。

在下一讲中,我们将探讨更有趣的非刚性形状对齐方法,它能够处理更复杂的形状变形。
007:迭代最近点(ICP)算法 🎯

在本节课中,我们将学习一种比刚体变换更有趣的形状对齐方法。具体来说,我们将探讨如何非刚性地对齐形状,这与上一讲中假设已知对应关系的情况不同。我们将使用一种更通用的变换类型,并学习著名的迭代最近点算法。
从已知对应关系到未知对应关系
上一节我们介绍了Procrustes算法,它能在已知对应关系的情况下,为形状提供最优的刚体对齐。但问题是,我们通常并不知道两个形状之间的对应关系。即使知道对应关系,我们又该如何非刚性地对齐形状呢?
为了解决这些问题,我们将学习一种在计算机视觉和图形学中广泛使用的算法——迭代最近点算法。它是构建统计形状模型(如人体模型)并进行良好配准的核心工具。
寻找对应关系的挑战
我们如何找到两个形状之间的对应关系呢?一个想法是提取某种描述局部形状的特征描述符,然后在目标形状中尝试匹配。但这种方法会遇到问题:可能存在多个匹配,或者在某些缺乏显著特征的区域,对齐会变得非常困难且模糊不清。
显然,我们需要一种更全面的方法,并考虑某种初始化。接下来,我们将看到如何做到这一点。
迭代最近点算法原理
我们有以下目标函数:
E(F, C) = Σ_i min_{x_i} || F(x_i) - y_i ||^2
其中,F 是将源形状点 x 映射到新位置 F(x) 的变换函数,y_i 是目标形状上的点。x_i 表示对于目标点 y_i 在源形状上的最近点。
真正的优化问题同时涉及变换 F 和对应关系集合 C。这是一个“先有鸡还是先有蛋”的问题:找到正确的 x 依赖于当前的变换 F,而找到最优的 F 又依赖于当前的对应关系 x。
迭代最近点算法通过交替优化的方式解决这个问题:
- 固定当前变换
F^j,为每个目标点y_i在源形状上寻找最近点,更新对应关系x_i^{j+1}。 - 固定当前对应关系
x_i^{j+1},优化变换F以最小化距离Σ_i || F(x_i^{j+1}) - y_i ||^2。 - 重复迭代步骤1和2,直到收敛。
算法流程与细节
以下是迭代最近点算法的具体步骤:
- 初始化:通常将形状中心对齐是一个好的起点。
- 对应关系步骤:给定当前变换估计
F^j,计算每个目标点y_i在变换后源形状上的最近点,得到对应关系x_i^{j+1}。 - 变换步骤:使用更新后的对应关系
{x_i^{j+1}, y_i},求解最优变换F^{j+1}。对于刚体变换,可以使用Procrustes分析。 - 迭代与终止:重复步骤2和3,直到误差低于阈值或变换更新非常小。
需要注意的是,迭代最近点算法是一个局部方法,如果初始化不好,可能会收敛到不理想的局部极小值。
提升算法性能的技巧
为了提高算法的效率和鲁棒性,可以考虑以下方法:
- 加速最近点搜索:使用KD-tree等数据结构,将复杂度从
O(n^2)降低到O(n log n)。 - 采样:不使用所有点进行匹配,而是使用一部分点来计算变换。
- 方向性:始终从目标形状向源形状寻找对应关系,以避免退化解。
- 处理异常值:使用鲁棒损失函数(如Huber损失)来降低错误对应关系的影响。
- 利用法线:在寻找对应关系时结合法线信息,可以提高匹配质量。
- 点对面距离:最小化目标点到源形状表面的距离,而不是到特定顶点的距离,可以使优化过程更平滑。
扩展到非刚性变换:基于梯度的ICP
Procrustes分析给出了最优刚体变换,但如果变形模型是非刚性的呢?我们可以将迭代最近点算法推广到非刚性变形。
此时,变换 F 是一个非线性函数(例如,参数化的人体姿态模型)。在“变换步骤”中,没有闭式解。我们可以通过计算能量函数 E 关于变换参数 θ 的梯度(或雅可比矩阵)来线性化问题,然后使用梯度下降等优化方法进行求解。
更新公式可以表示为:
θ^{j+1} = θ^j - α ∇_θ E
其中 α 是学习率。对于最小二乘问题,也可以使用高斯-牛顿法或列文伯格-马夸尔特法等更高效的方法。
算法流程变为:寻找对应关系 -> 固定对应关系,执行几步梯度下降来更新变换参数 -> 重新寻找对应关系 -> 迭代。
实践中的注意事项
在实现基于梯度的迭代最近点算法时,有几个关键点:
- 参数化:变换
F由参数θ定义(如人体模型的姿态和形状参数)。梯度是针对这些参数计算的。 - 自动微分:现代深度学习框架(如PyTorch、TensorFlow)的自动微分功能可以方便地计算复杂模型的梯度,无需手动推导。
- 优化器选择:梯度下降是最基本的方法,但对于非线性最小二乘问题,使用高斯-牛顿或列文伯格-马夸尔特法等二阶近似方法通常更有效。
- 收敛性:由于能量函数对于一般变形模型是非凸的,优化可能陷入局部极小值。良好的初始化和正则化项对于获得可靠的对齐结果至关重要。
算法对比:点对点 vs 点对面
在演示中,使用点对点距离的迭代最近点算法在优化时,对应关系在参数更新步骤中被“锁定”,导致每次更新对应关系时可能产生较大的跳跃。而使用点对面距离时,在参数更新过程中,对应点可以沿着三角面片滑动,从而使整个优化过程收敛得更平滑。为了获得高质量的配准结果,需要关注这些细节。
总结与下节预告
本节课我们一起学习了迭代最近点算法的核心思想。我们了解到:
- Procrustes分析适用于已知对应关系的刚体对齐问题。
- 当对应关系未知,且需要考虑更广泛的变换类型(如非刚性变形)时,需要使用迭代最近点算法或其变种。
- 迭代最近点算法通过交替优化对应关系和变换参数来求解。
- 算法可以扩展到非刚性情况,使用基于梯度的优化方法。
- 算法的性能可以通过加速搜索、鲁棒损失、点对面距离等技巧来提升。
- 由于问题的非凸性,好的初始化和正则化对获得正确解非常重要。

在下一讲中,我们将开始学习人体模型的基础,了解其背后的数学模型以及如何从训练数据中学习它。
008:基于顶点的模型与SMPL 🧍♂️➡️🧍♀️

在本节课中,我们将学习如何构建一个身体模型,并特别聚焦于一个流行且简单的模型——SMPL。我们的目标不仅是理解SMPL的工作原理,更重要的是理解构建一个好的身体模型需要哪些关键要素。
首先,让我们回顾一下什么是身体模型。身体模型是一个函数,它接收一些输入参数并输出一个三维人体网格。在本例中,我们选择的输入参数是人的姿态和体型。我们希望这个函数能让我们以一种看起来真实的方式,独立地控制人体的姿态和体型变化。你可以固定姿态改变体型,也可以固定体型改变姿态。
这里,我们用带箭头的 θ 表示姿态参数向量,用带箭头的 β 表示体型参数向量。许多论文沿用这种表示法,因为SMPL模型最初使用了这种符号。
既然我们相信姿态和体型是控制人体形状空间的一组好参数,那么问题来了:我们应该学习什么样的函数?我们的模型形式是什么?是姿态和体型到顶点坐标的线性函数,还是多项式函数?给定一个函数形式(比如多项式),我们如何利用三维扫描的训练数据来拟合其中的超参数(比如权重 W)?
实际上,无论是线性还是多项式映射,效果都不会很好。原因在于,由关节引起的形变部分具有很强的非线性,而这部分用旋转来建模效果最好,这正是我们在第二、三讲中学到的内容。
骨架与运动学链 ⛓️
上一节我们提到了用旋转来建模姿态,本节我们来看看如何组织这些旋转。
一种直接的想法是将身体分成多个部分,每个部分用一个旋转和平移矩阵参数化。姿态就是所有部分旋转和平移的集合。但这样做有问题:这些参数彼此独立,没有约束。在优化时,各部分可能会“飞”得到处都是。
一个非常有效的约束方法是使用运动学链。运动学链本质上是用骨架来参数化人体运动,其中每个身体部分相对于其父部分旋转。要获得某个部分(例如小臂)的最终变换,你需要从该部分开始,沿着骨架链向上累积所有父部分的变换,直到根关节。
在SMPL等模型中,通常使用指数映射(轴角表示)来参数化旋转。一个旋转可以用一个轴角向量 ω 表示,其模长代表旋转角度,单位向量代表旋转轴。通过罗德里格斯公式,可以将其转换为一个3x3的旋转矩阵 R:
R = I + (sinθ) * K + (1-cosθ) * K²
其中,K 是由轴角向量 ω 生成的反对称矩阵。
在骨架中,旋转是围绕关节进行的。因此,要绕某个关节旋转一个点,需要应用一个包含旋转和平移的变换矩阵 G。其旋转部分就是上面的 R,平移部分则是将点移动到关节位置所需的向量。这个变换是局部的,它将点从子部分的坐标系转换到父部分的坐标系。
通过运动学链,我们可以累积这些局部变换,最终将身体坐标系下的点 p_b 转换到世界坐标系 p_s。
线性混合蒙皮及其问题 🎭
上一节我们介绍了如何用运动学链变换刚性的身体部分,但直接应用会导致部件连接处出现不自然的“硬”边界和折痕。
动画领域多年来使用线性混合蒙皮来缓解这个问题。其核心思想是:不再将每个顶点硬性地分配给一个身体部分,而是软性地分配给多个部分。每个顶点受多个关节变换的影响,影响程度由一组混合权重决定,所有权重之和为1。


一个顶点 v_i 的最终位置通过线性混合其关联关节的变换矩阵得到:

v_i‘ = Σ (w_{k,i} * G_k(θ)) * v_i

其中,w_{k,i} 是第k个关节对顶点i的混合权重,G_k(θ) 是该关节的变换矩阵。
这解决了连接处的平滑问题,但引入了新问题:我们是在线性组合变换矩阵,而旋转矩阵本身存在于一个非线性流形上。线性组合的结果可能不再是有效的旋转矩阵,从而导致视觉上的“糖果纸”扭曲等伪影。
此外,混合权重和关节位置通常需要动画师手动精心调整,这是一个繁琐且难以扩展到多种体型和姿态的过程。
SMPL模型:从数据中学习一切 🧠
上一节我们看到了传统蒙皮方法的局限,本节我们来看看SMPL模型如何通过数据驱动的方式解决这些问题。
SMPL(Skinned Multi-Person Linear Model)的核心哲学是:在保持行业兼容性(基于标准蒙皮)的前提下,追求最简单的模型,并从训练数据中学习所有参数。

SMPL是一个函数 M(β, θ),输入体型 β 和姿态 θ,输出一个三角网格。其流程在标准蒙皮基础上增加了两个关键部分:
- 体型混合形状:建模不同人的身份(体型)差异。
- 姿态混合形状:建模在特定姿态下,为弥补线性蒙皮缺陷和表现肌肉收缩等效果所需的顶点位移。

并且,关节位置 J 也被定义为体型 β 的函数,通过一个从静息姿态顶点回归关节位置的稀疏矩阵(关节回归器)来实现。
姿态混合形状的设计关键 🔑
姿态混合形状 B_P(θ) 被设计为姿态参数 θ 的函数。一个朴素的想法是让 B_P(θ) 线性依赖于轴角向量 θ 本身,但这在实践中效果很差,因为轴角表示存在对称性和无界性问题。
SMPL采用了一个更聪明的设计:让 B_P(θ) 线性依赖于每个关节旋转矩阵的元素。具体来说,对于每个关节的旋转矩阵 R_k,我们减去单位矩阵 I(以确保在零姿态时混合形状贡献为零),然后将所有关节的 (R_k - I) 矩阵向量化并拼接成一个大向量 r(θ)。姿态混合形状则是这个向量与一个姿态混合形状基矩阵 P 的线性组合:
B_P(θ) = P * r(θ)
这样,B_P(θ) 就是旋转矩阵元素的线性函数,学习起来更加稳定和有效。
模型的训练与参数学习 📊
SMPL需要学习大量的模型参数(超参数),包括:
- 平均模板网格 T̄
- 体型混合形状基矩阵 S(通过PCA获得)
- 姿态混合形状基矩阵 P
- 混合权重矩阵 W
- 关节回归器矩阵 J

训练需要两类数据:
- 多姿态数据:用于学习 P、W、J。需要同一人在不同姿态下的三维扫描。
- 多体型数据:用于学习 T̄ 和 S。需要多人在同一静息姿态下的三维扫描。

训练过程是一个复杂的优化问题,需要最小化模型预测与真实扫描数据之间的误差。由于参数众多且相互依赖,训练时需要谨慎地分阶段进行,并加入各种正则化约束(如对 P 使用L2正则,对 W 向手动初始权重正则,对 J 施加稀疏性和关节位于部分交界处的约束),以确保模型收敛良好并具有泛化能力。


一旦模型训练完成,这些超参数就被固定下来。使用时,我们只需操纵 β 和 θ 这两个简单的参数,就能生成各种体型和姿态的真实人体网格。
总结与扩展 🎯

本节课我们一起学习了基于顶点的身体模型,特别是SMPL。
- 核心思想:将身体建模为姿态和体型的函数,结合线性混合蒙皮与数据驱动的混合形状。
- 关键改进:SMPL从数据中自动学习蒙皮所需的所有参数(模板、混合权重、关节位置、姿态/体型混合形状),避免了繁琐的手工调整。
- 设计要点:将姿态混合形状设计为旋转矩阵元素的线性函数,是模型成功的关键之一。
- 优势:SMPL模型简单、高效、与现有动画工具兼容,并且用较少的体型参数(PCA主成分)就能捕捉大范围的形状变化,比之前的基于变形梯度的方法(如SCAPE)更紧凑。

SMPL模型可以被扩展,例如加入软组织动力学层(如Dyna模型),来模拟肌肉抖动等更细微的效果。这只需在顶点位移公式中增加一项与动力学参数相关的混合形状即可。

希望本讲能帮助你理解SMPL的内部机制,并体会到在构建身体模型时,恰当的数学模型与充分利用数据同样重要。
009:模型训练及将SMPL适配到扫描数据


在本节课中,我们将学习如何训练人体模型,以及如何将模型(如SMPL)适配到扫描数据上。我们将首先了解另一种基于三角形变形而非顶点位移的模型,然后深入探讨如何从数据中训练模型,并解决模型训练与数据配准之间“先有鸡还是先有蛋”的循环依赖问题。
基于三角形变形的模型
上一节我们介绍了基于顶点位移的模型,它们通过在基础网格上应用一系列学习到的位移来模拟姿态和形状变化。本节中我们来看看另一种基于局部三角形变形的模型,例如SCAPE模型及其扩展BSCAPE。
这类模型的核心思想是:对网格的每个三角形或边,应用一个由姿态和形状参数化的3x3变换矩阵。定义一个三角形包含顶点 t0, t1, t2。模型首先将三角形平移到原点,然后考虑其两条边向量,例如 e0 = t2 - t0 和 e1 = t1 - t0。接着,对每个三角形应用一个特定的3x3变换矩阵 X 来变换这些边。
如果对每个三角形独立应用变换,得到的网格将不再连续,因为共享顶点可能被拉向不同位置。为了获得一个连贯的网格,需要求解一个最小二乘问题,找到一组新的顶点 V,使得由这些新顶点构成的边尽可能接近经过变换矩阵处理后的目标边。这可以通过求解以下问题实现:
min_V ||AV - XE||^2
其中矩阵 A 用于从顶点计算边(例如,包含1和-1的稀疏矩阵),E 是原始边向量,X 是对应的变换矩阵。
与SMPL模型类似,这类模型也将变形分解为姿态和形状两部分:
- 姿态相关变形:由一个关于姿态参数
θ的函数Q(θ)(3x3矩阵)编码。 - 形状相关变形:由一个关于形状参数
β的函数S(β)(3x3矩阵)编码。 - 关节运动:由一个关于
θ的混合矩阵B(θ)建模,用于混合全局变换矩阵。
一个关键区别是,这类模型没有显式的骨骼关节概念,所有变换都在全局坐标中进行,通过后续的缝合步骤保证网格连贯性。
以下是SMPL(顶点加法模型)与SCAPE(三角形乘法模型)的主要对比:
- SMPL:在基础网格上累加顶点位移;使用线性混合蒙皮进行关节运动;需要定义骨骼。
- SCAPE:对三角形边应用相乘的变换矩阵;通过混合全局变换矩阵进行关节运动;没有显式骨骼。
需要指出的是,SMPL模型被广泛采用的原因之一是其效率。SMPL直接在顶点位移空间进行PCA,而SCAPE在3x3变换矩阵空间进行PCA。后者是一个更高维、更抽象的空间,导致模型容量浪费在最终网格中不可直接观测的变化上。因此,SMPL通常能用更少的形状参数解释更多的观测顶点方差。
从数据训练人体模型
现在我们来探讨核心问题:如何从数据中训练人体模型(无论是SMPL、SCAPE还是其他模型)?我们拥有不同姿态、不同形状人体的扫描数据,但扫描数据本身存在缺失、自遮挡、拓扑不一致等问题,直接学习非常困难。
因此,我们首先做一个强假设:假设我们已经拥有了配准数据。即,对于每个扫描,我们已经通过某种方法将一个模板网格变形,使其与扫描对齐,并且所有配准结果具有相同的顶点数和连接关系。
在拥有配准数据 {V_j} 的前提下,训练模型 M 就变得相对直接。我们需要找到模型的最佳超参数 Φ(例如,SMPL中的混合权重、关节回归器、形状基向量、姿态混合形状等),使得模型在最佳姿态 θ_j 和形状 β_j 下生成的网格,与每个配准结果 V_j 尽可能接近。这可以通过最小化以下目标函数实现:
min_Φ Σ_j min_{θ_j, β_j} ||M(θ_j, β_j; Φ) - V_j||^2
注意,我们需要同时优化模型超参数 Φ 以及每个配准对应的姿态形状参数 {θ_j, β_j},这是一个复杂的优化问题。
然而,我们做了一个非常强的假设——我们已经拥有了配准数据。实际上,我们并没有。这就引出了下一个关键问题:如何从扫描数据得到配准结果?
从扫描到配准的适配问题
配准的目标是:将一个模板网格(如SMPL的默认模板)变形,使其紧密匹配扫描数据,同时保持网格的连贯性和顶点对应关系。这本质上是一个非刚性ICP(迭代最近点)问题。
回顾ICP流程:初始化估计,然后迭代进行 1) 为源点(模板)在目标(扫描)上寻找对应点,2) 求解最优变换以使源点对齐到对应点。在非刚性配准中,变换 F 不再是刚体变换,而是顶点的变形模型。
那么,变形模型 F 应该是什么?有以下几种选择:
- 直接优化所有顶点自由度:让每个顶点自由移动以匹配扫描。但这会导致优化不稳定,网格容易扭曲变形,即使加入平滑约束也很难得到合理的身体形状。
- 仅使用SMPL模型参数:只优化姿态
θ和形状β参数。问题在于,现有模型无法捕捉扫描中的细节(如面部特征、发型等)。如果仅限于模型空间,我们将无法从新扫描中学到任何新信息,这对于训练新模型没有意义。 - 混合方法:同时优化SMPL参数 (
θ,β) 和一个残差顶点位移场V。目标函数鼓励配准结果V既接近扫描,又接近当前SMPL模型M(θ, β)的输出。优化过程中,SMPL参数捕捉主体姿态和形状,而顶点位移V可以捕捉模型无法表达的细节。先验项的权重控制着对模型空间的忠实度。
适配目标函数详解
将一个模型适配到单个扫描的完整目标函数通常包含以下部分:
E(θ, β, V) = λ_data * E_scan + λ_coupling * E_coupling + λ_pose * E_pose + λ_shape * E_shape
以下是每个项的作用:
- 扫描到网格距离项
E_scan:最小化扫描点到配准网格表面的距离。为提高鲁棒性(应对离群点和初始位置不佳),常使用鲁棒代价函数,如Geman-McClure函数ρ(x):ρ(x) = (x^2) / (σ^2 + x^2)。当距离x较小时,惩罚近似二次;当距离很大时,惩罚趋近于常数1,避免离群点主导优化。注意,这里计算的是点到表面的距离,而非点对点距离,这允许在优化过程中隐式地更新对应关系。 - 耦合项
E_coupling:约束配准顶点V不要偏离模型M(θ, β)太远。有两种常见形式:- 顶点距离:
||V - M(θ, β)||^2,关注顶点的绝对位置。 - 边距离:
||A*V - A*M(θ, β)||^2,其中矩阵A用于计算边向量。这更关注局部表面几何(边的方向和长度),对整体位置变化更不敏感。
- 顶点距离:
- 姿态先验项
E_pose:防止出现不自然的人体姿态。通常假设姿态参数θ服从高斯分布,使用马氏距离:(θ - μ_θ)^T Σ_θ^{-1} (θ - μ_θ)。协方差矩阵Σ_θ的逆对不同的姿态变化方向进行了加权。 - 形状先验项
E_shape:防止形状参数β偏离合理的人体形状范围。同样可采用高斯先验:(β - μ_β)^T Σ_β^{-1} (β - μ_β)。
权重的设置 (λ_data, λ_coupling, λ_pose, λ_shape) 至关重要。一种常见的策略是进行多阶段优化:
- 初始阶段:设置很大的
λ_coupling、λ_pose和λ_shape,λ_data较小。这相当于做一个强约束的SMPL模型拟合,确保结果是一个合理的人体。 - 中间阶段:逐步降低姿态和形状先验的权重 (
λ_pose,λ_shape),适当降低耦合权重λ_coupling,同时增加数据项权重λ_data。允许配准结果在模型约束下逐渐贴近扫描细节。 - 最终阶段:进一步降低或移除先验权重,主要依靠数据项和较小的耦合项进行微调,以捕捉扫描中的高频细节。
通过这种渐进式策略,最终得到的配准结果 V 既能保持合理的人体结构,又能超越当前模型 M 的表达能力,从而为模型训练提供新的信息。
解决“鸡与蛋”问题:协同配准
我们面临一个循环依赖:训练模型需要配准数据,而获得好的配准又需要一个好的模型。这个“鸡与蛋”问题可以通过协同配准技术解决,其核心思想是交替优化。
我们不再分别处理单个扫描的配准和整个模型的训练,而是定义一个覆盖整个扫描数据集的总目标函数:
min_{Φ, {θ_j, β_j, V_j}} Σ_j E(θ_j, β_j, V_j; Φ)
其中 Φ 是模型超参数,{θ_j, β_j, V_j} 是每个扫描对应的姿态、形状和配准顶点。这个目标函数同时包含了所有扫描的配准损失以及对模型参数的依赖。
直接优化所有参数非常困难。我们可以采用块坐标下降法(或类似期望最大化的思想)进行交替优化:
- 固定配准:保持所有
{V_j}固定,优化模型超参数Φ以及每个扫描对应的{θ_j, β_j}。这一步相当于用当前配准数据来训练或更新模型。 - 固定模型:保持模型超参数
Φ固定,分别优化每个扫描的配准{θ_j, β_j, V_j}。这一步相当于使用当前模型作为先验,为每个扫描计算新的、更精确的配准。 - 迭代:重复步骤1和2。随着迭代进行,模型因更优的配准而变得更好,而更好的模型又能产生更准确的配准,形成良性循环。
总结
本节课中我们一起学习了:
- 除了基于顶点位移的模型(如SMPL),还存在基于三角形变形的模型(如SCAPE)。它们通过对网格边应用变换矩阵来工作,并通过求解最小二乘问题保证网格连贯性,且通常不依赖显式骨骼。
- 训练人体模型需要找到模型超参数,并针对每个训练样本优化其姿态和形状参数,以最小化模型输出与配准数据之间的差距。
- 获得配准数据本身需要一个人体模型作为先验来约束变形过程,而训练一个好的模型又需要高质量的配准数据,这构成了一个“鸡与蛋”的循环依赖问题。
- 通过定义包含数据项、耦合项、姿态和形状先验的混合目标函数,并采用多阶段优化策略调整权重,可以将一个模型适配到扫描数据,得到既贴合扫描细节又保持合理人体结构的配准结果。
- 这个循环依赖问题可以通过协同配准方法解决,即交替优化模型参数和所有扫描的配准结果,使两者在迭代中共同改进。
这些内容基于2016年《Learning Human Shapes in Motion》教程,幻灯片特别感谢Javier Romero。


010:基于学习的配准 - 第一部分


在本节课中,我们将继续探讨与之前完全相同的问题:给定一个点云,我们希望拟合一个参数化人体模型(SMPL),并使其变形,以解释给定的扫描数据。这被称为3D对齐或3D配准。
我们已经了解了如何通过经典方法,如迭代最近点算法和优化来实现这一目标。本节课中,我们将探讨如何利用学习技术,使这个拟合过程更加鲁棒和可靠。
扩展SMPL模型:SMPL+D
为了本次课程,让我介绍一个概念:SMPL+D。它扩展了SMPL模型,以模拟服装和头发的细节。
回顾一下,SMPL模型通过一组形状参数来建模身份,并通过一组姿态参数来建模姿态相关的形变。最后,我们应用运动学链和旋转来驱动身体。
SMPL模型的问题在于它无法模拟服装。那么,我们如何以一种简单的方式扩展SMPL来模拟服装呢?
最简单的方法是添加一组位移场 D,用于模拟个人细节和服装。本质上,你可以从一个标准姿态下的未着装身体,通过添加位移D,得到一个包含服装、头发和面部细节的标准姿态身体。
需要注意的是,这里的D没有被任何潜在参数(如编码服装的参数)参数化。它是一个完整的位移矩阵,因此具有很高的自由度。本质上,它需要接近数据,因为这是一个高度欠约束的问题,它本身并不是一个完整的服装模型。我们将在未来的课程中看到如何更好地处理这个问题。目前,这只是通过增加参数来增强模型的表达能力。
顺便提一下,在SMPL基础网格上添加位移场的想法,与让配准的顶点在接近模型的同时尽可能接近数据点的想法几乎是等价的。因为这允许顶点偏离模型,其效果与在SMPL模型上叠加位移场D基本相同。因此,这两种表述在很大程度上是等价的。
配准的应用场景
我们之前已经了解到,寻找配准是训练人体模型的关键步骤。然而,除了训练人体模型之外,还有其他应用也需要将SMPL拟合到扫描数据上,特别是计算从扫描到模型的配准。
以下是几个例子:
- 寻找扫描间的对应关系:如果你想在两个扫描之间找到对应关系,以识别不同身体部位的对应部分,你可以将同一个SMPL模板分别拟合到每个扫描上。这样,你就隐式地在两个扫描之间创建了一个对应映射,因为你总是可以从一个扫描映射到SMPL模板,再从SMPL模板映射到另一个扫描,从而在两个扫描之间形成一个对应循环。
- 从深度流中跟踪身体:你可能有一个来自Kinect等设备的深度数据流,并希望从中跟踪身体的形状和运动。这基本上是一个逐帧的配准问题。
- 用骨架驱动扫描动画:如果你想获取一个扫描数据并用骨架为其制作动画,你需要先将SMPL模型拟合到这个点云上。
所有这些应用都需要将SMPL拟合到扫描数据,因此这是一个重要的问题。在本节课中,我们将看到如何有效地做到这一点,以及如何从训练数据中学习这个配准过程的某些部分。
经典方法的局限:ICP与局部最小值
我们已经看到,使用ICP算法将SMPL(或本节课中的SMPL+D)拟合到扫描数据,需要求解一个包含多个项的目标函数。其中最重要的是扫描到网格距离项,它计算扫描中每个点到配准网格上最近点的距离。这本质上需要寻找最近点对。
为了最小化这个目标函数,你需要在寻找对应关系和寻找最优变换之间进行某种ICP式的交替迭代。我们在两节课前已经看到,这被称为ICP算法。
现在,如果我告诉你ICP算法容易陷入局部最小值,你应该不会感到惊讶。基本上,ICP计算最近点,但这些对应关系可能是错误的。
例如,在下图中,运行ICP将SMPL网格拟合到这个点云的结果显示,点云中的腿是交叉的,而配准结果中的腿却没有交叉。又或者,手部并没有真正匹配点云中的手部。原因是点云中的手部点很可能被错误地匹配到了网格的臀部点上,从而导致错误的对应关系,使得模型的某些部分解释了数据的错误部分。
因此,我们现在知道,使用最近点作为对应关系容易陷入局部最小值。接下来,我们将看看如何利用学习技术来改进这个配准过程。
基于学习的配准方法概览
我们将简要介绍两种类型的模型:
- 非参数化模型:不使用SMPL等参数化模型。
- 参数化模型:使用像SMPL这样的参数化模型,但利用训练数据和深度学习来学习从点云到SMPL模板的对应关系。
还有第三种方法,我称之为混合方法,这是一项非常新的工作,我们称之为“学习顶点下降”。我们将在未来的课程中看到它,但不在本节课讨论。
非参数化模型方法
那么,你能做的最简单的事情是什么?你想找到对应关系,或者想将一个模板拟合到输入形状上。
你可以做的是将点云编码成一个特征向量(记作 ε(S))。然后,给定一个模板和这个特征向量,你可以训练一个解码器来直接预测顶点位置,使其匹配输入形状。这是一个非常直接的方法,网络需要直接预测顶点位置。
你可以认为网络本质上扮演了顶点形变模型 F 的角色,这个我们之前讨论过的、使顶点更接近数据的形变函数,现在由一个神经网络来编码。
这种方法产生的结果比ICP对人类数据更好,因为它是从数据中学习的。然而,它仍然会陷入局部最小值,并且需要至少100个不同的全局旋转初始化,才能使这个学习模型收敛。此外,这个模型无法从数据中获取细节,并且生成的模板是不可控的,因为它不是SMPL模型,你无法对它进行姿态和形状调整。虽然可以相对容易地从中计算出一个SMPL模型,但它不是直接可控的。
这种方法收敛性不佳的原因之一是,这里的网络使用的是输入形状的全局特征,并一次性预测所有顶点。这是一个非常困难的学习问题。网络很难知道如何一次性预测所有顶点,因为它缺乏更局部的推理。为了获得良好的泛化能力,你需要大量包含不同姿态和形状的训练数据。当我们看到隐式表面重建方法与显式方法的区别时,我们会更好地理解这些概念。
结合隐式重建与参数化模型:IP-Net
因此,我们在这里提出的问题是:我们能否学会将SMPL模型拟合到数据上?并且,如果数据中存在高频细节,我们能否保留它们? 因为如果我们能做到这一点,我们就可以使扫描数据变得可控且非常逼真。
在我们大约一两年前提出的一项名为 IP-Net 的工作中,其目标是明确的:我们输入一个点云,并希望能够通过姿态和形状参数来控制这个点云。为此,我们当然需要将一个参数化模型(如SMPL)配准到这个点云上。
当时,基于深度学习的隐式表面重建方法刚刚兴起,并且人们认识到它们在保留细节方面比显式方法要好得多。我们稍后会更好地理解这一点,但现在的直觉是:这些隐式重建方法基本上基于非常局部的证据来预测表面在空间中的内外情况。这允许你使用数据进行训练,并且网络只需要观察局部模式来做出决策,从而能够更好地捕捉精细细节,因为你不需要那么多的数据,本质上你是在做非常局部的决策。
因此,我们称之为 IP-Net 的模型的高级思想是结合隐式重建(擅长捕捉细节)和SMPL模型拟合(提供可控性)。
你可能会问,为什么这是个好主意?正如我所说,基于学习的隐式重建方法更擅长捕捉细节,并且可以处理任意姿态。而参数化模型在捕捉细节方面并不擅长,因为一旦你超出参数空间,就无法表示这些细节。同时,泛化到复杂姿态也很困难,因为需要一个好的初始化。
本质上,隐式重建方法的主要问题是它们生成的是静态网格。你对静态网格做不了太多事情,因为你无法改变其姿态和形状。而参数化模型可以被重塑和重新摆姿势。因此,很自然地会想,我们能否在这里结合两者的优点。这就是IP-Net的基本思想:我们能否得到一个隐式重建结果,然后通过将模型拟合到它上面, somehow 将其转化为一个显式的、可控的模型?
当然,这里的挑战在于,在当时,从点云预测隐式表面的问题已经相对被理解,例如我们组和其他组的方法,如IF-Nets或NDFs(神经距离场)。它们可以将完整或不完整、稀疏或密集的点云转化为连续的隐式表面。
但问题在于,你如何然后将一个SMPL模型拟合到它上面?这看起来像是你把点云变成了一个表面,然后游戏规则是什么?我仍然需要解决配准问题。
主要问题在于,ICP会由于错误的对应关系以及SMPL模型无法表示服装和头发等原因而陷入困境。因此,目标函数无法很好地被最小化,因为模型无法解释数据。
在IP-Net中,有两个关键思想:
- 将SMPL预测为一个隐式表面,以使拟合变得容易。这有点像是反其道而行之:你从一个着装的网格,得到一个我们称之为内表面的未着装网格,使得这个表面看起来比以前更接近SMPL模型。本质上,现在拟合过程会更容易,因为隐式表面没有服装、没有头发,没有这些困难。
- 预测对应关系,而不是使用最近点。
IP-Net的实现方式
我们如何做到这一点?我们训练一个处理点云的网络(一种流行的方法是基于称为PointNet的架构)。在高层次上,它的处理方式类似于卷积神经网络处理像素:处理点云,从中提取特征,然后从这些特征解码出预测。
在这里,我们训练一个隐式表面网络来预测三个“层”或区域:
- 第一个区域是身体内部,即未着装的身体。
- 第二个区域是身体和服装之间的空间。
- 第三个区域是服装外部的空间。
网络可以被训练来预测空间中的每个点属于哪个区域。此外,你还可以预测这个点属于N个身体部件中的哪一个。你可以对空间中的所有点进行这些预测。
这就是现在被称为神经场网络的方法。它们之所以被称为这样,是因为它们对空间中的每个点都做出预测。我们将看到,这个简单的想法实际上被证明是非常强大的。我们将在未来关于神经场和隐式表面重建方法的课程中详细探讨这一点。

总结
在本节课中,我们一起学习了基于学习的3D人体配准方法的第一部分。我们首先回顾了通过添加位移场D来扩展SMPL模型以模拟服装细节的概念(SMPL+D)。接着,我们探讨了配准技术在不同应用场景中的重要性。
然后,我们分析了经典ICP方法容易因错误最近点对应而陷入局部最小值的局限性。为了克服这个问题,我们介绍了两种基于学习的配准思路:一种是直接预测顶点位置的非参数化模型,另一种是结合了隐式表面重建优势的参数化模型方法IP-Net。

IP-Net的核心思想是通过神经网络预测一个与SMPL更相似的“内表面”以及点与身体部件的对应关系,从而绕过ICP对最近点的依赖,并使后续的SMPL拟合变得更加容易和鲁棒。这为从扫描数据中获得既细节丰富又可控制的人体模型提供了一条有希望的途径。在接下来的课程中,我们将继续深入探讨其他先进的配准方法。
011:基于学习的配准 - 第2部分 🧠

在本节课中,我们将深入学习两种结合了神经网络与经典模型拟合的先进三维人体配准方法。我们将探讨如何利用隐式表面重建来简化配准过程,并介绍一种能够联合优化对应关系和模型参数的端到端自监督方法。
IPNe方法概述 🧩
上一节我们介绍了基于学习的配准的基本概念,本节中我们来看看一个具体的实现:IPNe方法。
IPNe方法接收一个可能穿着衣物、带有头发和面部细节的人体稀疏点云作为输入。它预测两个由隐式函数表示的表面:一个是内层身体表面,这个表面不包含衣物,应该类似于简单模型的表面;另一个是完整表面,包含衣物和头发等细节。此外,该方法还会预测每个点的身体部位标签,以使后续的拟合过程更容易。

这两个预测背后的核心思想是:由于内层表面更接近简单模型,因此将简单模型拟合到这个表面会更容易。一旦简单模型大致对齐到内层表面,就可以轻松地将其变形以解释外层表面的细节,从而获得一个代表完整人体的注册结果。这样,我们就可以改变模型的形状和姿态,这是本工作的主要目标之一。
优化与预测细节 🔍
接下来,我们更详细地了解优化和预测是如何工作的。
在测试时,我们利用神经网络的预测来使配准过程表现更好。本质上,我们有一个依赖于姿态、形状和一些表示衣物等的自由形变位移向量的能量或损失函数。
我们需要最小化以下目标:
- 数据项:将简单模型与IPNe预测的身体表面进行匹配。
- 部位项:将简单网格的各个部位与IPNe预测的部位标签进行匹配。
- 拉普拉斯正则化项:确保重建的表面局部平滑。
以下是数据项的公式描述。它是一个双向匹配目标,包含经典的基于ICP的目标(最小化目标表面顶点与拟合模型之间的距离),以及一个从模型反向匹配到IPNe预测的目标。
E_{data} = \sum_{v \in M} \min_{u \in S_{inner}} ||v - u||^2 + \sum_{u \in S_{inner}} \min_{v \in M} ||u - v||^2
其中 M 是简单模型,S_inner 是IPNe预测的内层表面。
与原始点云相比,这个拟合过程更容易,因为预测的表面是密集的,并且不包含衣物等细节。
部位目标的作用 🏷️
拥有部位标签非常有用,因为它可以让ICP过程更容易。你可以逐个部位进行匹配。
以下是部位匹配目标的公式。它对简单模型的各个部位求和,然后对于每个部位,只考虑该部位对应的预测身体顶点与模型之间的匹配。
E_{part} = \sum_{p \in Parts} \sum_{u \in S_{part}^p} \min_{v \in M^p} ||u - v||^2
其中 δ 函数指示我们正在匹配模型的哪个部位。例如,在匹配上臂时,只考虑IPNe预测的上臂点与身体模型上臂部分之间的匹配。
处理不完整数据的能力 💪
这种方法的一个关键优势是能够处理不完整的点云数据。
例如,你可以获得一个部分点云(如人的背部不可见)。如果尝试直接将简单模型拟合到这个不完整的点云上,效果可能很差。但是,如果首先使用神经重建方法恢复出完整表面,然后预测内层和外层表面,就可以先拟合内层部分,再扩展到外层部分,从而获得良好的注册结果。这在经典方法中直接拟合输入点云是难以实现的。
这种方法允许你拟合简单模型并使其变形,从而改变注册结果的姿态和形状。它也可以应用于人体以外的形状,例如手部。
学习的优势与挑战 ⚖️
那么,学习相比传统ICP带来了什么?
以下是学习的优势:
- 学习的对应关系比最近点更可靠。
- 可以补全和去噪输入形状。
- 可以移除使拟合变难的细节(如衣物和头发)。
- 对于部分点云,ICP拟合非常困难,而学习方法可以处理。
但学习方法也存在挑战:
- 为了获得展示的中间表面结果,需要运行Marching Cubes算法将隐式表示转换为显式表示。这个过程计算成本高且不可微分。
- 对应关系相对于拟合过程是不可微分的。在拟合过程中,我们需要用ICP算法不断更新对应关系,这涉及到交替的步骤。
LUDRE方法:一种更优雅的解决方案 🌀
一个自然的问题是:能否使对应关系可微分,从而避免不断更新对应关系?能否移除昂贵的Marching Cubes计算作为中间步骤?
我们在NeurIPS上发表的一篇名为《LUDRE: Self-supervised Learning of Implicit Surface Correspondences, Pose and Shape for 3D Human Mesh Registration》的论文中解决了其中一些挑战。
目标与之前完全相同:从点云获得注册。但我们认识到经典拟合的问题是,你需要最小化一个同时依赖于对应关系本身和模型参数 x 的目标。实际上,你是在优化扫描与模型之间的这些对应关系。
经典ICP的本质就是迭代以下两步:
- 寻找对应关系(关键点、最近点或使用预训练网络)。
- 优化模型参数以最小化目标。
这个过程容易陷入局部极小值,且不是端到端可微分的。虽然神经重建可以使过程更可靠,但问题在于能否进一步推进,得到一个更集成的公式。
LUDRE的核心思想:自监督循环 🔄
在LUDRE工作中,我们提出了一种无需监督或自监督地联合优化模型和对应关系的方法。
我们考虑一个网络 F_φ,它将每个扫描点映射到模型表面上对应的点。为了表示身体表面上的对应关系,我们考虑一个规范姿态下的人体网格。我们希望有一个映射,它能接收每个扫描点,并预测在这个规范形状上的对应表面点 m。
核心思想是:如果我们有这样的映射,我们可以使用简单模型,结合模型参数 x(编码形状和姿态),将这个点 m 变形到扫描空间,以解释原始的扫描点。这就形成了一个循环:从扫描点 s 到规范点 m,再通过简单模型变形回扫描空间。
循环是有趣的,因为它可以用于自监督。一个基本的约束是:如果你组合这些映射(从 s 到 m,再从 m 通过简单模型回到 s),这个循环应该闭合。
实现挑战与解决方案 🛠️
实现这个想法面临几个挑战:
- 联合训练:能否在没有监督的情况下联合训练网络和优化模型参数?
- 表面约束:如何确保网络预测的对应点确实位于模型表面上?让网络预测恰好位于流形上的三维点是很困难的。
- 集成优化:如何在联合训练过程中实际集成对应关系预测与模型拟合?
以下是我们的解决方案:
- 扩散简单模型:为了解决网络预测点可能不在表面的问题,我们将简单模型定义的表面变形函数扩散到整个周围三维空间。这可以通过距离变换来实现,使得对于空间中的任何点,都按照离它最近的表面点的变形方式来变形。这样我们就得到了一个从三维空间点到变形后空间点的映射
G。 - 施加流形约束:我们同时施加一个拉格朗日约束,强制网络预测的点尽可能靠近表面流形。这可以通过惩罚预测点到表面的距离来实现。
最终,我们得到了一个清晰优雅的目标函数,我们可以计算它相对于网络参数 φ 和每个训练扫描的模型参数 x 的梯度。因此,我们可以优化一个预测对应关系的网络,以及每个训练注册的特定姿态和形状参数。
有趣的是,最小化这个能量不需要配对标签数据,我们可以仅通过“闭合循环”来训练它。
实践效果与数据利用 📈
在实践中,事情并非如理论般完美。我们需要使用少量监督数据来引导(bootstrap)这个过程,然后利用这个自监督目标,在训练过程中添加更多扫描数据,使对应关系预测器越来越准确。
实验结果表明,在固定监督数据量(例如1000个扫描)的基础上,不断增加无监督数据的比例(从0%到100%),配准误差显著下降。这意味着,尽管没有使用任何额外的标签,仅通过添加原始扫描数据,就能使整个拟合过程越来越准确。
与之前最先进的方法(如完全监督的3DCODED)相比,LUDRE方法产生了相当准确的结果。这得益于自监督循环,以及神经对应关系预测器与经典模型拟合的结合。
总结 🎯
本节课中我们一起学习了两种先进的基于学习的配准方法。
- ICP 概念简单且有用,但寻找最近点常常导致局部极小值。
- IPNe 方法通过预测内、外双层表面和部位标签,结合隐式表面重建与模型拟合。先将简单模型拟合到内层,再扩展到外层,以获得良好的结果。
- LUDRE 方法提出了一个更优雅的公式,能够对对应关系和模型参数进行联合微分优化。我们看到了添加越来越多无监督数据如何带来益处和更高的准确性。
这些将学习与模型拟合相结合的方法非常强大,并且仍在被用于解决不同的问题,例如建模交互。
感谢观看,这是第5.2.2讲的结束。


012:通过优化将SMPL适配到图像

概述
在本节课中,我们将学习如何从单张图像中估计人体的三维姿态和形状。这是一个极具挑战性的问题,因为图像是三维世界的二维投影,我们丢失了深度信息。我们将重点介绍一种生成式方法,即通过优化一个参数化人体模型(如SMPL)的参数,使其在图像平面上产生的投影与图像证据(如检测到的二维关节点)相匹配。
为什么从单张图像估计三维姿态和形状很困难?
上一节我们介绍了如何将模型适配到点云数据。本节中我们来看看从单张图像进行估计的挑战。
从单张图像估计三维人体姿态和形状是一个极其困难的问题,原因如下:
- 高自由度:人体姿态空间非常复杂,参数维度高,但有效的姿态只是这些参数组合的一个子集。
- 巨大的外观变化:图像中的人体可能具有不同的肤色、穿着、背景、光照、姿态和交互方式。
- 深度信息丢失:图像是三维世界的线性透视投影,我们丢失了深度信息,导致至少三分之一的自由度无法直接观测。
一个经典的视频可以很好地说明深度模糊性问题:许多不同的三维姿态可以投影到几乎完全相同的二维图像上。这使得问题变得非常棘手。
解决方案:利用先验知识与人体模型
面对如此困难的问题,我们需要利用先验知识,因为图像证据本身不足以唯一确定姿态和形状。我们知道人体有固定的骨骼结构,只有某些姿态是合理的,运动主要是关节式的,人体形状大致对称且存在于一个子空间中。
为了利用这些信息,我们需要一个人体模型。如今,SMPL模型已成为从图像估计人体姿态和形状的事实标准模型,它统一了表示方式,无需为每个对象单独建模。
问题形式化
我们的输入是一张RGB图像,目标是估计模型参数。如果使用SMPL模型,这意味着需要估计姿态参数(θ)、形状参数(β),以及可选的相机参数(即相机相对于人体的位姿)。
从概率角度看,这可以表述为一个最大后验估计问题:在给定图像证据 Y 的情况下,找到最可能的模型参数 X(包含θ, β等)。这等于最大化似然(模型解释图像的程度)与先验(关于合理姿态和形状的知识)的乘积。
生成式方法 vs. 判别式方法
历史上,解决此问题主要有两种途径:
- 判别式模型:直接学习一个从图像像素到三维人体表面或模型参数的映射。我们将在下一讲中看到这类方法。
- 生成式模型:拥有一个人体模型,并通过优化模型参数来解释图像证据。本节课我们将聚焦于这种生成式方法。
如今,在生成式方法中,基于优化的方法占主导地位,因为对于高维空间,基于采样的方法效率不高。
基于优化的生成式方法框架
基于优化的方法通常遵循一个通用框架,包含三个步骤:
以下是该框架的三个核心步骤:
- 从图像中提取特征:例如,轮廓、距离变换、边缘或二维关节点。
- 用模型预测这些特征:将当前模型参数下的三维模型投影到图像平面,渲染出对应的特征(如投影的二维关节点或轮廓)。
- 优化模型参数以对齐特征:通过迭代优化,最小化模型预测特征与图像观测特征之间的误差。
一个好的优化特征需要能够从模型高效预测、易于计算,并且最好是可微分的。例如,二维关节点就是一个极佳的特征,因为它易于从模型投影得到,且天然可微。
特征匹配与优化目标
为了对齐特征,我们需要知道图像特征与模型预测特征之间的对应关系,这类似于三维形状配准中的ICP问题。
一个关键问题是:我们应该将模型匹配到图像,还是将图像匹配到模型?考虑图像中只包含部分人体的情况,如果最小化模型到图像的距离(即让模型点去寻找图像上的对应点),对于图像上不存在的部分,模型点可能会匹配到错误的背景上。因此,通常结合使用两种方式或采用更鲁棒的策略。
优化目标通常被构建为一个非线性最小二乘问题。总误差 E 是一个依赖于模型参数 X 的标量,我们希望最小化它。
总误差可以表示为各个特征误差的平方和:
E(X) = Σ_i || r_i(X) ||^2
其中,r_i(X) 是第 i 个特征的残差向量,例如预测的二维关节点与检测到的二维关节点之间的差值。
从概率角度,如果我们假设观测误差是独立且高斯分布的,那么最小化这个最小二乘误差就等价于求解最大似然估计。
优化算法:高斯-牛顿与列文伯格-马夸尔特
我们如何优化这个非线性最小二乘问题呢?核心技巧是线性化残差向量 e(X),而不是直接线性化标量误差 E(X)。
对残差向量在当前参数 X_t 处进行一阶泰勒展开:
e(X_t + ΔX) ≈ e(X_t) + J(X_t) ΔX
其中,J 是残差向量 e 关于参数 X 的雅可比矩阵(一阶导数矩阵)。
将展开式代入误差平方和,并忽略高阶项,通过求解使误差增量最小的 ΔX,我们可以得到参数更新步长。这导出了两种重要的更新规则:
以下是两种核心更新方法:
- 高斯-牛顿步:
ΔX = - (J^T J)^{-1} J^T e- 其中
J^T e恰好是标量误差E的梯度。 J^T J是标量误差E的海森矩阵(二阶导数矩阵)的近似。
- 其中
- 列文伯格-马夸尔特方法:
ΔX = - (J^T J + μ I)^{-1} J^T e- 这里引入了阻尼因子
μ和单位矩阵I。 - 当
μ很大时,更新近似于梯度下降,稳定但收敛慢。 - 当
μ很小时,更新近似于高斯-牛顿步,在最小值附近收敛快。 - L-M 方法动态调整
μ,在优化过程中结合了两种方法的优点。
- 这里引入了阻尼因子
迭代更新参数:X_{t+1} = X_t + ΔX,直至收敛。
现代方法:SMPLify 及其演进
早期方法(如2001年的经典工作)虽然开创性地使用了生成式优化框架,但受限于特征质量和模型表达能力,只能在受控环境下工作。
近年的两大突破彻底改变了这一领域:
- 可靠的二维姿态检测器:基于卷积神经网络,能够从图像中高精度检测人体关节点。
- 灵活易用的三维人体模型:如SMPL,无需针对每个对象进行繁琐的扫描和骨骼绑定。
SMPLify 方法巧妙结合了这两大突破。其核心思想是:
- 自底向上:使用现成的二维姿态检测器(如OpenPose)从图像中提取二维关节点
J_2D。 - 自顶向下:将SMPL模型的三维关节点
J_3D通过相机模型投影到二维平面,得到预测的二维点Π(J_3D)。 - 优化目标:最小化检测点与投影点之间的误差,同时加入姿态和形状先验项,以及防止肢体穿透的惩罚项。
其优化目标函数可概括为:
E(θ, β) = E_J(θ, β) + λ_θ E_θ(θ) + λ_β E_β(β) + λ_C E_C(θ, β)
其中 E_J 是二维关节数据项,E_θ 和 E_β 是姿态与形状先验,E_C 是防穿透约束。
扩展与挑战:SMPLify-X
SMPLify 主要关注身体。为了捕捉手部、面部表情等细节,SMPLify-X 被提出,它:
- 将SMPL模型升级为包含手、脸细节的SMPL-X模型。
- 使用变分自编码器 来学习更紧凑、合理的姿态先验,替代了混合高斯模型。
- 通过分类器预测性别,并选择对应的性别特定模型进行拟合,因为男女形体统计差异显著。
尽管优化方法取得了巨大成功,但仍存在局限性:
- 依赖检测器:如果二维姿态检测失败,优化结果也会失败。
- 局部极小值:优化过程可能陷入局部最优解,需要良好的初始化。
- 深度模糊性:对于某些姿态(如正面/背面翻转、腿部前后混淆),仅凭二维证据难以确定唯一的三维解。
- 匹配模糊性:如何将图像观测与模型预测正确关联,本身就是一个模糊问题。

总结
本节课我们一起学习了如何通过优化方法,将参数化人体模型(如SMPL)适配到单张图像,从而估计三维人体姿态和形状。我们了解了该问题的挑战性、生成式方法的概率框架、基于非线性最小二乘的优化流程(特别是高斯-牛顿和L-M方法),以及现代方法如何利用强大的二维检测器和SMPL模型取得突破。我们还看到了当前优化方法在细节捕捉(SMPLify-X)和仍面临的挑战(如局部极小值、深度模糊性)。在下一讲中,我们将探讨如何利用学习方法来尝试解决或缓解这些基于优化的方法所面临的问题。
013:通过学习将SMPL适配至图像 🧑💻

在本节课中,我们将学习如何利用深度学习技术,从单张人物图像中估计SMPL人体模型的参数。我们将探讨如何克服3D标注数据稀缺的挑战,并介绍几种结合优化与学习的自监督方法。
在上一讲中,我们介绍了通过优化方法将SMPL模型适配到图像的技术。该方法需要预先提取图像特征(如关键点、轮廓或边缘),并且优化过程可能较慢,容易陷入局部最优解。
本节中,我们将探讨是否可以通过深度学习,直接从图像像素学习一个映射函数来预测SMPL参数。核心挑战在于缺乏成对的图像与3D姿态数据。现有的3D数据集通常是在实验室环境下采集的,与网络上的自然图像差异很大。此外,由于深度歧义问题,从单张图像恢复3D姿态和形状本身就是一个难题。
因此,研究社区提出了一个关键问题:能否利用大量未配对的2D和3D数据来学习一个先验知识? 接下来,我们将介绍两篇同时期提出、思路相似的重要论文,它们阐述了自监督学习人体姿态和形状的核心概念。
方法一:端到端的人体形状与姿态恢复 (HMR) 🤖
第一篇论文名为《End-to-end Recovery of Human Shape and Pose》(简称HMR)。作者直接提出了核心问题:如何在没有成对3D监督数据的情况下,训练一个深度神经网络来直接回归SMPL参数?
其基本架构包含一个编码器(回归器),用于从输入图像预测姿态、形状和相机参数。由于没有直接的3D监督数据,训练这个映射关系是困难的。
以下是利用现有数据的关键思路:
- 我们拥有大量带有2D关键点标注的图像(例如通过OpenPose算法获得)。
- 我们可以训练网络从像素预测SMPL参数,然后将SMPL模型投影回图像,并最小化预测的2D关节点与图像中检测到的2D关节点的重投影误差。
然而,如果仅用这个2D重投影损失进行训练,网络可能会生成一些虽然能投影到正确2D点、但看起来不像真实人类的“怪物”模型。这是因为网络没有被训练去生成合理的人体形态。
为了解决这个问题,我们需要引入先验知识,确保预测的姿态和形状符合真实人体的分布。在注册课程中,我们已经见过如何构建姿态和形状先验(例如高斯混合模型或变分自编码器)。在这篇论文中,作者选择了生成对抗网络(GAN) 的思路。
其核心思想是:编码器作为生成器,产生姿态和形状参数;同时引入一个判别器,用于判断输入的姿态和形状是来自真实数据分布还是生成器。通过生成器和判别器之间的对抗训练,最终生成器能够产生符合真实人体分布的姿态和形状。在测试时,只需保留生成器(编码器)即可。
这种“在解释图像的同时保持分布内”的方法,在当时对野外图像的处理上取得了显著成果。
但这种方法使用包含所有像素的完整图像作为输入,而图像在颜色、纹理、光照和外观上存在巨大差异,因此需要大量数据才能泛化良好。
方法二:神经人体拟合 (Neural Body Fitting) 🔄
接下来介绍的第二篇论文是《Neural Body Fitting: Unifying Deep Learning and Model Based Human Pose and Shape Estimation》。它与HMR有很多相似之处,但也引入了一些关键的新概念。
这篇论文从另一个角度出发,对比了基于模型的方法和基于学习的方法:
- 基于模型的优化方法:通过最小化目标函数(如SMPL预测关键点与图像检测关键点之间的误差)来适配模型。但这种方法可能较慢,且严重依赖于初始化。
- 基于学习的方法:如果有训练数据,可以训练一个回归器。但获取野外自然图像及其对应的3D姿态和形状标注极其困难。此外,大多数深度学习模型只做预测,不会将输出与输入图像进行一致性验证,这可能导致预测与图像对齐不佳。
论文提出的混合架构与HMR类似,也使用SMPL模型作为中间3D表示,并将其投影到2D图像空间计算损失。其优势在于可以灵活地放置损失函数:
- 如果有一点3D数据,可以在姿态和形状参数上施加损失。
- 如果只有2D关键点标注,则在投影后的2D关键点上施加损失。
这篇论文进一步探索了两个重要维度:
1. 输入表征:简化图像信息
一个直观的想法是:将图像简化为语义分割图(如人体部位分割),再从分割图回归参数,这样是否更有用?因为这移除了许多与姿态形状无关的外观信息,可能有助于网络泛化。
以下是该论文对不同输入表征效果的评估结果(误差单位为毫米,越低越好):
- 原始RGB图像:98.5
- 轮廓图:95.5
- 3部位分割图:86.5
- 6部位分割图:66.2
- 12部位分割图:27.8
- 2D关键点:54.7
实验表明,使用部位分割作为中间表征能显著降低误差。轮廓图移除了太多信息,效果不佳;而适度的部位分割(如12部位)在保留必要信息的同时,有效提升了泛化能力和准确性。因此,当数据有限时,抽象掉不相关的信息是一个好策略。
2. 需要多少3D监督数据?
另一个关键问题是:我们需要多少3D标注数据?能否主要依靠2D数据?

以下是不同损失函数组合下的误差对比:
- 仅使用2D损失(无先验/GAN):误差很高(198.2),结果不具意义。
- 增加3D关节空间欧氏距离损失:3D误差大幅下降至83.7,但关节旋转误差仍高。
- 在姿态形状潜空间直接施加损失:3D关节误差与上一种相当,但关节旋转误差显著降低。
- 组合所有损失:得到最佳结果。

更重要的实验是分析所需3D数据的比例。在一个可控数据集上的实验表明:仅需约2%的训练数据具有3D标注,其余98%仅需2D关键点标注,就能使网络性能保持在一个较好的水平。 这意味着,少量的3D数据足以让网络学习到关于姿态和形状的先验,从而正则化整个学习过程,其余知识可以从大量2D数据中习得。
方法演进与总结 📝
在这些方法之后,出现了进一步的改进思路。例如,有方法指出回归得到的形状常常与图像拟合不佳,因此提出了一种更直接的结合方式:先用深度网络做初步预测,然后以此作为初始化进行优化(优化效果更好),再用优化得到的结果作为监督信号来训练深度网络,如此迭代。这本质上是将学习与优化在循环中更紧密地结合。
现在,让我们从数学概念上理解基于模型的优化与回归之间的联系。本质上,自监督方法是在训练一个神经网络,将图像映射到3D人体模型的潜参数(姿态、形状,甚至衣物和纹理)。我们可以将其视为一个可微渲染流水线:预测几何与纹理 -> 渲染 -> 与图像比较。
传统的优化方法是针对单张图像,优化潜参数以最小化渲染损失:
argmin_{θ, β} L(R(SMPL(θ, β)), I)
其中 R 是渲染函数,I 是图像。
而学习的方法则是优化网络参数 Φ,使得对于训练集中的所有图像,网络预测的潜参数经过渲染后都能与图像匹配:
argmin_{Φ} Σ_i L(R(SMPL(f_Φ(I_i))), I_i)
这里,f_Φ 就是我们的神经网络。这种公式化的好处是,理论上可以利用海量的互联网图像和视频数据,来训练更好的回归器,甚至改进3D模型本身。尽管实践中存在诸多挑战(如信噪比低),但这为未来研究提供了有趣的方向。
本节课中我们一起学习了如何通过自监督学习从单张图像估计SMPL模型。我们总结如下:
- 自上而下的优化方法 精度高且具有反馈循环(输出会与图像反复验证),但需要良好的初始化和手动调整目标函数。
- 自下而上的学习方法 是自动的,利用了数据中的先验,但通常精度稍低,且预测结果可能与图像对齐不佳。
- 混合方法 结合了优化与学习,能够在仅有少量3D标注、大量2D标注的情况下进行自监督学习,是当前的主流方向。
- 当数据有限时,对输入图像进行抽象(如使用语义分割),移除与任务无关的外观细节,能有效提升模型的泛化能力和准确性。
- 仅需少量3D标注(约2%),结合大量2D关键点标注,就足以训练出有效的模型。

感谢学习,本讲到此结束。👋
014:通过优化将SMPL模型适配到IMU数据


在本节课中,我们将学习如何通过优化方法,将SMPL人体模型适配到稀疏的惯性测量单元数据上。我们将基于一篇名为《Sparse Inertial Poser: Automatic 3D Human Pose Estimation from Sparse IMUs》的论文展开,该论文发表于SIGGRAPH 2017并获得了最佳科学论文奖。
概述与动机
我们的目标是基于可穿戴传感器来估计人体的姿态。这些传感器是能够放置在人体上的小型设备,用于重建运动。我们希望达到的精度类似于视频中展示的效果,其中图像仅作为参考,而结果完全由传感器数据生成。
上一节我们介绍了从图像中估计人体姿态和形状的方法。然而,基于视觉的方法需要外部摄像头,这限制了其记录范围,并且难以记录某些活动。因此,基于惯性测量单元的方法提供了一种替代方案。
什么是惯性传感器?
一个惯性测量单元是一个包含磁力计、陀螺仪和加速度计的小盒子。它能提供该盒子局部坐标系相对于某个全局坐标系的方向(通常用四元数表示),以及在该盒子坐标系中测量的加速度。
全局坐标系通常这样定义:X轴指向磁力计检测到的磁北方向,Y轴指向加速度计在静态时测得的重力负方向,Z轴由叉积得出。
结合视觉与IMU
人们已经尝试将IMU与视觉系统结合。例如,在博士论文的早期工作中,我们使用多个摄像头和五个IMU,通过优化框架整合信息来估计人体姿态和形状。关键思想是结合基于视觉的关节定位(更准确)和基于IMU的关节方向跟踪(更可靠)。
稀疏IMU姿态估计方法
本节中,我们来看看论文《Sparse Inertial Poser》所采用的不同方法。它采用了“分析-综合”的方法,使用放置在身体末端和背部的六个IMU。
为了将身体运动与IMU观测联系起来,我们需要一个被追踪者的铰接式人体模型(这里使用SMPL),并且需要知道IMU在身体上的位置。
我们采用一个包含三个目标项的优化方法:
- 方向一致性:比较模型预测的骨骼方向与IMU测量的方向。
- 加速度一致性:比较模型预测的加速度与IMU测量的加速度。
- 姿态先验:基于训练数据,衡量当前姿态的可能性(使用马氏距离)。
此外,还使用关节限制来防止不自然的弯曲。
方向距离度量
在比较方向之前,我们需要了解如何在旋转空间(SO(3))中测量距离。以下是几种常见的度量方式:
-
角距离:最自然的度量。对于两个旋转矩阵 R 和 S,角距离 θ 是相对旋转 SR^T 的轴角表示中的角度。公式为:
θ = arccos( (tr(SR^T) - 1) / 2 )
或者等价于θ = ||log(SR^T)||,其中log是矩阵对数映射。 -
弦距离:定义为两个旋转矩阵之差的Frobenius范数。公式为:
d_chord(R, S) = ||R - S||_F
它与角距离的关系为:d_chord^2 = 8 sin^2(θ/2)。 -
四元数距离:对于单位四元数 q_s 和 q_r,需要考虑四元数 q 和 -q 表示相同旋转的歧义性。距离定义为:
d_quat = min( ||q_s - q_r||, ||q_s + q_r|| )
它与角距离的关系为:d_quat = 2 sin(θ/4)。 -
轴角空间L2距离:直接计算两个旋转对应轴角向量的欧几里得距离。但这种方法在角度接近π时可能不连续,因为相反的轴可能产生相近的旋转,但向量距离很大。
选择不同的度量会影响优化行为。在论文中,我们选择了角距离。
仅使用方向的局限性
如果只优化方向一致性,由于传感器稀疏,会存在歧义。许多不同的姿态可以产生相同的肢体末端方向,导致结果不自然。加速度数据可以帮助解决这种歧义。
利用加速度数据
加速度数据本身非常嘈杂,直接双重积分得到位置会导致误差爆炸。论文的关键突破是在多个帧的批次上进行优化。这样可以利用身体模型来正则化加速度的数值积分,从而稳定地利用加速度信息,并消除方向上的歧义。
优化问题变为在所有T帧上最小化目标函数,包括方向项、加速度项和先验项的总和。
优化求解
我们通过线性化残差向量并使用高斯-牛顿或Levenberg-Marquardt等算法来求解这个大规模优化问题。雅可比矩阵具有特殊的稀疏结构:
- 方向项只依赖于当前帧,导致块对角结构。
- 加速度项链接了相邻帧(t-1, t, t+1)的姿态参数,形成带状结构。
利用这种稀疏性,可以高效地求解线性系统。
结果与评估
通过批优化和强身体模型先验,该方法首次实现了仅用六个IMU就能高精度重建人体运动。评估显示,结合方向与加速度的完整方法(SI)在角度误差和关节位置误差上均显著优于仅使用方向的方法。
局限性包括:无法跟踪手部和脚部的精细运动;全局平移存在漂移;需要人体模型;并且是离线方法(需要所有数据)。
拓展应用:3DPW数据集
该方法还可用于创建野外环境下的3D人体姿态数据集。通过结合稀疏IMU和手持手机摄像头,我们可以获得具有准确3D参考姿态的野外图像-姿态对。这解决了之前缺乏野外精确3D姿态数据的问题。由此产生的3DPW数据集包含视频、2D/3D姿态标注、相机姿态和3D人体扫描,被广泛用于评估野外人体姿态估计方法。

总结

本节课我们一起学习了如何通过优化将SMPL模型适配到稀疏IMU数据。核心在于:
- 使用包含方向、加速度和先验的优化目标。
- 理解并选择合适的旋转距离度量。
- 在多帧批次上进行优化,以利用加速度数据并解决方向歧义。
- 利用身体模型和先验知识约束这个欠定问题。
这项研究首次证明了仅用六个IMU即可在野外高精度重建人体运动,并为创建宝贵的野外3D姿态数据集(3DPW)提供了基础。



015:基于学习的SMPL模型与IMU数据适配 🧍♂️➡️📊



在本节课中,我们将学习如何利用基于学习的方法,将SMPL人体模型与来自惯性测量单元(IMU)的数据进行适配。与上一节介绍的基于优化的方法不同,这种方法可以实现实时的人体姿态重建。

概述与背景
在上一节(第71讲)中,我们探讨了如何使用优化方法将SMPL模型适配到IMU数据。本节我们将转向一种基于学习的方法,它能够实现实时处理。本节内容基于2018年发表在Siggraph上的论文《Deep Inertial Poser》(DIP),但我们将聚焦于其核心概念,这些概念也适用于更近期的研究。
首先,我们简要回顾一下IMU。IMU是一种可以测量其自身相对于全局坐标系方向的设备,同时也能测量其相对于该静态全局坐标系的加速度。
在本工作中,我们使用了六个IMU传感器,分别放置在身体的末端:小腿、手腕、头部和背部。我们的目标是,仅根据这些传感器提供的方向和加速度数据(不包含位置信息),恢复人体的完整三维姿态。

上图展示了该方法得到的结果演示。可以看到,尽管只有六个传感器,不足以完全约束全身姿态,但我们仍然能从这些稀疏的传感器数据中恢复出合理的人体姿态。
为什么使用IMU进行动作捕捉?
你可能会问,为什么需要使用IMU进行动作捕捉?以下是几种主流捕捉方式的对比:
- 基于反光标记的光学系统:用于电影制作,精度高,但需要大量摄像机、设备昂贵、设置时间长,且只能在有限的录制空间内使用。
- 无标记视频捕捉系统:只需单目或双目摄像头,更为便捷。但要求摄像头与人物始终保持无遮挡的视线,这在人物与物体交互(如桌子)或在复杂场景(如大型建筑、户外)中难以实现。
- 多传感器系统(如Xsens):使用约17个传感器,提供了足够的约束来跟踪运动,但侵入性更强,需要更多传感器,设置时间也较长。
- 混合方法(传感器+摄像头):结合了视频的位置约束和IMU的方向/加速度约束,是两全其美的方法。
- 稀疏IMU优化方法(如Sparse Inertial Poser):无需摄像头,非常方便。但它是基于多帧联合优化的离线方法,无法实现实时结果,而实时性对于虚拟现实等需要即时反馈的应用至关重要。
因此,我们的需求是:使用少量IMU传感器(减少侵入性)、设置简单、无需摄像头,并能实时重建完整姿态。
核心挑战与解决方案
与上一节类似,核心挑战在于:方向信息本身通常不足以唯一确定姿态。 例如,在下肢方向几乎不变的情况下,姿态也可能发生显著变化。这意味着许多不同的姿态都可能满足相同的方向约束。
因此,我们需要学习哪些是满足给定方向约束的合理姿态。过去(以及上一节)的方法是利用时序信息进行优化,并整合加速度数据来获得更多关于身体如何运动的线索。基于SMPL这种生成式模型,我们可以从模型本身合成预测的观测值(加速度和方向),并与真实IMU测量值进行比较优化。
然而,这种优化方法(Sparse Inertial Poser)计算耗时,需要数分钟,属于离线优化,不适合实时应用。
我们的目标是实现实时性能。我们不想使用优化,而是希望用一个基于学习的系统——特别是神经网络——来替代它。
基于学习系统的三大要素
任何基于学习的系统通常都面临三个关键挑战,它们极大地影响着算法性能:
- 数据:如何获取足够多且高质量的训练数据?
- 架构:如何设计网络架构以有效利用姿态数据的时序相关性?
- 损失函数:使用什么样的损失函数才能反映我们期望的输出?
接下来,我们将逐一探讨这三个要素。
数据获取与处理
数据通常是这类学习系统中最重要的部分。
如何获取数据? 目前并没有大量与运动数据配对的IMU数据库,因为这种数据捕获本身就很困难。幸运的是,得益于像SMPL这样的统一模型格式,我们可以利用已有的运动捕捉数据集(如AMASS数据集),这些数据集将多种运动数据统一到了SMPL格式中。我们可以直接使用这些SMPL格式的数据,然后通过前向运动学来合成IMU的观测数据(加速度和方向)。只要我们知道了传感器在身体上的附着位置,就可以轻松地从SMPL模型合成这些数据。
数据处理至关重要。我们必须仔细处理数据表达方式,这直接关系到模型能否学到有效信息。首先要理解的是涉及到的坐标系:
- SMPL身体坐标系:模型的顶点坐标系。通常Y轴与重力方向对齐。
- IMU惯性坐标系:由传感器定义。Z轴通常与重力方向相反(指向地心),X轴由检测到的地磁北极方向确定,Y轴由右手定则推导得出。
传感器测量的是小盒子(IMU)相对于这个惯性坐标系的方向。然而,在使用SMPL模型进行跟踪时,我们更感兴趣的是骨骼相对于身体坐标系的方向。因此,我们需要进行一系列坐标变换。
以下是关键的坐标变换步骤:
- 将IMU读数转换到身体坐标系:这需要应用传感器到惯性系的旋转
R_IS,以及惯性系到身体跟踪系的旋转R_TI。 - 计算传感器到骨骼的恒定偏移:由于IMU盒子贴在骨骼上时可能存在朝向偏差,我们需要计算一个固定的旋转偏移
R_BS。这通常在初始帧(第0帧)通过已知的对齐关系计算得出。 - 得到骨骼方向:对于每一帧的传感器测量
R_TS,应用恒定偏移R_BS,即可得到骨骼相对于跟踪系的方向R_TB。
一个重要问题:如果我们直接用上述计算出的骨骼方向数据来训练网络预测姿态,会有什么问题?考虑一个面向北方做的动作与面向南方做的相同动作——骨骼方向会完全不同,但动作本质是一样的。我们不希望网络学习这种与全局朝向相关的、不必要的变异。
解决方案:根节点归一化。我们需要对每一帧的数据,应用根节点(如骨盆)旋转的逆变换。这样,所有骨骼的方向都表达为相对于根节点坐标系的方向。无论人面向何方,相同的动作都会产生相同的数据,这极大地增加了数据的有效性和网络的泛化能力。
网络架构设计
现在我们来看网络架构。由于我们处理的是时序数据,因此模型的选择非常重要。
以下是尝试过的几种架构:
- 前馈神经网络:使用过去和未来帧的一个窗口作为输入。它能解决任务,但未显式建模时序信息,结果存在抖动。
- WaveNet:一种常用于语音建模的卷积架构。它只隐式地建模时序依赖,在本任务中产生了明显的、令人不悦的抖动,特别是在手部和脚部。
- 双向循环神经网络:DIP论文中最终采用的架构。具体来说,是使用了LSTM单元的堆叠双向循环神经网络。网络中包含前向传播(蓝色单元)和后向传播(绿色单元)的细胞,信息在时间上向前和向后传递。这种架构能够有效地捕捉前后文信息,对于时序预测任务非常强大。
损失函数设计
最后,我们讨论损失函数。
最简单的选择是在预测姿态上使用L2损失,这已经能产生合理的结果。但由于IMU数据存在不确定性(多个姿态可能对应相同的传感器读数),我们需要让网络能够表达这种不确定性。
一种简单的方法是让网络输出一个高斯分布,即同时预测姿态的均值 μ 和对角协方差矩阵(方差向量 σ²)。然后,我们通过最大化对数似然来训练网络:
L = -log P(Y|μ, σ²),其中 Y 是真实姿态。
网络会学习预测 μ 和 σ²。当网络对预测很有信心时,它会减小方差 σ²;当不确定时,则会增大方差,使概率分布更平坦,以覆盖更多可能的姿态。
另一个技巧:输入重建损失。在训练中,有时网络会倾向于忽略部分输入信息(例如,可能更关注方向而忽略加速度)。为了确保网络充分利用所有输入信息,我们可以要求网络在输出姿态的同时,也重建出输入信号(如各关节的加速度)。这迫使信息必须流经网络各层。同样,对于重建任务也可以使用高斯似然损失。
实时性与评估
该网络非常灵活。在测试时,你可以选择使用的未来帧数:
- 纯因果模型:只使用当前及过去帧的数据预测当前帧,零延迟,完全实时。
- 带未来信息的模型:允许少量延迟,使用未来几帧的信息来预测当前帧,效果更好。
- 完全离线处理:使用所有未来帧信息,效果最佳,但延迟最大。
因此,我们可以在延迟和精度之间进行权衡。DIP方法的结果比基于优化的Sparse Inertial Poser快几个数量级,同时保持了可比的精度。
在标准数据集(如Total Capture)上的定量评估显示,DIP在关节角度误差和位置误差等指标上与优化方法(SIP)表现相近或略优。重要的是,评估集中在没有放置传感器的肢体部位,这使得评估更具挑战性,也更能体现方法的泛化能力。
域适应与最新进展
一个未提及但非常重要的问题是域适应。我们使用合成数据训练,却在真实IMU数据上测试,这之间存在域差距。解决方案通常是:先在大规模合成数据上预训练一个大模型,然后在少量真实数据上进行微调,以捕获真实IMU测量的统计特性。微调前后,结果质量有显著提升。

上图展示了实时演示的效果。
最后,简要介绍几篇改进DIP的后续工作,它们提出了有趣的想法:
- TransPose:采用从末端关节到根关节的分层预测方式,并利用脚部与地面接触信息来正则化估计,特别是对于全局位置的估计。
- Transformer Inertial Poser:使用Transformer架构替代RNN。更有趣的是,它根据预测的姿态,同时预测一个可能的地面高度场,这对于施加脚部接触、摩擦等物理约束非常有用。
- Physics Inertial Poser:结合了运动学预测器和物理模块。物理模块通过优化扭矩和外力来产生满足测量值的运动,但优化过程较为复杂。


总结
本节课我们一起学习了如何利用基于学习的方法实现从稀疏IMU到SMPL人体姿态的实时重建。我们总结了以下关键点:
- 实时稀疏IMU捕捉是可行的。
- 在大规模合成数据上训练非常有用,且日益重要,因为它易于控制并能生成海量数据。
- 域适应仍然是一个重要挑战。
- 网络架构(如双向RNN/Transformer)和损失函数(如高斯似然损失、输入重建损失)的设计对性能至关重要。
- 数据预处理(如坐标变换、根节点归一化)是成功训练的基础。
本工作的代码和数据均已开源,供进一步研究和应用。


感谢观看。




016:基于顶点的服装学习模型

在本节课中,我们将要学习如何构建一个基于顶点的服装模型。这个模型能够根据新的人体姿态、体型和服装款式,生成相应的服装几何形状。
上一节我们介绍了如何使用基于顶点的服装表示进行配准和从图像重建。本节中,我们来看看如何学习一个能够泛化到新姿态的服装模型。到目前为止,我们假设服装本身不发生变化,但这并不完全符合现实。此外,我们还需要一个能够控制服装几何形状的模型。
模型概述与数据生成
第一个能够泛化到新体型、新姿态和新款式的服装模型是名为 TailorNet 的论文。其基本思想是:首先运行基于物理的仿真来获取训练数据,然后基于这些数据学习一个模型。
为什么要这样做?因为基于物理的仿真需要专业软件和大量专业知识,且参数调优不当或发生意外穿插时容易出错。更重要的是,这类模型难以微分。物理仿真依赖于前一帧的状态,若想追溯第一帧对第一百帧的影响,需要随时间传播这种依赖关系,这并非易事。相比之下,深度学习模型易于使用、可微分,并且只要能够良好泛化,就不会“崩溃”。
首先,我们来看所使用的表示方法。我们可以应用顶点位移,或者将网格切割成不同部分以分离不同的服装。这里我们使用的是基于 ClothCap 的表示方法。
我们希望学习一个函数,它能根据姿态、体型和款式参数生成服装几何形状。基本思想是:对于一种体型,有一种款式。如果改变款式(例如让T恤变大),那么同一件T恤穿在更大的体型上应该看起来更小、更紧身。这个模型能够做到这一点。同时,模型也需要能够泛化到不同的姿态。
以下是生成训练数据的关键步骤:
- 获取多样化的服装几何形状:使用 Multi-Garment Net 中的服装数据。这些数据来自穿着服装的人体3D扫描,通过分割和姿态归一化(与之前简单模型的方法相同)获得。
- 运行物理仿真以模拟穿着效果:将服装应用到不同体型的人体上,改变人体形状,并运行物理仿真,使服装“披覆”在身体上,模拟服装在真人身上的实际外观。
- 构建款式变化空间:对每种服装的几何形状进行主成分分析(PCA),以获得一个可能的服装几何形状空间。款式参数由PCA系数 γ 控制,例如控制袖长、T恤宽度等。
- 模拟姿态变化下的形变:将服装应用到标准姿态上,然后通过从SMPL模型的姿态数据集中插值生成合成运动序列,并在此序列上运行物理仿真,以获得服装随时间(姿态)的形变。
- 同时变化体型:在运动路径上平滑地改变体型,使物理仿真同时适应姿态和体型的变化,这有助于网络更好地泛化。
- 处理多种服装类别:需要对每种服装类别(如T恤、长裤、短裤、裙子等)及其PCA参数的不同变体重复上述过程。
- 姿态归一化:获得所有仿真数据后,需要将其归一化到标准姿态空间,原因与之前相同。
模型架构:从简单MLP到混合模型
如何学习这个模型?首先应该尝试最简单的方法。最简单的方法可能是线性模型,但这效果不会很好,因为服装形变与姿态之间是非线性的,存在非刚性效应。
可以尝试使用多层感知机(MLP),例如两层或三层的神经网络。输入是姿态参数、体型参数和款式编码(γ),输出是服装的 M × 3 个顶点坐标。需要为每种服装类型(如T恤、长袖衫、裤子、裙子)分别学习一个这样的神经网络。
MLP能很好地泛化到新姿态,这比预期要好。但当在多种体型和款式上训练时,它会产生过于平滑的结果。假设这是因为高频的褶皱图案在同一姿态下,会因体型和款式的不同而发生巨大变化。网络很难找出其中的规律,或许根本不存在统一的规律。
因此,一个合理的想法是:在泛化到新姿态时,只组合相似的体型和款式。这就是 TailorNet 工作的基本思想,它使用了一个混合模型。
为了简化表示,定义一个新变量 Φ,它是体型参数和款式参数组成的元组。

现在,预测分为两部分:
- 低频形变:使用一个单一的MLP,根据给定的姿态和体型款式(Φ)预测服装的整体低频形变,它不包含高频的褶皱细节。
- 高频细节(混合模型):使用一个混合模型来建模高频褶皱图案。我们预先定义 K 个原型,每个原型是一对特定的体型和款式参数。对于查询的体型款式(Φ),我们使用一个核函数来计算它与每个原型的相似度权重。权重在距离较小时较高,距离较大时较低。最终的预测是这些原型预测的加权线性组合。我们使用一个非常窄的核,以确保只组合非常相似的体型款式模式,从而避免平滑掉由不同模型产生的高频褶皱细节。
基本公式可以表示为:
最终顶点坐标 = 低频MLP(姿态, Φ) + Σ [权重_k(Φ) * 高频MLP_k(姿态, 原型_k)]
其中,权重核函数确保只有与查询 Φ 相似的原型才会对高频部分有显著贡献。

最后,将预测出的标准姿态下的带褶皱服装,使用SMPL模型进行蒙皮,即可得到目标姿态下的服装。
模型效果与扩展
该模型使用静态姿态进行训练,但能够预测出时间上连贯的结果。这对于从单张图像估计人体形状和服装非常有用。
模型能够很好地泛化到不同款式和体型。例如,保持体型固定,改变款式参数(γ),T恤的长度和合身度会相应变化。保持款式固定,改变体型,随着身体变大,T恤会变得更紧身。
需要为每种服装类别(如裙子、长袖衫、T恤、短裤、长裤)分别构建一个模型。这虽然不是一个紧凑的单一模型,但合乎情理,因为不同类别服装的形变模式可能完全不同。这种分层表示对于许多应用是有优势的,并且能产生相当真实的服装形变效果。
TailorNet 是一个相对简单且代码开源的模型。此外,还有其他更复杂的工作,例如:
- SNUG:这是TailorNet的自监督版本。它将物理仿真整合到训练循环中,通过自监督损失确保网络输出符合物理规律,从而减少了数据生成时间,将训练时间从17小时缩短到约2小时。
- Meta/Facebook的模型:同样基于顶点位移和类似ClothCap的表示。他们使用一个编码器-解码器架构的变分自编码器(VAE),联合预测服装的几何形状和视角依赖的纹理。在测试时,可以从潜空间中采样以生成不同款式的服装。
基于顶点模型的优势与局限
基于顶点位移的模型有其优势:
- 可控性强:易于控制服装形状和纹理。
- 兼容图形管线:与现有的计算机图形流水线兼容。
- 顶点对应关系完美:可以轻松实现服装在不同身体间的转移、纹理更换等操作。
然而,其主要局限性在于:
- 拓扑结构单一:每个模型只能处理一种固定的网格拓扑结构,无法同时生成不同拓扑的服装(例如,不能从一个模型同时生成T恤和裙子)。
- 难以处理非常宽松的服装:例如宽大的裙子,顶点位移表示可能效果不佳。
- 无法泛化到任意物体:不能通过单一的基础形状施加顶点位移来生成世界上所有可能的物体。
总结
本节课我们一起学习了基于顶点的服装学习模型。
- 我们首先了解了构建此类模型需要生成包含姿态、体型和款式变化的仿真数据。
- 接着,我们探讨了从简单的MLP模型到更先进的混合模型(TailorNet) 的演进,混合模型通过组合相似款式的高频预测,有效解决了细节平滑的问题。
- 然后,我们查看了模型的泛化效果,并简要介绍了其他相关扩展工作。
- 最后,我们分析了基于顶点模型的优势(可控、兼容性好)和主要局限(拓扑结构单一)。
总而言之,建模服装比建模裸体人体更为复杂,需要仔细考虑表示方法、配准、图像拟合和模型构建策略。基于顶点的参数化模型功能强大、易于控制和集成,但受限于单一拓扑结构且难以训练出丰富细节。

在下一讲中,我们将探讨如何使用隐式曲面模型来解决其中一些局限性,特别是在生成细节和灵活处理不同拓扑结构方面。
017:基于顶点的图像服装重建 - 第二部分

在本节课中,我们将学习如何从单张或多张图像中,重建穿着服装的三维人体模型。我们将探讨基于优化的方法和基于学习的方法,并了解如何将服装与身体分离以获得更高的控制度。
概述
上一节我们介绍了如何使用顶点位移来表示服装,以及如何利用这种表示来获取包含服装的人体扫描注册,并分离服装与估计服装下的体型。本节中,我们来看看如何从图像中估计穿着服装的人体三维模型。
从视频中重建三维人体模型
在2018年,自动重建穿着服装的人体三维模型尚不可能。以下介绍的方法可能是首个证明此任务可行的论文。该方法假设有一段人物在相机前旋转的单一视频。
目标是重建一个如你所见的虚拟化身,该化身可以在姿态和体型上进行编辑。
基本思想基于优化。首先想到的是,我们有一段视频,当人物旋转或移动时,其服装和体型几乎不变,唯一变化的是姿态。因此,一个想法是建立一个优化框架,在整个序列上同时优化姿态、体型和服装位移。
对于每一帧 i,都有一个姿态参数 θ_i。对于每一帧,都有一个衡量模型与数据拟合程度的度量,这类似于上一讲中稀疏惯性捕捉论文的方法,但这里使用的是图像。拟合度量基本上是依赖于优化参数(θ_i、体型参数 β 和位移 D)的模型 M 的渲染结果与图像本身之间的某种距离。这个距离度量可以是轮廓重叠、关节重叠或边缘比较等,即将预测的特征与图像中检测到的特征进行比较。
这种公式化的一个问题是必须一次性优化所有姿态。这在原则上计算量大且内存密集,因为需要为每一帧加载一个模型,并同时更新所有这些模型。虽然可以高效完成,但通常需要为此优化编写专门的代码,这可能不太方便。
视频化身与视觉外壳技术
另一种看待这个问题的方式是CBPR 2018年一篇名为“视频化身”的论文所展示的。其中运用了经典计算机图形学中从多视图重建三维形状的技术,称为视觉外壳重建。
标准的视觉外壳假设一个静态物体和多个观察该物体的视角。你可以从每个相机中心发射光线,这些光线从相机中心指向轮廓点,这就创建了一个所谓的“轮廓锥体”。通过相交这些锥体,可以获得三维形状。
另一种理解方式是体素化三维空间,然后将体素投影到每个相机视图中。如果它与前景重叠,则意味着它是表面内部的一部分;如果不重叠,则是背景的一部分。通过这种方式可以重建表面。
然而,问题在于人物在这里是移动的,姿态在变化,因此我们不能假设物体是静态的,需要对此进行补偿。
我们知道如何使用SMPL模型在每一帧估计三维人体模型,但这无法捕捉服装细节。那么,如何在不一次性优化所有姿态的情况下估计服装呢?
将视觉外壳推广到铰接物体
基本思想是基于视觉外壳技术,并将其推广到铰接物体。视觉外壳假设物体是静态的,这里我们将放宽这个假设,允许物体根据关节运动。
这里的轮廓光线从相机中心穿过轮廓,然后可以将其与模型表面的点建立对应关系。每一束光线都与一个身体模型点相关联。现在我们要做的是对这些从相机到轮廓的光线进行“逆姿态变换”,以便优化一个与姿态无关的单一形状。
这可以看作是我们学习SMPL模型时所用“逆姿态变换”技巧的推广,只不过这里我们拥有的不是完整的三维扫描姿态,而只是一个人的轮廓。
具体思路是:将光线与三维模型点关联,每个三维模型点根据SMPL模型对应的运动链变形。因此,光线会与SMPL模型一起变形,我们对光线进行了逆姿态变换。
这样做的好处是,这些光线对身体在空间中的位置设置了约束,但这些约束现在不依赖于姿态,因为我们已经对光线进行了逆变换。核心思想是根据非刚性运动的逆变换来变换轮廓锥体。
数学上,我们有一个规范空间中的光线 R(这是我们想要得到的),以及姿态空间中的光线 R'。我们需要做的是应用施加在模型顶点上的变换的逆变换。这束光线将与一个顶点关联,该顶点有其变换矩阵 J_k 和混合权重 w_{k,i}。因此,基本上,这个来自线性混合蒙皮的变换矩阵的线性组合需要被求逆,然后还需要减去姿态混合形状的贡献。
本质上,这就像是向前移动一个顶点,但现在是向后移动,并且不是应用于顶点,而是应用于一条光线。一旦完成,你就将姿态空间中的光线变换到了规范空间。
这个想法应该开始变得熟悉,因为它反复出现:即通过逆姿态变换来估计与姿态无关的形状属性,这与我们学习SMPL模型时的技巧相同。

基本优化框架
现在,基本的优化框架是:我们有一组形状参数(假设形状随时间恒定),以及服装的位移参数(也假设在序列中恒定)。

数据项是光线到模型中对应顶点的距离,由点线距离公式给出。先验项包括强制执行形状对称性、基于SMPL模型PCA空间的形状先验,以及基于拉普拉斯正则化器的表面平滑度。
关键点在于,一旦我们对光线进行了逆姿态变换,这个目标函数就不再依赖于姿态。这非常棒,因为现在优化速度更快,并且无需优化姿态就能产生期望的结果。当然,这里的技巧是,如果初始姿态估计错误,那么形状优化也不会正确。因此,必须首先确保姿态是准确的。但如果你一开始没有好的形状模型,这可能很困难,这就形成了一个先有鸡还是先有蛋的问题,可以通过先拟合姿态、再优化形状、然后重新拟合姿态的迭代方式来解决。

在实践中,即使不知道人的具体形状,姿态也可以被合理地估计出来。

应用这种方法可以利用时间信息,恢复人的三维形状以及优化后的姿态。
当时获得这些结果时,我们感到非常高兴和印象深刻。如今,你可以从单帧图像中获得更详细的重建,但这在当时的技术水平下,证明了什么是可能的。
基本上,可以使用这种方法重建各种穿着服装的人体模型。由于基于位移表示,对于像裙子这样的大范围服装,质量可能不会很好。
因为这是基于SMPL模型的,所以你可以对这些化身应用不同的姿态,也可以改变它们的体型。位移是应用在SMPL模型之上的,因此只需改变SMPL模型即可改变这些模型的形状。
这是一种基于优化的方法。如果你对细节感兴趣,可以使用基于“从明暗恢复形状”的方法获得更好的细节,该方法试图联合估计表面法线和光源以推断三维形状的细节。但这同样基于优化且相当复杂。
方法的局限性
局限性在于优化可能陷入局部最小值,正如我们在其他方法中看到的那样。最大的限制可能是将服装表示为单一偏移量,因为你无法将身体与服装分离,例如,不能将服装从一个身体重定向到另一个身体。另一个限制当然是可能陷入局部最小值。
这里除了在图像中检测人体的二维关键点和分割人体之外,没有真正的“学习”过程。
引入学习:从优化到学习范式
一年后,包括我们团队在内的研究者开始探索,基本上是从纯粹的优化方法转向包含学习的方法。
你可以将其视为增加一个前端:给定图像,预测模型的参数。然后训练这个网络。如果没有三维数据,可以通过自监督循环进行训练:从图像开始,用卷积神经网络预测三维模型的参数,然后通过一个可微的三维模型(如SMPL加位移)得到三维模型,接着将其渲染回图像,并要求最小化一致性损失。
这与我们之前的优化问题没有太大不同,但请注意,现在参数 θ、β 和服装参数被参数化为图像和神经网络参数 Φ 的函数。这允许我们在多个人物图像和视频上进行训练。
以下是遵循此范式的一些论文示例。其中,“视频化身”论文的扩展使用了自监督循环。MGN论文将服装与身体分离。DeepCap论文是特定于主体的,但允许从单一视频中稳健地跟踪穿着服装的人体,包括非刚性变形。如果你对这些主题感兴趣,建议至少阅读这些论文。
多服装网络
在本讲座中,我将介绍多服装网络,因为它是将服装与身体分离的论文,我想聚焦于不同服装表示方法的优缺点。
目标是从单张人物姿态图像中获取三维化身。设置与之前相同:一个人在相机前旋转,你想从这些图像中重建体型和服装,但现在你希望有能力将一个主体的服装转移到另一个主体上。
为了获得这种控制水平,需要一个将服装与身体分离的模型,正如我们在ClothCap论文中看到的那样。现在我们要从图像中做到这一点,这将更具挑战性。
在表示方面,同样需要将服装切割成片,并估计服装下的体型。这样做需要进行注册,这是一个非常困难的问题。如果对于不穿衣服的人已经很困难,想象一下对于不同种类、不同拓扑结构、不同形状、不同非刚性变形的服装,难度会有多大。
想象你想建立一个T恤的模型。你需要将扫描分割成服装,估计服装下的体型(类似于ClothCap),然后将每个服装模板非刚性注册到每个扫描。当然,你不会孤立地注册模板,你会利用身体,因为这会使问题更容易处理。
通过使用复杂的优化流程,我们能够注册一个包含33个穿着服装的人体扫描数据集。这允许你,例如,取一件服装并将其映射到不同人的扫描上。现在的问题是如何用图像做到这一点?
设置是:你有一个人在相机前旋转的8张图像(源),以及一个目标扫描,你想要这个三维服装网格。这是通过自监督完成的。
首先解析图像,得到人体的2D关键点和语义分割。这样做是因为没有足够的数据来泛化到所有可能的纹理和服装变化。如果将语义分割作为图像输入网络,网络将能更好地泛化到其他服装类型,例如,它不需要泛化到不同的颜色和纹理,因为这些信息在语义分割中被抽象掉了。
基本上,现在你为每件服装以及人物的形状和姿态都有不同的预测头。然后组合这些预测。对于服装,你也有一个PCA模型,通过这些特征向量和系数,你可以获得服装,再加上网络预测的一些额外位移,以表示PCA空间之外的东西。
然后,你使用自监督损失来闭合循环,其中包括预测与真实语义分割的重叠度。如果你有一点三维数据,还可以直接在三维扫描或三维顶点上应用监督。如果你有注册数据,可以在体型和服装参数上应用损失。
这是一个与神经身体拟合非常相似的设置。对于服装,你可能比仅估计姿态和体型需要更多的三维数据。
现在,你有人物在相机前旋转的8张输入图像,可以估计体型和服装,然后将其应用到任何体型上。令人惊讶的是,这种简单的、可能有些朴素的仅应用位移的模型,能产生视觉上相当吸引人的结果。
对于某些应用,例如游戏或体育赛事,需要将特定类型的服装应用到不同的体型上,这种位移的想法可能完全够用。
从图像到UV映射:提升细节预测
我们观察到的一个问题是,直接将位移作为图像的函数来预测是一项困难的学习任务。原因是图像中的像素空间与顶点空间非常脱节,网络没有直接的连接来弄清楚什么对应什么。
使学习问题表现更好的一种方法,是我们在这项名为“Tex2Shape”的工作中所做的:从单张图像获取详细全身几何,利用UV映射。
这里的想法是将三维重建问题转化为图像翻译问题。有一系列论文利用图像翻译网络,例如,输入语义分割,网络会输出包括纹理在内的完整真实感图像。这些基于“pix2pix”架构,卷积网络非常擅长找到这种图像到图像的映射,因为输入和输出之间有完美的像素对齐。
这里的想法是利用UV映射。UV映射是将人体的三维形状展开成二维图像的过程,就像将世界地图展开成地图集一样。每个像素在这个二维图像中都有一个对应的三维表面点,这意味着你可以在这里存储任何与三维形状相关的东西,例如位移或法线。好处是你可以有一个非常高分辨率的图像,当你想渲染时,只需在图像中查找法线,这比在网格上存储法线在数据结构上更高效。
我们知道如何将形状表示为图像,因为可以在每个UV坐标存储从平均平滑形状(例如SMPL模型)的位移。输出是存储了位移和法线的UV图。
现在,如何从图像得到这样一个UV图呢?有诸如DenseRack和DensePose等论文,它们学习一个对应关系图,为图像中的每个像素学习其在UV空间中的对应坐标。这允许你将图像直接展开成可见像素的UV图。注意这个UV图是不完整的,因为人物的背面没有被看到。
现在,我们可以利用这个UV变换,通过神经网络从图像像素转到UV预测。输出是法线和三维位移。使用这种像素到像素的翻译网络,可以直接学习从这些像素到这些法线和三维位移的映射。
我们这样做而不是直接从输入到输出的原因是,现在我们有一对一的对齐关系:输入中的眼睛与输出中的眼睛对齐,鼻子和胸部服装与胸部服装的三维几何对齐等等。这对神经网络来说非常方便,因为它可以在不同局部层次上观察,查看局部结构和全局结构,神经网络非常适合做这件事。
以下是一些结果,显示了扫描的三维渲染(灰色为真实值,绿色为神经网络重建)。对于正面部分,结果看起来相当详细;对于背面,也相当详细。
为了训练这个网络,使用了感知损失和对抗损失以获得细节并处理问题的多模态性。尽管这仅用三维人体扫描训练,但它可以泛化到野外的人物图像。值得注意的是,它还能泛化到各种随意姿态。
为了从合成数据泛化到真实数据,需要进行大量的数据增强,例如应用不同的光照、视角、着色等,否则网络会过拟合到训练渲染过程中的光照条件。
这是关于使用神经网络一次性重建三维化身,这比优化方法快得多,因为神经网络只需几毫秒就能产生输出。
纹理映射与虚拟试穿
我们还使用了类似的想法来映射纹理。一个问题是很难从不同纹理的三维人体扫描中获得各种纹理。我们意识到服装店有很多服装图像,因此我们想学习一个可能的人物纹理模型。学习直接将服装图像的纹理映射到三维人体模型是有意义的。
一个额外的优势是,这允许你进行某种虚拟试穿。我们训练了一个神经网络,学习将这些服装图像中的像素直接映射到不同服装的SMPL模型的UV图上,这允许你取商店里的服装图像,然后将它们映射到SMPL模型上,以获得这些带纹理的化身。
总结
本节课中,我们一起学习了从图像估计包括服装的三维人体模型。
核心要点如下:
- 视频化身论文证明了从单一视频重建包含服装的三维人物是可能的。
- 如果你想利用时间信息,必须利用形状随时间几乎不变这一事实。
- 将身体与服装分开编码允许更高的控制度,例如将一件服装从一个身体应用到另一个身体。
- 拥有具有意义和可控性的编码(如分离的身体和服装)是很好的。
- 直接预测顶点并不容易,特别是如果你想预测细节。
- 在UV空间中进行像素对齐的预测能产生更详细的重建,同时允许你对模型应用不同的姿态和体型。

我们将在下一讲中介绍另一类基于隐式表面的技术,它能提供比这些UV空间方法更好的细节。这将结束基于顶点的服装和图像中人体估计的第二部分。
018:基于顶点的服装表示与注册


在本节课中,我们将学习如何使用顶点位移来表示服装,并利用这种表示方法进行三维扫描的注册。接着,我们将探讨如何从单张图像预测穿着服装的人体三维模型。最后,我们会了解如何学习一个将姿态、体型和服装风格作为输入参数的服装模型。
👕 服装表示方法概述
在本课程中,我们将看到几种不同的服装表示方法。本节将介绍基于顶点位移的方法,这是最基本、最简单的表示形式。后续课程还会介绍基于隐式曲面、点云和神经特征点等方法。
让我们先看看顶点位移表示法。如果你还记得,SMPL模型是基于一个基础形状(模板),通过添加一组向量位移来建模形状变形和姿态相关变形,所有这些计算都在一个规范姿态下进行。
现在,如果我们想为这个基础模型添加服装,最简单的方法就是再添加一组顶点位移来专门表示服装。这些顶点位移将叠加在规范姿态下的基础平均形状之上。
本质上,如果我们知道了这些位移,就可以从一个未着装的人体形状变换到一个着装的人体形状,如上图所示。这种表示法有其优点和缺点,我们将在本节中详细探讨。
🔍 基于顶点位移的服装注册
首先,让我们尝试用这种表示法解决一个实际问题:为穿着服装的人体三维扫描进行注册。
为服装进行注册的过程与为裸体人体注册没有太大不同。因为即使对于裸体,模型也无法解释所有细节。这里的技巧是同时优化模型参数和一组自由形式的顶点位移,以逐步适应扫描数据。
注册过程如下:
- 从某个初始模型开始,首先优化模型参数。
- 当模型足够接近数据后,启动自由形式的顶点位移优化(即之前提到的位移矩阵)。
- 通过这种方式,我们得到一个与SMPL模板顶点数相同,但能表示服装的注册结果。
然而,你可能已经猜到,这种注册方法的主要问题是它完全忽略了服装在身体上的分层结构。这意味着,当某人抬起手臂,服装随之移动时,这种表示法并不是在追踪这种切向移动,而是试图通过顶点在法线方向上的位移来解释变化。这对于许多应用(如纹理映射或将服装转移到不同体型的人身上)来说是个问题。
🧩 多层注册:ClothCap方法
为了解决上述问题,我们引入了ClothCap工作。其核心思想是将服装分割成独立的网格部件,并分别估计服装下的身体形状。这样,我们就可以分别追踪服装下的身体和每件衣物,从而获得一个多层注册结果,更好地捕捉运动的物理特性。
实现这一目标的第一步是估计服装下的身体形状。这本身是一个挑战,因为服装会遮挡身体。然而,我们在2017年观察到:当人运动时,服装会在身体的不同部位产生褶皱和贴合。利用多帧时间序列信息,这些多重约束为我们提供了关于真实身体形状的大量信息。
我们利用了这一观察,开发了名为“Buff”的方法。具体做法是:积累所有时间帧的规范姿态注册结果,考虑这些注册结果的并集,我们称之为“融合扫描”。你可以把它想象成一个有很多层的洋葱。我们可以设置一个优化问题,要求身体模型位于这个“洋葱”(即融合扫描)的凸包内部,因为服装不能与身体相交。通过这种方式,我们可以相当准确地估计出服装下的身体形状。
🧠 ClothCap工作流程详解
ClothCap工作的输入是一系列由4D扫描仪捕捉的运动中的三维扫描序列。我们还会手动定义一些标签,来指定我们期望哪些身体部位与特定衣物(如T恤、裤子)重叠。这是一个非常弱的先验,用于帮助获得更好的扫描分割。
给定输入后,工作流程如下:
- 扫描分割:首先将扫描序列分割成不同的衣物部件。
- 多层模型注册:然后,将一个多层的SMPL模型(如果你愿意,可以看作是SMPL的多层版本)注册到这些分割后的扫描上。
本讲座不深入讲解扫描分割的具体技术(当时基于马尔可夫随机场和身体先验),而是聚焦于多层部件注册的过程。这个过程是全自动的,最终能得到一个包含服装下身体形状以及每件衣物随时间追踪的注册结果。
🛠️ 如何实现多层网格注册?
要获得好的注册,需要一个好的模型。而标准的SMPL模型不适合解释穿着服装的人,因为它本身没有服装。因此,我们在这里做的是:为正在追踪的目标对象创建一个特化的SMPL模型。
具体步骤如下:
- 将SMPL模型分割成与扫描分割对应的部件(通过将扫描的分割信息传递到SMPL模板)。
- 将SMPL模型切割成这些部件。
- 变形这个SMPL模型,使其能够解释第一帧扫描。
这样,我们就得到了一个被分割成部件的网格。这个网格的顶点源于SMPL模型,这意味着我们仍然可以使用SMPL的函数来改变这个特化模型的姿态或形状,这对后续的注册非常有用。
我们将这个“服装模板”作为我们的模型,然后将其非刚性变形到每一帧扫描,以获得多层注册结果。这样,我们就能捕捉到服装的非刚性动力学,比如运动时产生的褶皱变形。
⚖️ 注册的目标函数
与裸体注册类似,我们的目标函数包含数据项和耦合项,但更为复杂。
- 数据项:这是扫描到网格的距离。但现在,我们计算的是每个衣物部件与其对应的扫描分割部分之间的距离。公式表示为:
∑_{garment=1}^{N} distance(V^{garment}, S^{garment})
其中V^{garment}是注册结果中衣物的顶点,S^{garment}是扫描分割中对应的衣物部分。这样做比不考虑分割的整体注册效果更好。 - 耦合项:使注册结果接近我们的特化模型。这个模型知道服装的大致形状,但不知道随时间变化的非刚性变形(如皱纹)。耦合项在拟合数据和保持模型合理性之间进行权衡。
- 边界项:我们希望注册结果中衣物的边界与扫描中检测到的边界匹配,并且边界是平滑的。
- 平滑项:拉普拉斯项,用于使整个注册结果的表面平滑。
📐 边界平滑与拉普拉斯平滑
边界平滑是为了防止优化后边界变得噪声大、不平滑。对于一个用弧长 s 参数化的曲线 γ(s) = [x(s), y(s), z(s)],其曲率的平方近似为二阶导数的平方和。我们希望曲率小,以实现平滑。
在离散网格中,对于边界环上的每个顶点 n,其平滑项可计算为:
∑ ||v_{n-1} - 2v_n + v_{n+1}||²
这本质上是计算一维拉普拉斯算子,最小化该项可使边界曲线平滑。
拉普拉斯平滑则作用于整个网格表面,用于保持整体光滑并允许合理的褶皱。给定一个网格,其图拉普拉斯算子 L 定义为:
L = I - D^{-1}A
其中 A 是邻接矩阵,D 是对角度矩阵(D_ii 为顶点 i 的邻居数)。
当我们最小化 ||L * V||²(V 是顶点矩阵)时,对于每个顶点 v_i,我们实际上是在最小化其与邻居平均位置 (1/N)∑v_j 的差值。这个差值向量近似于法线方向,其大小与平均曲率相关。最小化这个项会使表面尽可能平坦,但通过与数据项的权衡,可以保留必要的细节(如皱纹)。
🎯 多层注册的应用与总结
一旦通过优化上述目标函数解决了多层注册问题,我们就能获得完美的、与底层SMPL模型对齐的衣物注册结果。这使得我们可以对服装和身体进行“线性代数”操作。
例如,我们可以计算衣物的位移:位移 = 衣物顶点 - 对应的身体模板顶点。当我们有一个新的身体时,只需将计算好的位移加到新身体的对应顶点上,就能为其“穿上”衣服。这实现了服装在不同人体间的转移。
以下是应用示例:
- 将一个人的服装注册结果,通过添加位移的方式,转移到另一个不同体型的人身上。
- 该方法不仅适用于紧身衣,也可用于追踪裙子等服装,只需为裙子准备一个单独的模板,并让其随着身体的根关节移动即可。
需要指出的是,ClothCap的这种简单位移添加模型,并没有考虑服装的物理属性(如一件T恤穿在更大体型的人身上会被撑大)。要建模这些效应,需要更复杂的服装模型,这将在后续课程中讨论。
本节课中,我们一起学习了基于顶点位移的服装表示方法,以及如何通过ClothCap方法实现考虑分层结构的多层服装注册,从而为后续的服装转移和编辑奠定了基础。


019:神经隐式与点基服装模型 - 第三部分和第四部分


在本节课中,我们将学习如何构建能够从潜在代码生成新形状的生成式神经隐式人体模型,并了解另一种基于点云的服装建模方法。我们将首先探讨生成式神经隐式模型的工作原理,然后介绍点基服装模型的优势与局限。
概述:从重建到生成 🧬
上一节我们介绍了用于人体重建的神经隐式模型。这些模型虽然能泛化到新姿态,但并非严格意义上的生成模型。本节中,我们将探讨如何构建真正的生成式模型,即给定一些控制参数(如潜在编码),模型能够生成以隐式方式表示的新人体形状。
生成式神经隐式模型:GDN 🏗️
我们将以名为GDN(Towards Generative Detailed Neural Avatars)的工作为基础进行讲解。其核心思想与之前类似,但关键在于训练一个模型,使其能够从潜在编码生成形状。
模型架构概览
模型在高层级的工作流程如下:
- 输入一个编码人体整体形状和服装类型的潜在编码
Z_shape。 - 输入另一个编码服装细节(如褶皱)的潜在编码
Z_detail。 - 一个规范隐式模型在规范空间中生成形状的隐式表面以及空间中各点的法向量场。
- 一个多主体前向蒙皮模块,将Simple模型的蒙皮思想扩展到神经隐式场,以处理不同体型。
该网络使用自解码框架进行训练,并通过对抗损失来学习更具随机性的细节部分。
以下是训练框架的简要说明:
- 自解码框架:为训练数据集中的每个实例初始化一组潜在编码(
Z_shape,Z_detail),并与模型参数一起优化。 - 对抗训练:用于训练法向量细节部分,采用生成对抗网络的训练方式。
规范隐式模型
这部分没有新概念,主要是应用之前的知识构建系统。
- 形状潜在编码
Z_shape生成一个神经特征体素网格。 - 对于给定点,通过三线性插值获取其特征,与点的绝对位置一同输入“占用率块”,解码出该点在规范空间中的占用率
O。 - 法向量模块根据点的特征、绝对位置以及细节潜在编码
Z_detail预测法向量。
因此,形状被表示为一个隐式表面,即所有满足占用率 O(x) = τ(通常 τ = 0.5)的点 x 的集合。占用率场映射在0(内部)和1(外部)之间。
多主体前向蒙皮模块
此模块基于SNARF的前向蒙皮思想,但需处理多主体情况,因此更为复杂。
我们需要建模两项内容:无服装的人体变形和有服装的变形。为了更容易学习前向蒙皮,我们考虑使用不带服装变形的Simple模板。
具体流程涉及两个模块:
- 蒙皮权重模块
W:输入形状潜在编码Z_shape和尺寸无关的规范点X*,预测蒙皮权重。 - 体型依赖变形场模块
M:用于将尺寸依赖的规范点X̄*转换为尺寸无关的点X*,以便W模块能在此与体型无关的空间中预测蒙皮权重。这是使模型更容易泛化的关键新概念。
前向蒙皮过程需要满足模型预测的 posed 点 x' 与真实 posed 点匹配,这涉及通过迭代求根来寻找对应的规范点。
训练流程与结果
模型采用自解码设置训练。首先训练粗糙形状模型,然后在此基础上训练法向量细节模块。
此类模型可以生成相当详细的结果,并且能够从潜在编码生成全新的人体。虽然生成的变形看起来与蒙皮模型结果相似(因为蒙皮权重不依赖于姿态),但法向量预测引入了一些姿态依赖的细节。其优势在于能够生成具有不同服装风格的多样化人体。
分层生成模型:Simplicial 🧥
GDN模型的一个限制是它是单层的,没有分离身体和服装。分离两者能提供更多控制,例如更换服装。
Simplicial 是一个拓扑感知的生成模型,它使用神经隐式表面编码服装层,允许在不同服装(包括不同拓扑结构)之间进行插值。
与顶点基模型的对比
顶点基服装模型(如TailorNet)基于位移场,需要预测三维位移作为姿态和形状的函数:M(pose, shape) -> displacement。它们是离散的,需要预定义顶点数量。
神经隐式模型则使用一个函数 C,它接受空间中的任意点、姿态和服装编码,输出一个无符号距离场来表示表面:C(point, pose, Z_cloth) -> unsigned distance。表面是该距离场的零水平集。
在Simplicial中,Z_cloth 被分解为控制服装类别(如袖子长度)的 Z_cat 和控制合身度的 Z_style,以实现更精细的控制。
从图像拟合模型
隐式表示的一个便利之处是易于从图像拟合模型,可以直接优化模型的潜在编码。
拟合流程:
- 从图像中提取服装语义分割。
- 使用现有方法初始化人体姿态和形状参数。
- 通过优化服装潜在编码
Z_cloth,使模型投影与图像分割掩码对齐,从而获得三维重建。
优化目标函数简述:
- 沿从相机出发穿过像素的光线采样点。
- 每个点用相对于人体网格上一组关键点的位移来表示(
P_β),这编码了点与身体的关系。 - 对于每个采样点,判断其是否与对应的语义分割标签重叠(变量
s_p ∈ {0, 1})。 - 情况1 (
s_p = 0):点位于分割区域外,应强制其位于服装表面之外,即要求距离场值C > 0(通常设为最大允许距离d_max)。 - 情况2 (
s_p = 1):点位于分割区域内,应强制其位于服装表面上,即最小化|C|,使C趋近于0。 - 考虑投影到同一像素的所有点,通常取沿光线的最小值。
通过这种优化,可以恢复出与图像分割对齐并覆盖在身体上的分层服装模型。结果质量受训练数据和距离场阈值的影响。
点基服装模型:第四部分 ⚫
现在让我们转向点基服装模型。这部分内容相对简短,但作为一种表示方法值得了解。
表示方法比较
点云与其他模型相比如何?
- 保真度高,拓扑灵活(点可自由移动)。
- 可直接从扫描中学习,并允许快速渲染。
- 随着类似高斯泼溅这样的点基渲染技术兴起,点表示越来越受欢迎。
POP:基于点的细节表示
之前的一些方法将特征附加在表面面片上,可能导致拼接边界处的伪影。POP 方法直接将特征附加到点上,实现了更细粒度的表示,从而能捕捉尖锐的局部细节。
工作原理:
- 依赖于UV贴图,该贴图建立了图像UV位置与表面3D点之间的对应关系。
- 一个编码器为每个UV位置生成点特征。
- 结合服装潜在张量,一个形状解码器为表面上的每个点预测一个位移向量
r_i ∈ R³。 - 该位移在规范空间中预测,然后与原始点一同变换到姿态空间,得到最终的点位置
p_i。
这与TailorNet 的核心思想(预测位移)相似,但关键区别在于:POP 输出的点是离散且不连接的,渲染时不使用连接它们的面片。
结果与局限
POP 可以产生比传统LBS更高质量的结果。然而,由于使用简单的UV贴图,在接缝处可能出现不连续。对于裙子这类服装,当腿部分开时,基于身体位移场的点可能会变得稀疏,导致伪影。
总结点基模型:
- 控制不复杂,能建模不同拓扑。
- 能达到良好的细节水平,渲染速度快。
- 不是连续表示,是离散的,需要预先指定点的数量,在这方面与网格有相同的问题。
后续课程中我们将看到基于高斯泼溅的点模型,其主要区别在于每个点附加了一个高斯分布(协方差),可以快速渲染出高质量结果,且无需顶点连接。
总结 🎯
本节课我们一起学习了生成式神经隐式人体模型和点基服装模型。
- 在第三部分,我们探讨了GDN等生成式神经隐式模型,它们能够从潜在代码生成带细节的人体形状,并通过分层模型(如Simplicial)实现了身体与服装的分离及跨拓扑插值。
- 在第四部分,我们介绍了点基服装模型(如POP),了解了其通过离散点表示服装、实现快速渲染和灵活拓扑的能力,同时也认识到其存在离散性带来的限制。
隐式表面更易于学习,并能提供一定程度的控制,相关研究正在不断改进。点基表示则在高保真渲染方面展现出独特优势。理解这些不同表示方法的优缺点,对于在虚拟人类建模中选择合适的技术至关重要。


020:神经隐式与基于点的服装模型 - 第二部分

概述
在本节课中,我们将继续学习神经隐式模型,并探讨如何将其专门化,以更好地应用于人体建模,特别是穿着服装的人体。我们将从回顾基于网格模型的局限性开始,逐步介绍几种关键的神经隐式人体模型,分析它们的设计思路、优势与挑战。
从通用模型到人体模型
上一节我们介绍了用于通用物体的神经隐式模型。本节中,我们将看看如何使这些模型专门用于人体。
基于网格的人体模型,虽然在某些方面很方便,但在处理拓扑结构变化和复杂服装时存在问题。拓扑需要手动定义,并且分辨率有限。相比之下,隐式函数或隐式表面在拓扑变化方面更灵活,也更适合学习,因为它们允许对每个点进行预测。
用于人体和关节的神经隐式模型具有高保真度、拓扑灵活性,并允许一定程度的控制。它们可以直接从扫描数据中学习,而无需进行繁琐的配准。
基于顶点的人体模型是一个函数,它将姿态和形状参数映射到模型的 3N 个顶点(V 代表顶点,是三维的)。而在神经隐式模型中,给定一个维度为 D 的潜在编码 z 和一个三维点 p,模型预测一个距离或占据值(一个标量)。这是两种模型在数学上的核心区别。
为了使神经隐式模型更像人体模型,我们需要让它们不再依赖于随机的潜在编码,而是依赖于有意义的潜在编码,即人体的姿态 θ 和形状 β,并预测距离或占据值。
NASA:首个神经隐式人体模型
第一个尝试用神经隐式模型预测人体或关节化表面的模型是NASA。该论文的核心论点是,需要对关节结构进行推理,否则网络很难为所有可能的姿态学习表面的占据情况。
以下是其基本思路:
- 朴素方案:直接从姿态预测隐式表面非常困难,因为网络需要为每种可能的姿态学习其配置。
- 改进方案:利用人体是关节化的这一先验知识,让网络的学习任务变得更容易。
其灵感来源于SMPL等模型在规范空间进行变形的思想。问题在于,能否将这些概念扩展到神经隐式模型?答案是肯定的。
分块刚性模型
为了改进不适用于新姿态的非结构化朴素模型,我们可以引入分块刚性模型。
该模型的操作如下:对于姿态空间中的每个点,模型会根据身体的每个部分将其“解除姿态”。我们虽然不知道空间中的一个点属于哪个部分,但模型会假设它属于每一个部分。
以下是具体步骤:
- 根据每个部分,将点
p变换回规范空间。 - 为每个刚性部分预测占据值。
- 点的总占据值取所有部分预测值的最大值。
这意味着,一个点只要被任何一个部分占据,就被认为是占据的。这与我们之前看到的通过 max 操作组合多个部分的隐式表面以得到并集的思想一致。
这个模型显著改善了结果,能够更好地重建姿态。然而,与简单的刚性网格模型类似,它在关节处存在问题,因为人体并非刚性部件的集合,还存在非刚性变形。
可变形分块模型
为了模拟这些依赖于姿态的变形(类似于SMPL中的姿态混合形状),模型在规范空间的占据网络函数中也加入了姿态 θ 作为条件。这样,网络就能学习也依赖于姿态的占据情况。
这与SMPL中的姿态混合形状完全类似,只不过后者是顶点位移。可变形模型在肘部等位置能产生更平滑的结果,符合预期。
NASA模型存在的问题包括:需要将点映射回规范空间、存在基于部件的伪影、以及泛化到新姿态的能力有限。其低维姿态编码未能完全消除长距离的虚假相关性。
CAPE:引入局部结构感知
CAPE模型解决了上述问题,其思路直接而有效。
以下是其核心思想:
- 获取SMPL模型的隐式表面,并独立地考虑每个部分。
- 将这些部分分别规范到规范空间。
- 使用PointNet等网络预测每个部分的潜在编码。
- 从这些潜在编码预测占据值。
与NASA的主要区别在于,现在网络能够“看到”规范空间中未姿态部分的局部结构。这些潜在编码 z_1 到 z_K 更加强大。反姿态和取最大值的操作与NASA相同,但局部潜在编码的引入使CAPE具有比NASA更好的泛化能力。
然而,基于部件的模型在部件交界处始终存在问题,CAPE也不例外。此外,CAPE无法建模服装或精细细节,它更像一个关节化模型。拥有隐式表面表示对于测试点是否在内部(例如在模拟中判断服装是否在体内)或判断人物是否与3D场景相交仍然有用。
基于部件的模型通常需要蒙皮权重进行部件组合,在分布外姿态下部件伪影明显,且无法建模宽松服装。
Neural-GIF:学习连续变形场
那么,如何建模这些精细的变形呢?接下来介绍一篇名为Neural-GIF的论文,它使用学习的线性混合蒙皮和规范形状来学习姿态和形状条件的神经隐式模型。
有趣的是,它与SMPL模型完全类似,但工作方向相反:
- SMPL(前向):从规范空间开始,应用一系列变形得到姿态空间。
- Neural-GIF(后向):从姿态空间开始,应用一系列变换以在规范空间评估占据值。
以下是其工作流程:
- 从姿态空间中的查询点
p‘开始。 - 解除姿态:网络预测该点的蒙皮权重
w,使用逆蒙皮将其变换回规范空间点p。 - 预测变形场:网络预测一个依赖于规范空间点
p和姿态θ的三维位移场Δp。这类似于连续的姿态混合形状,但由于是隐式表面,其作用方向是相反的(例如,Δp指向内会使表面变大)。 - 评估SDF:在变形后的规范空间点
p + Δp上评估符号距离函数或占据值。
该模型的目标是直接从扫描数据训练,并获得可以用骨架姿态驱动的神经隐式表面(包含服装细节)。这是一个特定于主体的模型,但能产生精细的细节。
与直接以姿态 θ 为条件来预测规范空间SDF的Scanimate等工作相比,Neural-GIF通过在评估SDF之前先对点进行变形,能够获得更好的细节。
前向与后向蒙皮的挑战
然而,Neural-GIF等模型仍存在问题。主要问题在于需要为空间中的每个点预测蒙皮权重,这是一个困难的学习问题。这被称为后向蒙皮。
当姿态复杂时,网络学习的蒙皮权重场可能无法正确泛化,导致规范空间点预测错误。这是因为为所有可能姿态学习蒙皮权重非常困难。
相比之下,在SMPL的前向蒙皮中,这不是问题,因为我们从一个点开始并变形它。规范空间的蒙皮权重相对静态,不随姿态剧烈变化,因此学习起来更容易。
SNARF:可微分前向蒙皮
SNARF模型的关键思想是将SMPL的前向蒙皮模式整合到学习过程中。它学习规范空间的形状(网络 Σ_f)和规范空间的蒙皮权重(网络 Σ_w),而不是姿态空间的蒙皮权重。
其核心挑战在于:在前向蒙皮中,从规范空间点 x* 映射到姿态空间点 x‘。但从扫描数据学习规范形状需要知道逆映射——对于每个 x‘,需要知道对应的 x*。这是一个非投影映射,可能有多解。
以下是SNARF的解决方案:
- 在规范空间,网络
Σ_w预测点x*的蒙皮权重w。 - 前向蒙皮后,应满足:
x‘ ≈ Σ_i w_i * B_i * x*。 - 对于给定的
x‘,可能存在多个x*满足此方程(多个假设)。 - 考虑所有可能的
x*,通过Σ_f获取其占据值,然后取最大值作为x‘的最终占据预测。 - 损失函数是预测占据值与真实占据值之间的交叉熵。
关键技巧在于,需要通过一个非线性方程(根查找)的求解过程进行反向传播。通过这种方式,SNARF实现了类似SMPL的前向蒙皮,虽然表面细节可能稍显平滑,但对不同姿态(尤其是与数据集差异很大的姿态)的泛化能力要强得多。
比较表明,前向蒙皮模型对困难姿态的泛化更好,而后向蒙皮模型则具有更高的保真度,并且对宽松服装等建模更灵活。
总结
本节课中,我们一起学习了如何将神经隐式模型应用于人体建模。我们从分块刚性模型(NASA)开始,看到了其改进版本(CAPE)如何引入局部结构信息。接着,我们探讨了Neural-GIF如何通过后向蒙皮和连续变形场来建模精细细节,但也分析了后向蒙皮在泛化上的挑战。最后,我们介绍了SNARF如何通过可微分的前向蒙皮来解决泛化问题,在保真度和泛化能力之间取得了更好的平衡。

目前我们所见的模型都不是生成模型。在下一部分,我们将探讨如何使这些模型具备生成能力,例如通过采样潜在编码来生成完整的3D隐式表面形状模型。
021:神经隐式与基于点的服装模型 - 第一部分


在本节课中,我们将学习神经隐式模型以及基于点的服装模型。课程内容分为四个部分。第一部分,我们将了解用于3D形状的通用神经隐式模型。第二部分,我们将探讨如何将这些模型专门应用于人体建模。第三部分,我们将学习如何使这些模型具有生成能力。最后,我们将介绍一种简单但有效的基于点的表示方法。
第一部分:3D形状的神经隐式模型 🧊
一个核心问题是:什么是3D数据的好表示方法?我们需要考虑几个因素:表示方法必须与神经网络兼容,需要足够灵活,并且能够产生高保真度的结果。
以下是几种常见的3D表示方法及其特点:
- 体素网格:这种表示方法非常适合卷积神经网络,因为可以直接对数据应用滤波器。然而,它将3D空间离散化为网格,所需内存与分辨率的立方成正比。此外,在训练或预测时,必须预先确定输出的分辨率。
- 点云:点云将3D空间离散化为一系列3D点。但它不建模点之间的连接关系或拓扑结构。通常也需要预先确定网络输出的点数,这限制了分辨率。渲染点云通常也更困难。
- 网格:网格由顶点和面组成,是我们课程中广泛使用的表示。它同样受限于分辨率,需要预先确定顶点数量,并且通常需要一个类别特定的模板(对于人体可行,但对于椅子等更复杂的物体则难以定义)。
一种在计算机图形学中已知多年但直到最近才与深度学习结合的有趣表示是隐式表面表示。它的优势在于不离散化空间,可以表示任意拓扑和分辨率,内存占用低,且不局限于特定类别。
2019年,几乎同时出现了三篇论文提出了相似的想法。我们可以定义一个函数 F(p),它告诉我们一个点 p 是在物体内部还是外部,或者它到表面的距离。表面(图中蓝色边界)由这个函数 F 决定,即所有满足 F(p) = c(例如,对于占用率0/1,c=0.5)的点 p 的集合,这被称为函数的等值面。
这种表示的一个便利之处是,即使发生拓扑变化(例如表面分裂成两部分),我们也可以对函数 F 关于其参数求导,而无需担心点与点之间如何连接,这在网格表示中会非常困难。
对于常见物体,这是一个突破,因为它能以前所未有的分辨率表示不同的拓扑结构,并且可以在测试时选择分辨率。
那么这些网络是如何工作的呢?模型实际上相当简单。它接收一个点的坐标 (x, y, z),通过一个神经网络来预测该点是在内部还是外部。通常,我们不只是想用神经网络记忆单个形状,因此需要一些条件输入。例如,输入 x 可以是稀疏点云、部分点云、低分辨率体素甚至图像,通过一个编码器得到一个 n 维的潜在向量 z,然后用 z 来条件化解码器。网络将基于 z 和点坐标预测内部/外部。
为了重建表面,我们需要查询空间中的许多点,解码出它们是内部还是外部,然后使用一种称为行进立方体的计算机图形学算法来恢复并网格化表面。
然而,当我们尝试对像人体这样的铰接形状建模时,遇到了许多问题。给定一个低分辨率体素作为输入,我们希望通过这种占用网络(现在常被称为神经场模型)重建一个高保真度的网格,但结果往往缺失铰接结构,并倾向于产生看起来非常“平均”的形状。
在2020年CVPR上发表的工作中,我们解决了这些限制,以建模更详细的铰接结构和更复杂的物体形状。首先,我们需要找出之前模型的问题所在。
从模型设计来看,存在两个潜在问题:
- 结构丢失问题:原始形状空间存在于三维中,当我们将其编码并映射到一个潜在变量时,我们失去了这种结构,解码器更难知道输出形状也应存在于3D空间中。
- 坐标信息不足:输入给网络的点坐标不包含关于局部形状的信息。我可以旋转整个形状,坐标会完全改变,网络需要学习根据所有可能的旋转来产生形状。坐标本身不包含形状信息,信息在于局部结构,即点与点之间的关系。
因此,我们借鉴卷积神经网络的成功,在3D中使用了卷积神经网络。我们对输入数据(例如一个我们想超分辨或补全的3D网格)进行卷积,得到一个多尺度的深度特征网格(特征体积)。现在,我们不再基于点坐标解码,而是基于在网格连续位置处(通过三线性插值提取)的特征来解码占用率或距离场。这样,在更深层我们拥有形状的更全局结构,在较浅层我们拥有更局部的结构。
从数学上看,之前是 F(z, p) -> occupancy,现在我们用多尺度特征 F1...FN 替换了潜在编码 z,解码函数基于这些在连续点位置 p 提取的深度特征。
这一主要改变对结果产生了显著影响。我们观察到,对于低分辨率体素,我们可以恢复细节并保留输入数据中已有的细节。我们还可以补全缺失部分的点云,因为模型在形状数据集上训练过,可以学习典型3D形状的外观。该模型后来还被扩展以预测纹理,并在一些3D重建挑战中取得了优异成绩。
第二部分:处理开放表面与流形 🌀
然而,我们仍然有一个遗留问题。我们假设输出是0或1(内部或外部),但这只能建模水密表面。现实中存在开放表面、流形和具有内部结构的复杂形状,对于这些结构,无法清晰定义内部和外部。
我们需要改变输出表示。一个解决方案是预测无符号距离到表面,而不是占用率。这意味着我们要预测空间中任意点 p 到表面上最近邻点 q 的距离 d = ||p - q||,注意这是无符号的。
现在,表面是这个无符号距离场的零等值面。问题是如何从一个无符号距离场恢复零等值面上的所有点?
最朴素的方法是在网格上采样点,然后基于一个阈值(例如距离小于0.01)来判断,但这不精确且计算量大。我们可以做得更好。我们有一个距离场,可以计算梯度场 ∇F(p)。梯度指向距离变化最大的方向,即远离表面的法线方向。实际上,对于距离场,梯度 ∇F(p) 指向最近点 q,并且其模长始终为1。
因此,负梯度 -∇F(p) 指向表面上的最近点 q。我们需要沿着这个方向移动多远呢?距离值 F(p) 本身告诉了我们。所以,更新公式为:p_new = p - F(p) * ∇F(p)。通过迭代这个步骤,我们可以从任意点“行进”到表面上,这种方法被称为球面行进。
这种方法的好处是,给定稀疏点云,我们可以重建密集点云,并且能够处理不定义内部/外部的复杂空间。我们可以对开放表面(如衣物)进行建模,也可以对具有内部结构的场景进行建模。
与之前的IF-Nets相比,新的神经距离场(NDF)可以恢复物体的内部结构,因为我们不需要表面是水密的。
此外,利用距离场的特性,我们可以通过球面行进直接渲染表面,得到深度图、法线图等。
这种方法比表面重建更通用。我们意识到可以用它来建模一般函数(线性、二次、正弦曲线),特别是可以建模流形(非函数数据,例如一个螺旋线,对于一个给定的x可能有多个y值)。我们可以将回归问题 y = h(x1...xn) 隐式地定义为函数 F 的零等值面:F(x1...xn, y) = 0。然后,对于给定的 x1...xn,我们可以沿着y轴方向行进,直到满足 F=0 的条件。这避免了传统回归网络在处理多值函数时可能产生的“平均”效应,而是直接对联合 (X, Y) 的流形进行建模。
总结与对比 📊
在进入讲座第二部分之前,让我们简要总结和对比网格与隐式函数:
- 控制表面:网格更容易控制,因为它们是紧凑的结构,可以使用线性代数进行变形。隐式表面也可以变形,但在当前学习模型中仍不那么容易控制(例如进行关节动画)。
- 处理拓扑变化与细节:在应对拓扑变化和获取细节方面,隐式表面表示无疑更方便。

本节课中,我们一起学习了3D形状的神经隐式表示,特别是如何通过使用多尺度特征和预测无符号距离场来克服早期模型的局限性,从而能够对复杂、开放和非水密的表面(如人体和衣物)进行高保真建模。我们还看到了这种表示如何扩展到更一般的流形建模问题。在下一节中,我们将探讨如何将这些神经隐式模型专门用于人体建模。
022:神经辐射场与人类建模 👤

在本节课中,我们将学习如何使用神经技术,特别是神经辐射场,来建模虚拟人类或其外观。我们将从理解神经辐射场试图解决的核心问题开始,逐步探讨其原理、优势、局限性以及相关的扩展工作。
概述
神经辐射场为新视角合成问题提供了一种全新的解决方案。该问题的核心是:给定一个场景的一组稀疏静态图像,目标是学习一个模型,使其能够以连续的方式从任意视角渲染该场景。
神经辐射场核心原理
上一节我们介绍了新视角合成问题,本节中我们来看看神经辐射场是如何解决这个问题的。
与传统的计算机图形学方法(如多视角立体视觉重建)不同,神经辐射场采取了一种更根本的方法。它学习场景中每个五维点的辐射亮度,这五维包括空间位置 (X, Y, Z) 和观察方向 (θ, φ)。
本质上,模型会“记住”场景中每个点、从每个可能观察方向看过去的颜色和该点的体积密度。理想情况下,在有实际几何体的地方密度高,在没有几何体的地方密度低。这种方法的一个优点是,它既能建模固体对象,也能建模体积对象。
一旦有了这个辐射场,我们就可以通过体渲染来获得目标图像。给定像素位置的颜色 C 是通过沿射线积分以下量得到的:
$$
C(r) = \int_{t_n}^{t_f} T(t) \cdot \sigma(r(t)) \cdot c(r(t), d) , dt
$$
其中:
- r(t) = o + t·d 是射线,从原点 o 出发,沿方向 d 前进,t 是参数。
- T(t) 是透射率,表示射线从近端 t_n 传播到 t 而未击中任何粒子的概率。
- σ(r(t)) 是体积密度,可理解为射线在位置 r(t) 处终止于一个无穷小粒子的概率密度。
- c(r(t), d) 是在位置 r(t)、沿方向 d 发出的颜色。
这个方程编码了两件事:T(t) 是“到目前为止未击中任何物体”的概率,而 σ(t) 是“即将在此处终止”的概率密度。
在实际计算中,我们使用数值积分来近似这个方程。以下是近似的离散形式:
$$
\hat{C}(r) = \sum_{i=1}^{N} T_i \cdot (1 - \exp(-\sigma_i \delta_i)) \cdot c_i
$$
其中:
- T_i = exp(-\sum_{j=1}^{i-1} \sigma_j \delta_j) 是离散化的透射率。
- δ_i 是相邻采样点之间的距离。
- 为了获得连续模型,射线被分成若干段,并在每个段内均匀采样。
关键思想是:一个多层感知机以五维(位置和方向)作为输入,输出 RGB 颜色和密度 σ。当我们需要生成图像时,就让射线穿过每个像素,沿途累积这些辐射亮度,并考虑由密度和透射率加权的遮挡关系。损失函数就是渲染出的像素颜色与真实图像像素颜色之间的差异。
位置编码的作用
如果直接用 MLP 从位置和方向映射到颜色和密度,结果往往会比较模糊。这是因为神经正切核的带宽限制了所学函数的频谱。直观理解是,如果输入点彼此非常相似,那么输出也会很相似,导致图像模糊。
解决方法是使用位置编码(如傅里叶特征),将输入点映射到更高维的空间。这相当于引入了不同频率的基函数,增加了模型的频谱容量,从而能够生成更锐利的结果。以下是对比:
- 无位置编码:结果模糊。
- 有位置编码:结果明显更锐利。
这种方法并未改变网络结构,只是对输入空间进行了固定的、非学习的映射。
神经辐射场的优势与局限性
神经辐射场的一个很酷的特性是,尽管从未直接针对几何形状进行训练,它也能恢复出场景的几何信息。我们可以通过计算射线终止的期望深度来获取深度图:
$$
\hat{d}(r) = \sum_{i=1}^{N} T_i \cdot (1 - \exp(-\sigma_i \delta_i)) \cdot t_i
$$
因此,神经辐射场不仅提供了可连续渲染的场景表示,还恢复了场景几何。
然而,神经辐射场也有其局限性:
- 场景特定:每个场景都需要单独训练一个 MLP,无法泛化到新场景。
- 无法建模动态场景:直接训练动态场景会导致模糊。
- 难以编辑:场景信息被编码在网络权重中,难以进行对象移动、组合等操作。
- 训练和推理成本高:训练可能需要数小时至数天,推理也不是实时的。
- 表面提取不精确:需要通过阈值化密度来提取表面,这通常不够准确。
扩展工作:处理动态场景
针对无法建模动态场景的局限,后续研究提出了扩展方法。一个直观的想法是在输入中增加时间维度 t,但这即使使用位置编码也可能产生模糊结果。
更有效的方法是引入规范空间的概念。这通过两个网络实现:
- 形变场网络:输入 (x, y, z, t),输出形变向量 (Δx, Δy, Δz),将当前时刻的点映射到规范空间(如序列的第一帧)。
- 神经辐射场网络:输入规范空间中的点 (x+Δx, y+Δy, z+Δz) 和观察方向,输出颜色和密度。
这种方法(如 D-NeRF)端到端地训练形变场和辐射场,利用了时间上的相关性,学习一个单一的规范场以及如何形变它以解释每个时间实例,从而产生更清晰、连续的结果。
扩展工作:场景编辑与组合
为了实现对神经辐射场表示的编辑,例如组合不同场景或复制对象,需要将场景表示与神经渲染网络解耦。
Control-NeRF 的核心思想是:
- 为每个场景学习一个多分辨率特征体积,其中每个点存储一个高维特征。
- 训练一个通用的、与场景无关的渲染网络,它读取特征体积中的特征并生成颜色和密度。
通过用多个场景同时训练这个通用渲染网络和各自的场景特征体积,我们得到了一个更接近传统图形表示(如网格)的系统。之后,我们可以裁剪一个场景的特征体积的一部分,粘贴到另一个场景的特征体积中,并使用同一个渲染网络来渲染组合后的新场景,实现场景的混合与匹配。
扩展工作:加速训练与推理
即使有上述技巧,使用显式的多分辨率特征体积仍然存在内存消耗大(规模随分辨率立方增长)和推理慢的问题。
Instant NGP 提出了一个巧妙而高效的解决方案:使用哈希表来存储特征。
- 将空间划分为多个小立方体(体素)。
- 使用哈希表将每个立方体顶点的索引映射到一个特征向量上。
- 查询时,对点所在立方体的顶点特征进行线性插值。
这种基于哈希的编码,配合定制的 CUDA 内核实现,实现了训练和推理速度的极大提升(相比原始方法快10-100倍),在速度与质量之间取得了更好的权衡。
扩展工作:结合表面与体渲染
为了获得更高质量的几何表面,有工作尝试结合表面渲染(高质量几何,但需要掩码监督)和体渲染(可直接从颜色训练,表面是近似的)的优点。
UniSurf 的基本思想是渐进式地将体渲染收敛到表面渲染:
- 开始时,在表面可能区域进行体渲染(沿射线积分)。
- 随着训练进行,逐渐缩小这个积分区间,最终聚焦在估计的表面附近。
- 对于固体对象,体渲染方程中的 α 项可以对应于采样点的占据概率 O,方程可以简化为更接近表面渲染的形式。
这种方法能产生更锐利的几何表面,同时保持了体渲染易于训练的优点。
总结
本节课中,我们一起学习了神经辐射场的基本原理。它通过 MLP 学习场景的连续辐射场,并通过体渲染合成新视角图像。我们探讨了位置编码的重要性、神经辐射场恢复几何的能力,以及它存在的几个主要局限性:场景特定、静态假设、难以编辑和计算成本高。
接着,我们介绍了几项重要的扩展工作:通过引入规范空间和形变场来建模动态场景的 D-NeRF;通过解耦场景特征与通用渲染器来实现场景编辑的 Control-NeRF;利用哈希编码极大加速训练和推理的 Instant NGP;以及结合表面与体渲染优势以获取更好几何的 UniSurf。

这些进展为将神经辐射场的高质量渲染能力与虚拟人类的可控性(如姿态、形状)相结合奠定了基础,这将是下一部分课程的重点。
023:人类行为捕捉 🎬

在本节课中,我们将学习如何捕捉人类行为。我们将首先了解如何在静态场景中捕捉人类,然后探讨如何捕捉动态的人与物体交互,最后,我们将介绍一种在大型空间(如包含多个房间的建筑)中捕捉人类行为的方法。
概述
捕捉人类行为与建模人类外观类似,存在两个相互交织的问题。首先,我们需要能够捕捉人类,即在人类执行动作时,重建其与3D场景相结合的3D运动。其次,我们需要生成与场景一致的人类动作,这是一个日益重要的课题,具有广泛的应用前景。本节课我们将重点介绍捕捉部分,而动作合成部分将在下一讲(第12讲)中详细讨论。
为什么关注人与物体交互?🤔
大多数有趣的人类活动都涉及与他人或环境的交互。我们通过改变环境来实现特定目标,例如搬运箱子、坐在桌椅、钉钉子或打开盒子。当然,与其他人互动也是一种非常重要的交互类型,但由于时间有限,本讲将不涵盖人与人之间的交互。
在应用方面,机器人可以从人类动作中学习,首先需要能够将人类行为与环境一起数字化。此外,人类也可以在虚拟环境中学习有用技能,例如在无实际危险的情况下学习操作工具和机器。另一个有趣的应用是虚拟助手,它可以帮助你更好地导航世界。虚拟教学也是一个潜在应用领域,例如让著名人物如爱因斯坦在共享虚拟空间中教授相对论课程。特别是在疫情期间,人们对这种能够提供共享空间感的虚拟交流方式兴趣大增。
如何捕捉真实世界中的人与物体交互?📹
首先,我们需要捕捉3D场景。计算机视觉技术在传感器和算法方面都取得了显著进步,我们现在拥有的3D数据比7到10年前要多得多。一种方法是使用深度传感器(如Kinect)扫描房间,并将所有深度帧融合成一个连贯的3D场景。也可以使用激光扫描仪或基于立体视觉/结构光的扫描仪来重建场景。
当这些3D场景可用时,一些研究工作应运而生。例如,ICCV 2019的PROX工作提出,在从图像估计人体姿态和形状时,结合3D场景信息可以改善结果,因为我们可以利用“人体不应与场景相交”等物理约束。PROX的基本思想是使用类似SMPL的技术估计人体模型,同时加入约束,确保模型不穿透3D场景,并且特定部位(如脚)与场景保持接触。这通过惩罚模型顶点与场景的穿透,并鼓励接触顶点(手动标注)靠近场景来实现,本质上是一个优化问题。PROX证明了如果预先知道3D场景,结果可以得到改善。
如何捕捉动态场景交互?🔄
捕捉动态交互更具挑战性。仅使用单张图像非常困难,因为存在大量模糊性,同时追踪人和物体极具挑战性。一种选择是使用高质量但昂贵、记录空间有限且难以扩展到大型空间的光学标记捕捉系统。另一种方法是在身体上佩戴惯性测量单元(IMU)传感器,这种无摄像头系统易于扩展且无空间限制,但存在传感器漂移问题,数据质量通常不如光学系统。
BEHAVE:一种折中的捕捉方案 ⚖️
BEHAVE工作提出了一种介于两者之间的方案。它使用一个便携式系统,具有良好的定位能力且不会随时间漂移。该系统包含四个校准的Kinect传感器,记录了8名受试者在5个不同地点与各种日常物品(如箱子、椅子、桌子、背包)的交互。BEHAVE既是一个数据集,也是一个算法,旨在捕捉以SMPL模型表示的人体运动以及物体的3D网格。
初始阶段,为了获得高质量数据,研究采用了包含手动标注的复杂流程。标注者需要在图像中点击物体的关键点,以便更准确地重建物体姿态。然后,结合深度点云、来自OpenPose的2D关键点检测以及物体分割信息,通过优化使SMPL模型的3D关节投影与2D检测匹配,并使3D物体点与图像中标注的2D关键点匹配,从而联合估计人体姿态和物体姿态。
为了自动化这一过程,研究训练了一个模型,能够从四个深度视图自动恢复SMPL模型和物体。关键思想是找到能从输入点云直接提取的、能使优化行为更好的特征F。具体来说,模型预测3D场景中每个点到SMPL模型的对应关系以及距离场。
- 人体距离场
U_H(p):对于空间中的点p,预测其到人体模型网格M的距离。网络被训练为忽略物体。 - 物体距离场
U_O(p):预测点到物体网格的距离。网络被训练为忽略人体。 - 对应场
C(p):对于空间中的点p,预测其在SMPL模型上最近的表面点。

利用这些场,可以通过优化使SMPL顶点与人体距离场一致,物体顶点与物体距离场一致,并利用对应场使网格与神经网络的预测保持一致。优化目标包括:
- 最小化人体距离场的差异:
|dist(p_i, M(c_i)) - U_H(p_i)|。 - 确保物体顶点位于物体距离场的零水平集上:最小化
|U_O(v_j)|。 - 满足接触约束:对于距离人体和物体都小于2厘米的接触点,要求物体顶点与SMPL模型上的对应点
M(c_j)匹配。

通过这种方法,BEHAVE能够获得与半自动方法质量相近的结果。BEHAVE数据集已公开供研究使用。
在大型场景中捕捉:Human POSEitioning System (HPS) 🏢
BEHAVE无法捕捉涉及大型场景的所有可能交互,因为外部摄像头对记录空间大小和时间长度都有限制。IMU传感器则非常适合长时间、大范围的记录。
HPS工作的目标是在大型场景和长时间(可达一小时或更久)记录中,仅使用可穿戴传感器(IMU和头戴式摄像头)来恢复人体3D姿态并在3D场景中自我定位。其核心思想是结合基于IMU的姿态估计和视觉定位(自定位)。
视觉定位是一个经典的计算机视觉问题:给定一个预先扫描的3D场景和一张由头戴摄像头拍摄的测试图像,确定这张图像是在3D场景中的哪个位置拍摄的。通常步骤包括:从测试图像和用于重建3D场景的多视角图像中提取特征(如关键点);进行特征匹配,检索出与测试图像最相似的场景视角;最后优化相机姿态,使特征匹配。
仅使用IMU和初始视觉定位,重建的人体可能会漂移或与场景(如地板)相交。因此,HPS通过联合优化来整合物理约束:
- 视觉定位项:匹配头戴摄像头图像与3D场景。
- 场景接触项:当IMU检测到脚部与地面接触时(通过加速度骤变判断),强制对应的人体模型顶点与场景接触。
- 平滑项:确保运动不抖动。
- 姿态项:使SMPL姿态与IMU测量的姿态匹配。
通过这种联合优化,HPS能够仅使用身体佩戴的传感器在大型场景中追踪人体。这项研究展示了在元宇宙兴起的背景下,在3D环境中记录人体运动并实时定位的巨大潜力和重要性。当前方法尚未解决与动态物体的交互问题,这是正在研究的方向。
总结 📝
本节课我们一起学习了人类行为捕捉。捕捉人与物体的交互非常重要且充满挑战,是当前的研究热点。BEHAVE提出了一种基于深度相机的简易捕捉方案,展示了神经场与经典优化结合是一种有前景的方法。对于长时间、大范围的记录,外部摄像头并不适用,可以使用IMU并结合视觉自定位技术。HPS方法通过联合IMU优化和自定位,实现了仅使用身体佩戴传感器对人物的追踪。这些技术为虚拟现实、机器人学习等应用奠定了基础。

接下来,我们将在下一小节中学习如何从单张图像中捕捉人与物体的交互。
024:从图像重建人体与物体交互 👥➡️🖼️

在本节课中,我们将学习如何从单张图像中重建人体与物体的三维交互。我们将探讨基于优化的经典方法,以及如何利用学习到的先验知识来获得更优的结果。核心在于理解像素对齐的概念,并学会处理重建中的深度模糊问题。
动机与应用
上一讲我们讨论了人体交互的重要性。图像和视频中大多数有趣的内容都涉及人与人、或人与环境的交互。在虚拟现实、增强现实和机器人技术等领域,理解这些交互具有广泛的应用价值。
因此,我们面临的核心问题是:能否仅从单张图像(而非深度相机、多视角系统或惯性传感器)中重建和理解人体与物体的三维交互?这是一个长期的计算机视觉难题。
早期方法:基于启发式规则的优化
在缺乏大规模三维交互数据集的时代,早期工作主要依赖于手工定义的启发式规则和优化。
📐 方法:ProOSa
ProOSa 是首批尝试从单张RGB图像中重建人体(用SMPL模型表示)和物体网格的工作之一。其流程如下:
- 定义交互约束:手动标注人体网格与物体网格之间可能发生接触的顶点对(例如,臀部与长凳的接触面,手与球拍的抓握点)。
- 初始估计:使用当时最先进的方法检测边界框,并估计人体的三维姿态和形状。
- 检索物体:从数据库中找到与图像匹配的物体三维模型。
- 优化对齐:通过优化缩放和位置参数,使人体和物体的位置满足第一步定义的接触约束。
公式表示:优化目标是找到人体参数 (\theta, \beta) 和物体变换 (T_{obj}),使得投影到图像上的接触点对 ((V_{human}, V_{object})) 尽可能接近。
局限性:这种方法无法枚举所有可能的交互方式(例如,对同一把椅子,可以坐、靠、搬)。因此,它难以对复杂多变的交互进行联合推理。
现代方法:基于学习的重建
随着数据集的丰富和深度学习的发展,研究者开始利用学习到的先验知识来重建交互。
🤖 方法:CHORE
CHORE 方法旨在从单张RGB图像中联合重建具有合理空间布局的人体和物体。这非常具有挑战性,因为存在深度模糊、以及人或物体之间的严重遮挡。
在深入CHORE细节之前,我们需要回顾一个关键概念:像素对齐的隐式函数。
关键技术:像素对齐的隐式重建
在神经隐式函数的课程中我们学过,PIFu等方法可以从图像重建出细节丰富的三维网格。其核心思想是:
- 使用图像编码器提取特征图。
- 对于图像中的每个像素,发射一条射线进入三维空间。
- 沿着射线采样三维点 (X = (x, y, z))。
- 网络根据该三维点投影回图像平面所对应的像素特征,以及该点的深度 (z),来判断该点位于表面内部还是外部。
代码逻辑描述:
# 伪代码示意
image_features = encoder(image) # 提取图像特征
for pixel in image:
ray = shoot_ray_from_pixel(pixel)
for point X along ray:
# 关键步骤:像素对齐
feature = sample_feature(image_features, project_to_2d(X))
# 预测该点是否在表面内
inside = network(feature, X[2]) # X[2] 即深度 z
核心公式:网络学习一个函数 (f(F(p), z) \rightarrow {0,1}),其中 (p = \pi(X)) 是三维点 (X) 投影到图像的二维位置,(F(p)) 是该位置的图像特征。
优势:像素对齐让网络能同时利用全局和局部信息,每个像素都成为一个训练数据点,从而用更少的数据实现更有效的学习,获得前所未有的细节。
核心挑战:深度-尺度模糊
然而,训练这种像素对齐网络面临一个根本性模糊问题:不同的三维形状在缩放并放置在合适深度时,可以投影出完全相同的图像。
根据透视投影公式:
[
x_{img} = f_x \frac{X}{Z} + c_x, \quad y_{img} = f_y \frac{Y}{Z} + c_y
]
物体在图像中的大小受三个因素影响:焦距 (f)、物体物理尺寸 ((X, Y))、以及深度 (Z)。在单视角下,这三者相互耦合,难以区分。
解决方案:固定深度,预测尺度
为了训练网络,我们需要消除这种模糊。一个巧妙的解决方案是:在预处理阶段,将所有训练数据归一化到一个固定的深度 (Z_0),同时保持其像素对齐性。
关键定理:对网格顶点进行统一缩放,不会改变其图像投影。
- 证明:设原顶点为 (V = (V_x, V_y, V_z)),缩放后为 (V' = sV = (sV_x, sV_y, sV_z))。
- 其投影坐标 (p = (f_x V_x / V_z, f_y V_y / V_z))。
- 缩放后的投影坐标 (p' = (f_x \cdot sV_x / (sV_z), f_y \cdot sV_y / (sV_z)) = p)。
- 因此,缩放因子 (s) 在分子分母中抵消,投影不变。
如何固定深度:我们希望将网格的平均深度移动到 (Z_0)。只需选择缩放因子 (s = Z_0 / \mu_z),其中 (\mu_z) 是网格所有顶点深度的平均值。缩放后,新网格的平均深度恰好为 (Z_0),且其图像投影保持不变。
图形化理解:这类似于电影中的“滑动变焦”效果,在将物体移向固定深度的同时进行缩放,使其在图像中的大小保持不变。
CHORE 方法流程
解决了数据对齐问题后,CHORE 的训练流程变得清晰:
- 数据预处理:利用上述深度-尺度归一化方法,将所有训练集中的人体-物体交互网格对,归一化到固定深度,并保持与原始图像的像素对齐。
- 网络设计:构建一个端到端网络,输入单张图像,联合预测两个神经隐式场:
- 一个用于人体。
- 一个用于物体。
- 联合优化:网络学习从图像特征到三维形状的映射,其内部隐式地建模了人体与物体之间合理的空间布局先验(例如,人坐在椅子上时,臀部与椅面应接触)。
- 推理:给定新图像,通过网络预测得到归一化深度下的神经隐式场,然后通过Marching Cubes等方法提取出三维网格。
结果:与基于启发式规则的ProOSa相比,CHORE能够学习到更多样的交互类型,重建结果更加合理和可靠。尽管在严重遮挡或低分辨率图像上仍存在挑战,但该方法标志着从单图像理解三维交互的重要进步。
总结
本节课我们一起学习了从单张图像重建人体与物体交互的方法演进:
- 早期优化方法 (如ProOSa):依赖手工定义的交互约束,虽然开创了问题,但可扩展性有限。
- 像素对齐隐式重建:这是获得高质量细节的关键技术,其核心是利用三维点投影位置的图像特征来进行预测。
- 深度-尺度模糊的解决:通过将训练数据统一缩放至固定深度,可以在保持像素对齐的前提下,简化网络的学习任务。
- 基于学习的方法 (如CHORE):利用神经网络从数据中学习人体-物体交互的空间布局先验,能够处理更广泛、更复杂的交互情况,是当前的主流方向。

通过结合像素对齐表示和有效的深度归一化策略,我们能够从单张图像中重建出合理的三维人体与物体交互场景,为后续的分析与应用奠定了基础。
025:场景中的人类合成 🧍➡️🏠


在本节课中,我们将学习如何在静态场景中合成静态的人类。我们将了解如何表示人类与场景的接触。我们将快速概述用于根据输入条件生成多种输出的典型模型,这些模型基于变分自编码器和条件变分自编码器。例如,它们可用于根据场景的某些部分合成多种可能的人类姿态。最后,我们将学习如何合成运动,特别是在不平坦地形上的移动。我们将了解如何将地形的三维几何信息整合到一个神经模型中,以产生与此地形一致的人类运动。
在上一讲中,我们看到了感知或捕捉人类、从某种传感器数据重建人类的方法。本讲的主要重点将是在三维几何等条件上生成逼真的人类运动。
捕捉运动的方法,例如捕捉人-物交互的BEHAVE,我们看到了可以从图像中在一定程度上恢复人类运动或姿态以及物体姿态的方法。现在,我们将关注从头开始生成这种人-物或人-场景交互。例如,你可以在三维环境中为虚拟人类制作动画。
我们首先可能会问,为什么这很有趣或很有用?在最高层面上,虚拟人类领域的目标之一是复制真实人类的行为。真实人类可以在三维场景中导航,可以理解周围环境。因此,让智能体具备相同的能力,基本上是人工智能的长期目标之一。
更具体的应用包括游戏,你需要让角色与环境互动,例如坐下或抓取物体。目前视频游戏的运作方式是通过预录制的动作,然后在场景中特定的预定义位置触发这些动作,这看起来有些不自然,正如我们在GTA的例子中看到的那样。
这对于训练机器人与三维环境交互也很有用。例如,在将物理机器人部署到真实空间之前,在虚拟环境中训练虚拟智能体非常有用。当然,对于VR和AR应用也是如此。我们在上一讲中提到过这一点,这非常有用,因为我们谈论的是元宇宙中的共享虚拟空间,生活在那里的虚拟人类(无论是真实的还是虚拟的)需要理解周围的三维场景是什么样子,需要理解他们可以对场景做什么,生成的运动应该与场景一致。例如,对于社交互动也是如此。视频通话中缺少的一点是共享空间,如果你想要共享空间,那么在这些共享空间中的人类渲染应该满足三维世界的物理约束。
希望你已经相信这有非常多的应用。
实际上,合成人-物交互需要什么?我们需要从虚拟人类的视角去理解,需要感知三维场景。我们至少需要推理“可供性”。“可供性”是一个概念,意味着场景中的几何结构提供了特定类型的行动可能性。例如,椅子可供坐下,但也可供站立、抓取和以多种不同方式操纵。这比物体的功能更基本。物体的功能是,例如椅子的主要功能是供人坐下,刀的主要功能是用于切割。但我们抓握刀的方式有很多种,抓握椅子的方式也有很多种,特定物体提供了许多不同的姿态可能性。
理想情况下,算法应该同时推理可供性和功能。当小孩学习环境和学习与环境互动时,通常在真正知道物体功能之前,通过探索环境来学习可供性。因此,一个好的算法应该能够理想地同时推理这两件事。
我们需要在三维场景条件下合成三维人类。让我们看一些例子。这些都是近期的论文,这是一个相对较新的主题,计算机视觉社区对此感兴趣已有多年,但直到最近我们才有技术能够在三维中研究这些事物。
例如,这是在CVPR上发表的工作,它本质上允许你在三维场景中合成静态人类。基本思路是使用三维场景,然后目标是在该场景中以物理上合理的方式合成人类的静态姿态,使人们坐在椅子上或躺在沙发上,而不与环境相交,或者不产生不满足约束的姿态。
我们如何着手解决这个问题?我们看到,首先需要的是数据,所以我们需要一个好的捕捉方法。我希望你现在已经意识到,在捕捉与合成之间,在感知与建模之间,总是存在一个循环。
例如,我们有PROX方法,它允许你在场景条件下重建三维人体姿态。我们看到这带来了更好的结果,解决了与环境的相交等问题。本质上,我们面临的主要问题是,像SMPL这样的当前模型没有考虑场景,你无法让SMPL模型以场景为条件。那么问题是如何让SMPL模型以场景为条件?
一种可能的方法,也是这项名为POSA的工作中所做的,其关键思想是基于人体网格和姿态,预测可能与场景接触的顶点,以及预测哪些物体可能被接触。这是两个预测:首先,神经网络仅基于姿态标记出可能接触的顶点;然后,这种着色显示哪个物体最可能被接触。例如,这里的绿色意味着人体的底部很可能与沙发接触,手的这部分很可能与桌子接触。
当然,这只是一个假设。这个问题是多模态的,因为对于给定的输入存在多种解决方案。
那么这是如何建模的?这是通过一些二元变量来建模的,这些变量指示一个顶点在给定点是否接触,或者指示接触的可能性。例如,F_c取值为0或1,1表示有接触,0表示无接触。对于网格中的每个顶点V_i,你都有一个这样的二元变量。然后,对于每个顶点,你还有一个矩阵或向量,包含针对每个物体的二元变量(L是物体的数量),指示对于给定的姿态,哪个物体可能被接触。
所以问题是:首先,顶点V_i是否与场景接触?其次,顶点V_i实际接触的是哪个物体类别?我提到存在多种解决方案。例如,我可以坐在沙发上,或者坐在椅子上,或者坐在架子或桌子上。所以存在多种解决方案,我们需要一个能够让我们采样多种解决方案的预测模型。解决这个问题的一种方法是使用生成式神经网络,如变分自编码器或条件变分自编码器。给定一个网格,这个网络可以采样输入并以该网格为条件,然后网络将产生不同的解决方案,指示哪些顶点可能接触,以及对于这些顶点,哪些物体实际上最可能被接触。
现在让我回顾一下变分自编码器,因为这是一种常用于人体建模背景下的技术,例如用于建模姿态流形以及这些接触。
基本上,使用贝叶斯定理,我们通常感兴趣的是知道导致给定观测X的因素是什么,这些因素就是我们感兴趣的量。因此,我们通常感兴趣的是获得后验概率,即给定这些观测X的这些因素的概率。为了解决这个问题,我们通常使用贝叶斯规则来反转问题,然后我们有一个似然函数,衡量这些测量值由这些因素产生的可能性。然后我们有先验概率,即这个先验实际存在的概率,再除以观测的边际似然。
所以我们有X(证据),Z(原因或这些潜在变量,即假设)。然后我们有系统的似然,在推理中我们计算后验以推断这些潜在变量Z。
在大多数情况下,后验没有封闭形式的解,并且在计算上是难以处理的。这就是变分推断发挥作用的地方,因为你可以使用一个更简单的分布来近似这个后验。
现在,两个问题是我们如何定义这个近似后验,以及我们如何进行这种近似?
我们可以这样看:我们实际上希望这个近似接近真实的未知后验。因此,这个KL散度衡量了两个分布之间的距离。理想情况下,这个距离应该很小。这里,KL散度是衡量一个分布与另一个分布之间差异的度量,在这个例子中是参数化为φ的近似分布Q_φ(Z|X)(例如,这可以是一个神经网络)与实际感兴趣的后验P(Z|X)之间的差异。
KL散度的定义基本上是这个关于潜在变量Z的积分,它包含两项:一项是Q_φ(Z|X)乘以log(Q_φ / P)的对数。
这里需要注意:如果Q_φ和P相等,那么这个比值等于1,整个式子等于0,距离很小。此外,这里的差异度量(对数项)由Q_φ加权。所以,在概率质量高的地方,如果你愿意这么想,代价就更高。注意,在这个积分中,X是不变的,我们固定X并对Z进行积分。所以对于每个不同的Z,X,我们都有这样一个积分。
KL散度的一些性质是它是非负的并且是凸的。但它是一个非对称度量,因为如果我调换项的位置,把P放在这里,把Q放在那里,不会得到相同的量。所以它不是数学意义上的对称度量或距离。
为了执行推断,我们基本上需要最小化KL散度。我们希望最小化这个近似与真实后验之间的差异。


在本节课中,我们一起学习了在静态场景中合成静态人类的基础。我们探讨了表示人-场景接触的方法,并回顾了用于多输出生成的条件变分自编码器模型。我们还了解了如何将三维地形几何整合到神经模型中,以生成与地形一致的人类运动,特别是移动。这些技术对于游戏、机器人训练以及VR/AR应用中的虚拟人类动画至关重要。
026:人体运动合成

在本节课中,我们将学习如何利用变分自编码器进行人体运动合成,特别是如何根据场景条件生成静态姿态和动态运动。我们将从推导条件变分自编码器的核心公式开始,逐步理解其编码、解码过程,以及如何通过重参数化技巧解决训练中的难题。最后,我们将探讨如何将这些技术应用于生成与复杂地形交互的、自然流畅的人体动画。
变分自编码器公式推导 🧮
上一节我们介绍了变分自编码器的基本概念,本节中我们来看看其核心公式的推导过程。
我们从近似分布 Q_φ(Z|X) 与真实后验分布 P_θ(Z|X) 之间的KL散度开始。根据定义,我们可以展开这个项。
利用贝叶斯定理,我们可以将 P_θ(Z|X) 重写为 P_θ(X|Z) * P_θ(Z) / P_θ(X)。然后,利用对数的性质(对数的乘积可以转化为和),我们可以得到三项。
第一项是观测数据 X 的对数边际似然 log P_θ(X)。第二项是近似分布 Q_φ(Z|X) 与先验分布 P_θ(Z) 之间的KL散度。第三项是 Q_φ(Z|X) 下 log P_θ(X|Z) 的期望值。
通过移项,我们得到以下等式:
log P_θ(X) - KL[ Q_φ(Z|X) || P_θ(Z|X) ] = E_{Z~Q}[log P_θ(X|Z)] - KL[ Q_φ(Z|X) || P_θ(Z) ]
由于KL散度总是非负的,我们可以推导出证据下界。观测数据的对数似然 log P_θ(X) 必然大于或等于右侧的项,即:
log P_θ(X) ≥ E_{Z~Q}[log P_θ(X|Z)] - KL[ Q_φ(Z|X) || P_θ(Z) ]
这个右侧的项被称为证据下界。
编码器与解码器的解释 🤖
现在,我们来理解这个公式在变分自编码器中的具体含义。
在这个框架中,Q_φ(Z|X) 是编码器。它接收观测数据 X,并输出一个在潜在空间 Z 上的分布,这个分布描述了哪些潜在变量可能生成了 X。然后,我们从该分布中采样一个潜在变量 Z。
P_θ(X|Z) 是解码器。它接收采样得到的潜在变量 Z,并尝试重建观测数据 X,即生成 X‘。
因此,最大化证据下界等价于同时优化两个目标:
- 让重建的 X‘ 尽可能接近原始 X(通过最大化 E[log P_θ(X|Z)])。
- 让编码器产生的分布 Q_φ(Z|X) 尽可能接近我们预设的简单先验分布 P_θ(Z)(通过最小化KL散度),这能确保潜在空间具有良好的结构。
在实践中,对于图像或人体网格等数据,重建损失通常使用 L1 或 L2 距离来衡量生成样本与真实观测之间的差异。
训练挑战与重参数化技巧 ⚙️
上一节我们理解了目标函数,但在训练时我们遇到了一个难题:如何通过采样操作进行反向传播?
我们希望使用反向传播来优化编码器网络参数 φ 和解码器网络参数 θ。问题在于,从分布 Q_φ(Z|X) 中采样 Z 的操作是不可微分的,这阻断了梯度从解码器流向编码器。
解决方案是重参数化技巧。我们假设后验分布 Q_φ(Z|X) 是高斯分布。编码器不再直接输出一个样本,而是输出该分布的参数:均值 μ 和方差 σ²。
然后,我们从一个标准正态分布 N(0, I) 中采样一个随机噪声 ε。接着,我们通过以下变换得到所需的样本 Z:
Z = μ + σ ⊙ ε
这里,⊙ 表示逐元素相乘。
这样做的妙处在于,采样过程的随机性被转移到了噪声 ε 上,而 ε 与模型参数无关。现在,Z 对参数 φ 的导数可以通过 μ 和 σ 来计算(因为 Z = μ + σ * ε),从而使得整个流程可微,允许梯度顺利反向传播。
条件变分自编码器与应用 🎯
有时,我们希望生成过程依赖于某些附加条件 C(例如场景信息)。这时可以使用条件变分自编码器。
我们可以让编码器和解码器都以条件 C 为输入。在人体运动合成中,这允许我们根据场景(如一个房间)来生成可能的人体接触点(如脚接触地板,手可能接触椅子)。
以下是其工作流程:
- 训练阶段:使用包含人体网格和场景信息的数据对,训练条件变分自编码器。
- 推理阶段:
- 给定一个观测到的人体姿态,可以通过编码器得到潜在分布,并采样多个 Z,再通过解码器生成多种可能的接触点预测。
- 也可以直接从先验分布中采样 Z,结合场景条件 C,通过解码器生成全新的人体姿态。
得到预测的接触点后,可以通过优化一个目标函数来生成最终静态摆放在场景中的人体。这个目标函数通常包含:
- 可达性项:促使预测为接触的顶点靠近对应的场景物体表面。
- 穿透惩罚项:防止人体模型与场景物体发生穿插。
- 正则化项:使最终姿态不过分偏离初始姿态。
从静态到动态:运动合成 🚶
生成静态姿态已经很有用,但生成与场景交互的动态运动则更具挑战性。这需要模型具备一定的“规划”能力。
一个经典工作是《Phase-Functioned Neural Networks for Character Control》这篇论文。它能够根据3D地形和指定的运动类型(如行走),合成出适应地形的连续3D姿态序列。
实现这样的系统面临三大挑战:
1. 数据获取
获取人物在复杂地形上运动的真实数据非常困难。该论文采用的解决方案是数据增强:先捕获人物在平面上的行走、上下楼梯等基本运动数据,然后通过算法将不同的地形(用参数化的曲面片表示)适配到人物的脚部轨迹下,从而创造出“人物-地形”配对数据。
2. 运动与地形的编码
以下是编码运动与地形信息的方式:
- 运动编码:输入包括历史关节位置、关节速度、根节点轨迹和根节点速度。
- 地形编码:沿着人物预期的前进轨迹,在固定点采样地形高度值,作为标量输入。
- 相位变量:这是一个关键辅助变量,它在0到2π之间循环,代表步行周期的进度(如0为抬脚,π为最高点,2π为落脚)。没有它,神经网络容易产生过度平滑、脚部滑动的结果。相位函数化神经网络能根据相位动态调整网络权重,生成与步伐同步的、更自然的运动。
3. 推理生成
系统是一个自回归模型。基于过去帧的运动状态、当前地形采样信息以及相位,预测下一帧的关节位置、速度等。然后递归地使用网络,即可生成连续的运动序列。
这种基于局部几何(高度场)而非高级语义(如“楼梯”)的方法,赋予了模型很好的泛化能力,能适应各种未见过的地形。
总结与展望 📚
本节课中我们一起学习了如何利用变分自编码器进行人体运动合成。
我们首先推导了变分自编码器的核心公式,理解了其作为生成模型同时优化重建损失和潜在空间正则化的原理。接着,我们探讨了训练中的关键技巧——重参数化,它解决了采样操作不可微的难题。然后,我们将模型扩展到条件生成 setting,使其能根据场景信息预测人体接触点,进而合成静态场景中的人体姿态。最后,我们深入了一个更复杂的动态运动合成模型,它通过编码局部地形、运动历史和步态相位,能够自回归地生成与复杂地形自然交互的人体动画。


当前,简单的生成模型已能根据场景合成静态人体。而通过变分自编码器预测接触点,以及利用自回归系统预测未来运动,我们能够实现更具交互性的动态运动合成。在接下来的课程中,我们将看到更为复杂的模型,用于合成场景中动态、且具有更高级交互行为的人体运动。

浙公网安备 33010602011771号