39、HumanNeRF

简介

主页:https://grail.cs.washington.edu/projects/humannerf/
在这里插入图片描述
一种自由视点渲染方法——HumanNeRF——它适用于人类执行复杂身体运动的给定单目视频,例如来自 YouTube 的视频。其可以在任何帧暂停视频并从任意新的摄像机视点甚至是针对该特定帧和身体姿势的完整 360 度摄像机路径渲染主体。这项任务特别具有挑战性,因为它需要合成身体的逼真细节,从输入视频中可能不存在的各种摄像机角度看,以及合成精细的细节,如布料褶皱和面部外观。该方法优化了典型 T 姿势中人的体积表示,与运动场相一致,该运动场通过向后扭曲将估计的规范表示映射到视频的每一帧。运动场被分解为由深度网络产生的骨骼刚性和非刚性运动。论文展示了与先前工作相比的显着性能改进,以及在具有挑战性的不受控制的捕获场景中移动人类的单目视频的自由视点渲染示例

实现流程

在这里插入图片描述
以视频帧为输入,优化正则外观,表示为连续场,以及从观测到正则空间的运动场映射。将运动场分解为骨架刚体运动和非刚体运动,分别表示为离散网格和连续场。还使用现成的身体姿态估计器对身体姿态进行了初始化,从而获得更好的对齐效果。在观测空间的体绘制和输入图像之间施加了一个损失,引导优化到一个解决方案。

使用典型的外观体积 Fc 弯曲到观察到的姿势,以产生输出外观体积 Fo,表示一个移动的人
在这里插入图片描述

Fc: x→(c, σ) 将位置 x 映射到颜色 c 和密度 σ

T: (xo, p)→xc 定义了一个运动场,在观察位姿 p = (J, Ω) 的引导下,将点从观察空间映射回标准空间,其中 J 包括 K 个标准3D关节位置,Ω = {wi} 是用轴角向量 wi 表示的局部关节旋转

将运动场分解为两部分来处理带有复杂变形的复杂人体运动
在这里插入图片描述

其中 Tskel 表示骨骼驱动的变形,本质上是逆(体积)线性混合skinning,TNR 从骨骼驱动的变形开始,并产生一个与之对应的 ∆x 偏移量

Tskel提供了由标准skinning驱动的粗变形,而TNR提供了更多的非刚性效应,例如由于服装变形

在室外场景,增加使用现成的3D身体+相机姿态估计器

由于位姿估计不准确,增加一个位姿修正函数 Ppose§ ,可以更好地解释观测结果,并将这种改进应用于骨骼驱动的变形,即将公式2中的 Tskel(x, p) 替换为 Tskel(x, Ppose§)

Canonical volume
正则体 Fc 表示为一个连续场,给定点 x 时输出颜色 c 和密度 σ
在这里插入图片描述
在这里插入图片描述
在NeRF之后,使用宽度为 256 的 8 层 MLP,以位置 x 的位置编码 γ 作为输入,产生颜色 c 和密度 σ。应用一个将 γ(x) 连接到第 五 层的跳跃式连接。在每个全连接层之后都采用 ReLU 激活,除了生成颜色 c 的那一层使用 sigmoid

Skeletal motion(骨骼运动)

计算骨骼变形 Tskel 作为一种逆线性混合skinning,将观察空间中的点映射到规范空间
在这里插入图片描述

wio是第 i 个骨的混合权重,Ri, ti 分别是旋转和平移,将骨骼的坐标从观察映射到规范空间,Ri 和 ti 可以由 p 显式计算,目标是优化wio

导出旋转和平移 {Ri, ti} ,以从观察空间中的骨骼坐标映射到规范空间中的坐标。

定义身体姿态 p = (J, Ω),其中 J = {ji} 包含 K 个关节位置,Ω = { wi }使用轴角表示∈so(3) 定义局部关节旋转。给定一个预定义的规范位姿 pc = (Jc, Ωc)和一个观察到的位姿 p = (J, Ω),身体部分 k 的观察到规范变换 M 为:
在这里插入图片描述

其中 exp(ω)∈SO(3) 为 3×3 旋转矩阵,取 ω 的指数(即应用罗德里格斯旋转公式)计算,τ (k) 为运动学树中关节k的父结点的有序集。

然后可以从 Mk 中提取身体部位 k 的旋转平移 Rk 和 tk :
在这里插入图片描述

