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

2020年6月5日08:23:52 8 1,796 °C
摘要

Faceswap换脸手把手教程,算法原理、环境搭建、模型训练、效果测试,一条龙服务,尽在本文!

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

本文 GitHub https://github.com/Jack-Cherish/PythonPark 已收录,有技术干货文章,整理的学习资料,一线大厂面试经验分享等,欢迎 Star 和 完善。

一、红色高跟鞋

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

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

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

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

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

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

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

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

今天,我继续手把手教学

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

搞起来

二、Faceswap

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

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

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

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

Faceswap 项目地址:点击查看

三、算法原理

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

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

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

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

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

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

1、人脸检测

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

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

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

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

2、特征提取

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

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

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

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

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

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

3、人脸转换

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

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

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

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

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

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

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

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

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

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

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

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

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

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

论文地址:点击查看

4、预处理和后处理

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

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

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

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

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

用代码表示就是:

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

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

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

四、环境搭建

大致的原理讲完了,开始进入实战部分,环境搭建。

Faceswap 项目地址:点击查看

Faceswap 这类的换脸算法,计算量很大,强烈推荐使用 GPU 搭建开发环境。

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

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

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

经过我的熬夜测试,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 的环境,然后在里面折腾:

只要这几个基础库版本没有问题,其他就好说了,根据项目的 requirements.txt 直接安装第三方库即可:

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

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

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

下载地址:http://ffmpeg.org/

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

五、模型训练

faceswap 有一个强大的 GUI 。

输入如下指令,打开 GUI。

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

主要提供了四个功能:

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

1、数据集制作

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数据集要保证一下几点:

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

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

2、模型训练

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

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

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

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

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

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

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

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

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

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

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

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

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

论坛地址(需翻墙):点击查看

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

官方文档,很全面。

六、效果测试

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

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

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

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

点击 Convert 开始转换!

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

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

七、最后

  • 切勿滥用技术,切勿商用。
  • 算法的魅力无处不在,多多学习背后的技术。

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

weinxin
微信公众号
分享技术,乐享生活:微信公众号搜索「JackCui-AI」关注一个在互联网摸爬滚打的潜行者。
Jack Cui

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:8   其中:访客  5   博主  3

    • avatar moxiaoying 来自天朝的朋友 谷歌浏览器 Windows 10 重庆市 电信 1

      显卡劝退 :cry:

        • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Mac OS X 10_14_4 北京市 百度网讯科技联通节点

          @moxiaoying 确实非常吃显卡。

        • avatar 1 来自天朝的朋友 谷歌浏览器 Windows 10 黑龙江省哈尔滨市 电信 2

          是cuda10.0 但一直配置不好。。
          There was an error reading from the Nvidia Machine Learning Library. Either you do not have an Nvidia GPU (in which case this warning can be ignored) or the most likely cause is incorrectly installed drivers

            • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 北京市 电信

              @1 去官网安装驱动,然后conda创建虚拟环境,在环境里安装所有依赖。

            • avatar 1 来自天朝的朋友 谷歌浏览器 Windows 10 黑龙江省哈尔滨市 哈尔滨工程大学 2

              请问有预训练好的模型吗 想用cpu训练了。。

                • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 北京市 电信

                  @1 这个只能自己训的~

                • avatar wey 来自天朝的朋友 谷歌浏览器 Windows 10 广东省汕尾市 电信 1

                  大神,你好,我是新手,想请教您一下,为啥我在训练的时候提示no gpu detect?我需要怎么做才能让他用gpu来跑,而不是用cpu跑呢?是不是因为cuda、cudnn、tensorflow需要完全匹配才能行
                  ——–问题已经解决。看到大神教程里面写了,的确是版本问题。评论没得删除。故在此备注。
                  再次感谢大神的教程

                  • avatar wey 这家伙可能用了美佬的代理 谷歌浏览器 Windows 10 美国 华盛顿州西雅图市亚马逊公司数据中心 1

                    想请教下大神下,一般loss值到多少才算是训练好?