如何使用 Deepfakes 换脸
如何使用 Deepfakes 换脸
1. 获取deepfakes工具包
git clone https://github.com/deepfakes/faceswap.git
2. 补齐依赖包:
pip install tqdm
pip install cv2
pip install opencv-contrib-python
pip install dlib
pip install keras
pip install tensorflow
pip install tensorflow-gpu(如机器带有gpu)
pip install face_recognition
3.收集样本:
这里我选用的是新垣结衣的样本,费了好半天,下了100张图片:

另外一个人的样本是凯瑞穆里根,由于实在是找图片麻烦,所以直接截取了《The Great Gatsby》里的视频,然后用ffmpeg转化为图片,大概有70张的样子。
3. 面部抓取
在收集完样本后,使用 ./faceswap.py extract –i input_folder/ –o output_folder/ 命令对样本图片进行面部抓取。
做这个的原因是因为我们主要关注的是换脸,所以只需要获取脸部的特征,其他环境因素对换脸的影响并不大。

在面部抓取的过程完成后,我们可以得到所有脸部图片。在此,我们可以人工筛选一下不合适的样本(如下图中的49_1.jpg),将之去除。

4. 面部检测算法HOG:
这里简单提一下脸部特征提取算法HOG(Histogram of Oriented Gradient)。
严格来说,其实HOG是一个特征,是一种在计算机视觉和图像处理中用来进行物体检测的特征描述因子。
HOG特征结合SVM分类器已经被广泛应用于图像识别中。
此处脸部检测的一个简单过程如下:
a. 首先使用黑白来表示一个图片,以此简化这个过程(因为我们并不需要颜色数据来检测一个脸部)。

b. 然后依次扫描图片上的每一个像素点 。对每个像素点,找到与它直接相邻的像素点。然后找出这个点周围暗度变化的方向。
例如下图所示,这个点周围由明到暗的方向为从左下角到右上角,所以它的梯度方向为如下箭头所示

c. 在上一个步骤完成后,一个图片里所有的像素点均可由一个对应的梯度表示。这些箭头表示了整个图片里由明到暗的一个趋势。
如果我们直接分析这些像素点(也就是按色彩的方式分析),那么那些非常亮的点和非常暗的点,它们的值(RGB值)肯定有非常大的差别。
但是因为我们在这只关注明亮度改变的方向,所以有有色图和黑白图最终得到的结果都是一样的,这样可以极大简化问题解决的过程。

d. 但是保存所有这些梯度会是一个较为消耗存储的过程,所以我们将整个图片分成多个小方块,并且计算里面有多少不同的梯度。
然后我们使用相同梯度最多的方向来表示这个小方块的梯度方向。这样可以将原图片转化为一个非常简单的表现方式,并以一种较简单的方法抓取到面部的基本结构。

e. 当计算到一个图片的HOG特征后,可以使用这个特征来对通过训练大量图片得出的HOG特征进行比对。如果相似度超过某个阈值,则认为面部被检测到。

4. 开始训练
在提取两个人脸的面部信息后,直接使用下面命令开始进行模型的训练:
./faceswap.py train -A faceA_folder/ -B faceB_folder -m models/
其中 -m 指定被保存的models所在的文件夹。也可以在命令里加上-p 参数开启preview模式。
在训练过程中,可以随时键入Enter停止训练,模型会保存在目标文件夹。
训练使用的深度学习框架是tensorflow,它提供了保存checkpoint 的机制(当然代码里必须用上)。
在停止训练后,以后也可以随时使用上面的命令读取之前训练得出的权重参数,并继续训练。

5. 转换人脸
在训练完模型后(损失值较低),可以使用以下命令对目标图进行换脸:
./faceswap.py –i input_images_folder/ -o output_images_folder/ -m models/
此处的例子是找的一个视频,所以我们可以先用下面的命令将一个视频以一个固定频率转化为图片:
ffmpeg –i video.mp4 output/video-frame-%d.png
然后执行转换人脸操作。最后将转换后的人脸图片集合,合成一个视频:
ffmpeg –i video-frame-%0d.png -c:v libx264 -vf “fps=25, format=yuv420p” out.mp4
下面是两个换脸图(样本A 110张图片,样本B 70张图片,训练时间6小时):

嗯…效果不咋样… 建议大家可以增大样本量,并延长训练时间。
6. 转换人脸的过程
下面简单的聊一下转换人脸的过程。
这里用到了AutoEncoder(一种卷积神经网络),它会根据输入图片,重构这个图片(也就是根据这个图片再生成这个图片):

这里 AutoEncoder模型做的是:首先使用encoder将一个图片进行处理(卷积神经网络抽取特征),以一种压缩的方式来表示这个图片。然后decoder将这个图片还原。
具体在deepfakes中,它用了一个encoder和两个decoder。在训练的部分,其实它训练了两个神经网络,两个神经网络都共用一个encoder,但是均有不同的decoder。
首先encoder将一个图片转化为面部特征(通过卷积神经网络抽取面部的细节特征)。然后decoder 通过这个面部特征数据,将图片还原。
这里有一个error function(loss function)来判断这个转换的好坏程度,模型训练的过程就是最小化这个loss function(value)的过程。
第一个网络只训练图片A,第二个网络只训练图片B。encoder学习如何将一个图片转化为面部特征值。
decoder A用于学习如何通过面部特征值重构图片A,decoder B用于学习如何通过面部特征值重构图片B。

