最近,一个名叫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社区发帖,每位注册的用户也有5枚邀请码。
RussellCloud社区:本站新帖 - RussellCloud - Powered by phpwind
(http://forum.russellcloud.com/)
# 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万美金,你可能只需要一台有可以计算深度学习的显卡的工作站以及足够的时间就可以完成。
但是科技的进步还是会给我们带来一些担忧。在换脸技术上,如果人人能够使用,那就可以低成本制作各种假视频。
我们都知道视频在当前社交媒体下极快的传播速度,“朋友圈”流通的各种小视频非常火爆。如果利用这个技术低门槛地制作低成本假视频,这可能会带来巨大的社会信任危机。你怎么看?