查看原文
其他

你的红色高跟鞋,AI 换脸技术初体验

Jack Cui Jack Cui 2021-08-19

点击上方“Jack Cui”,选择“加为星标

第一时间关注技术干货!


1


红色高跟鞋

刘敏涛,中国内地知名女演员。

我还是从 2015 年上映的《伪装者》知道她的。

5 月 5 日,又凭借着在晚会合唱的《红色高跟鞋》上了微博热搜,直拍视频的播放量高达 4000 多万,逗趣的表情管理,让人忍俊不禁。

AI 换脸技术,可以直接让你也拥有这自我陶醉的表情管理能力。

比如,看下宋小宝“演唱”一首《红色高跟鞋》。


公众号上传了 Deepfake 视频,但是一直无法过审

人脸这东西还是有些风险的,索性就不放视频了,想看视频的,可以去 B 站搜索,宋小宝红色高跟鞋,有很多其他人的作品,绝对惊艳

今天,我继续手把手教学

算法原理、环境搭建、模型训练、效果测试,一条龙服务,尽在下文!

搞起来

2


Faceswap
这种换脸的算法,其实有很多。

例如 Faceswap 、DeepFaceLab、Faceswap-GAN 等等。

本文以 star 量最多的 Faceswap 为例,进行说明。


Faceswap 项目地址:
https://github.com/deepfakes/faceswap

3


算法原理
Faceswap 是一个名为 deepfakes 的 Github 用户开源的项目。

Deepfake 就是“Deep Machine Learning”(深度学习)和“Fake Photo”(假照片)组合而成的。

早期技术可以追溯到 2018 年,当时在构建模型的时候使用了 Encoder-Decoder 自编解码架构。

而 Faceswap 算法,在此之上又引入 GAN(生成对抗网络)技术,显著提升了换脸的效果。

总体上,「Faceswap」换脸主要分为以下三个过程:

  • 人脸检测

  • 特征提取

  • 人脸转换


人脸检测

想要替换人脸,那首先得找到人脸的位置,这就需要用到人脸检测算法。


Faceswap 算法采用了 SSD 这类比较成熟的检测框架,同于提取面部图像。

与传统人脸检测略有不同的,Faceswap 算法需要裁剪的人脸边界框(bouding box, bbox)是正方形的,同时还会适当的向外扩充一些,以保证人脸都在 bbox 内。

特征提取

检测到人脸后,需要提取人脸的特征

首先要做的就是,人脸关键点检测,也就是 landmark。


这些关键点,抽取了人脸的表情特征,同时大致描述了人脸的器官分布。

我们可以直接通过 dlib 和 OpenCV 等主流的工具包直接提取人脸的关键点。

当然,为了取得更好的定位精度,也可以使用 CNN 训练一个人脸关键点检测模型,简单好用。

人脸转换



人脸转换的思想,其实和我上篇文章 ALAE 的思想很像。

就是采用自编码器的原理,不记得它是啥的话,可以去上一篇文章看一看。

简单来讲,就是将人脸图像压缩到短向量,再由短向量恢复到人脸图像。这些短向量包含了人脸的主要信息,例如该向量的元素可能表示人脸肤色、眉毛位置、眼睛大小等等。


所以如果我们用某个编码器学习所有人,那么它就能学习到人脸的共性;如果再用某个解码器学习特定的某个人,那么就能学习到这个人的特性。

简单而言,当我们用通用编码器编码人脸 A,再使用特定解码器 B 解码短向量,那么就能生成出拥有 A 的人脸表情,但却是 B 人脸的图像。

就好比,你摆出一个表情,我根据你睁眼的大小嘴巴咧开的大小等面部特征,模仿出你的表情

我们表情一样,但长相不一样

人脸转换,除了自编码器的方法,还有一种 GAN 方法。

GAN 会利用提取的人脸特征点,使用生成器直接生成对应的目标人脸图像,这跟 StyleGAN 人脸生成算法很类似,但不同的是需要生成指定表情的人脸。

在生成的图片后,会接一个判别器,判断图片的逼真程度。


上述算法都是针对单张图片而言的,对于视频而言,就是多了一个视频拆分成图片,图片拼接成视频的过程。

DeepFakes 技术发展已久,2020 年有一篇最新发表的综述论文,包含了各种 DeepFakes 算法的概述,想了解更多的读者,可以去“啃”一下论文了。

论文地址:
https://arxiv.org/pdf/2001.00179.pdf

预处理和后处理

大致思路就是这样,里面还有很多细节,我们称之为 Tricks ,这就需要通过阅读源码去学习了。

比如,在进行提取人脸特征之前,需要进行图像的预处理。

对数据进行规范化(Normalization),使训练的图像的分布信息尽可能相近:


训练的数据集是分为 A 数据集和 B 数据集的,如上图,A 数据集为川普,B 数据集为凯奇。

我们可以将 A 数据集(川普)加上两者数据集的平均差值(RGB三通道差值)来使两个输入图像图像的分布尽可以相近,这样我们的损失函数曲线下降会更快些。

用代码表示就是:

