目录

将src人脸转换为dst人脸

用dst人脸交换来自src帧的人脸

视频重建:获取我们的深度伪造视频


  • 下载项目文件 - 75.5 MB

深度伪造——使用深度学习在视频中将一个人的脸换成另一个人的脸——是当今使用人工智能的最有趣最可怕的方式之一。

虽然深度伪造可用于合法目的,但它们也可用于虚假信息。能够轻松地将某人的脸换成任何视频,我们真的可以相信我们的眼睛告诉我们的吗?政治家或演员做或说令人震惊的事情的真实视频可能根本不是真实的。

在本系列文章中,我们将展示深度伪造的工作原理,并展示如何从头开始实现它们。然后我们将看看DeepFaceLab,它是一种多合一的Tensorflow 驱动的工具,通常用于创建令人信服的深度伪造。

在上一篇文章中,我们讨论了Google AI Platform以及如何在Docker容器的帮助下在那里训练模型。在本文中,我将启动一个新notebook(我在Kaggle中完成了此操作,但如果您的计算机启用了GPU,则您可以在本地完成)并获取先前训练的结果模型,使用它们交换src帧中的人脸以最终合并他们并重新创建原始视频,但这次我们将获得最终的深度伪造。

如果你在Kaggle Notebook中训练你的模型并且你打算留在这个平台上,使用它的输出作为我们将要创建的那个的输入。如果您在AI Platform中训练了模型并计划在Kaggle上工作,请像通常导入数据集一样导入它们,如果您计划在本地工作,则将模型移至Notebook目录。请记住,您的机器需要有GPU,否则在尝试加载模型时会崩溃。

就我而言,我使用最后一个notebook的输出作为我将在Kaggle中启动以结束项目的那个notebook的输入。您需要获取的一个重要元素是shape_predictor_68_face_landmarks.dat文件。在继续之前立即下载。

将src人脸转换为dst人脸

在接下来的几行中,我们要做的是从src视频中提取帧,从帧中提取人脸,使用这些人脸获得转换后的dst脸,然后将它们插入到src帧中。然后我们简单地将它们链接在一起以获得深度假视频。

让我们从导入所需的库开始:

import numpy as np
import pandas as pd
import keras
import tensorflow
from tensorflow.keras.models import load_model
import gc
import matplotlib.pyplot as plt
import cv2
import os
import dlib
from IPython.display import clear_output

现在我们需要创建一些目录,我们将沿着这个notebook保存生成的图像:

!cd /kaggle/working/
!mkdir frames
!mkdir results
!mkdir transformed
!mkdir final
!ls /kaggle/working/
__notebook__.ipynb  final  frames  results  transformed

现在,是时候提取src帧并根据它们的顺序存储它们了。为此,我们将使用升序将它们保存为特定目录中的文件名:

input_path = '/kaggle/input/presidentsdataset/presidents/trump1.mp4'
output_path = '/kaggle/working/frames/'def extract_frames(input_path,output_path):videocapture = cv2.VideoCapture(input_path)success,image = videocapture.read()count = 0while success:cv2.imwrite(output_path+"%d.jpg" % count, image)     success,image = videocapture.read()count += 1print('Frames extraction has ended')return countframes = extract_frames(input_path,output_path)
Frames extraction has ended

让我们看看一帧是什么样的:

%matplotlib inline
plt.figure()
image = cv2.imread('/kaggle/working/frames/120.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image)
plt.show()

现在是时候从src帧中提取人脸,并使用与各自帧相同的名称保存它们。我们将像之前一样使用MTCNN库来提取人脸:

!pip install mtcnn
from mtcnn import MTCNNdef extract_faces(source,destination,detector):counter = 0for dirname, _, filenames in os.walk(source):for filename in filenames:try:image = cv2.imread(os.path.join(dirname, filename))image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)detections = detector.detect_faces(image)x, y, width, height = detections[0]['box']x1,y1,x2,y2 = x-10,y+10,x-10 +width + 20,y+10+heightface = image[y1:y2, x1:x2]face = cv2.resize(face, (120, 120), interpolation=cv2.INTER_LINEAR)plt.imsave(os.path.join(destination,filename),face)clear_output(wait=True)print("Extraction progress: "+str(counter)+"/"+str(len(filenames)-1))except:passcounter += 1
Extraction progress: 1701/1701

