给大家介绍最近超级火的黑科技应用deepfake,这是一个实现图片和视频换脸的app。前段时间神奇女侠加尔盖朵的脸被换到了爱情动作片上,233333。我们这里将会从github项目faceswap开始一步一步实现一个视频换脸的教程。

注意:

本技术存在一定的使用风险,本教程仅做技术交流,请不要用在其他不应该被使用的地方。

技术分析

faceswap 项目是一个学习重建脸部特征的深度学习算法。你给它一堆的图片,它学习几个小时后,通过分辨哪些是合成的图片最终。但是它并不是仅仅把相似的图片替换,而是通过对不同的表情进行学习分析,最后可以对给出的图片进行模型替换达到以假乱真的效果。详细分析可参考Reddit

假设你可以连续12小时盯着一个人看,观察他的表情并记在大脑里面。然后他跟你说画个我微笑的样子,悲伤的样子,你瞬间就可以完成这个要求并且能够达到高清的图片效果。这就是深度学习的威力。

换脸针对训练的是脸部特征,因此对于输入的图片应该也是只有脸部的图片,所以如果是非脸部的图片需要提取脸部再来进行替换,这也是后面一开始出错的原因。

AI换脸详细步骤

拷贝项目到本地并开始训练模型

首先需要安装git,使用git clone拷贝faceswap项目到本地。从本站上传的文件下载测试数据,faceswap项目地址https://github.com/deepfakes/faceswap

git clone https://github.com/deepfakes/faceswap
cd faceswap
pip install -r requirements.txt
wget https://www.bobobk.com/wp-content/uploads/2019/01/input.zip
unzip input.zip

解压后可以看到目录下有了input_A和input_B训练数据文件夹。

由于训练耗时较长,如果GPU不强的话会更久,建议使用screen运行,本教程训练使用GTX1080ti训练。代码如下:

screen -S faceswap
python faceswap.py train

模型将会保存在model文件夹下。这里我运行到损失函数小于0.03就没有继续训练了。

输入文件准备

模型训练好了就是大家喜闻乐见的换脸环节了,由于我们的测试数据是川普和尼古拉斯凯奇,所以首先我们找一张最新的一小段视频。视频来源https://www.youtube.com/watch?v=S73swRzxs8Y,由于模型只是用来进行图片替换的,这里需要首先将视频转换为图片,项目文件中toos.py可以进行此项工作,用法:

mkdir input
mkdir output python tools.py effmpeg -i cage.mp4 -o input -s 00:0148 -e 00:0156
####视频1分48秒可以到1分56秒结束。

运行失败,为什么,因为没有安装FFmpeg,其中一个功能就是将视频里面的图片提取出来,图片合成会视频。安装可看https://cloud.tencent.com/developer/article/1027379,这里直接给出centos7安装代码

yum install -y vim
yum install -y epel-release
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
yum repolist
rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
yum repolist
yum update -y
yum install -y ffmpeg
ffmpeg -version

 

安装后就可以了,切割后的图片存在于input文件夹中,接下来就是转换了。

运行报错  

python faceswap.py convert -i original -o modified

 

原因是没有比对的文件,想想也是,我们的输入是一张人脸图片,给的确实一整个电影的一帧,比对就是先把脸部给提取出来以用来替换,所以这里需要先做脸部比对。这在项目里就是使用extract命令(一开始我以为extract是解压文件呢,233333)

把前面从视频中提取的图片文件进行脸部提取,使用方法

python faceswap.py extract -i original -o input

运行训练好的模型换脸

继续运行convert命令

python faceswap.py convert -i input -o output

可以看到已经在逐步输出换脸后的图片,想想还有点小激动呢。

将换脸后的图片重新合成回视频

代码:

python tools.py effmpeg  -i output -r input/cage.mp4 -o modified/cage.mp4 -a gen-vid

生成的mp4在modified文件夹下,下载播放即可。播放时还真的是乐趣多多。

应用

该技术自开发一来就有各种声音,恐惧其威力,想想别人使用你的样子发表一段根本不是你自己录制的视频是什么情景。

个人认为这是一个非常好玩的东西,你可以把自己换到自己喜欢的角色身上,比如哈利波特什么的啊。想想就很有意思。像这篇文章作者把妻子换到节目主持人身上,他妻子得多激动,啊哈哈哈。

总结

