65.9K
CodeProject 正在变化。 阅读更多。
Home

预处理深度伪造数据集

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2021 年 3 月 29 日

CPOL

4分钟阅读

viewsIcon

7781

在本文中,我将介绍预处理视频并准备将其输入到我们的模型所需的步骤。

深度伪造——利用深度学习将一个人的脸替换到视频中的另一个人身上——是当今人工智能最有趣令人担忧的应用方式之一。

虽然 deep fakes 可以用于合法目的,但它们也可以用于虚假信息。 能够轻松地将某人的脸替换到任何视频中,我们真的可以相信我们眼睛所告诉我们的吗? 一个看起来很真实的政治家或演员做或说一些令人震惊的事情的视频可能根本不是真的。

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

在之前的文章中,我们已经研究了大量的理论,但现在是时候开始编写实际代码以使该项目运作了! 在本文中,我将指导您完成将源 (src) 和目标 (dst) 视频转换为实际图像所需的步骤,这些图像已准备好输入到我们的自编码器中。 如果您不熟悉这些术语,我鼓励您快速阅读之前的文章以获取一些上下文。

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

在笔记本上设置基础知识

让我们从导入所需的库并创建我们将要使用的目录开始

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(一种广泛用于此类任务的计算机视觉库)来提取构成视频的图像。 让我们动手吧

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

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)
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

最后一个输出意味着我们为源个体提取了 1701 和 1875 帧,为第二个个体提取了 1109 和 1530 帧。 这是一个用于训练我们模型的图像的好数量。 如果您想绘制 src 个体的一帧,只需运行

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

它将显示这个

绘制一个 目标 个体的帧

%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 文件夹以获取结果面部集。 如果您在 Kaggle Notebooks 中,请在工作文件夹中查找 trump_faces.zipbiden_faces.zip 文件,然后下载它们或简单地将它们用作下一个笔记本的输入。

现在我们有了我们的面部集,是时候用它们构建和训练我们的模型了。 我们将在 下一篇文章 中介绍这一点。 我希望在那里见到你!

© . All rights reserved.