FSGAN:一种基于对抗生成网络的换脸术

2023-11-17

本文导读

本文主要介绍ICCV 2019的一篇文章,FSGAN:Subject Agnostic Face Swapping and Reenactment。

文章提出了一种基于对抗生成网络的换脸术,该方法可以对在训练中未曾见过的脸部图像对进行很好的处理,并且可以根据目标图像脸部区域的mask对源图像的脸部区域进行补全,比较好的解决了脸部遮挡问题。原文链接:https://arxiv.org/pdf/1908.05932.pdf

网络架构

在这里插入图片描述

整个FSGAN的架构可以分为3个部分:重演和分割模块,补全模块,融合模块;分别对应上图中的a、b、c部分。重演模块的作用是将源图片 I s I_s Is调整为目标图片 I t I_t It的姿势;由于源图片 I s I_s Is和目标图片 I t I_t It的脸部区域可能不一致,比如:头发遮挡等问题所导致,所以补全模块则是根据目标图片 I t I_t It脸部区域的mask来补全源图片 I s I_s Is的脸部区域;在补全之后,两张图片的姿态,形状已经基本一致,但肤色和光照还有差异,最后的融合模块则是将补全后的人脸图片 I c I_c Ic更好的融合到目标图片It中。

loss

由于换脸问题本质上还是一个重建问题,文章使用的两个基本loss也都是比较常见的重建损失和对抗损失。

重建损失

重建损失有两部分构成,perceptual loss和 L1 loss,分别捕获图片的高频细节和低频特征。

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

最终的重建损失则为
在这里插入图片描述

对抗损失

为了使得生成的图片更具有真实感,文章还结合多尺度鉴别器实现对抗损失

在这里插入图片描述

重演和分割模块

重演和分割模块包含两个网络:Gr和Gs。

Gs的功能很简单:输入一个3通道的图片,输出是其对应的3通道的分割模板,在后续流程中的人脸补全模块会使用到该分割模板。Gs所采用的损失函数为交叉损失熵以及逐像素的L1 loss

在这里插入图片描述

重演模块是一个不断迭代的过程,作者提取源图片 I s I_s Is和目标图片 I t I_t It的欧拉角以及人脸关键点,在两个欧拉角和关键点中进行插值,进而得到中间关键点 p j p_j pj。将得到的中间关键点和人脸图片输入Gr,如此重复迭代,最终得到重演图片 I r I_r Ir

在这里插入图片描述

在训练过程中,采用了一个逐步的重演损失,对每一次迭代的重演图片计算重建损失,避免了源图片 I s I_s Is和目标图片 I t I_t It姿态差异过大带来的影响,这也是本文的贡献之一。

在这里插入图片描述

补全模块

在重演模块得到了源图片的最终重演图片 I r I_r Ir以及对应的分割模板 I s I_s Is,在补全阶段,首先根据重演分割模板 I s I_s Is提取出 I r I_r Ir中的脸部区域,即去除背景。将其和目标图片的分割模板 S t S_t St一起输送到补全网络Gc,结合下面的loss对面部进行补全

在这里插入图片描述

融合模块

根据作者所说,融合模块也是本文的两点之一。具体来说,作者想采用泊松融合的方式使得补全后的人脸 I c I_c Ic能够更加自然的融合到目标图片 I t I_t It中,但是他并没有直接采用泊松融合,而是构建了一个融合网络Gb,让其实现泊松融合。
在这里插入图片描述

这里为什么不直接采用传统的泊松融合?文中并没有明确的说明。相比于传统的泊松融合,这里仅多了一项对抗损失,或许这样做可以提高生产图片的真实感?也可能是为了构建一个全流程深度学习的网络?

总结

松融合,这里仅多了一项对抗损失,或许这样做可以提高生产图片的真实感?也可能是为了构建一个全流程深度学习的网络?

总结

总的来说,FSGAN在换脸方面的效果还是不错的。能够很好的保存源人脸的身份特征,同时将面部信息和表情信息均迁移到目标图像中。FSGAN中包含许多不同的子网络,适用于更普遍的换脸任务,但是作者并没有说明要如何训练这样一个大网络,不过可以借鉴该篇文章的思路,或者将其中的部分网络加以应用,也是可以得到不错的效果的。

