目录

在Notebook上设置基础

提取视频帧

人脸检测和提取


  • 下载项目文件 - 75.5 MB

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

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

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

在之前的文章中,我们已经讨论了大量的理论,但现在是时候进入实际代码来使这个项目工作了!在本文中,我将指导您完成将源( src )和目标( dst )视频转换为准备好输入我们的自动编码器的实际图像所需的条件。如果您不熟悉这些术语,我建议您快速阅读以前的文章以了解上下文。

该数据集由四个具有知识共享署名许可的视频组成,因此允许重复使用或修改它们。该数据集包含个人的两个视频和目标个人的两个视频。您可以在此处找到数据集。我要解释的Notebooks在这里。我在Kaggle Notebooks上做了这个预处理阶段,但如果你有一个强大的GPU,你可以轻松地在本地运行项目。让我们深入研究代码!

在Notebook上设置基础

让我们首先导入所需的库并创建我们将要使用的目录:

import cv2
import pandas as pd
import os
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
!pip install mtcnn
from mtcnn import MTCNN!cd /kaggle/working/
!mkdir frames_1
!mkdir frames_2
!mkdir frames_3
!mkdir frames_4
!mkdir results_1
!mkdir results_2

提取视频帧

您可能还记得在第一篇文章中,我提到我们需要将视频转换为图像,以便我们可以从各个帧中提取人脸,最终用它们来训练我们的模型。在这一步中,我们将使用OpenCV提取构成视频的图像,OpenCV是一种广泛用于此类任务的计算机视觉库。让我们动手吧:

定义视频所在的路径以及保存输出的位置(如果需要,修改它们):

input_1 = '/kaggle/input/presidentsdataset/presidents/trump1.mp4'
input_2 = '/kaggle/input/presidentsdataset/presidents/trump2.mp4'
input_3 = '/kaggle/input/presidentsdataset/presidents/biden1.mp4'
input_4 = '/kaggle/input/presidentsdataset/presidents/biden2.mp4'
output_1 = '/kaggle/working/frames_1/'
output_2 = '/kaggle/working/frames_2/'
output_3 = '/kaggle/working/frames_3/'
output_4 = '/kaggle/working/frames_4/'

定义我们将用于提取帧的函数:

def extract_frames(input_path,output_path):videocapture = cv2.VideoCapture(input_path)success,image = videocapture.read()count = 0while success:cv2.imwrite(output_path+"frame%d.jpg" % count, image)     success,image = videocapture.read()count += 1return count

提取帧:

total_frames_1 = extract_frames(input_1,output_1)
total_frames_2 = extract_frames(input_2,output_2)
total_frames_3 = extract_frames(input_3,output_3)
total_frames_4 = extract_frames(input_4,output_4)

确定每个视频提取了多少帧:

print('Total frames extracted in video 1: ',total_frames_1)
print('Total frames extracted in video 2: ',total_frames_2)
print('Total frames extracted in video 3: ',total_frames_3)
print('Total frames extracted in video 4: ',total_frames_4)

最后一个输出意味着源中的人有1701和1875帧,第二个人有1109和1530帧。这是训练我们模型的大量图像。如果要绘制src个体的帧之一,只需运行:

Total frames extracted in video 1:  1701
Total frames extracted in video 2:  1875
Total frames extracted in video 3:  1109
Total frames extracted in video 4:  1530

它会显示这个:

绘制目的地个人的帧:

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

人脸检测和提取

现在我们已经获得了所有的帧,是时候从它们中提取人脸了。为此,我们首先检测人脸所在的位置,然后对其进行裁剪以将图像保存为新文件。我们将使用MTCNN检测器,这是一个专门为人脸检测开发的Python库。

使用他们的一个例子,这是它的人脸检测的样子:

我们将使用他们的脚本作为我们的基本代码,从我们的帧中提取人脸,但正如您所看到的,检测器不会考虑整个人脸。下巴、前额的一部分和颧骨不包括在内,因此我们将采用MTCNN检测并添加一些额外的填充,以便在裁剪并生成新图像之前将整个面部变为正方形。运行以下几行:

def extract_faces(source_1,source_2,destination,detector):counter = 0for dirname, _, filenames in os.walk(source_1):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,str(counter)+'.jpg'),face)print('Saved: ',os.path.join(destination,str(counter)+'.jpg'))except:passcounter += 1for dirname, _, filenames in os.walk(source_2):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,str(counter)+'.jpg'),face)print('Saved: ',os.path.join(destination,str(counter)+'.jpg'))except:passcounter += 1detector = MTCNN()
extract_faces('/kaggle/working/frames_1/','/kaggle/working/frames_2/', '/kaggle/working/results_1/',detector)
extract_faces('/kaggle/working/frames_3/','/kaggle/working/frames_4/', '/kaggle/working/results_2/',detector)
Saved:  /kaggle/working/results_1/0.jpg
Saved:  /kaggle/working/results_1/1.jpg
Saved:  /kaggle/working/results_1/2.jpg
Saved:  /kaggle/working/results_1/3.jpg
Saved:  /kaggle/working/results_1/4.jpg
...

