Sora和快手可灵背后的核心技术 | 3DVAE:通过小批量特征交换实现身体和面部的三维形状变分自动编码器

【摘要】学习3D脸部和身体生成模型中一个解开的、可解释的和结构化的潜在表示仍然是一个开放的问题。当需要控制身份特征时,这个问题尤其突出。在本文中,论文提出了一种直观而有效的自监督方法来训练一个3D形状变分自动编码器(VAE),以鼓励身份特征的解开潜在表示。通过交换不同形状间的任意特征来管理迷你批次生成,这允许定义一个利用已知的潜在表示中的差异和相似性的损失函数。在3D网格上进行的实验结果表明,用于潜在解开的最先进的方法无法解开脸部和身体的身份特征。论文提出的方法正确地解耦了这些特征的生成,同时保持了良好的表示和重建能力。

原文:3D Shape Variational Autoencoder Latent Disentanglement via Mini-Batch Feature Swapping for Bodies and Faces
地址:https://arxiv.org/abs/2111.12448
代码:https://github.com/simofoti/3DVAE-SwapDisentangled
出版:CVPR
机构: 伦敦大学学院

1 研究问题

本文研究的核心问题是: 如何设计一种自监督的方法,在3D人脸和人体形状的生成模型中实现身份特征解开的潜在表示。

::: block-1
想象论文要开发一个3D游戏或虚拟试衣间,需要程序自动生成各种逼真的人脸和人体模型。论文希望这个生成系统有以下特点:1)能够通过调节少量的控制参数,就生成千变万化的脸部和身体;2)这些控制参数应该是可解释的,比如对应眼睛、鼻子、嘴巴等具体的面部器官。这样的生成工具不仅使用方便,而且便于实现局部的、细粒度的形状控制。
:::

本文研究问题的特点和现有方法面临的挑战主要体现在以下几个方面:

  • 身份特征具有明显的局部性,而现有的3D形状生成模型往往只学习到全局的latent表示,缺乏对局部身份特征的显式建模。
  • 缺乏可用于身份特征解开学习的监督信号。现有的latent解开方法主要针对人脸表情和姿态的解耦,而缺少面向身份特征的benchmark和评估标准。
  • 身份特征之间往往存在复杂的相关性,简单地对latent空间做划分,无法学习到语义清晰的特征表示。

针对这些挑战,本文提出了一种基于"迷你批次特征交换"的VAE训练范式:

::: block-1
核心思想是在组建每个训练批次时,随机地在不同形状实例之间交换局部的身份特征(如鼻子、眼睛、下巴等),从而得到一批在特定身份特征上存在差异,而在其他特征上保持一致的"合成"形状。然后要求VAE学习到的latent表示能够反映这种差异和一致性,即属于同一身份特征的潜变量应该在批内保持不变,而控制不同身份特征的潜变量应该各不相同。这其实是构建了一种弱监督信号,引导VAE去学习身份特征解开的表示(Sora和可灵等应该构建了很多弱监督信号)。同时,本文还提出了一个新的latent一致性损失函数,进一步利用批内形状的相似性约束,来强化解开学习的效果。实验表明,本文方法能在不影响生成质量的情况下,大幅提升latent表示的可解释性,实现对身份特征的有效解耦和操控。
:::

2 研究方法

本文提出了一种新颖的方法来训练3D形状变分自编码器(3D-VAE),以学习人脸和人体3D网格的解耦、可解释和结构化的潜在表示。该方法包括三个关键部分:3D-VAE的基本结构、特征交换mini-batch的生成,以及潜在一致性损失函数的构建。接下来将详细介绍每一部分。

2.1 3D形状变分自编码器

论文采用文献[16]中提出的网格卷积VAE作为基本架构。编码器 E E E 将输入网格 X X X 映射到潜在分布 Z Z Z , 定义为近似后验 q ( z ∣ X ) q(z|X) q(zX)。解码器(也称生成器) G G G 根据似然 p ( X ∣ z ) p(X|z) p(Xz) 将潜在向量 z z z 映射回网格。编码器使用spiral++卷积、ELU激活和池化层,而解码器使用spiral++卷积、ELU激活和反池化层。此外还有三个全连接层:两个预测潜在分布均值和对角协方差,一个将 z z z 转换回网格。