我们来看看其中一张提取的人脸:

%matplotlib inline
plt.figure()
image = cv2.imread('/kaggle/working/results/120.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image)
plt.show()

图片:

现在我们已经提取了所有面部并将其保存在各自的目录中,让我们转换所有面部以获得它们的dst版本。请记住,这里的目标是使用来自src 脸的面部手势获取dst脸。要加载自动编码器模型,请发出以下命令:

autoencoder_a = load_model("/kaggle/input/deepfakes-model-training/autoencoder_a.hdf5")
autoencoder_b = load_model("/kaggle/input/deepfakes-model-training/autoencoder_b.hdf5")

使用autoencoder_a的编码器和autoencoder_b的解码器来变换人脸:

# LOADING THE ENCODER A
encoder_a = keras.Model(autoencoder_a.layers[1].input, autoencoder_a.layers[1].output)
# LOADING THE DECODER B
decoder_b = keras.Model(autoencoder_b.layers[2].input, autoencoder_b.layers[2].output)

现在让我们创建将转换实际人脸的函数:

def face_transform(source,destination,encoder,decoder):counter = 0for dirname, _, filenames in os.walk(source):for filename in filenames:# load the imagetry:image = cv2.imread(os.path.join(source, filename))image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)image = image.astype('float32')image /= 255.0image = encoder.predict(np.array([image]))image = decoder.predict(image)image = cv2.normalize(image, None, alpha = 0, beta = 255, norm_type = cv2.NORM_MINMAX, dtype = cv2.CV_32F)image = image.astype(np.uint8)plt.imsave(os.path.join(destination,filename),image[0])counter += 1clear_output(wait=True)print("Transformation progress: "+str(counter)+"/"+str(len(filenames)))except:print('exception')Pass

并通过发出以下命令来运行它:

face_transform('/kaggle/working/results/','/kaggle/working/transformed',encoder_a,decoder_b)
Transformation progress: 1701/1701

让我们绘制与显示的前一张脸相对应的变换图像:

%matplotlib inline
plt.figure()
image = cv2.imread('/kaggle/working/transformed/120.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image)
plt.show()

一旦您将转换后的dst脸保存为相应src脸的相应名称,就可以开始人脸交换了。

用dst人脸交换来自src帧的人脸

有几种方法可以执行换脸操作。您可以使用自己的脚本或使用现有脚本来节省几个小时的工作。最后,您可能会得到与DIY解决方案相同的结果,因为这些算法中的大多数都基于相同的原理(Delanuay三角剖分应用于面部交换)。有三种流行的脚本,我已经研究:Wuhuikai的FaceSwap, Satya的FaceSwap,Matthew Earl的Mallick faceswap。

我们将使用最后一个,因为它实现了部分面部交换,这在测试期间对我们来说效果更好。根据您在面部变换过程中获得的结果,您可能会发现另一种方法更适合您,因此请尝试所有方法!现在,让我们从实际代码开始:

将建议的repo克隆到notebook的/working目录:

!git clone https://github.com/matthewearl/faceswap.git

请记住,我们将使用我之前提到的shape_predictor_68_face_landmarks文件。它是dlib库用来检测包含我们帧中人脸的区域的模型。

现在我们需要对脚本进行一些修改,使其在我们的notebook中可执行。为此,请使用的python魔法命令%load ./faceswap/faceswap.py加载faceswap.py文件。

该文件将自动在该notebook单元格中打开并允许您对其进行修改。

打开文件后,查找PREDICTOR_PATH变量并将其修改为指向shape_predictor_68_face_landmarks.dat文件的变量。就我而言,我已将其修改为PREDICTOR_PATH = '../input/shape-predictor-68-face-landmarksdat/shape_predictor_68_face_landmarks.dat'。

其次,我们需要修改最后一行,以便将生成的人脸交换输出图像保存到我们需要的文件夹中,并使用我们需要的名称。为此,请注释最后一行,并在其下方添加以下内容:

cv2.imwrite(sys.argv[3], output_im)

最后,要重写文件,删除出现在文件顶部注释的 python魔发命令%load ./faceswap/faceswap.py,并将其替换为%%writefile ./faceswap/faceswap.py

运行单元格,如果一切顺利,您应该会收到一条消息,指出文件已被覆盖。如果您对如何修改文件以及最终结果应该是什么样子有疑问,请查看本文的notebook。

是时候使用修改后的脚本交换人脸了。我编写了一个函数,可以为我们完成繁重的工作:

def massive_face_swap(source,destination,output):counter = 0for dirname, _, filenames in os.walk(source):for filename in filenames:current_src = os.path.join(dirname, filename)current_dst = os.path.join(destination, filename)current_out = os.path.join(output, filename)!python /kaggle/working/faceswap/faceswap.py {current_dst} {current_src} {current_out}clear_output(wait=True)print("Swap progress: "+str(counter)+"/"+str(len(filenames)-1))counter += 1

通过传递转换后的人脸集合的相对路径、帧以及要保存带有交换人脸的帧的位置来运行它:

massive_face_swap('./transformed','./frames','./final')
Swap progress: 1700/1700

让我们绘制一个样本:

%matplotlib inline
plt.figure()
image = cv2.imread('/kaggle/working/final/150.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image)
plt.show()

将其与原始帧进行比较:

plt.figure()
image = cv2.imread('/kaggle/working/frames/150.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image)
plt.show()

还不错吧?但是,在这里您会注意到面部的变换和交换存在某些缺陷。在创建深度伪造时,可能会发生这种情况,因为人脸集合太小,或者因为您没有对模型进行足够的迭代训练。在我们的例子中,正如我之前提到的,我们训练了2700个 epoch,但通常这些模型需要训练超过15000 次迭代。

这些是我们可以获得的一些最佳帧:

既然您已经看到了最后的步骤是多么复杂,现在是时候将所有内容放在一起并生成我们的深度伪造了。

视频重建:获取我们的深度伪造视频

为了最终得到我们期待已久的深度伪造,我们只需要用结果帧而不是原始帧来重建视频。为此,在openCV的帮助下,运行以下代码行:

frames = []
for i in range(1701):image = image = cv2.imread(os.path.join('/kaggle/working/final', str(i)+'.jpg'))height, width, layers = image.shapeframes.append(image)
frames = np.array(frames)
videomaker = cv2.VideoWriter('/kaggle/working/deepfake.avi', cv2.VideoWriter_fourcc(*'DIVX'), 25, (width,height))for frame in frames:videomaker.write(frame)videomaker.release()

执行结束后,如果这是您定义的目录,您可以在/kaggle/working看到您的deepfake.avi(我的在这里)。目前为止就这样了!我希望这些步骤对您使用这种DIY方法进行深度伪造有所帮助。在最后一篇文章中,我们将探讨DeepFaceLab作为我们最后一种方法的替代方法。

https://www.codeproject.com/Articles/5298030/Putting-it-all-Together-Swapping-Faces-with-Deep-F

(九)把一切放在一起:用深度伪造换脸相关推荐

  1. (五)构建和训练深度伪造自动编码器

    目录 在Notebook中设置基础 数据集创建和拆分 创建和训练自动编码器 在Keras中交换编码器和解码器 下载项目文件 - 75.5 MB 深度伪造--使用深度学习在视频中将一个人的脸换成另一个人 ...

  2. (二)生成深度伪造的方法

    目录 自编码器概述 DeepFaceLab概述 换脸概述 下载项目文件 - 75.5 MB 深度伪造--使用深度学习在视频中将一个人的脸换成另一个人的脸--是当今使用人工智能的最有趣和最可怕的方式之一 ...

  3. 关上Deepfake的潘多拉魔盒,RealAI推出深度伪造视频检测工具

    诞生之初,Deepfake是一项有趣的图像处理技术,仅仅带来搞笑和娱乐视频,但殊不知,潘多拉魔盒就此被打开,催生出色情黑产.恶搞政客"操纵"民意,Deepfake正逐步进化为一种新 ...

  4. 重磅!Nature子刊:利用GAN来​“深度伪造大脑数据”可以改善残疾人的脑机接口...

    近日,南加州大学(Universityof Southern California)维特比工程学院的研究人员正在使用生成对抗网络(GAN)来改善残疾人的脑机接口.生成对抗网络(Generative A ...

  5. 人工智能时代下的“烦恼”:美国国会探讨“深度伪造”风险及对策

    近日,一段关于扎克伯格的恶搞视频在Instagram上流传.该视频中,扎克伯格的面部表情极其僵硬,声音与本人的相比差距很大.事实上,这是以色列一家科技公司利用人工智能(AI)换脸技术合成而来,这一技术 ...

  6. (十)DeepFaceLab:预包装的DIY深度伪造替代品

    目录 准备输入数据和设置笔记本 初始化Notebook并安装依赖项 数据集导入 从原始视频中提取和去噪帧 人脸检测 可选:排序和增强Facesets 模型训练 合并结果帧 获取结果视频:深度伪造 下载 ...

  7. (七)准备在云中训练深度伪造模型

    目录 检查先决条件 在本地计算机上设置所有内容 创建提交训练作业所需的局部变量 创建项目所需的Bucket 下载项目文件 - 75.5 MB 深度伪造--使用深度学习在视频中将一个人的脸换成另一个人的 ...

  8. (四)为深度伪造预处理数据集

    目录 在Notebook上设置基础 提取视频帧 人脸检测和提取 下载项目文件 - 75.5 MB 深度伪造--使用深度学习在视频中将一个人的脸换成另一个人的脸--是当今使用人工智能的最有趣和最可怕的方 ...

  9. (三)使用自动编码器进行深度伪造

    目录 应用于深度伪造的卷积自编码器 下载项目文件 - 75.5 MB 深度伪造--使用深度学习在视频中将一个人的脸换成另一个人的脸--是当今使用人工智能的最有趣和最可怕的方式之一. 虽然深度伪造可用于 ...

最新文章

  1. angularJS中directive与controller之间的通信
  2. ERICA:提升预训练语言模型实体与关系理解的统一框架
  3. 2017全球教育机器人行业研究报告(附PDF下载)
  4. webapi 返回类型
  5. 怎么寻找科研论文?(二)
  6. ob_start ob_end_clean的用法 fetch
  7. python爱心代码制作_Python之——爱心代码参与情人节
  8. 阿里云四大海外数据中心将开服
  9. AD19妙用SHIFT+S查找没连的线
  10. 解析百度Apollo自动驾驶平台
  11. 百炼-2726:采药
  12. 如何培养创造性思维能力
  13. ftp关键技术二:nobody进程创建和使用(一)
  14. reply-code=503, reply-text=COMMAND_INVALID - unknown exchange type 'x-delayed-message'
  15. 我与我的专业计算机作文500字,电脑走进我的生活作文500字
  16. WannaCry席卷全球 软件作者到底赚了多少钱?
  17. 使用virtualenv搭建Python下的Flask开发环境,ubu测试有效
  18. C# 中添加chart 控件
  19. 将数据库中的页面渲染到网页上
  20. GsyVideoPlayer视频分析使用

热门文章

  1. l2-029 特立独行的幸福 (25分)_霜降后盆栽幸福树,调整4个地方,不用再怕掉叶子了...
  2. java entry迭代,如何迭代Entry / BarEntry ArrayList并修改它们的值MPAndroid Chart
  3. api压测工具_高并发之API接口,分布式,防刷限流,如何做?
  4. dev编译按钮是灰色_提升 50% 的编译速度!阿里零售通 App 工程提效实践
  5. mie散射理论方程_腾讯游戏学院专家:PBR渲染模型的理论及具体应用
  6. 礼品盒子插画素材丨节日设计加上它之后价值翻倍!
  7. 设计师分享社区,展示风采平台
  8. 年终庆典高端海报设计PSD分层模板
  9. 苹果屏蔽更新_iOS 屏蔽更新的最新方法,完美支持 iOS13 系统
  10. Linux开机启动过程(9):进入内核入口点之前最后的准备工作