所以在训练时,我们会将两个图片均送入同一个encoder,但是用两个不同的decoder还原图片。
这样最后我们用图片B获取到的脸,使用encoder抽取特征,再使用A的decoder还原,便会得到A的脸,B的表情。
如何使用 Deepfakes 换脸的更多相关文章
- fakeapp, faceswap, deepfacelab等deepfakes换脸程序的简单对比
https://deepfakes.com.cn/index.php/95.html https://www.cnblogs.com/zackstang/p/9011753.html
- Deepfakes:AI换脸技术自制明星XX片
ps:亮瞎狗眼 去年开始就在国外网站上比较火的项目了,通过Deepfakes技术可以将视频中的人脸换成自己喜欢的明星, 当时就有不少人制作了换脸视频,其中大部分是替换了XX片的女主角. 国外网站Red ...
- Deepfakes教程及各个换脸软件下载
源:https://blog.csdn.net/koest/article/details/80720078 Deepfakes目前用于深度换脸的程序基本都是用python编程语言基于tensorfl ...
- 从换脸到换姿势,AI 在图像处理的道路上越走越魔幻
从换脸到换姿势,AI 在图像处理的道路上越走越魔幻 https://mp.weixin.qq.com/s/VFq3BWLpzyKZ3sqVWf1HKA [导读]加州大学伯克利分校的研究人员,近日在著名 ...
- GTX 750等低配显卡如何玩转Deepfakes?
这里说的Deepfakes软件还是DeepFaceLab,人工智能换脸,是使用深度学习方法来实现的.而深度学习程序对电脑配置要求是非常高的,尤其是跑模型这个环节.很多低配电脑,根本就跑步起来.比如像G ...
- 程序员体验AI换脸就不要用ZAO了,详解Github周冠军项目Faceswap的变脸攻略
本文链接:https://blog.csdn.net/BEYONDMA/article/details/100594136 上个月笔者曾在<银行家杂志>发文传统银行如何引领开放 ...
- faceswap深度学习AI实现视频换脸详解
给大家介绍最近超级火的黑科技应用deepfake,这是一个实现图片和视频换脸的app.前段时间神奇女侠加尔盖朵的脸被换到了爱情动作片上,233333.我们这里将会从github项目faceswap开始 ...
- AI换脸必备知识:如何查看显卡型号以及显存大小!
使用Deepfakes(AI换脸) 软件,拼的就是配置,耗的就是时间,考验的是耐心. 配置好了,时间就少了. 所以玩这种软件,硬核需求就是:配置,配置,配置. 我的电脑能跑这个软件么?也是很多新手的 ...
- GitHub 被指审查内容,著名“换脸”开源项目 deepfake 遭限制访问
开发四年只会写业务代码,分布式高并发都不会还做程序员? >>> 昨天 Hacker News 上一条关于 deepfake 开源项目的帖子(https://news.ycombi ...
随机推荐
- How to enable Linux-PAM on uClinux
By default the uClinux uses the tools provided by busybox firstly. So the init login and passwd are ...
- 设备树..ing
.dts==>.dtb ==>device_node ==> platform_device ==> led_dev.c ==>匹配 led_drv.c (设备 ...
- expect-调试模式的使用
1.expect简介 Expect是一种TCL扩展性的语言,主要用于完成系统交互方面的功能,比如SSH.FTP等,这些程序都需要手工与它们进行互动,而使用Expect就可以模拟人手工互动的过程,是一种 ...
- GIEC2019第六届全球互联网经济大会北京站震撼来袭!
GIEC2019第六届全球互联网经济大会将于2019年8月26日-27日在北京召开,以“智慧零售数字商业”为主题,将邀请政府官员.企业高管.专家学者共议新形势下如何利人工智能和数字化的商业模式促进零售 ...
- POJ 2154 color (polya + 欧拉优化)
Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). You ...
- 创建多线程的第一种方式——创建Thread子类和重写run方法
创建多线程的第一种方式——创建Thread子类和重写run方法: 第二种方式——实现Runnable接口,实现类传参给父类Thread类构造方法创建线程: 第一种方式创建Thread子类和重写run方 ...
- Quartz Scheduler misfireThreshold属性的意义与触发器超时后的处理策略
Quartz misfireThreshold属性的意义与触发器超时后的处理策略. 在配置quartz.properties有这么一个属性就是misfireThreshold,用来指定调度引擎设置触发 ...
- shell中wait命令详解
wait命令介绍 wait [作业指示或进程号] 1.等待作业号或者进程号制定的进程退出,返回最后一个作业或进程的退出状态状态.如果没有制定参数,则等待所有子进程的退出,其退出状态为0. 2.如果是s ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
- c#高级编程第七版 学习笔记 第二章 核心c#
第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...