训练时最小化如下损失函数:

L V A E = L R + α L L + β L K L L_{VAE} = L_R + αL_L + βL_{KL} LVAE=LR+αLL+βLKL

其中 L R L_R LR 是重建损失, L L L_L LL 是基于网格拉普拉斯矩阵的平滑正则项, L K L L_{KL} LKL 是变分分布 q ( z ∣ X ) q(z|X) q(zX) 与先验 p ( z ) p(z) p(z) 间的KL散度。 α α α β β β 是平衡系数。

2.2 特征交换mini-batch生成

核心创新点之一是特征交换方法。具体来说,论文先在一个模板网格上定义 F F F 个特征区域,每个区域对应一组顶点。由于数据集中的网格具有顶点对应关系,可以很容易地识别出每个网格的各个特征区域。举个例子,对于人脸,论文可以定义眼睛、鼻子、嘴巴等不同的特征(图1左)。

基于此,论文精心设计了mini-batch的生成过程。一个大小为 B B B 的mini-batch可以看作一个 B × B \sqrt{B} \times \sqrt{B} B ×B 的矩阵,其中对角线上的元素从数据集中采样,其余元素通过特征交换得到。每次生成一个mini-batch时,论文随机选择一个特征并交换不同网格间该特征对应的顶点坐标(图1左)。这样,矩阵的每一行包含相同的人脸/人体,但具有不同的特征;而每一列包含不同的人脸/人体,但具有相同的特征。

2.3 潜在一致性损失函数

mini-batch的精心设计为构建潜在一致性损失函数奠定了基础。当一个mini-batch输入到编码器后,论文得到大小为 B × B \sqrt{B} \times \sqrt{B} B ×B 的潜在向量矩阵,其中每个向量 z i j z_{ij} zij 被均匀地划分为 F F F 个子集,分别控制一个特征(图1中间)。

假设当前mini-batch交换了特征 f f f, 则 z i j = ( z i j f ∣ z i j c ) z_{ij} = (z^f_{ij}|z^c_{ij}) zij=(zijfzijc)。其中 z i j f z^f_{ij} zijf 控制特征 f f f, 而 z i j c z^c_{ij} zijc 控制其他特征。直觉上,同一列的 z i j f z^f_{ij} zijf 应该接近,因为它们对应相同的特征 f f f;而同一行的 z i j f z^f_{ij} zijf 应该远离。反之,同一行的 z i j c z^c_{ij} zijc 应该接近,而同一列的 z i j c z^c_{ij} zijc 应该远离。这就好比对角线上的人脸彼此不同,但具有相同的特征 f f f

基于这一思想,论文构建潜在一致性损失函数如下:

L c = γ B ∑ s , p , q = 1 B I p ≠ q ( max ⁡ [ 0 , ∥ z p s f − z q s f ∥ 2 2 − ∥ z s p f − z s q f ∥ 2 2 + η 1 ] + max ⁡ [ 0 , ∥ z s p c − z s q c ∥ 2 2 − ∥ z p s c − z q s c ∥ 2 2 + η 2 ] ) \begin{aligned} L_c = \frac{γ}{\sqrt{B}} \sum_{s,p,q=1}^{\sqrt{B}} \mathbb{I}_{p \neq q} \Big(&\max[0, \|z^f_{ps} - z^f_{qs}\|^2_2 - \|z^f_{sp} - z^f_{sq}\|^2_2 + η_1] \\ +&\max[0, \|z^c_{sp} - z^c_{sq}\|^2_2 - \|z^c_{ps} - z^c_{qs}\|^2_2 + η_2] \Big) \end{aligned} Lc=B γs,p,q=1B Ip=q(+max[0,zpsfzqsf22zspfzsqf22+η1]max[0,zspczsqc22zpsczqsc22+η2])

其中 γ γ γ 是归一化系数, I \mathbb{I} I 是指示函数, η 1 η_1 η1 η 2 η_2 η2 是容差。该损失函数遍历mini-batch矩阵的对角线,并要求匹配的潜在变量对之间的距离比不匹配的对之间的距离小一个容差 η η η。这鼓励 VAE 学习到的潜在表示能够解耦地控制每个特征的生成。

