当前位置: 首页 > news >正文

【论文阅读】Face2Diffusion for Fast and Editable Face Personalization

code:mapooon/Face2Diffusion: [CVPR 2024] Face2Diffusion for Fast and Editable Face Personalization https://arxiv.org/abs/2403.05094 (github.com)

论文

介绍 

目标:向 T2I 模型不知道的图像中插入特定概念(例如某人的脸),从而催生出诸如 TextualInversion 和 DreamBooth的个性化方法。这两个方法学习每个概念需要几十分钟的微调,基于此提出了Face2Diffusion (F2D),用于高可编辑性面部个性化。核心思想是从训练pipeline中删除与身份无关的信息,防止过拟合并提高编码面部的可编辑性。

特点:平衡了身份保真度和文本保真度。三个组件:1)多尺度身份编码器 (MSID) ,提供了解耦的身份特征,同时保留了多尺度信息,提高了相机姿势的多样性。 2)表情引导,将人脸表情与身份分离,提高人脸表情的可控性,可以通过文本提示和参考图像来控制人脸表情。 3)分类引导去噪正则化(CGDR) ,鼓励模型学习如何对面部进行去噪,从而增强背景的保真度。

图 1.  Face2Diffusion 满足复杂的文本提示,文本包括多个条件,同时保留输入的面部身份,无需单独的测试时间调整。 

方法

先验知识

目标:将输入面部表示为 CLIP 文本空间中的面部嵌入 S*,以生成受 StableDiffusion 上文本提示调节的目标对象。

前提:预训练的图像编码器在将面部身份表示为文本嵌入向量 S* 方面非常有用。对于一个面部编码器 fid 和一个映射网络 fmap,给定输入图像 x 的 S* 计算如下:

然后,S*被用作标记化的词,用于生成注入身份信息的图像,如图 3(b) 所示。fmap通过对每个个体或面部数据集使用重建损失进行优化,以实现即时编码,无需在测试时进行调整。

以前的方法存在三种类型的过拟合:背景、相机角度和面部表情。图2显示了[Multi-concept customization of text-to-image diffusion.]的失败案例。可以看出,由于对输入样本的过拟合,该方法往往会生成相似的背景、角度和面部表情。

图 3 可视化了 F2D。由解决过拟合问题的三个重要组件组成:

  • 3.2节多尺度身份(MSID)编码器,通过从面部识别模型 [Arcface: Additive Angular Margin Loss for Deep Face Recognition] 中移除与身份无关的信息,解耦摄像机角度和面部嵌入。
  • 3.3节表情引导,将面部表情从面部嵌入中解耦,对齐表情与文本,并增加表情的多样性。
  • 3.4节类引导去噪正则化(CGDR),强制面部嵌入的去噪方式遵循其super-class(即“一个人”)的背景去噪方式。

(a) 训练过程中,将人脸图像输入到新型多尺度身份编码器 fid 和现成的 3D 人脸重建模型 fexp 中,分别提取身份和表情特征。连接的特征通过映射网络 fmap 作为词嵌入 S* 投影到文本空间中。输入图像也由VAE的编码器E进行编码,然后添加高斯噪声ε。将去噪后的潜在特征图限制为前景中的原始特征图,并限制为背景中的类引导去噪结果。

(b) 推理过程中,表情特征被替换为无条件向量 ̃ vexp 以使生成图像的面部表情多样化。将人脸嵌入 S* 注入输入文本后,执行 StableDiffusion 的原始去噪循环,以生成由输入人脸身份和文本调节的图像。

Multi-Scale Identity Encoder

首先考虑如何在文本空间中编码面部信息。DreamIdentity 提出从浅层到深层提取多尺度特征,以提高身份相似性。然而这种直接的多尺度方法容易对输入样本过拟合,原因是浅层特征包含了大量与身份无关的低级信息(例如摄像角度、表情和背景)。这使得模型依赖于浅层特征来最小化重建损失(公式 1):从而导致编辑能力下降。图 4(a) 和 (b) 分别可视化了基于 ViT 的 ArcFace 模型在浅层(第 3 层)和最深层(第 12 层)的身份相似性分布。水平轴表示身份相似性,垂直轴表示频率。

图 4.ArcFace 和 MSID 编码器的身份相似度分布。尽管深层特征 (b) 对齐良好,但 ArcFace (a) 的浅层特征未对齐且可辨别性较低。本文的 MSID 编码器成功地从浅层 (c) 和深层 (d) 中删除与身份无关的信息,以防止过度拟合。

从 VGGFace2 数据集中为每个身份均匀采样了一个 {Anchor, Positive(相同), Negative(不同)} 三元组。浅层特征未对齐且不足以区分身份;尽管最深层特征的 AUC 为 99.97%,浅层特征的 AUC 仅为 93.99%。这一结果表明,浅层特征包含了输入图像的特定信息,导致面部个性化中的过拟合。

