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

目录

在Notebook上设置基础

提取视频帧

 人脸检测和提取


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

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

在本系列文章中,我们将展示深度伪造的工作原理,并展示如何从头开始实现它们。然后我们将看看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 = 0
    while success:
        cv2.imwrite(output_path+"frame%d.jpg" % count, image)     
        success,image = videocapture.read()
        count += 1
    return 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)

最后一个输出意味着源中的人有17011875帧,第二个人有11091530帧。这是训练我们模型的大量图像。如果要绘制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 = 0
    for 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+height
                face = 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:
                pass
            counter += 1
    for 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+height
                face = 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:
                pass
            counter += 1
 
detector = 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值