images_A += images_B.mean(axis=(0, 1, 2)) - images_A.mean(axis=(0, 1, 2))

再比如,换脸之后,需要进行图像的后处理。

为了是生成的人脸效果更加,会进行诸如边缘融合、色彩均衡等处理方法。

想要了解算法背后的实现方法,那就得耐着性子看源码了。

4


环境搭建
大致的原理讲完了,开始进入实战部分,环境搭建。
Faceswap 项目地址:https://github.com/deepfakes/faceswap
Faceswap 这类的换脸算法,计算量很大,强烈推荐使用 GPU 搭建开发环境。
我是 RXT 2060 super ,训练模型都需要 12 个小时以上,如果只用 CPU 训练,那可能需要几个星期的时间才能训练好。
Faceswap 程序,对于 Python 版本、 CUDA 版本和 tensoflow-gpu 版本都有要求。


经过我的熬夜测试,Python 版本必须是 3.6.x,如果是 3.7.x 都跑不起来。

CUDA 版本也得是 10.0 或 9.0,版本高了,比如 10.2,训练的时候会出现 gpu 用不起来的情况。
我的运行环境是:
  • CUDA 10.0

  • Python 3.6

  • tensorflow-gpu 1.14.0


还是推荐使用 Anaconda 配置环境,直接创建一个 Python 3.6 的环境,然后在里面折腾:
conda create -n tf python==3.6
只要这几个基础库版本没有问题,其他就好说了,根据项目的 requirements.txt 直接安装第三方库即可:
python -m pip install -r _requirements_base.txt


除了这些第三方库,官方还少统计了一个 pynvml,直接用 pip 安装即可。
python -m pip install pynvml


此外还需要配置一下 FFmpeg,安装好后记得配置环境变量。


下载地址:

http://ffmpeg.org/


安装好这些,环境就算准备完毕了。

5


模型训练
faceswap 有一个强大的 GUI 。
输入如下指令,打开 GUI。

python faceswap.py gui



主要提供了四个功能:
  • Extract:数据集制作,可以自动提取视频或图片中的人脸。

  • Train:训练模型,有多种算法可供选择。

  • Convert:换脸,使用训练好的模型对图片或视频换脸。

  • Tools:工具,很多图像处理小工具。


数据集制作
想要训练换脸模型,首先要处理数据集,可以用 Extract ,比如下载一些宋小宝的高清视频,然后使用 Extract 处理。


指定好视频路径和输出图片路径,点击 Extract 即可处理图片。
Extract 除了会生成参见后的人脸数据意外,还会生成 alignments.fsa 文件,也就是人脸对齐文件。
这个提取,是提取视频中所有的人脸,所以提取完之后,需要使用人脸识别接口或者人工清晰一遍数据,将无用的数据删除。
删除图片之后,需要根据剩余的图片重新生成 alignments.fsa 文件。
这时候,就需要用到 Tools 里面的功能。
选择 Tools 标签下的 Sort 选项,Input 填写为刚刚处理完图片的文件夹,Output 填写新的文件夹,其余选项默认,点击 Sort 执行按钮,对所有图片进行重新排序
图片名处理完了,再选择 Tools 标签下的 Alignments,job 选项 Remove-Faces:


其中 Alignments files 是 Extract 后生成的对齐文件,Faces Folder 是我们刚刚 Sort 后的输出目录。设置完毕后点击Alignments 即可。
这样我们就获得了,重新排序好,干净的宋小宝人脸数据集人脸对齐文件
另外一个数据集,处理方法同理。


数据集要保证一下几点:
  • 图片要高清!模糊的图片训练效果欠佳。

  • 图片要多样化!仅仅一个处理一个视频得到的图片是不够的,要找足够多样丰富的图片作为数据集。


数据集 A 和 数据集 B 越多越好,至少各 1000 张左右。


模型训练


训练模型不麻烦,选择数据集 A 和 数据集 B 的地址,以及两个数据集对应的人脸对齐文件。
最后再指定一个模型保存地址即可。


数据集 A 和 数据集 B 要区分一下,谁替换谁。
比如,我是要将《红色高跟鞋》的刘敏涛替换为宋小宝。
那么,数据集 A 就是刘敏涛的图片,数据集 B 就是宋小宝的图片。
点击 Train 就可以开始训练了。
训练过程中,点击 Preview,可以看到中间的训练结果。


点击 Analysis 可以看到 Loss 的收敛情况。


你需要的,它都有,就问你香不香

训练的时候,可以选择多种算法,也有各种训练参数,了解一下每个算法的特点,每个训练参数的含义,怎么训练的更好,可以去官方论坛,看一下英文教程。
论坛地址(需翻墙):https://forum.faceswap.dev/


官方文档,很全面。

6


效果测试
模型训练可能需要花费一天的时间。
训练好模型后,就可以直接搞起了。


首先,需要指定需要想要替换的视频,以及对应的人脸对齐文件(可以使用 Extract 生成)。
点击 Convert 开始转换!
换脸大功告成,再看一下效果!

7


最后
  • 切勿滥用技术,切勿商用。

  • 算法的魅力无处不在,多多学习背后的技术。



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存