最后,结合原有的VAE损失(1)和潜在一致性损失(2),论文得到总的损失函数:

L = L V A E + κ L c = L R + α L L + β L K L + κ L c L = L_{VAE} + κL_c = L_R + αL_L + βL_{KL} + κL_c L=LVAE+κLc=LR+αLL+βLKL+κLc

其中 κ κ κ 控制潜在一致性损失的权重。

综上所述,本文提出了一种通过特征交换生成mini-batch、并构建潜在一致性损失函数的方法,使得3D-VAE能够学习到更加解耦、可解释和结构化的3D人脸和人体的潜在表示。该方法只需要对标准的VAE进行很小的改动,却能学习到可以独立控制每个特征生成的潜在空间。这极大地提高了生成模型的可解释性和可用性。

3 实验

3.1 实验场景介绍

本文提出了一种新的VAE框架,通过批特征交换与潜在一致性损失,使学习到的潜在表征具有更好的可解释性、结构性和解纠缠特性。实验旨在验证该方法在人脸与人体3D网格生成任务中的有效性。

3.2 实验设置

  • Datasets:从UHM和STAR线性模型中随机生成人脸与人体3D网格数据集,各1万个,划分为训练集(90%)、验证集(5%)和测试集(5%)
  • Baseline:VAE、DIP-VAE-I/II、Factor VAE等最先进的自监督潜在解纠缠模型
  • Implementation details:
    • 骨干网络:SpiralNet++,人脸模型4层卷积,人体模型3层卷积
    • 超参数:40个epoch,ADAM优化器,学习率1e-4,批大小16,潜变量维度(人脸60维,人体33维)等
  • metric:
    • 重建误差:平均/最大每顶点误差
    • 生成多样性:随机生成的样本对之间的平均每顶点距离
    • 分布距离:JSD、MMD、COV等
    • 潜变量解纠缠:观察潜变量遍历对生成特征的影响

3.3 实验结果

3.3.1 实验一、与其他潜在解纠缠方法的性能对比

目的:评估所提出的模型与其他自监督潜在解纠缠方法在生成任务上的性能表现
涉及图表:表1
实验细节概述:在人脸数据集上,比较了VAE、DIP-VAE-I/II、Factor VAE等模型的重建误差、生成多样性、分布距离等指标
结果:

  • 本文模型的重建误差与普通VAE相当,优于其他方法,说明批特征交换和一致性损失并未降低重建能力
  • 本文模型的生成多样性与大多数方法相近,Factor VAE多样性更高但生成样本真实性较差
  • 其他评估生成性能的指标表明,本文方法与其他模型性能相当

3.3.2 实验二、潜在表征的解纠缠效果评估

目的:定性评估学习到的潜在表征对控制不同面部/身体特征的解纠缠能力
涉及图表:图3、图4、图5、图10、图11
实验细节概述:遍历每个潜变量,生成两个改变该变量至最小值(-3)和最大值(+3)的3D网格,观察顶点位移,分析其对不同特征的影响
结果:

  • 本文模型的潜在表征展现出明显的结构性和可解释性,不同潜变量对应控制了特定的面部/身体特征
  • 相比之下,其他方法学到的潜在表征难以解释,大多数变量均表现出纠缠的特性

3.3.3 实验三、消融研究

目的:分析模型关键组件(批特征交换、一致性损失、拉普拉斯正则化、归一化)的作用
涉及图表:图13
实验细节概述:分别移除模型的潜在一致性损失、拉普拉斯损失和输入归一化,重新训练并对比性能
结果:

  • 移除潜在一致性损失后,仅保留批特征交换无法获得解纠缠的潜在表征
  • 移除拉普拉斯损失会导致生成网格表面不规则,出现不连续
  • 移除输入归一化则降低了生成人脸的真实性

3.3.4 实验四、泛化能力评估

目的:验证模型对于训练分布外样本的拟合能力
涉及图表:图14
实验细节概述:在CoMA人脸数据集的中性表情上,通过优化潜码最小化与目标网格的重建误差,测试模型的泛化性能
结果:

  • 重建误差随着施加的噪声线性增长,但整体仍保持较低水平,说明模型泛化能力较好
  • 本文方法的重建误差在所有模型中最低,证明其更强的泛化性

