ZAO最近火爆,成为现象级产品之一,引起大家的广泛关注,ATA上面已经有同学做了一些说明分析,链接如下:

https://www.atatech.org/articles/148375?spm=ata.13269325.0.0.27ad49fa0Vr2gG

上面文章介绍了ZAO是基于deep fake算法演变出来的一种产品,并提供了deepFake lab的下载地址,计算机硬件的要求等等。本文从更底层的算法角度出发,带大家深入到算法本质,去理解ZAO究竟是如何基于GAN来进行换脸的。

首先,我们给出一张换脸的整体流程图:

图片来源:Exposing DeepFake Videos By Detecting FaceWarping Artifacts

上图展示了基于deepFake换脸算法的一般流程,首先对于输入图片(a)原图做人脸检测(b),检测出人脸后进行关键点检测(c)。之后(c)通过变换矩阵(d)来实现人脸摆正,之后将摆正后的人脸进入DeepFake(GAN/CycleGAN)来实现人脸替换,之后将替换后的人脸(g)通过变换矩阵的反变换来做关键点对齐,最后替换回原图进行融合最终得到(i)和(h)。

这里我们给出的是图像上人脸替换的一般流程,那对于短视频而言,就需要先对视频进行截帧,然后逐帧进行人脸替换,在视频帧替换过程中要有人脸识别的网络来保证替换的对象保持统一性(具体理解就是比如我们要替换一段视频中小燕子的脸,那就要识别出检测的人脸是不是小燕子的,不能将紫薇的人脸也替换了),当然由于是视频逐帧的替换,那么在其中为了保证视频随时间前后帧替换的人脸的自然和连贯性,就需要对前后帧的人脸进行转移平滑操作,从而保证较强的视觉效果。

以上就是图像换脸,视频换脸的通用流程,当然对于ZAO而言,我们发现它的换脸效果要好于我们一般的换脸算法,尤其是在头部旋转的(低头,回头,仰头)上面,效果很是不错,所以我们有理由相信,ZAO的算法内部应该是使用3D人脸关键点的检测,这样在替换的过程中就会换的更为自然。

好的,现在我们了解了流程,下面我们更加细节的介绍上面说的DeepFake(GAN/CycleGAN)的算法工作原理。为了简化大家对于GAN/CycleGAN的理解,我们同样以图的方式展现:

首先,上图表示了最简单的人脸替换网络,对于输出人脸(左边),通过神经网络编码得到中间状态(往往是一个向量或者很小的图像),之后再进入解码器还原得到重建的人脸(右边)。我们注意,中间的编码态相当于保存的人脸的全部信息。在上图我们并没有做人脸替换的相关操作,即A脸编码后解码的还是A脸,B脸编码后解码的还是B脸。

下面,如果我们将B脸编码的向量用A脸的解码去解,会发生什么呢?是的,B的脸会出现在原本A的脸的位置,但面部的表情和一些细节会保留A的。这样就实现了换脸。

从上图还有一点需要注意,因为编码的可替换要求,我们必须让所有脸的编码器保持一致性,也就是所有替换前的人脸用统一的编码器去编码(上图统一的红色编码器),但对于每个不同的人脸要实用不同的解码器去解码(上图不同的蓝色和绿色解码器),这样才能完成换脸。

但是如果仅仅使用上面的算法结构,生成的人脸会比较假,可以看出相当明显的人为替换痕迹,而为了让替换发生的更为真实,CycleGan应运而生,还是简单的一张图去理解CycleGan的算法本质:

我们可以看出,说到底,CycleGan不过在换脸后生成的假脸和真脸的之间多增加了一个损失来减小两者的差距,同时让相较于之前的A–>B, CycleGan还同时实现了B–>A的生成和缩小差距,而这整个过程呈现了一个闭环,故而名为Cycle。

CycleGan的循环训练可以明显的缩小直接将B脸用A解码器解码所产生的不真实性。

当然,在真实场景中,在完成换脸后可能还需要一些后处理来保证结果更加平滑自然,比如在换脸边缘做一些模糊处理,在人脸区域做一些和原脸的风格迁移等等。而这些就是实现技术代差的关键技术了,我们今天只是浅析一下ZAO的算法,更深入的一些产品算法设计细节我们这里不做更深的探讨了。

最后面对ZAO,虽然他有着霸王条款,单但从技术角度看,我认为ZAO确实做的很好,技术上值得我们学习,但换脸本身是否符合道德,究竟是不是一件有意义有价值的事情,还需要时间给出我们最终的答案。

感谢您阅读,希望对您有所帮助。

–溪鹤

原文链接
本文为阿里云原创内容,未经允许不得转载。