专注于编程知识分享,包括但不限于数据结构、算法分析、集合框架、深度学习等领域知识。更多内容请关注微信公众号:旭说编程。

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

FSGAN:一种基于对抗生成网络的换脸术 的相关文章

  • 在 Pytorch 中获取负片(倒置)图像

    我想直接从数据加载器获取图像的负片并将其作为张量提供 有我可以使用的库吗 我试过火炬transforms并没有找到任何 不要费力 只需使用255 image它会给你一个负面的形象 试试吧
  • PyTorch:tensor.cuda()和tensor.to(torch.device(“cuda:0”))之间有什么区别?

    在 PyTorch 中 以下两种将张量 或模型 发送到 GPU 的方法有什么区别 Setup X np array 1 3 2 3 2 3 5 6 1 2 3 4 X model X torch DoubleTensor X Method
  • Win10 64位上CUDA 12的PyTorch安装

    我需要在我的 PC 上安装 PyTorch 其 CUDA 版本 12 0 pytorch 2 的表 https i stack imgur com X13oS png in In 火炬网站 https pytorch org get sta
  • Cuda和pytorch内存使用情况

    我在用Cuda and Pytorch 1 4 0 当我尝试增加batch size 我遇到以下错误 CUDA out of memory Tried to allocate 20 00 MiB GPU 0 4 00 GiB total c
  • 二维数组的按行 numpy.isin [重复]

    这个问题在这里已经有答案了 我有两个数组 A np array 3 1 4 1 1 4 B np array 0 1 5 2 4 5 2 3 5 是否可以使用numpy isin二维数组按行排列 我想检查一下是否A i j is in B
  • Pytorch:了解 nn.Module 类内部如何工作

    一般来说 一个nn Module可以由子类继承 如下所示 def init weights m if type m nn Linear torch nn init xavier uniform m weight class LinearRe
  • 通过 Conda 安装 PyTorch

    目标 使用 pytorch 和 torchvision 创建 conda 环境 Anaconda 导航器 1 8 3 python 3 6 MacOS 10 13 4 我尝试过的 在Navigator中 创建了一个新环境 尝试安装 pyto
  • 使用 pytorch 获取可用 GPU 内存总量

    我正在使用 google colab 免费 Gpu 进行实验 并想知道有多少 GPU 内存可供使用 torch cuda memory allocated 返回当前占用的 GPU 内存 但我们如何使用 PyTorch 确定总可用内存 PyT
  • 预训练 Transformer 模型的配置更改

    我正在尝试为重整变压器实现一个分类头 分类头工作正常 但是当我尝试更改配置参数之一 config axis pos shape 即模型的序列长度参数时 它会抛出错误 Reformer embeddings position embeddin
  • 为什么测试时一定要用DataParallel?

    在GPU上训练 num gpus设置为1 device ids list range num gpus model NestedUNet opt num channel 2 to device model nn DataParallel m
  • 删除 Torch 张量中的行

    我有一个火炬张量如下 a tensor 0 2215 0 5859 0 4782 0 7411 0 3078 0 3854 0 3981 0 5200 0 1363 0 4060 0 2030 0 4940 0 1640 0 6025 0
  • 使用 KL 散度时,变分自动编码器为每个输入 mnist 图像提供相同的输出图像

    当不使用 KL 散度项时 VAE 几乎完美地重建 mnist 图像 但在提供随机噪声时无法正确生成新图像 当使用 KL 散度项时 VAE 在重建和生成图像时都会给出相同的奇怪输出 这是损失函数的 pytorch 代码 def loss fu
  • 在pytorch张量中过滤数据

    我有一个张量X like 0 1 0 5 1 0 0 1 2 0 我想实现一个名为的函数filter positive 它可以将正数据过滤成新的张量并返回原始张量的索引 例如 new tensor index filter positive
  • 下载变压器模型以供离线使用

    我有一个训练有素的 Transformer NER 模型 我想在未连接到互联网的机器上使用它 加载此类模型时 当前会将缓存文件下载到 cache 文件夹 要离线加载并运行模型 需要将 cache 文件夹中的文件复制到离线机器上 然而 这些文
  • Blenderbot 微调

    我一直在尝试微调 HuggingFace 的对话模型 Blendebot 我已经尝试过官方拥抱脸网站上给出的传统方法 该方法要求我们使用 trainer train 方法来完成此操作 我使用 compile 方法尝试了它 我尝试过使用 Py
  • 如何计算 CNN 第一个线性层的维度

    目前 我正在使用 CNN 其中附加了一个完全连接的层 并且我正在使用尺寸为 32x32 的 3 通道图像 我想知道是否有一个一致的公式可以用来计算第一个线性层的输入尺寸和最后一个卷积 最大池层的输入 我希望能够计算第一个线性层的尺寸 仅给出
  • Pytorch ValueError:优化器得到一个空参数列表

    当尝试创建神经网络并使用 Pytorch 对其进行优化时 我得到了 ValueError 优化器得到一个空参数列表 这是代码 import torch nn as nn import torch nn functional as F fro
  • Pytorch Tensor 如何获取元素索引? [复制]

    这个问题在这里已经有答案了 我有 2 个名为x and list它们的定义如下 x torch tensor 3 list torch tensor 1 2 3 4 5 现在我想获取元素的索引x from list 预期输出是一个整数 2
  • 在Pytorch中计算欧几里得范数..理解和实现上的麻烦

    我见过另一个 StackOverflow 线程讨论计算欧几里德范数的各种实现 但我很难理解特定实现的原因 如何工作 该代码可以在 MMD 指标的实现中找到 https github com josipd torch two sample b
  • TensorFlow 相当于 PyTorch 的 Transforms.Normalize()

    我正在尝试推断最初在 PyTorch 中构建的 TFLite 模型 我一直在遵循PyTorch 实现 https github com leoxiaobin deep high resolution net pytorch blob 1ee

