2019.08 FSGAN -论文解读

2023-11-15

原文链接:https://zhuanlan.zhihu.com/p/138042376

笔者前言

《FSGAN: Subject Agnostic Face Swapping and Reenactment》是ICCV19的一篇文章,主要工作是面部身份变换和表情迁移,去年文章出来的时候我读过一遍,有些地方看的不是很懂。最近这篇文章的代码开源了,想复现一下,看看能不能用到最近比较火热的视频会议中去,便把这篇文章拿出来重新过了一遍,发现还是有新的收获的,话不多说,让我们直入正题。

What

这篇论文的亮点之一就是同时cover了人脸生成领域常见的两个任务,面部身份变换和表情迁移。给定源人脸和目标人脸,面部身份变换将源人脸贴合到目标人脸上,生成的人脸图像的背景、表情都是目标人脸的,但是身份是源人脸的。表情迁移生成的人脸图像的表情信息是目标人脸的,但是其他信息都是源人脸的。(不过在面对表情迁移任务时,关于源人脸和目标人脸的定义可能会反过来,比如FaceForensics++中的定义与FSGAN的定义就相反)

说了这么多,让我们用图来直观的感受面部身份变换和表情迁移。

上为面部重演,下为面部身份变换

此外,FSGAN还做到了subject agnostic,就是可以应对训练时没有见过的人脸,这也是FSGAN的亮点之一。此外,由于在模型结构中引入了分割模型,所以FSGAN在应对侧脸的时候效果较好。

Why

总的来说,为了降低对数据的依赖和提高模型在不同人物之间的泛化性。

可以看到,在人脸生成领域,除了要提高生成图像的质量,最近的趋势趋向于降低数据依赖。直观上很好理解,我希望我的模型在应对不同的人物,不同的角度都表现的很好,或者说不会太差。因为有时候,我们很难弄到源人物或者目标人物的大量人脸图像数据。

How

从整体的流程图上可以看到,整个模型大体分为三部分、四个生成器。 [公式] 是源人脸, [公式]是目标人脸,[公式] 是重演模块,将源人脸重演成目标人脸的形状,得到 [公式][公式] 是分割模块,对目标人脸进行分割,提取出面部、头发、背景区域,得到分割图 [公式][公式] 是修复模块,将 [公式] 根据 [公式] 修复,补充缺少区域;然后通过 [公式] 的融合模块,将人脸贴合到目标图像中,得到最后的生成图像 [公式]

在描述每个模块的操作原理和训练方法之前,先表一下下面会用到的损失函数。图像重建损失包括了两部分:感知损失,利用预训练好的VGG-19提取图像特征,特征的差异即损失函数。不同于以往的直接使用imagenet预训练好的vgg模型,FSGAN作者使用VGGface2和CelebA训练了模型用于这项损失,如下图:

重建损失的另一部分是逐像素的L1损失:

整体重建损失如下:

对抗损失方面,采用了与pix2pixHD相同的hinge loss以及不同尺度的判别器,具体如下:

面部重演和面部分割

重演模块的实现实际上是一个迭代的过程,作者通过源人脸和目标人脸得到对应的欧拉角以及对应的人脸关键点,然后在两个欧拉角和关键点中插值,进而得到中间状态的关键点 [公式] ,通过迭代地生成对应中间关键点的面部图像来达到最终的面部重演的效果,公式如下:

可以看到, [公式] 以当前图像I和目标关键点的热力图H作为输入,输出生成的目标图像以及图像所对应的分割图。迭代到最后,就可以得到源图像根据目标图像重演之后的生成人脸。

这里的插值很有意思,也很有想法,具体实现细节应该再探究一下,这种逐步迭代的方法解决了pose差异过大所带来的负面效果。

训练阶段,源图像和目标图像都是从同一个视频里选取的,本质上是个重建过程。重演模块的损失包含了四项:1.对抗损失。2.目标人脸的分割结果 [公式][公式] 得到的生成人脸的分割图 [公式] ,这两个分割结果做逐像素损失。3.模型生成的图像和真值的重建损失,只针对脸部的区域。4.此外,作者还提到了stepwise consistency损失,不过我在代码里没有找到,就是迭代过程中生成的图像和目标图像真值的重建损失。具体如下:

面部分割方面,训练数据集有真实标签,采用了图像分割的交叉熵损失和图像逐像素L1损失,如下所示:

重演的推断阶段,非常有意思的是,FSGAN利用了源人脸视频的整个序列的信息,他将源人脸的每一帧的欧拉角信息,舍弃roll,保留pitch和yaw,投影到二维平面上,每个点对应一个姿态,连成三角形。在推断阶段,有目标pose作为参考时,找到包含该pose的三角形,然后用三个顶点对应的源人脸的图像,结合目标人脸关键点信息过 [公式] ,将结果加权得到重演后得到的图像 [公式] .

面部修复

面部修复image inpainting模型的训练过程是一个有监督的训练过程,真值是没有了背景的目标图像 [公式] 。在得到 [公式] 输出的图像 [公式] 和分割图 [公式] 之后,对 [公式] 进行增广,添加一些遮挡,然后对 [公式] 使用增广后的分割图除去背景,然后再将除去背景的图像过 [公式] 得到模型输出值 [公式] . 有了真值和输出值,损失函数如下:

面部融合

在面部融合阶段应用了泊松融合,公式如下:

然后训练了融合模型 [公式] 去输出我们想要的融合后的图像,损失如下,包括重建损失和对抗损失:

不过,为什么不直接用泊松融合做最后阶段,而是训练一个模型要拟合这种输出呢?个人猜测是要利用GAN模型的强学习能力。

数据集选了IJB-C、VGGFace2、CelebA、LFW、FaceForensics++等,分别训练各个模型。评价指标选取了SSIM、欧拉角差异、人脸关键点差异,还使用了dlib提取id信息,进行人脸验证。(这里我没弄明白怎么用dlib做face verification,不过我觉得既然是提取id信息,可以使用预训练好的FaceNet之类的face verification网络或者使用face_recognition包。)

展示如下:

定量比较
表情重演定性比较
面部身份变换定性比较

笔者后记

FSGAN是一个大工程,不同于传统的端到端模型,FSGAN包括了很多需要单独训练的模型,也很好地解决了侧脸的问题。不过,当面对较大的pose时,成像质量会显著下降。并且,FSGAN没办法像三维模型一样很好地捕捉面部细节。

人脸生成方面开源的代码不多,既然这个代码最近已经开源,预训练模型也已提供,是时候跑一波看看效果了,希望可以最终应用到项目上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2019.08 FSGAN -论文解读 的相关文章