通过存储 K 个混合权重作为一组体积 {wic(x) } 来求解在规范空间中定义的 wic,观察权重从中导出为

在这里插入图片描述
在规范空间中求解一组权值体积 {wic(x) } ,而不是在观测空间(对应 N 个输入图像)中求解N组 {wio(x) } ,可以避免过拟合,从而得到更好的泛化效果

将 {wic(x) } 集合打包成一个包含 K 个通道的单个卷 Wc(x)

没有使用MLP编码Wc,而是选择了一个显式的体积表示,有以下两个原因

  1. 公式5 需要 K 个MLP 评估来计算每个 {wio(x) } ,这对于优化是不可实现的(K = 24);
  2. 通过三线性插值重新采样的有限分辨率显式体积提供了平滑性,有助于以后的优化规范化,特别的,在优化过程中,不是直接求解体积 Wc,而是求解由随机(常数)潜在代码 z 生成体积的 CNN 参数 θskel:
    在这里插入图片描述

添加了一个通道,一个背景类,并将 Wc 表示为一个包含 K + 1 个通道的卷。

将信道级 softmax 应用到 CNN 的输出,强制跨信道进行统一分区

公式5 的分母可以用来近似成为主体的一部分的可能性 ΣKk=1 wkc (Rkx + tk)

当 f (x) 接近于零时,我们很可能处于远离主题的自由空间,这是我们在体绘制时使用的

在这里插入图片描述
用于生成运动权重体积的网络。网络从一个完全连接的层开始,它将(随机的,恒定的)潜在代码 z 转换为 1 × 1 × 1 × 1024 网格。随后,它与 5 个转置卷积连接,增加卷的大小,同时减少通道的数量,最后,产生一个大小为 32×32×32×25 的卷。在MLP 和转置卷积层后应用 LeakyReLU。潜在代码 z 的大小是 256。

Non-rigid motion(非刚性的运动)

非刚性运动 TNR 表示为偏移 ∆x 到骨架驱动的运动,以该运动为条件,即 ∆x(x,p)= TNR(Tskel(x,p),p)),为了获取细节,用 MLP 表示 TNR
在这里插入图片描述
再次使用标准的位置编码 γ 和条件 MLP Ω,身体姿态 p 的关节角
在这里插入图片描述
一个6层 MLP (宽度=128),输入关节旋转 Ω 和位置编码 γ(x),并预测偏移量 ∆x。我们在第五层的位置编码中使用一个跳过连接。此外,我们从关节角 Ω 中去掉了全局方向的旋转矢量,只使用剩下的作为 MLP 输入

Motion Field Decomposition(运动领域分解)

将运动场分解为骨架刚性运动和非刚性运动。具体来说,从观测空间中的 x 点开始,有三种不同的分解配方(为了简化符号和提高可读性,省略身体姿势 p,否则它总是作为T, Tskel, TNR的第二个参数出现。)
在这里插入图片描述

  1. Tskel和TNR都以观测点位置x为条件,如上图(a)所示
    在这里插入图片描述
  2. TNR 以 x 为条件,而 Tskel 以非刚性运动调整的位置为条件,x + TNR(x),如图(b)所示
    在这里插入图片描述
  3. 图©所示的Tskel取决于 x 和 TNR 取决于 Tskel(x) 被骨骼刚性运动 Tskel 扭曲的位置
    在这里插入图片描述
    在这里插入图片描述
    方案 ©导致最佳对齐,论文使用的就是方案(c)

Pose correction(姿势校正)

从图像中估计的身体姿势 p = (J, Ω) 通常是不准确的,为此需要更新姿态
在这里插入图片描述
固定关节 J,并优化关节角度的相对更新,∆Ω =(∆w0,…,∆wk),然后将其应用于Ω,得到更新的旋转向量

与其直接优化 ∆Ω,不如求解基于 Ω 生成 ∆Ω 的 MLP 的参数 θ 位姿,从而导致更快的收敛
在这里插入图片描述
将从观测空间到规范空间的扭曲方程重写为
在这里插入图片描述
在这里插入图片描述
宽度 256 的 4 层 MLP 取关节角 Ω 用于细化初始姿态。与非刚性运动MLP一样,我们将除根关节(即身体方向)外的所有关节都考虑在内,并进行相应的优化