本文一步一步地从模型训练,到视频文件的处理,再到图片换脸并重新根据原始视频合成生成的视频。是一个完整的使用faceswap 深度学习AI实现视频换脸教程,理论上可以运用于任何的视频和想替换的人脸,只需要给与足够的目标模型和训练模型的图片即可,这也是很多明星被换到小电影上的原因。

这项换脸技术相信会在未来产生大量好玩的视频,应用,敬请期待!!!

另:由于使用的是深度学习,在训练模型上需要耗费大量的计算资源,因此最好使用GU或者TPU训练较好。

转载地址:https://www.bobobk.com/258.html

faceswap深度学习AI实现视频换脸详解的更多相关文章

  1. 深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

    在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论 ...

  2. 深度学习之卷积神经网络(CNN)详解与代码实现(一)

    卷积神经网络(CNN)详解与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10430073.html 目 ...

  3. 【转载】 深度学习之卷积神经网络(CNN)详解与代码实现(一)

    原文地址: https://www.cnblogs.com/further-further-further/p/10430073.html ------------------------------ ...

  4. go微服务框架go-micro深度学习 rpc方法调用过程详解

    摘要: 上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,服务端注册server信息,client获取serv ...

  5. 深度学习之卷积神经网络(CNN)详解与代码实现(二)

    用Tensorflow实现卷积神经网络(CNN) 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10737065. ...

  6. go微服务框架go-micro深度学习(五) stream 调用过程详解

        上一篇写了一下rpc调用过程的实现方式,简单来说就是服务端把实现了接口的结构体对象进行反射,抽取方法,签名,保存,客户端调用的时候go-micro封请求数据,服务端接收到请求时,找到需要调用调 ...

  7. 使用函数计算三步实现深度学习 AI 推理在线服务

    目前深度学习应用广发, 其中 AI 推理的在线服务是其中一个重要的可落地的应用场景.本文将为大家介绍使用函数计算部署深度学习 AI 推理的最佳实践,  其中包括使用 FUN 工具一键部署安装第三方依赖 ...

  8. Java学习-007-Log4J 日志记录配置文件详解及实例源代码

    此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:20 ...

  9. Python学习一:序列基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:moyi@moyib ...

随机推荐

  1. 【Java】利用java.io.PrintWriter写出文本文件

    代码: package com.hy.expired; import java.io.FileNotFoundException; import java.io.PrintWriter; public ...

  2. CentOS源码安装 Tomcat/8.0.24

    依个人的习惯,喜欢将源码安装在/usr/local这个目录下面: 第一步:下载源码 wget http://archive.apache.org/dist/tomcat/tomcat-8/v8.0.2 ...

  3. springboot之kafka安装与实践

    环境:腾讯云centos7 1.下载 http://mirror.bit.edu.cn/apache/kafka/2.3.0/kafka_2.11-2.3.0.tgz 2.解压 tar -xvf ka ...

  4. 002-jdk-数据结构-工具类Collections、Arrays、System.arraycopy

    常用备注 一.LIst to Array List<String> list = new ArrayList<String>(); Object[] array=list.to ...

  5. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_08-新增页面-前端-Api调用

    表单数据提交到后台 export const page_add = paramas => { return http.requestPost(apiUrl+'/cms/page/add',par ...

  6. [ML] Roadmap: a long way to go

    看上去不错的博文: 机器学习的经典算法一览 (一) 机器学习的经典算法一览 (二)       1.引言 正文将详细介绍传统机器学习算法,基本思想和用途.把问题解决思路和方法应用建议提前到这里的想法也 ...

  7. 浅析 Nodejs 模块化

    本文只讨论 CommonJS 规范,不涉及 ESM 我们知道 JavaScript 这门语言诞生之初主要是为了完成网页上表单的一些规则校验以及动画制作,所以布兰登.艾奇(Brendan Eich)只花 ...

  8. @value取值

    配置文件的书写 valm.DlUrl=http://14.168.55.203:5199/FOSSecMngTemplate?wsdl vals.DlUrl=http://14.168.55.203: ...

  9. centos下如何关闭xdebug扩展

    因为只要加载XDEBUG都会导致系统太慢,所以只有在需要调试系统程序的时候才加载XDEBUG扩展.平时一定要把它给注释掉. 只需要在php.ini文件中注释掉xdebug即可. 即: 前面加一个分号即 ...

  10. Flutter 移动端屏幕适配方案和制作

    flutter_screenutil插件 flutter 屏幕适配方案,让你的UI在不同尺寸的屏幕上都能显示合理的布局! 注意:此插件仍处于开发阶段,某些API可能尚未推出. 安装依赖: 安装之前请查 ...