为解决此问题,本文提出了用于面部个性化的多尺度身份(MSID)编码器。在 ArcFace 面部识别模型的预训练中,不仅鼓励最深层,还鼓励浅层来区分身份。将拼接的多尺度身份向量表示为,给定一个图像及其类别标签 y,将多尺度损失 Lm 表述为原始的 ArcFace 损失:

Wk 是权重矩阵 W 的第 k 列,m 和 s 分别是 ArcFace 中的边距和尺度。如图 4(c) 和 (d) 所示,我编码器生成的多尺度特征在浅层和深层都对齐良好且具有辨别力;浅层特征的 AUC 从 93.99% 提升到 99.46%。解耦的多尺度身份特征在提供强身份信息的同时,防止了过拟合。与之前图像分类任务中的工作 [38] 只关注最深的两层不同,我们训练了多个层级,重点关注的是浅层到深层的多尺度特征解耦,而不是仅仅分类时最深特征的辨别能力。

  • 面部识别模型能够提供有用的身份表示,但浅层特征中包含了与身份无关的信息(如相机姿态、表情、背景),这会导致模型过拟合,依赖这些浅层特征来降低重建误差。
  • 过拟合问题:直接使用浅层特征的多尺度方法虽然能够提取更多的信息,但容易对输入图像的具体信息(如背景)过拟合,导致模型的编辑能力下降,即生成的面部图像缺乏灵活性。

  • 身份相似性分析:实验发现浅层特征的身份相似性不足以区分不同身份,且浅层特征的 AUC 只有 93.99%,而深层特征的 AUC 为 99.97%。这表明浅层特征包含了太多与身份无关的信息,导致过拟合问题的出现。

  • 多尺度身份编码器(MSID):通过结合浅层和深层的特征,在模型的训练过程中对各层的特征进行解耦,以提高模型的泛化性和编辑能力。

  • 多尺度损失:通过改进后的损失函数(公式 3),不仅最深层的特征被用于区分身份,浅层特征也得到了优化,保证在多个层级上提取到有用的身份信息。

  • 结果改进:实验结果表明,改进后的多尺度方法使得浅层特征的 AUC 提升至 99.46%,大幅减少了模型对浅层无关特征的依赖,并且增强了面部个性化中的身份表示能力。

Expression Guidance

尽管 MSID 编码器在保留身份相似性的同时极大地提高了文本保真度,但由于对输入样本的过度拟合,仍然很难控制面部表情。为了解决这个问题提出表情指导,将面部表情与身份分开。我们利用 3D 人脸重建模型 [Accurate 3D Face Reconstruction with Weakly-Supervised Learning: From Single Image to Image Set.](表示为 fexp)来提取表情特征。对于输入人脸图像 x,只需在映射网络 fmap 之前连接 vexp = fexp(x) 和 vid = fid(x) 即可注入表情信息。表达引导特征向量 S* 计算:

以 0.2 的概率丢弃 vexp 并输入一个替代的可学习向量 ̃ vexp 以进行无条件生成。训练后,用学习到的无条件向量~vexp 生成与各种表达相关提示一致的目标主题。

Class-Guided Denoising Regularization

对训练样本的过拟合会导致生成的图像无法与背景中的文本条件保持一致。延迟主体调节(DSC)[60]通过用其超级标识符替换标识符 S* 来解决这个问题在早期的去噪步骤中使用类词(例如“一个人”),并在推理过程中从去噪循环的中间用 S* 切换超类词。然而,由于一些人脸身份出现在早期去噪步骤中,DSC 降低了生成图像与输入人脸的身份相似度。为了在不降低身份的情况下从人脸嵌入中分离出背景信息,提出了类引导去噪正则化(CGDR)。 CGDR 背后的重要观察是,类别词“a person”与特定背景很好地分离,因为图 2 中生成了各种类别词。CGDR 强制面部嵌入的去噪方式遵循背景中类别提示的去噪方式。首先,我们在模型中输入身份注入提示 p =“A photo of S*”和类提示 pc =“A photo of a person”,以预测相同噪声潜在 zt 的噪声:

然后,我们将原始预测噪声 ˆ ε 约束为背景中的 ˆ εc 和前景中实际添加的噪声 ε ,如下所示:

 M 是人脸解析模型 [61] 的分割掩模,用于将身份区域与其他区域分开, ⊙ 表示像素级乘法。通过这个单一目标函数,F2D 学习对人脸身份进行编码,从而大大减轻对输入图像背景的过度拟合。训练策略保持了 T2I 模型的原始权重,因为在 F2D 训练期间仅优化 fmap。因此不会遇到语言漂移和灾难性遗忘。

实验

多尺度身份编码器
我们预训练了包含 12 层 Transformer 编码器的 ViT 模型 [15],并在 MS1M 数据集 [19] 上训练了 30 个 epoch。批次大小设置为 1024,学习率为 10−3。我们选择深度集 {3, 6, 9, 12} 进行多尺度特征提取。