随机推荐

  • 机器学习:正则化

    正则化 引入正则化的目的是为了解决过拟合问题 左边的图中蓝色的线是目标函数 随机产生五个带噪声的点 我们理想的拟合曲线为红色的线 虽然有些许误差 但是整体拟合情况和目标函数接近 但是 事先不知道需要用二次曲线来拟合这些点 如果使用了更高次方
  • Vue2/Vue3 响应式原理

    Vue 2 x 版本与 Vue 3 x 版本的响应式实现有所不同 Vue 2 x 响应式基于 ES5 的 Object defineProperty 实现 Vue 3 x 响应式基于 ES6 的 Proxy 实现 Vue 2 响应式原理 V
  • Halcon与WPF联合编程

    环境 VS2017 halcon12 1 新建WPF应用程序完成后 解决方案资源管理器 引用处右键 添加引用如下两个dll 只引入第一个也可以 2 工具箱 空白处右键 选择项 只添加halcondotnet dll 文件位置同上 这样hal
  • 【TVM帮助文档学习】开始使用TVMC Python: TVM的高级API

    本文翻译自Getting Starting using TVMC Python a high level API for TVM tvm 0 9 dev0 documentation 首先我们需要准备好示例使用resnet模型 如果你还没有
  • [技术分享]Android平台实时音视频录像模块设计之道

    实现背景 录像有什么难的 无非就是数据过来 编码保存mp4而已 这可能是好多开发者在做录像模块的时候的思考输出 是的 确实不难 但是做好 或者和其他模块有非常好的逻辑配合 确实不容易 好多开发者希望聊聊录像模块 实际上录像这块 需求层面的东
  • 浏览器缓存机制及其分类

    聚沙成塔 每天进步一点点 专栏简介 强缓存 Cache Control 和 Expires 协商缓存 ETag 和 Last Modified 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦
  • 解决ros安装 使用roscore命令测试问题

    本人安装教程完成ROS的安装后 在进行测试如图1命令 出现 解决办法输入完命令1后要输入命令2才行 即可测试成功 测试成功的界面如下
  • caxa线切割怎样画链轮,收藏:Autocad实战教程-线切割画链轮

    Autocad实战教程 线切割画链轮 今天小编为各位朋友准备的内容是Autocad实战教程 线切割画链轮 希望能对各位朋友有所帮助 用AutoCAD绘制链轮首先要知道一些参数 d1为链条滚子直径 套铜直径 p为节距 链条两孔中心的距离也是链
  • c/c++开发时的VsCode插件

    Name Align Spaces Id OldStarchy align spaces Description Align operators without modifying the code 在不修改代码的情况下对齐操作符 Vers
  • 华为杯数学建模(准备)<2018 - 2022>

    前言 这里简单总结一些资料 为后期个人参赛做准备 其中的优秀案例皆以博客 链接的形式总结归纳 详细见对应原作者博客 基础知识 一些需要提前掌握的算法 1 时间序列算法 拟合插值算法 基础的图论算法 2 多元线性回归 3 整数规划 线性规划
  • 8. 让java性能提升的JIT深度解剖

    JVM性能调优 1 C1 C2与Graal编译器 1 1 C1编译器 1 2 C2编译器 1 3 分层编译 2 热点代码 3 热点探测 4 方法调用计数器 5 回边计数器 6 编译优化技术 6 1 方法内联 7 锁消除 8 栈上分配 9 逃
  • qt多文档

    http blog csdn net siren0203 article details 5661541 转载于 https www cnblogs com tiandsp p 7580571 html
  • 如何将照片中的文字转变成可编辑的文章(如何将书上的文字转变为可编辑的文字)

    在工作中 我常常在想 要是能把纸上有用的文字快速输入到电脑中 不用打字录入便可以大大提高工作效率该有多好呀 随着科技的发展 这个问题在不断的解决 例如 现在市场上的扫描仪就带有OCR软件 可以把扫描的文字转换到电脑中进行编辑 但是 对于我们
  • HwBinder入门篇-Android10.0 HwBinder通信原理(一)

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • PHP模拟上传文件使用CURLFile函数 加精!!!

    一 CURLFile 介绍 CURLFile construct PHP 5 gt 5 5 0 PHP 7 CURLFile construct curl file create 创建 CURLFile 对象 说明 面向对象风格 publi
  • vb调用python程序_VB_Python代码对照算法百题(018)

    VB代码 2018年4月浙江 17 分析数组a中各元素依次变化的情况 进行如下定义 变化段 数组中相邻两个元素构成一个变化段 变化段有上升段 a i gt a i 1 下降段 a i 波峰 从上升段到下降段形成一个波峰 波峰的起点是峰顶前所
  • 【小白学习PyTorch教程】十三、迁移学习:微调Alexnet实现ant和bee图像分类

    Author Runsen 上次微调了VGG19 这次微调Alexnet实现ant和bee图像分类 多年来 CNN许多变体已经发展起来 从而产生了几种 CNN 架构 其中最常见的是 LeNet 5 1998 AlexNet 2012 ZFN
  • mysql怎么连接多个数据库_如何在单个网页上连接到多个MySQL数据库?

    I have information spread out across a few databases and want to put all the information onto one webpage using PHP I wa
  • 眼睁睁看着乙方把项目作死是一种什么感受(项目作死10大方法)

    刚跟乙方开完会回来 在会议的后半程我感觉快要窒息了 基于本次项目合作浓郁的 政治因素 作为 掮客 的我们只能要求不再延期跳票 尽快处理等嘴皮子功夫 其它的实在力不从心 这种感觉就真真是眼睁睁看着甲方作死 极力想拉住它 它还嫌 累 我是如何看
  • FSGAN:一种基于对抗生成网络的换脸术

    本文导读 本文主要介绍ICCV 2019的一篇文章 FSGAN Subject Agnostic Face Swapping and Reenactment 文章提出了一种基于对抗生成网络的换脸术 该方法可以对在训练中未曾见过的脸部图像对进