Python AI 换脸,宋小宝换脸刘敏涛唱红色高跟鞋,是怎么实现的?
学习python的正确姿势
共 4546字,需浏览 10分钟
·
2020-06-06 23:22
应该有一些 b 友知道他吧,可能你之前看过他的博客:
或者逛过他的 Github,他在 Github 上面开源了挺多不错的项目,比如爬虫、机器学习啥的,那个 star 量我都酸了...中国区 Top 100!
那么接下来有请 Jack Cui 闪亮登场!!!!
哈喽,各位小帅b的朋友们,你们好哇~小帅b大佬人很nice,要带小弟飞一次~特此有了今天的邀请分享。我本身做算法工作,所以今天给大家带来了AI换脸的分享,希望各位喜欢!
咱们进入正题:
红色高跟鞋
刘敏涛,中国内地知名女演员。
我还是从 2015 年上映的《伪装者》知道她的。
5 月 5 日,又凭借着在晚会合唱的《红色高跟鞋》上了微博热搜,直拍视频的播放量高达 4000 多万,逗趣的表情管理,让人忍俊不禁。
AI 换脸技术,可以直接让你也拥有这自我陶醉的表情管理能力。
比如,看下宋小宝“演唱”一首《红色高跟鞋》。
公众号上传了 Deepfake 视频,但是一直无法过审。
人脸这东西还是有些风险的,索性就不放视频了,想看视频的,可以去 B 站搜索,宋小宝红色高跟鞋,有很多其他人的作品,绝对惊艳。
今天,我继续手把手教学。
算法原理、环境搭建、模型训练、效果测试,一条龙服务,尽在下文!
搞起来!
Faceswap
这种换脸的算法,其实有很多。
例如 Faceswap 、DeepFaceLab、Faceswap-GAN 等等。
本文以 star 量最多的 Faceswap 为例,进行说明。
Faceswap 项目地址:https://github.com/deepfakes/faceswap
算法原理
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))
再比如,换脸之后,需要进行图像的后处理。
为了是生成的人脸效果更加,会进行诸如边缘融合、色彩均衡等处理方法。
想要了解算法背后的实现方法,那就得耐着性子看源码了。
环境搭建
大致的原理讲完了,开始进入实战部分,环境搭建。
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/
模型训练
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/
官方文档,很全面。
效果测试
模型训练可能需要花费一天的时间。
训练好模型后,就可以直接搞起了。
首先,需要指定需要想要替换的视频,以及对应的人脸对齐文件(可以使用 Extract 生成)。
点击 Convert 开始转换!
换脸大功告成,再看一下效果!
最后
切勿滥用技术,切勿商用。
算法的魅力无处不在,多多学习背后的技术。
感谢 Jack Cui 给我们带来了非常 nice 的分享,如果你对他感兴趣的话(坏笑),不妨关注下他,就在小帅b的隔壁哟:
那么,我们下回见咯,peace!
评论