Jack-Cui · 2020年11月20日

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

1120.11.png

点赞再看,养成习惯,微信公众号搜索【JackCui-AI】关注这个爱发技术干货的程序员。本文 GitHub https://github.com/Jack-Cherish/PythonPark 已收录,有一线大厂面试完整考点、资料以及我的系列文章。

1 红色高跟鞋

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

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

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

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

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

image.png

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

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

今天,我继续手把手教学

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

搞起来

2 Faceswap

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

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

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

image.png

Faceswap 项目地址:

https://github.com/deepfakes/...

3 算法原理

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

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

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

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

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

  • 人脸检测
  • 特征提取
  • 人脸转换

人脸检测

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

image.png

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

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

特征提取

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

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

image.png

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

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

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

人脸转换

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

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

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

image.png

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

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

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

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

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

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

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

image.png

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

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

论文地址:

https://arxiv.org/pdf/2001.00...

预处理和后处理

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

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

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

image.png

训练的数据集是分为 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 这类的换脸算法,计算量很大,强烈推荐使用 GPU 搭建开发环境。

我是 RXT 2060 super ,训练模型都需要 12 个小时以上,如果只用 CPU 训练,那可能需要几个星期的时间才能训练好。

Faceswap 程序,对于 Python 版本、 CUDA 版本和 tensoflow-gpu 版本都有要求。

image.png

经过我的熬夜测试,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

image.png

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

python -m pip install pynvml

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

下载地址:

http://ffmpeg.org/

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

5模型训练

faceswap 有一个强大的 GUI 。

输入如下指令,打开 GUI。

python faceswap.py gui

image.png

主要提供了四个功能:

  • Extract:数据集制作,可以自动提取视频或图片中的人脸。
  • Train:训练模型,有多种算法可供选择。
  • Convert:换脸,使用训练好的模型对图片或视频换脸。
  • Tools:工具,很多图像处理小工具。

数据集制作

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

image.png

指定好视频路径和输出图片路径,点击 Extract 即可处理图片。

Extract 除了会生成参见后的人脸数据意外,还会生成 alignments.fsa 文件,也就是人脸对齐文件。

这个提取,是提取视频中所有的人脸,所以提取完之后,需要使用人脸识别接口或者人工清晰一遍数据,将无用的数据删除。

删除图片之后,需要根据剩余的图片重新生成 alignments.fsa 文件。

这时候,就需要用到 Tools 里面的功能。

选择 Tools 标签下的 Sort 选项,Input 填写为刚刚处理完图片的文件夹,Output 填写新的文件夹,其余选项默认,点击 Sort 执行按钮,对所有图片进行重新排序

图片名处理完了,再选择 Tools 标签下的 Alignments,job 选项 Remove-Faces:

image.png

其中 Alignments files 是 Extract 后生成的对齐文件,Faces Folder 是我们刚刚 Sort 后的输出目录。设置完毕后点击Alignments 即可。

这样我们就获得了,重新排序好,干净的宋小宝人脸数据集人脸对齐文件

另外一个数据集,处理方法同理。

image.png

数据集要保证一下几点:

  • 图片要高清!模糊的图片训练效果欠佳。
  • 图片要多样化!仅仅一个处理一个视频得到的图片是不够的,要找足够多样丰富的图片作为数据集。

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

模型训练

训练模型不麻烦,选择数据集 A 和 数据集 B 的地址,以及两个数据集对应的人脸对齐文件。

最后再指定一个模型保存地址即可。

image.png

数据集 A 和 数据集 B 要区分一下,谁替换谁。

比如,我是要将《红色高跟鞋》的刘敏涛替换为宋小宝。

那么,数据集 A 就是刘敏涛的图片,数据集 B 就是宋小宝的图片。

点击 Train 就可以开始训练了。

训练过程中,点击 Preview,可以看到中间的训练结果。

image.png

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

image.png

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

训练的时候,可以选择多种算法,也有各种训练参数,了解一下每个算法的特点,每个训练参数的含义,怎么训练的更好,可以去官方论坛,看一下英文教程。

论坛地址(需翻墙):

https://forum.faceswap.dev/

image.png

官方文档,很全面。

6 效果测试

模型训练可能需要花费一天的时间。

训练好模型后,就可以直接搞起了。

image.png

首先,需要指定需要想要替换的视频,以及对应的人脸对齐文件(可以使用 Extract 生成)。

点击 Convert 开始转换!

换脸大功告成,再看一下效果!

image.png

7 最后

  • 切勿滥用技术,切勿商用。
  • 算法的魅力无处不在,多多学习背后的技术。
作者:Jack Cui
原文:https://mp.weixin.qq.com/s/5k...
关注作者公众号,获取更多有趣AI应用~
imagy.png

系列篇

更多AIoT领域有趣的算法应用及产品请关注有趣的AIoT应用专栏。
推荐阅读
关注数
2143
内容数
24
介绍有趣好玩的AIoT 实战项目,算法应用及软硬件产品。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息