4 总结后记

本论文针对3D生成模型中潜在表示解耦的问题,提出了一种基于Mini-Batch特征交换和潜在一致性损失的自监督方法。通过在Mini-Batch内的样本间交换预定义的网格特征并约束对应潜变量的相似性,实现了对身体和面部3D网格的特征级解耦生成控制。实验结果表明,所提方法能够学习到更加解释性强、结构化的潜在表示,生成效果优于现有方法。

::: block-2
疑惑和想法:

  1. 除了预定义的语义特征,是否可以通过无监督的方式自动发现并解耦3D形状的内在成分表示?(有个有趣工作CausalVAE)
  2. 本文假设训练数据需要具有顶点对应性,如何将方法拓展到非结构化的3D数据如点云、体素?
  3. 形状的局部特征通常具有层次结构,如何建模特征间的拓扑关系,实现分层解耦控制?
    :::

::: block-2
可借鉴的方法点:

  1. Mini-Batch内样本特征交换的思想可以用于其他需要解耦因素的生成任务,如图像合成、视频生成等。
  2. 将Mini-Batch结构引入loss设计来施加归纳偏置的方法值得借鉴,可用于改进其他自监督表示学习任务。
  3. 利用领域知识对架构施加约束以实现可解释特征解耦的思路具有一定通用性,可用于其他生成模型。
    :::

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(DS)C语言版:学习笔记(4):线性表

参考教材:数据结构C语言版(严蔚敏,吴伟民编著) 工具:XMind、幕布、公式编译器 正在备考,结合自身空闲时间,不定时更新,会在里面加入一些真题帮助理解数据结构 目录 2.1线性…

eNSP由于Cloud网卡设置错误引起的STP环路机制问题

现象:SW1和SW2之间直连(vlan13)不可达,但是断开左边的Cloud云的虚拟之后可达(设置g0/0/1口为down) ,接口协议均up,配置正确。 查看生成树状态: 发现,SW2的g0/0/4接口为阻塞状态&…

[机器学习] Stable Diffusion初体验——基于深度学习通过神经网络的强大AI平台

文章目录 前言平台介绍 一.创建应用 Stable Diffusion WebUI初始化上传模型,VAE,lora 介绍sd模型,vae,lora模型进入应用文生图工作区调参区图生图 结语 前言 在这个信息爆炸的时代,AI技术正以前所未有的速度发展着。图…

微服务开发与实战Day07 - MQ高级篇

一、消息可靠性问题 首先,分析一下消息丢失的可能性有哪些。 消息从发送者发送消息,到消费者处理消息,需要经过的流程是这样的: 消息从生产者到消费者的每一步都可能导致消息丢失: 发送消息时丢失: 生产…

第二证券:新股“肉签”不断,今日两只申购!光伏巨头小伙伴来了

本周(6月17日—6月21日),A股商场将迎来两只新股,分别为沪市主板的永臻股份和创业板的爱迪特,均将于本周一进行申购。 资料显现,永臻股份是国内领先的铝合金光伏结构件制造商,公司发行价为23.35…

俄罗斯方块小游戏(附源码)

游戏展示 一.导包 import turtle import random 二.定义一个Block类 定义一个Block类,用于表示游戏中的方块,包含颜色和形状。 class Block:def __init__(self, color, tiles):self.color colorself.tiles tiles三.定义了7个不同的Block对象 定义了7…

docker通过容器id查看运行命令;Portainer监控管理docker容器

1、docker通过容器id查看运行命令 参考:https://blog.csdn.net/a772304419/article/details/138732138 docker inspect 运行镜像id“Cmd”: [ “–model”, “/qwen-7b”, “–port”, “10860”, “–max-model-len”, “4096”, “–trust-remote-code”, “–t…

C# Winform内嵌窗体(在主窗体上显示子窗体)

在开发Winform项目中,经常会要切换不同的窗体。通常程序都有一个主窗体,在切换窗体时往往需要关闭其他子窗体,这个实例就来介绍MDI主窗体内嵌子窗体的实现方法。 MDI主窗体要设置一个比较重要的属性,IsMdiContainertrue。子窗体的…