ZAO 背后的深度学习算法原理浅析相关推荐

  1. TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书

    作者:蒋子阳 著 出版社:中国水利水电出版社 品牌:智博尚书 出版时间:2019-01-01 TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书 ISBN:97875170682 ...

  2. 深度学习算法原理_用于对象检测的深度学习算法的基本原理

    深度学习算法原理 You just got a new drone and you want it to be super smart! Maybe it should detect whether ...

  3. Python大数据综合应用 :零基础入门机器学习、深度学习算法原理与案例

    机器学习.深度学习算法原理与案例实现暨Python大数据综合应用高级研修班 一.课程简介 课程强调动手操作:内容以代码落地为主,以理论讲解为根,以公式推导为辅.共4天8节,讲解机器学习和深度学习的模型 ...

  4. 深度学习算法原理——LSTM

    1. 概述 在循环神经网络RNN一文中提及到了循环神经网络RNN存在长距离依赖的问题,长短期记忆(Long Short-Term Memory,LSTM)网络便是为了解决RNN中存在的梯度爆炸的问题而 ...

  5. ONNX 浅析:如何加速深度学习算法工程化?

    AlphaGo击败围棋世界冠军李世石以来,关于人工智能和深度学习的研究呈现井喷之势. 各种新的算法和网络模型层出不穷,令人眼花缭乱.与之相随的,深度学习的训练和推理框架也在不断的推陈出新,比较著名的有 ...

  6. 高效“炼丹”必备技能:一文实现深度学习数学原理入门,还有吴恩达老师亲授课程...

    贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 哪个程序员不想高效"炼丹"? 尤其是深度学习算法开发人员,追求模型结构优化和提高编程效率是永远的目标. 但是,如果只做 ...

  7. 一文梳理深度学习算法演进

    来源:https://zhuanlan.zhihu.com/p/464515049 作者:Peter潘欣 编辑:蘑菇先生 学习记涉及语音.图像.nlp.强化学习.隐私保护.艺术创作.目标检测.医疗.压 ...

  8. Bengio、Hinton的不懈追求——深度学习算法揭示大脑如何学习

    来源:AI科技评论 编译:Don 校对:青暮 "如果我们能够揭示大脑的某些学习机制或学习方法,那么人工智能将能迎来进一步的发展,"Bengio如是说. 深度学习依赖于精妙设计的算法 ...

  9. MySQL索引背后的数据结构及算法原理--转

    MySQL索引背后的数据结构及算法原理 作者 张洋 | 发布于 2011-10-18 MySQL 索引 B树 优化 原文地址:http://blog.codinglabs.org/articles/t ...

最新文章

  1. webgl三维观察综合实验_【CV现状-2】三维感知
  2. python super 理解(一)
  3. idea报错解决:Cannot start compilation: the output path is not specified for module “XXX“.
  4. HDU 3646 DP + 二分
  5. flask bootstrap ajax,使用Flask集成bootstrap的方法
  6. vmware的vmdk格式虚拟机转换为kvm的qcow2格式
  7. DOM(二)——修改内容、属性、样式
  8. Ubuntu16.04 下convert 命令 将eps转tif,jpg,png,pdf格式
  9. mysql 视图报错_MySQL使用Union创建视图报错
  10. 24点游戏java代码 中国开源社区_编程之美 1.16 24点游戏
  11. Pr视频剪辑的降噪与花字
  12. 《谁说菜鸟不会数据分析》数据处理 之 数据清洗--重复数据的处理
  13. C++超市管理系统(MySQL)
  14. http请求中的 OPTIONS 详解
  15. java计算机毕业设计小区物业管理系统录像展示.mp4源程序+mysql+系统+lw文档+远程调试
  16. 双显示器如何设置上下显示和鼠标上下进入第二屏幕?
  17. 数据库备份服务器性能指标,服务器处置性能估算
  18. Choregraphe中NAO机器人如何使用纯python指令盒让机器人说话
  19. Android Proguard混淆详解
  20. 紫薇圣人的程序员人生[原创IT小说]

热门文章

  1. 照片识别出错_AI跨年龄人脸识别技术在跨年龄寻亲的应用简析
  2. oracle erp 报表开发手册,处置OracleERP导出的报表文件
  3. linux命令cp命令行参数,linux命令之cp命令参数及用法详解
  4. php new static 效率,PHP中new static()与new self()的比较
  5. 新手学完Java可以面试哪些岗位?
  6. 一直未运行_【直击一线】延一转三相分离器投运成功,盘活全区生产运行一盘棋...
  7. java beanutil 工具类_实现BeanFactoryAware来达到Spring静态方法获取Bean对象的BeanUtil工具类...
  8. python怎么让输出结果为01_python从0到1--01.python中的输入/输出(基础篇)
  9. 【LeetCode笔记】79. 单词搜索 剑指 Offer 12 矩阵中的路径(Java、dfs)
  10. leetcode 4 --- 寻找两个有序数组的中位数