怎么查网站到期时间查询,如何更改wordpress上的默认头像,杭州做网站怎么收费多少,最好的网站制作公司代码#xff1a;https://github.com/neuralchen/SimSwap 文章目录 摘要介绍RELATED WORK实验结论代码实操 SimSwap是一个高保真度人脸交换的高效框架。它将源脸的身份转移到目标脸上#xff0c;同时保留目标脸的属性。该框架包括ID注入模块#xff08;IIM#xff09;#…代码https://github.com/neuralchen/SimSwap 文章目录 摘要介绍RELATED WORK实验结论代码实操 SimSwap是一个高保真度人脸交换的高效框架。它将源脸的身份转移到目标脸上同时保留目标脸的属性。该框架包括ID注入模块IIM用于在特征级别上转移身份信息。弱特征匹配损失用于隐式地保留属性。SimSwap在身份性能上具有竞争力并且相比之前的方法更好地保留了属性。该框架可以推广到任意身份并通过广泛的实验进行了评估。
摘要
本文提出了一种高效的框架称为Simple SwapSimSwap旨在实现通用且高保真度的人脸交换。与之前的方法相比这种方法不仅能够适应任意身份还能保留目标人脸的属性如面部表情和注视方向。为了克服上述缺陷本文采用了两种方法。首先提出了ID注入模块IIM该模块可以在特征级别上将源人脸的身份信息转移到目标人脸上。通过使用该模块将特定身份的人脸交换算法的架构扩展为任意人脸交换的框架。其次提出了弱特征匹配损失该损失以隐式方式帮助我们的框架保留面部属性。在野外人脸上进行的大量实验证明SimSwap能够实现与先前最先进方法相媲美的身份性能并且在属性保留方面表现更好。代码已经在GitHub上可用https://github.com/neuralchen/SimSwap。
介绍
人脸交换是一项有前景的技术它将源人脸的身份转移到目标人脸同时保持目标人脸的属性例如表情、姿势、光照等不变。在电影业中这项技术被广泛用于制作不存在的双胞胎。工业级人脸交换方法利用先进设备重建演员的面部模型并重新构建场景的光照条件这超出了大多数人的能力范围。最近无需高端设备进行人脸交换[2, 7, 20, 26]引起了研究人员的关注。
人脸交换的主要困难可以总结如下1) 具有强大泛化能力的人脸交换框架应该适应任意人脸2) 结果人脸的身份应与源人脸的身份接近3) 结果人脸的属性例如表情、姿势、光照等应与目标人脸的属性一致。
主要有两种类型的人脸交换方法包括在图像级别处理源人脸的源导向方法和在特征级别处理目标人脸的目标导向方法。源导向方法[3, 4, 26, 27]将目标人脸的属性如表情和姿势转移到源人脸然后将源人脸混合到目标图像中。这些方法对源图像的姿势和光照敏感不能准确复制目标的表情。目标导向方法[2, 7, 18, 20]直接修改目标图像的特征并能很好地适应源人脸的变化[7] DeepFakes。开源算法[7]DeepFakes能够生成两个特定身份之间的人脸交换结果但缺乏泛化能力。基于GAN的工作[2]在特征级别上结合了源身份和目标属性并将应用扩展到任意身份。 最近的工作[20]利用了一个两阶段框架并取得了高度逼真的结果。然而这些方法过于关注身份修改对属性保留施加的约束较弱往往在表情或姿势上出现不匹配。
为了克服泛化和属性保留方面的缺陷我们提出了一种高效的人脸交换框架称为SimSwap。我们分析了一种特定身份的人脸交换算法[7]的架构并发现泛化不足是由于将身份信息集成到解码器中因此解码器只能应用于一个特定的身份。为了避免这种集成我们提出了ID注入模块。我们的模块通过将源人脸的身份信息嵌入到目标图像的特征中进行修改从而消除身份信息与解码器权重之间的相关性使我们的架构能够适用于任意身份。此外身份和属性信息在特征级别高度耦合。对整个特征进行直接修改会导致属性性能下降我们需要使用训练损失来缓解这种影响。虽然明确约束结果图像的每个属性以匹配目标图像过于复杂但我们提出了弱特征匹配损失。我们的弱特征匹配损失在高语义级别上将生成的结果与目标输入对齐并隐含地帮助我们的架构保留目标的属性。通过使用这个术语我们的SimSwap能够在具有竞争性身份性能的同时具有比先前最先进的方法更好的属性保留能力。大量实验证明了我们算法的泛化性和有效性。
RELATED WORK
人脸交换已经被研究了很长时间。这些方法主要可以分为两类包括在图像级别处理源人脸的源导向方法和在特征级别处理目标人脸的目标导向方法。
源导向方法源导向方法将属性从目标人脸转移到源人脸然后将源人脸混合到目标图像中。早期的方法[4]使用3D模型来转移姿势和光照但需要手动干预。提出了一种自动方法[3]但只能与特定人脸库中的身份进行人脸交换。Nirkin等人[27]利用3D人脸数据集[29]来转移表情和姿势然后使用Poisson Blending [30]将源人脸融合到目标图像中。然而由于3D人脸数据集表达能力有限依赖于3D模型的方法[4, 27]通常难以准确复制表情。最近FSGAN [26]提出了一个两阶段的架构首先使用人脸再现网络进行表情和姿势转移然后使用另一个人脸修复网络将源人脸混合到目标图像中。源导向方法的一个普遍问题是它们对输入源图像敏感。源人脸的夸张表情或大幅度姿势将强烈影响人脸交换结果的性能。
目标导向方法目标导向方法使用神经网络提取目标图像的特征然后对这些特征进行修改并将特征还原到输出的人脸交换图像中。Korshunova等人[18]训练了一个生成器并能够与一个特定身份进行人脸交换。著名的算法DeepFakes [7]利用了一个编码器-解码器架构。一旦训练完成它能够在两个特定身份之间进行人脸交换但缺乏泛化能力。类似于[24, 25]的方法结合了源人脸区域和目标非人脸区域的潜在表示以生成结果但未能保持目标的表情。IPGAN [2]从源图像中提取身份向量从目标图像中提取属性向量然后将它们发送到解码器。生成的输出在传递源人脸的身份方面表现良好但通常未能保留目标人脸的表情或姿势。最近提出的方法FaceShifter [20]能够产生高度逼真的人脸交换结果。FaceShifter利用了一个复杂的两阶段框架并取得了最先进的身份性能。然而与以前的方法一样FaceShifter对属性的约束太弱因此它们的结果经常出现表情不匹配的问题。 图2SimSwap的框架我们的生成器包括三个部分包括编码器部分、ID注入模块IIM和解码器部分。编码器从目标图像 中提取特征 。ID注入模块将身份信息从传输到 。解码器将修改后的特征还原到结果图像中。我们使用身份损失来鼓励我们的网络生成与源人脸相似身份的结果。我们应用弱特征匹配损失来确保我们的网络在不过多影响身份修改性能的情况下保留目标人脸的属性。
3 方法
给定源图像和目标图像我们提出了一个框架将源人脸的身份转移到目标人脸同时保持目标人脸的属性不变。我们的框架源于一种特定身份的人脸交换架构[7]可以适应任意身份。我们首先讨论原始架构的局限性第3.1节。我们展示如何将其扩展为适用于任意身份的框架第3.2节。然后我们提出了弱特征匹配损失有助于保留目标的属性第3.3节。最后我们给出我们的损失函数第3.4节。
DeepFakes的架构包含两个部分一个通用的编码器 和两个特定身份的解码器 。在训练阶段-架构接收扭曲的源图像并将其恢复为原始的未扭曲的源图像。使用-架构对目标图像进行相同的过程。在测试阶段目标图像将被发送到 -架构。该架构将错误地将其视为扭曲的源图像并生成具有源身份和目标属性的图像。在此过程中编码器 提取了目标的特征其中包含目标人脸的身份和属性信息。由于解码器 设法将目标的特征转换为具有源身份的图像源人脸的身份信息必须已经隐式地整合到 的权重中其中 的哪一部分应该被改变哪一部分应该被保留。
我们的ID注入模块致力于改变 中的身份信息朝着源人脸的身份信息。该模块由两个部分组成即身份提取部分和嵌入部分。在身份提取部分中我们处理包含源人脸身份和属性信息的输入源图像 。由于我们只需要前者我们使用人脸识别网络[8]从 中提取身份向量 。在嵌入部分中我们使用ID块将身份信息注入到特征中。我们的ID块是Residual Block [12]的修改版本并使用自适应实例归一化(AdaIN) [13]替代原始的批次归一化[14]。我们任务中AdaIN的公式可以写成 这里[ \mu(\text{Fea}) ] 和 [ \sigma(\text{Fea}) ] 是特征 [ \text{Fea} ] 的按通道均值和标准差。[ \sigma_S ] 和 [ \mu_S ] 是使用全连接层从 [ \text{v}_S ] 生成的两个变量。为了保证足够的身份嵌入我们使用了总共9个ID块。在注入身份信息后我们将修改后的特征传递到解码器生成最终的结果 [ \text{I}_R ]。由于训练中涉及来自不同身份的源图像解码器的权重不应与任何特定身份相关联。我们的解码器只专注于从特征中恢复图像并将身份修改任务交给ID注入模块因此我们可以将我们的架构应用于任意身份。在训练过程中我们从生成的结果 [ \text{I}_R ] 中提取身份向量 [ \text{v}_R ]并使用身份损失最小化 [ \text{v}_R ] 与 [ \text{v}_S ] 之间的距离。然而身份损失的最小化可能使网络过度拟合并仅生成具有源身份的正面图像同时失去了目标的所有属性。为避免这种现象我们利用对抗训练的思想并使用鉴别器来区分具有明显错误的结果。对抗损失在提高生成结果质量方面也发挥着重要作用。我们使用了鉴别器的patchGAN[15]版本。
该论文探讨了一种在进行人脸替换时保留目标人脸属性的方法。主要挑战包括仅修改目标人脸的身份部分并保持属性如表情、姿势、光照等不变。所提出的方法涉及对整个人脸进行修改包括身份和属性信息但通过在深度层次上将结果图像与输入目标对齐从而保持属性。引入了弱特征匹配损失仅使用鉴别器的最后几层以隐式学习如何保留目标人脸的属性。
总体损失函数包括五个组成部分身份损失、重构损失、对抗性损失、梯度惩罚和弱特征匹配损失。身份损失确保真实和生成的人脸嵌入之间的相似性同时防止属性不匹配。弱特征匹配损失受到pix2pixHD的启发通过在多尺度设置中仅使用鉴别器的最后几层以隐式方式约束属性避免需要为每个属性训练单独的网络。
重构损失确保生成的结果在源脸和目标脸属于相同身份时与目标脸相匹配。采用Hinge版本的对抗性损失和梯度惩罚有助于在大姿势下提高性能。弱特征匹配损失使用所有鉴别器进行计算构建了一个多尺度的设置。
论文解释了原始特征匹配损失和提出的弱特征匹配损失之间的差异。前者旨在稳定训练并关注多个层次的自然统计信息而后者通过专注于深度特征来针对属性性能。
总体损失函数是各个损失的加权和为每个组件分配了特定的权重。该方法旨在在人脸替换过程中平衡身份保持和属性一致性提供了每个损失组件在总体函数中的实验参数。
实验
实施细节由于我们致力于对任意身份进行面部交换我们选择了一个大型的面部数据集VG-GFace2 [6]作为我们的训练集。为了提高我们的训练集的质量我们删除了尺寸小于250 × 250的图像。我们将图像对齐和裁剪到大小为224 × 224的标准位置。至于ID注入模块中的人脸识别模型我们使用在[9]上预先训练的Arcface [8]模型。我们使用Adam优化器[17]进行网络训练其中1 02 0.999。我们对具有相同身份的图像对进行一批训练然后对具有不同身份的图像对进行另一批训练交替进行。我们对网络进行超过500个时期的训练。
4.1 定性面部交换结果
我们展示一个面部矩阵以展示我们的面部交换结果。我们从电影场景中选择了8张面部图像作为目标。DeepFakes的结果受到严重的光照和姿势不匹配的影响。FaceShifter成功产生了不错的面部交换结果但结果面部的表情和凝视方向并不完全尊重目标面部的表情和凝视方向。我们的SimSwap生成了合理的面部交换结果同时在属性保留方面表现更好。
与FaceShifter的额外比较我们在图5中进一步比较了更多的结果与FaceShifter。如图所示FaceShifter表现出强烈的身份修改能力并且能够将结果面部的形状改变为源面部的形状。然而它过于关注身份部分经常在保持表情和凝视方向等属性方面失败。在图5的第2行中目标面部正在眯起眼睛。SimSwap能够生成复制这种微妙表情的结果而FaceShifter则失败。此外尽管FaceShifter使用第二个网络将其面部交换结果与背景结合但我们仍然设法产生了比FaceShifter稍好的光照条件第3和4行。
与FSGAN的比较我们在图6中与FSGAN进行比较。FSGAN的结果未能复制目标面部的表情第1行凝视方向第1和4行并且它们的结果与目标图像之间在光照条件上存在明显差异。我们的SimSwap在属性保留方面表现更好。此外FSGAN对输入源图像非常敏感。如第2行所示目标面部有一个清晰的眼区域但FSGAN引入了源面部的阴影。类似问题在第4行围绕鼻子区域也发生了。
图5与FaceShifter [20]的更多比较结果。我们在表达和光照条件方面具有更好的属性性能。
此外在鼻子区域周围的第4行也发生了类似的问题。SimSwap对输入源图像更加稳健并产生更具说服力的结果。
4.3 SimSwap的分析
在本节中我们将首先对我们的身份修改能力进行分析。然后我们将进行多项消融测试以展示在面部交换任务中如何在身份和属性性能之间保持平衡。
高效的ID嵌入SimSwap的架构使用ID注入模块进行身份嵌入以便我们可以将身份信息从解码器的权重中分离出来并将我们的架构推广到任意身份。为了验证我们架构的有效性我们使用FaceForensics [31]上由[20]提出的标准进行相同的定量实验。我们随机选择FaceForensics中每个面部视频的10帧。我们使用SimSwap根据FaceForensics中的相同源和目标对进行面部交换。我们使用另一个人脸识别网络[23, 33]提取生成的帧和原始帧的身份向量。对于每个生成的帧我们搜索原始帧中最近的面部并检查该面部是否来自正确的源视频。准确率被命名为ID检索它作为该方法身份性能的代表。我们还使用姿势估计器[32]来估计生成的帧和原始帧中的姿势并计算它们的平均L2距离。由于我们无法找到有效的复制我们忽略了面部表情部分。
为了进一步比较我们训练了另外2个网络分别称为SimSwap-oFM其使用原始的特征匹配公式以及SimSwap-nFM其不使用特征匹配项。我们对这两个网络进行相同的定量实验。我们还在DeepFakes生成的帧上进行测试。比较结果显示在表1中。
正如我们所见SimSwap-oFM具有最低的ID检索因为它在浅层次上对齐了结果。与此同时通过在所有级别上移除约束SimSwap-nFM在身份性能上与Faceshifter相差无几。我们的SimSwap在身份上略逊于FaceShifter但在属性保留方面表现相对较好。结合图4和5的结果我们的SimSwap在身份检索同时保持中等的重建损失以在身份和属性性能之间保持良好的平衡。 为了进一步验证我们的弱特征匹配损失的有效性不同网络生成的结果显示在图8中。我们注意到具有相同特征匹配项的结果列3和4列5和6相对较小的差异这表明增加对视觉效果的影响有限。当我们比较SimSwap列5和SimSwap-oFM列3之间的结果时SimSwap呈现出更好的身份性能同时没有失去太多属性。SimSwap-nFM的结果列7具有最佳的身份性能并且结果面部的形状已经朝着源面部的形状进行了修改。然而SimSwap-nFM明显失去了属性因为凝视方向往往偏离目标面部的方向。 至于SimSwap和wFM-id它们在大多数情况下产生非常相似的视觉输出。然而当比较图7中的wFM-id和nFM的值以及图8中的结果时我们注意到尽管wFM-id具有较小的身份损失但ID检索和视觉效果表明nFM确实实现了更好的身份性能。这表明wFM-id已经过度拟合了身份损失。此外wFM-id更有可能从源面部引入头发如图9所示。这是不希望的因为我们只是替换面部。因此我们选择SimSwap以获得更稳定的结果。
结论
我们提出了SimSwap这是一个旨在实现通用和高保真面部交换的高效框架。我们的ID注入模块在特征级别传递身份信息并将特定于身份的面部交换扩展到任意面部交换。弱特征匹配损失有助于我们的框架具有良好的属性保留能力。广泛的结果表明我们能够生成视觉上吸引人的结果而且我们的方法能够比先前的方法更好地保留属性。 代码实操
conda create -n simswap2 python3.8 -y
conda activate simswap2
# 安装环境
sudo apt-get install python3-dev
pip install torch1.8.0cu111 torchvision0.9.0cu111 torchaudio0.8.0 -f https://download.pytorch.org/whl/torch_stable.html
pip install --ignore-installed imageio
pip install cython insightface0.7.3 onnx onnxruntime moviepy
文件目录
.
├── 512
│ └── 550000_net_G.pth
├── 512.zip
├── arcface_model
│ └── arcface_checkpoint.tar
├── archive
│ ├── data
│ ├── data.pkl
│ └── version
├── checkpoints
│ └── people
├── cog.yaml
├── crop_224
│ ├── 1_source.jpg
│ ├── 2.jpg
│ ├── 6.jpg
│ ├── cage.jpg
│ ├── dnl.jpg
│ ├── ds.jpg
│ ├── gdg.jpg
│ ├── gy.jpg
│ ├── hzc.jpg
│ ├── hzxc.jpg
│ ├── james.jpg
│ ├── jl.jpg
│ ├── lcw.jpg
│ ├── ljm2.jpg
│ ├── ljm3.jpg
│ ├── ljm.jpg
│ ├── mars2.jpg
│ ├── mouth_open.jpg
│ ├── mtdm.jpg
│ ├── trump.jpg
│ ├── wlh.jpg
│ ├── zjl.jpg
│ ├── zrf.jpg
│ └── zxy.jpg
├── data
│ └── data_loader_Swapping.py
├── demo_file
│ ├── Iron_man.jpg
│ ├── multi_people_1080p.mp4
│ ├── multi_people.jpg
│ ├── multispecific
│ ├── specific1.png
│ ├── specific2.png
│ └── specific3.png
├── Dockerfile
├── docs
│ ├── css
│ ├── favicon.ico
│ ├── fonts
│ ├── guidance
│ ├── img
│ ├── index.html
│ └── js
├── download-weights.sh
├── insightface_func
│ ├── antelope
│ ├── antelope.zip
│ ├── face_detect_crop_multi.py
│ ├── face_detect_crop_single.py
│ ├── __init__.py
│ └── utils
├── LICENSE
├── models
│ ├── arcface_models.py
│ ├── base_model.py
│ ├── config.py
│ ├── fs_model.py
│ ├── fs_networks_512.py
│ ├── fs_networks_fix.py
│ ├── fs_networks.py
│ ├── __init__.py
│ ├── models.py
│ ├── networks.py
│ ├── pix2pixHD_model.py
│ ├── projected_model.py
│ ├── projectionhead.py
│ ├── __pycache__
│ └── ui_model.py
├── MultiSpecific.ipynb
├── options
│ ├── base_options.py
│ ├── __pycache__
│ ├── test_options.py
│ └── train_options.py
├── output
│ └── result.jpg
├── parsing_model
│ ├── 79999_iter.pth
│ ├── model.py
│ ├── resnet.py
│ └── wget-log
├── pg_modules
│ ├── blocks.py
│ ├── diffaug.py
│ ├── projected_discriminator.py
│ └── projector.py
├── predict.py
├── README.md
├── SimSwap colab.ipynb
├── simswaplogo
│ ├── simswaplogo.png
│ └── socialbook_logo.2020.357eed90add7705e54a8.svg
├── test
│ ├── checkpoints.zip
│ └── people
├── test_one_image.py
├── test_video_swapmulti.py
├── test_video_swap_multispecific.py
├── test_video_swapsingle.py
├── test_video_swapspecific.py
├── test_wholeimage_swapmulti.py
├── test_wholeimage_swap_multispecific.py
├── test_wholeimage_swapsingle.py
├── test_wholeimage_swapspecific.py
├── train.ipynb
├── train.py
└── util├── add_watermark.py├── html.py├── image_pool.py├── json_config.py├── logo_class.py├── norm.py├── plot.py├── __pycache__├── reverse2original.py├── save_heatmap.py├── util.py├── videoswap_multispecific.py├── videoswap.py├── videoswap_specific.py└── visualizer.py31 directories, 104 files执行这个
python test_one_image.py --name people --Arc_path arcface_model/arcface_checkpoint.tar --pic_a_path crop_224/6.jpg --pic_b_path crop_224/ds.jpg --output_path output/报了个错
-------------- End ----------------
Pretrained network G has fewer layers; The following are not initialized:
[down0, first_layer, last_layer, up0]
/home/xiedong/xiedong/miniconda3/envs/simswap2/lib/python3.8/site-packages/torch/nn/functional.py:3451: UserWarning: Default upsampling behavior when modebilinear is changed to align_cornersFalse since 0.4.0. Please specify align_cornersTrue if the old behavior is desired. See the documentation of nn.Upsample for details.warnings.warn(
真难玩不玩了换个项目玩比如faceshifter。