查看原文
其他

刷爆朋友圈的 deepfakes 视频人物换脸是怎样炼成的?

2018-02-03 魏鸿鑫 AI研习社

本文作者 魏鸿鑫,本文首发于知乎专栏【Russell Lab】,AI 研习社获其授权转载。

最近,一个名叫deepfakes的技术火了,这是一个可以给视频人物换脸的技术。

这张图片源自雷神三预告片索尔大战浩克的片段,将索尔的脸替换为了Trump的,这个表情实在是......

当然,最令人害怕的是,这个技术火的原因不是恶搞,竟然是有人把明星的脸换到了某些不可描述的小电影的主角上:)而且推出了一个桌面应用,使得使用门槛进一步下降。

不过这不是我们今天讨论的话题(正经脸),我们在RussellCloud上复现了一个换脸的实例——尼古拉斯-凯奇和特朗普的换脸人生。这里我们会阅读一些项目的代码让增进对这个项目的技术了解。

  模型部分

模型部分在model.py中,使用keras框架,这是一个类Auto-Encoder模型。具体的Encoder和Decoder设计代码如下:

def Encoder():
   input_ = Input( shape=IMAGE_SHAPE )
   x = input_
   x = conv( 128)(x)
   x = conv( 256)(x)
   x = conv( 512)(x)
   x = conv(1024)(x)
   x = Dense( ENCODER_DIM )( Flatten()(x) )
   x = Dense(4*4*1024)(x)
   x = Reshape((4,4,1024))(x)
   x = upscale(512)(x)
   return Model( input_, x )def Decoder():
   input_ = Input( shape=(8,8,512) )
   x = input_
   x = upscale(256)(x)
   x = upscale(128)(x)
   x = upscale( 64)(x)
   x = Conv2D( 3, kernel_size=5, padding='same', activation='sigmoid' )(x)
   return Model( input_, x )

其定义的卷积(conv)层使用LeakyReLU函数激活:

def conv( filters ):
   def block(x):
       x = Conv2D( filters, kernel_size=5, strides=2, padding='same' )(x)
       x = LeakyReLU(0.1)(x)
       return x
   return block

还使用了一个低分辨率特征映射(upscale)层,这是一种类似解决超分辨率问题的亚像素卷积层(sub-pixel convolution layer)的层。这里一个upscal层包括子像素卷积层用LeakyReLU函数激活,再通过一层「像素洗牌」(pixel shuffle)。

def upscale( filters ):
   def block(x):
       x = Conv2D( filters*4, kernel_size=3, padding='same' )(x)
       x = LeakyReLU(0.1)(x)
       x = PixelShuffler()(x)
       return x
   return block

总体的大概模型图如下:

Auto Encoder模型

  RussellCloud复现

复现前准备:

  • 注册 RussellCloud 账号(http://russellcloud.com/#register)

如果你没有邀请码,可以到RussellCloud社区发帖,每位注册的用户也有5枚邀请码。

RussellCloud社区:本站新帖 - RussellCloud - Powered by phpwind

(http://forum.russellcloud.com/)

  • 安装 russell-cli 终端工具

  • Clone 项目文件,Git地址RussellCloud/deepfakes_faceswap

    (https://github.com/RussellCloud/deepfakes_faceswap)

# clone代码$ git clone https://github.com/RussellCloud/deepfakes_faceswap

使用命令行登录:

# 使用russell login命令$ russell login

输入y,网页登录后在网页端拷贝账户的Token,粘贴进终端,回车。如果你使用Windows的命令行,可能会出现粘贴不进的情况,请右键窗口粘贴。

成功登录输出:

Login Successful as XXX

新建项目:

来到RussellCloud主页,进入控制台,新建一个项目。项目名随便起一个,默认容器环境一定要选择:tensorflow-1.4 。



网页创建项目

初始化项目:

项目创建完成后记得在项目主页复制概览ID,用于项目初始化。

# 绑定远程项目,此处<project_id>是在网页上复制的项目概览 ID$ russell init --id <project_id>

初始化成功输出:

Project "XXX" initialized in current directory

运行项目:

# 一句命令挂载我们准备好的数据集,运行此项目$ russell run --data f3fadfadf6ac417e9f20813603187344:data "python run.py"

成功运行提示

一分钟以后就可以在该项目的网页端检查输出啦!

网页任务页查看输出

  小记

最后我们可以看到很多经过转化的图像:

三个效果还不错的输出例子

不过可能会有人觉得:你这个图片中间为啥这么模糊呢,感觉很影响效果。如果你看代码的话可以知道我们的AutoEncoder是采集64*64的像素,我们的图片是256*256。我们训练及生成的时候都做了一个截取,把最中间的160*160的区域认定为脸部,将其压缩为64*64。

最终在生成的时候,我们生成的也是64*64的数据。为了显示出来,我们使用opencv变换为160*160替换原图中间的图像。低分辨率转换得来,所以中间的图像有些模糊。

换脸对比

换脸技术是有很多实现方法的,也许AutoEncoder并不是一个效果很好的方案。但我们看到我们实验的效果中的川普脸部还是比较显著的换上了凯奇的一些特征:眉毛变得颜色深一些,眼睛也睁的更大一点显得眼神比较柔和,还有鼻子和笑容都有所改变。

  闲谈

换脸的应用早早就有,例如在速度与激情7拍摄中,保罗沃克遭遇车祸使得未完成的拍摄无法由他本人完成。所以最后是替换替身演员的脸部图像最终完成的拍摄(据说渲染所花费的美金高达5000万)。在国内比较知名的还有:

真是难为后期了~

而深度学习使得我们用这些技术的门槛大大下降——相比于5000万美金,你可能只需要一台有可以计算深度学习的显卡的工作站以及足够的时间就可以完成。

但是科技的进步还是会给我们带来一些担忧。在换脸技术上,如果人人能够使用,那就可以低成本制作各种假视频。

我们都知道视频在当前社交媒体下极快的传播速度,“朋友圈”流通的各种小视频非常火爆。如果利用这个技术低门槛地制作低成本假视频,这可能会带来巨大的社会信任危机。你怎么看?

NLP 工程师入门实践班:基于深度学习的自然语言处理

三大模块,五大应用,手把手快速入门 NLP

海外博士讲师,丰富项目经验

算法 + 实践,搭配典型行业应用

随到随学,专业社群,讲师在线答疑

▼▼▼



新人福利




关注 AI 研习社(okweiwu),回复  1  领取

【超过 1000G 神经网络 / AI / 大数据,教程,论文】



从事人脸识别研究必读的N篇文章

▼▼▼

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存