deepfakes怎么用_手把手教你使用 Deepfakes 换脸

deepfakes怎么用_手把手教你使用 Deepfakes 换脸做为程序员,不会换脸软件怎么能忍?下面教你们徒手使用Deepfakes换脸。python如何使用Deepfakes换脸?git获取deepfakes工具包程序员gitclonehttps://github.com/deepfakes/faceswap.git补齐依赖包:githubpipinstalltqdmpipinstallcv2pipinstallopencv-c…

大家好,又见面了,我是你们的朋友全栈君。

做为程序员,不会换脸软件怎么能忍?下面教你们徒手使用 Deepfakes 换脸。python

如何使用 Deepfakes 换脸?git

获取 deepfakes 工具包程序员

git clone https://github.com/deepfakes/faceswap.git

补齐依赖包:github

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

收集样本算法

这里我选用的是新垣结衣的样本,费了好半天,下了 100 张图片:网络

7e45333e8b574ef68c075cc4.html

另一我的的样本是凯瑞穆里根,因为实在是找图片麻烦,因此直接截取了《The Great Gatsby》里的视频,而后用 ffmpeg 转化为图片,大概有 70 张的样子。框架

面部抓取ide

在收集完样本后,使用以下命令对样本图片进行面部抓取:工具

./faceswap.py extract –i input_folder/ –o output_folder/

作这个的缘由是由于咱们主要关注的是换脸,因此只须要获取脸部的特征,其余环境因素对换脸的影响并不大。

7e45333e8b574ef68c075cc4.html

在面部抓取的过程完成后,咱们能够获得全部脸部图片。在此,咱们能够人工筛选一下不合适的样本(以下图中的 49_1.jpg),将之去除。

7e45333e8b574ef68c075cc4.html

面部检测算法 HOG

这里简单提一下脸部特征提取算法 HOG(Histogram of Oriented Gradient)。

严格来讲,其实 HOG 是一个特征,是一种在计算机视觉和图像处理中用来进行物体检测的特征描述因子。HOG 特征结合 SVM 分类器已经被普遍应用于图像识别中。

此处脸部检测的一个简单过程以下:

①首先使用黑白来表示一个图片,以此简化这个过程(由于咱们并不须要颜色数据来检测一个脸部)。

7e45333e8b574ef68c075cc4.html

②而后依次扫描图片上的每个像素点 。对每一个像素点,找到与它直接相邻的像素点。而后找出这个点周围暗度变化的方向。

例以下图所示,这个点周围由明到暗的方向为从左下角到右上角,因此它的梯度方向为以下箭头所示:

7e45333e8b574ef68c075cc4.html

③在上一个步骤完成后,一个图片里全部的像素点都可由一个对应的梯度表示。这些箭头表示了整个图片里由明到暗的一个趋势。

若是咱们直接分析这些像素点(也就是按色彩的方式分析),那么那些很是亮的点和很是暗的点,它们的值(RGB 值)确定有很是大的差异。

可是由于咱们在这只关注明亮度改变的方向,因此由有色图和黑白图最终获得的结果都是同样的,这样能够极大简化问题解决的过程。

7e45333e8b574ef68c075cc4.html

④可是保存全部这些梯度会是一个较为消耗存储的过程,因此咱们将整个图片分红多个小方块,而且计算里面有多少不一样的梯度。

而后咱们使用相同梯度最多的方向来表示这个小方块的梯度方向。这样能够将原图片转化为一个很是简单的表现方式,并以一种较简单的方法抓取到面部的基本结构。

7e45333e8b574ef68c075cc4.html

⑤当计算到一个图片的 HOG 特征后,可使用这个特征来对经过训练大量图片得出的 HOG 特征进行比对。若是类似度超过某个阈值,则认为面部被检测到。

7e45333e8b574ef68c075cc4.html

开始训练

在提取两我的脸的面部信息后,直接使用下面命令开始进行模型的训练:

./faceswap.py train -A faceA_folder/ -B faceB_folder -m models/