最终结果应该是保存在results_1results_2中的几张人脸图像,每个文件夹都包含相应个人的人脸。您可能已经注意到我将所有人脸的大小调整为120x120尺寸。这是为了避免在构建模型和定义输入形状时发生任何冲突。

要绘制人脸并让我们了解它的提取方式,请运行以下命令:

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

它会绘制这个:

请注意,该图像显示了更广泛的个人面部。这对我们以后交换人脸非常有帮助,但也有助于我们在模型训练中达到较低的误差。如果您像我一样在Kaggle Notebook中执行这些步骤,请发出以下命令,然后更轻松地下载文件:

!zip -r /kaggle/working/trump_faces.zip /kaggle/working/results_1/
!zip -r /kaggle/working/biden_faces.zip /kaggle/working/results_2/

如果你按照你的本地计算机上的项目,浏览到results_1results_2文件夹来获得所产生的faceset。如果您在Kaggle Notebooks中,请在工作文件夹中查找trump_faces.zipbiden_faces.zip文件,然后下载它们或将它们用作下一个Notebook的输入。

现在我们有了faceset,是时候用它们构建和训练我们的模型了。我们将在下一篇文章中介绍。

https://www.codeproject.com/Articles/5298023/Preprocessing-a-Dataset-for-Deep-Fakes

(四)为深度伪造预处理数据集相关推荐

  1. 论文阅读-DF-Platter: Multi-Face Heterogeneous Deepfake Dataset(多人脸异构深度伪造数据集)

    一.论文信息 文章名称:DF-Platter: Multi-Face Heterogeneous Deepfake Dataset 作者团队: 会议:cvpr2023 数据集地址:http://iab ...

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

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

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

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

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

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

  5. (一)深度伪造的视频人脸传输

    目录 Deep Fakes简介 了解深度伪造背后的概念 Deep Fakes一般概述 下载项目文件 - 75.5 MB Deep Fakes简介 深度伪造--使用深度学习在视频中将一个人的脸换成另一个 ...

  6. 25个深度学习开源数据集

    简介 学习深度学习最重要的就是数据集啦.小编在刚开始学习深度学习的时候最头疼的一件事就是没有数据,徒有很多想法,但却无法实现,这里小编给大家介绍25个常用的深度学习开源数据集,这是从国外的一篇博客中看 ...

  7. 国内外深度学习开放数据集下载集合(值得收藏,不断更新)

    国内外深度学习开放数据集下载集合(值得收藏,不断更新) 一.Image processing data set 1.MNIST ,是最流行的深度学习数据集之一.这是一个手写数字数据集,包含一个有着 6 ...

  8. 图像处理 语音识别 深度学习 开放数据集

    从图像处理到语音识别,25款数据科学家必知的深度学习开放数据集 本文介绍了 25 个深度学习开放数据集,包括图像处理.自然语言处理.语音识别和实际问题数据集. 介绍 深度学习(或生活中大部分领域)的关 ...

  9. 从图像处理到语音识别,25款数据科学家必知的深度学习开放数据集

    选自Analytics Vidhya,作者:Pranav Dar,机器之心编译. 本文介绍了 25 个深度学习开放数据集,包括图像处理.自然语言处理.语音识别和实际问题数据集. 介绍 深度学习(或生活 ...

最新文章

  1. 他们隔空协作,打造出懂医学、知开源的智能机器人
  2. 红外发送管的角度特性测试
  3. python 3.5 格式化字符串输出
  4. netty5.0通过LineBasedFrameDecoder和StringDecoder解决粘包
  5. Android Studio 导入新工程项目
  6. 30岁女IT工程师感叹:靠这工具,把报表做成养老工作,月薪快3W
  7. loadrunner 服务器性能监控,Loadrunner 性能测试服务器监控指标
  8. CocoaPods报错:The dependency 'xxx' is not used in any concrete target
  9. 阶乘浅析poj1150 3406 zoj1222 2358
  10. securecrt下载和注册方法
  11. 基于C# Winform的酒店管理系统
  12. Unity打包APK多语言包名的适配
  13. MAX to UE4 单位设置
  14. 【Vivado那些事儿】Vivado介绍
  15. 获取时间差几小时几分钟前 (类似于新浪微博 发表于几小时几分钟前)
  16. 计讯物联防潮产品,无惧恶劣环境
  17. 利用文件保存数据(c语言)
  18. easyExcel自定义背景颜色easyPoi自定义修改表头背景色
  19. Curator基本操作(Zookeeper节点增删改查)
  20. 函数式编程之根-拉姆达运算/演算(λ-calculus)

热门文章

  1. php 最长公共子串,PHP实现求解最长公共子串思路方法
  2. MYSQL中什么是规范化_数据库设计 - 什么是规范化(或规范化)?
  3. os2计算机网络,计算机网络 第二章 物理层
  4. sha java 应用_Java中常用的加密算法应用MD5,SHA,RSA
  5. 设计灵感|如何在海报设计中正确使用双色调风格?
  6. 初学者UI设计临摹素材模板,请先搞清楚这4个分类!
  7. 简述计算机阶码表达什么,阶码
  8. 保姆级My SQL-5.7.19安装教程
  9. docker wsl2启动不了_在window上安装docker的方法
  10. Mac精品软件分享第二期