Face2Diffusion
我们采用了两词嵌入方法 [11, 63],其中 S∗=[S1∗,S2∗] 由两个独立的映射网络 fmap1fmap1​ 和 fmap2fmap2​ 预测。每个映射网络 fmapifmapi​ 由两层多层感知器(MLP)组成,每层包含一个线性层、dropout [53] 和 leakyReLU [35],接着是一个额外的线性层,将特征投影到文本空间中。我们在 FFHQ 数据集 [25] 上训练模型,共进行了 100,000 次迭代。需要注意的是,只有 fmap1fmap1​ 和 fmap2fmap2​ 被更新,其他网络被冻结。仅使用水平翻转作为数据增强。批次大小设置为 32,学习率为 10−5。

设置

评估数据
采用了 FaceForensics++ 数据集 [45]。随机选择了 100 个视频,并从每个视频中提取一帧。图像按照 FFHQ 数据集 [25] 的方法对齐和裁剪。我们还收集了 40 个以人为中心的提示词,涵盖了多种场景,如职业、活动、表情和位置。提示词列表包含在补充材料中。我们生成了所有人脸图像和提示词的组合,总共 4000 个场景。按照之前的工作 [9, 46],我们为每个 {图像, 提示词} 组合生成四张图像,以进行稳健的评估,并报告所有样本的平均分数。

对比方法
我们将我们的方法与九种最先进的个性化方法进行比较,包括六种主体驱动方法:Textual Inversion [17]、DreamBooth [46]、CustomDiffusion [30]、Perfusion [54]、E4T [18] 和 CelebBasis [63],以及三种与主体无关的方法:FastComposer [60]、ELITE [59] 和 DreamIdentity [11]。对于包括 Face2Diffusion 在内的所有方法,我们使用 StableDiffusion-v1.4 [43],采用 30 个去噪步骤的 Euler ancestral 离散调度器 [26],以及指导系数为 7.0 的无分类器指导 [22] 进行公平比较。更多细节请参见补充材料。

评估指标

我们考虑了以下三个评估指标:

  1. 身份相似性 表示生成的图像在面部身份方面与输入图像的相似程度。我们采用了 AdaFace [27]、SphereFace [33] 和 FaceNet [48],计算输入图像与生成图像的特征余弦相似度。对于无法检测到面部的图像,我们赋值为 0.0。

  2. 文本相似性 表示生成的图像与除面部身份外的文本提示的一致性。我们采用 CLIP 分数 [20]、方向性 CLIP (dCLIP) 分数 [16] 和 SigLIP [64] 来计算图像与文本的相似性。我们使用参考提示词“一个人的照片”以及由“S∗S∗ 的照片”生成的参考图像来进行 dCLIP 计算。

  3. 因为面部个性化的目标是同时满足“注入面部身份”和“与文本提示对齐”,因此需要同时评估图像在这两方面的性能。为此,我们引入了 Identity × Text 分数,反映面部个性化的总体质量。我们计算了上述六个指标的调和平均 (hMean) 和几何平均 (gMean)。

 

复现

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(五)-聚合
  • GitHub每日最火火火项目(9.20)
  • 【简单点】docker如何部署tomcat
  • 线程池的类型
  • 掌握顶会流量密码!“Mamba+CNN”双热点组合!轻松找到创新点!
  • EP21 Promise封装request请求
  • Java企业面试题3
  • 数据结构—单链表
  • 让医院更智慧,让决策更容易
  • LeetCode_sql_day30(1264.页面推荐)
  • ROS学习笔记13——rosbag功能包的简单使用
  • 【自动化测试】常见的自动化遍历工具以及如何选择合适的自动化遍历工具
  • 1、vectorCast单元测试常用操作
  • 关于 OceanBase 4.x 中被truncate的 table 不再支持进回收站的原因
  • CSS——网格布局(display: grid)之上篇
  • [译] React v16.8: 含有Hooks的版本
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【css3】浏览器内核及其兼容性
  • CentOS7 安装JDK
  • ES6系列(二)变量的解构赋值
  • es6要点
  • happypack两次报错的问题
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript函数式编程(一)
  • Laravel 实践之路: 数据库迁移与数据填充
  • MySQL主从复制读写分离及奇怪的问题
  • Python3爬取英雄联盟英雄皮肤大图
  • React系列之 Redux 架构模式
  • spark本地环境的搭建到运行第一个spark程序
  • XForms - 更强大的Form
  • 前端存储 - localStorage
  • 系统认识JavaScript正则表达式
  • 学习Vue.js的五个小例子
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 阿里云重庆大学大数据训练营落地分享
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​用户画像从0到100的构建思路
  • #{}和${}的区别?
  • (8)STL算法之替换
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (笔试题)合法字符串
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (回溯) LeetCode 78. 子集
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)ObjectiveC 深浅拷贝学习
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • *Django中的Ajax 纯js的书写样式1
  • .mysql secret在哪_MySQL如何使用索引
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)