论文阅读——ApeGNN- Node-Wise Adaptive Aggregation in GNNs for Recommendation

ApeGNN: Node-Wise Adaptive Aggregation in GNNs for Recommendation ApeGNN:GNN 中的节点自适应聚合以进行推荐 Abstract 近年来,图神经网络(GNN)在推荐方面取得了长足的进步。基于 GNN 的推荐系统的核心机制是迭代聚合用户-…

ThinkPHP 的老漏洞仍然被攻击者钟情

研究人员发现安全领域出现了令人不安的趋势:攻击者不仅对新披露的漏洞十分感兴趣,对已知的漏洞也丝毫不放过,尽管有些漏洞已经存在了好些年头,攻击者仍然能够通过老漏洞成功完成攻击。 典型的例子就是 ThinkPHP 远程代码执行漏洞…

轨迹优化 | 图解欧氏距离场与梯度场算法(附ROS C++/Python实现)

目录 0 专栏介绍1 什么是距离场?2 欧氏距离场计算原理3 双线性插值与欧式梯度场4 仿真实现4.1 ROS C实现4.2 Python实现 0 专栏介绍 🔥课程设计、毕业设计、创新竞赛、学术研究必备!本专栏涉及更高阶的运动规划算法实战:曲线生成…

深度学习之激活函数

激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。在神经元中,输入的input经过一系列加权求和后作用于另一个函数,这个函数就是这里的激活函数。 1. 为什么需要激活…

鸿蒙开发:【线程模型】

线程模型 线程类型 Stage模型下的线程主要有如下三类: 主线程 执行UI绘制。管理主线程的ArkTS引擎实例,使多个UIAbility组件能够运行在其之上。管理其他线程的ArkTS引擎实例,例如使用TaskPool(任务池)创建任务或取消…

示例:WPF中应用MarkupExtention自定义IValueConverter

一、目的:应用MarkupExtention定义IValueConverter,使得应用起来更简单和高效 二、实现 public abstract class MarkupValueConverterBase : MarkupExtension, IValueConverter{public abstract object Convert(object value, Type targetType, object …

数字化转型对企业有什么价值?

数字化转型对企业有什么价值? 1. 信息共享 很多业务设计和管理规划,通常需要综合多个业务部门和业务专题的数据。 如果企业的数据和信息在位置分布上非常分散,就很难充分利用企业积累的数据资源,并将其用于有效的管理决策和业务…

零基础直接上手java跨平台桌面程序,使用javafx(七)用户操作界面探讨,这个系列结束

GUI&#xff0c;我们还是喜欢web。如果javafx有像wpf的WebView2差不多的功能&#xff0c;我们就开心了scene builder中拖出一个webview&#xff0c;然后再回到代码中。发现<?import javafx.scene.web.*?>是红色的&#xff0c;我们缺少配置。于是在pom.xml中添加JavaFX依…

Nodejs 第七十七章(MQ高级)

MQ介绍和基本使用在75章介绍过了&#xff0c;不再重复 MQ高级用法-延时消息 什么是延时消息? Producer 将消息发送到 MQ 服务端&#xff0c;但并不期望这条消息立马投递&#xff0c;而是延迟一定时间后才投递到 Consumer 进行消费&#xff0c;该消息即延时消息 插件安装 R…

[C++] 从零实现一个ping服务

&#x1f4bb;文章目录 前言ICMP概念报文格式 Ping服务实现系统调用函数具体实现运行测试 总结 前言 ping命令&#xff0c;因为其简单、易用等特点&#xff0c;几乎所有的操作系统都内置了一个ping命令。如果你是一名C初学者&#xff0c;对网络编程、系统编程有所了解&#xff…

学会python——读取大文本文件(python实例六)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、读取大文本文件 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强…

电脑内存怎么看?5个秘诀,轻松查看内存!

“新买了一台电脑&#xff0c;想查看一下我电脑的内存&#xff0c;大家可以分享一下查看方法吗&#xff1f;” 当我们谈论电脑的性能时&#xff0c;内存无疑是一个不容忽视的关键组件。然而&#xff0c;对于许多普通用户来说&#xff0c;如何查看电脑内存的大小、类型以及使用情…