随机推荐

  • 学长告诉我,大厂MySQL都是通过SSH连接的

    大家好 我是咔咔 不期速成 日拱一卒 一 背景 之前待的几个公司 数据库 服务器权限都是给所有后端直接拉满的 但也会出现员工离职的情况 每次有人离职时都需要改数据库密码 服务器密码 每次密码修改后得告知所有开发修改本地密码 但这样的事情也不
  • 详解反调试技术

    反调试技术 恶意代码用它识别是否被调试 或者让调试器失效 恶意代码编写者意识到分析人员经常使用调试器来观察恶意代码的操作 因此他们使用反调试技术尽可能地延长恶意代码的分析时间 为了阻止调试器的分析 当恶意代码意识到自己被调试时 它们可能改变
  • xilinx mipi ip

    占位
  • JSP页面中Input输入框获取当前系统时间

    JSP页面中Input输入框获取当前系统时间 在input属性value中填写如下代码即可获取系统当前时间输入 value
  • switch游戏机小白初体验

    1 switch版本区别 lite 续航版与oled的区别 oled屏幕比续航版的大 续航版和oled版都可以连接电视或显示器 lite只能玩掌机 只喜欢玩掌机的可以选lite 更便宜 国行 港版 日版的区别 国行不能与全球玩家联机 不能买
  • warning: could not find UI helper ‘git-credential-manager-ui‘

    可以先试试别人的教程 58条消息 关于git 凭证存储 credential helper配置 解决 git pull push fetch remote not found的问题 DavidFFFFFF的博客 CSDN博客 我是因为换了电
  • Python pyinstaller打包exe最完整教程

    目录 1 简介 2 安装 3 原理和打包效果 3 1 原理概述 3 2 搜索模块 3 3 打包效果概述 3 4 打包成单个文件夹 优点 缺点 3 5 打包成单个exe 优点 缺点 4 打包 4 1 基本语法 4 2 参数总览 位置参数 可选
  • IDEA导入eclipse项目并部署运行完整步骤(转发)

    首先说明一下 idea里的project相当于eclipse里的workspace 而idea里的modules相当于eclipse里的project 1 File gt Import Project 在弹出的对话框里选择要导入的项目 2
  • IAR仿真确认延时程序时间的准确性

    单片机 程序经常会用到延时函数 毫秒延时或微秒延时函数 为了确认延时函数时间的准确性 以前经常是需要通过IO口输出波形来确认时间是否准确 最近发现了个更方便准确的方法 只需要通过IAR仿真软件即可准确知道延时函数的运行时间 1 首先在IAR
  • SQL 数据更新

    SQL 数据更新 数据更新有三种 插入 修改 删除 一 插入数据 插入元组 行 INSERT Into lt 表名 gt lt 属性列1 gt lt 属性列2 gt lt 属性列3 gt lt 属性列4 gt Values lt 常量1 g
  • 2022.7台式机装机指南(3060 + 12490F)

    文章目录 硬件购买 装机避坑 系统制作 系统激活 大学四年用的华硕飞行堡垒FX86 那时候的配置还可以 8代i7 1050ti 8G 256固态 1T机械 后来又买了一张内存条 扩到了16g 四年只出过2次故障 第一次蓝屏自己修好了 第二次
  • PDF Redactor - 涂黑屏蔽PDF文字让敏感内容不可读的软件工具

    PDF Redactor是一款Windows平台下的PDF小工具软件 旨在涂黑屏蔽或删除PDF文件中的敏感文本和图像以保护隐私 被屏蔽的内容不仅在PDF阅读器中无法查看 而且即使使用文本搜索功能也无法再找到这部分内容 这些内容将从PDF文件
  • python json.dumps中文乱码问题解决

    json dumps var ensure ascii False 并不能解决中文乱码的问题 json dumps在不同版本的Python下会有不同的表现 注意下面提到的中文乱码问题在Python3版本中不存在 注 下面的代码再python
  • 解决pyside6-uic生成py代码中文为unicode(乱码)的问题

    前言 本来想用Java做客户端 后来发现很多算法还是Python有现成的比较方便 所以最终选择了pyside6 但是用Designer QT设计师 设计完后 生成的代码中文部分显示为unicode 也可以理解为乱码 就像这样 self pu
  • 前端分页插件_免费开源的React前端框架——ReactAdmin

    介绍 ReactAdmin是一个Github上免费开源的前端框架 不是组件库 也不是模板 它是一个框架 采用es6 React和Material Design构建基于Rest GraphQl API的Web应用程序 在React上star数
  • Android实现用户登录和注册界面

    我们在做android项目时经常会用到用户登录 这里呈上实现了Spinner的登录界面 初学的朋友可以直接拿过来使用 本界面使用的是流式布局 也是我最喜欢用的布局方式 同学们可以通过代码了解一下 代码中Intent的使用有点杂乱 主要是为了
  • sql逗号分开的指定列,分成多行

    if object id tempdb dbo tb is not null drop table tb go create table tb id int price varchar 100 customer int cinvcode i
  • 掌握这个技能,再也不用为面试发愁了

    点击上方 前端瓶子君 关注公众号 回复算法 加入前端编程面试算法每日一题群 废话只说一句 码字不易求个 收藏 学会 快行动起来吧 评论区走起 在面试时 经过简单寒暄后 面试官一般先从让候选人自我介绍开始 紧接着就是问候选人简历中所列的项目
  • weblogic CVE-2023-21839 复现

    影响版本 Weblogic 12 2 1 3 0 Weblogic 12 2 1 4 0 Weblogic 14 1 1 0 0 这里是用的docker下载的vulhub的CVE 2023 21839 靶机和攻击机都是192 168 85
  • 2019.08 FSGAN -论文解读

    原文链接 https zhuanlan zhihu com p 138042376 笔者前言 FSGAN Subject Agnostic Face Swapping and Reenactment 是ICCV19的一篇文章 主要工作是面部