HumanNeRF objective

输入帧{I1, I2,…, IN},身体姿势{p1, p2,…, pN},相机{e1, e2,…, eN}
在这里插入图片描述
L{·}是损失函数,Γ[·]是体积渲染器,对所有网络参数使损失最小化。Θ = {θc, θskel, θNR, θpose}.

Fc由参数θc决定,而从观测空间到正则空间的变换 T 则依赖于参数 θskel、θNR和θpose

Volume rendering

一条含有D个样本的射线 r 的期望颜色 C®,∆ti 为样本 i 与 i + 1之间的区间
在这里插入图片描述
进一步扩大 αi 的定义,使其在前景近似概率 f(x) 较低时很小
在这里插入图片描述
采用NeR提出的分层抽样方法。不使用分层采样,因为被试的包围盒可以从他们的3D身体姿势估计。然后只对盒子里的点进行采样

Delayed optimization of non-rigid motion field

当一次性求解公式 11中的所有网络参数时,发现优化后的骨骼驱动运动和非刚性运动并没有解耦——受试者的一部分骨骼运动由非刚性运动场建模——这是由于非刚性运动对输入图像的过拟合所致。因此,当呈现不可见的视图时,质量会下降。

管理优化过程来解决问题。具体来说,在优化开始时禁用非刚体运动,然后以粗到细的方式将它们带回来。为了实现这一点,对于非刚性运动MLP,对其位置编码的频带应用了一个截断的 Hann 窗口,以防止对数据的过拟合,随着优化的进行,窗口大小不断增加。定义了位置编码的每个频带 j 的权值
在这里插入图片描述
其中 τ∈[0,L) 决定了截断汉恩窗的宽度,L 为位置编码的总频带数。然后我们将 τ 定义为优化迭代的函数
在这里插入图片描述
其中 t 为当前迭代,Ts 和 Te 为超参数,决定何时启用非刚体运动优化,何时使用位置编码的全频带。从位置编码中移除位置标识而不影响性能。通过这样做,可以通过设置 τ = 0 完全禁用非刚性运动优化。

Loss and ray sampling

同时使用 MSE 损失来匹配像素级外观和感知损失 LPIPS,以提供对轻微的错位和阴影变化的鲁棒性,并改善重建中的细节。最终损失函数是 L = LLPIPS + λLMSE。使用 λ = 0.2,并选择 VGG 作为 LPIPS 的主干。

基于patch的射线采样:在随机射线样本上进行训练,就像在NeRF中做的那样,不能最小化损失,因为LPIPS使用卷积来提取特征。在一幅图像上采样 G 个大小为 H × H 的 patch,每批渲染总共 G × H × H 射线。将渲染的 patch 与输入图像上相同位置的 patch 进行比较。实验采用 G = 6, H = 32

效果

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要在PyTorch中使用自己的数据集进行命名实体识别(NERF),您可以按照以下步骤操作: 1. 准备数据集:首先,您需要准备一个包含标记好的命名实体的数据集。每个样本都应该是一个句子及其对应的实体标签。确保将数据集分为训练集、验证集和测试集。 2. 数据预处理:将数据集预处理为适合模型训练的格式。您可以将每个句子中的单词转换为数字编码,构建词汇表,并将标签进行数字编码或者使用标签映射表。 3. 创建数据加载器:使用PyTorch的`DataLoader`类来加载数据。您可以创建一个自定义的数据集类继承自`torch.utils.data.Dataset`,并实现 `__getitem__` 和 `__len__` 方法来获取样本和样本数量。 4. 定义模型:使用PyTorch定义一个NERF模型。您可以选择使用预训练的模型(如BERT)作为基础模型,然后添加一些额外的层来进行NERF任务。根据您的数据集大小和任务复杂性,选择适当的模型架构。 5. 定义损失函数和优化器:选择合适的损失函数(如交叉熵损失)和优化器(如Adam)来训练模型。 6. 训练模型:使用训练集对模型进行训练。迭代数据加载器中的每个批次,计算损失并进行反向传播更新模型参数。 7. 评估模型:使用验证集评估模型的性能。计算模型在命名实体识别任务上的准确率、召回率、F1值等指标。 8. 模型推理:使用训练好的模型对新的句子进行命名实体识别。将句子转换为模型可接受的格式,并使用模型预测实体标签。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值