其中 -m 指定被保存的 Models 所在的文件夹。也能够在命令里加上 -p 参数开启 Preview 模式。

在训练过程当中,能够随时键入 Enter 中止训练,模型会保存在目标文件夹。

训练使用的深度学习框架是 Tensorflow,它提供了保存 Checkpoint 的机制(固然代码里必须用上)。

在中止训练后,之后也能够随时使用上面的命令读取以前训练得出的权重参数,并继续训练。

7e45333e8b574ef68c075cc4.html

转换人脸

在训练完模型后(损失值较低),可使用如下命令对目标图进行换脸:

./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 小时):

7e45333e8b574ef68c075cc4.html

7e45333e8b574ef68c075cc4.html

嗯…效果不咋样… 建议你们能够增大样本量,并延长训练时间。

转换人脸的过程

下面简单的聊一下转换人脸的过程。这里用到了 AutoEncoder(一种卷积神经网络),它会根据输入图片,重构这个图片(也就是根据这个图片再生成这个图片):

7e45333e8b574ef68c075cc4.html

这里 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。

7e45333e8b574ef68c075cc4.html

7e45333e8b574ef68c075cc4.html

因此在训练时,咱们会将两个图片均送入同一个 Encoder,可是用两个不一样的 Decoder 还原图片。

这样最后咱们用图片 B 获取到的脸,使用 Encoder 抽取特征,再使用 A 的 Decoder 还原,便会获得 A 的脸,B 的表情。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141122.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • navicat15激活码最新_通用破解码

    navicat15激活码最新_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • java 中级面试题_java中级面试题[通俗易懂]

    java 中级面试题_java中级面试题[通俗易懂]本帖最后由唯我独赞mo于2015-11-1222:47编辑1、java中wait和sleep有什么区别?多线程条件下如何保证数据安全?答:最大区别是等待时wait会释放锁,而sleep会一直持有锁,wait通常用于线程时交互,sleep通常被用于暂停执行。2、java中volatile和synchronized有什么区别?1.volatile本质是在告诉jvm当前变量在寄存器(工作内存…

    2022年10月12日
  • Android自定义ProgressDialog

    Android自定义ProgressDialog我们在开发Android上应用程序时,有很多时候会遇到“延时”等待的情况,例如数据加载时,尤其是在联网的时候,请求网络会有个等待时间,在这个等待的时间里需要给用户一个友好的提示,提示用户现在正在做什么操作,需要耐心等待等等,这时一个进度对话框就可以解决。Android提供给我们一个很好的控件叫ProgressDialog,用来创建自定义信息以及一些相关操作,唯一不好的一点就是Android原生控件给我一种一如既往的单调和丑陋,下面是原生ProgressDialog的源码以及效果

  • 用eclipse创建JAVA程序的步骤

    用eclipse创建JAVA程序的步骤如何使用Eclipse进行Java程序开发一般分为如下4个步骤:一、创建Java项目二、创建程序包三、编写Java源程序四、运行Java程序1、创建Java项目1.1打开eclipse1.2点击顶部菜单栏File->New->JavaProject,输入项目名2、创建程序包点击顶部菜单栏,File->New->Package,…

  • 在Linux里设置用户环境变量的方法「建议收藏」

    在Linux里设置用户环境变量的方法「建议收藏」在linux里设置环境变量的方法(exportPATH)1.修改当前用户下的.bash_profile文件没有ROOT用户权限无法修改ETC下的系统变量,只能修改当前用户下的环境变量$cd(进入用户登陆目录)如当前用户是weblogic那就进入/home/weblogic目录$ls–al查看目录底下是否存在.bash_profile文件

  • Leetcode 5:最长回文子串(最详细的解法!!!)[通俗易懂]

    Leetcode 5:最长回文子串(最详细的解法!!!)[通俗易懂]给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为1000。示例1:输入:"babad"输出:"bab"注意:"aba"也是一个有效答案。示例2:输入:"cbbd"输出:"bb"解题思路首先最简单的做法就是暴力解法,通过二重循环确定子串的范围,然后

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号