最近刷抖音,看见了一个特别有意思的白眼特效,如下面的视频,其大概原理就是检测人脸及定位眼睛关键点,并将贴图覆盖在眼睛上(猜测)。这让我想起了之前读研期间玩儿过的一个demo:DeepWarp,通过浏览器上传一张包含人脸的图像,经服务端后台神经网络模型预测后,便可以返回眼珠左右移动、上下移动,旋转或者斗鸡眼四种状态的动态图片。妈妈再也不用担心我没有斗图表情包了(*^_^*)。
(抖音视频)
相关资源
论文:DeepWarp: Photorealistic Image Resynthesis for Gaze Manipulation
项目首页:
http://sites.skoltech.ru/compvision/projects/deepwarp
论文笔记
作者将该任务视为传统图像生成的一个特例,并通过设计深度神经网络进行联合的端到端训练和预测。该结构包含一个多尺度的光流场预测网络和一个光照调整网络,光流场预测网络负责将输入的眼睛图片、对应的关键点以及需要调整的视角角度进行预测,输出该角度下的眼睛运动变化的光流信息,整个是一个由粗到细的两阶段处理流程;将运动信息作用于输入图像后,得到眼睛变化后的图像,光照调整网络通过对该结果的调整,得到更接近于真实图片的预测输出。
01
光流预测模块
光流预测模块主要通过输入的图像、人眼关键点和角度信息预测根据角度变化后形变的光流信息,并进一步根据光流特征进行形变,一共包含粗糙变换(0.5×-scale)和精细变换(1×-scale)两个阶段。形变预测模块通过全卷积神经网络(Conv+BN+Relu),保证尺度不发生变化,填充方式采用“SAME”,步长为1,并且不使用任何池化操作。
(两阶段光流预测模块)
粗糙变换
该阶段使用0.5倍尺度的图像作为CNN输入,得到0.5倍尺度下的光流信息,为保证可以作用于原图像上,CNN输出的光流场特征图进行了2倍上采样。
(0.5×-scale处理模块)
放大后的两通道Dcoarse(I, α) 包含x方向的偏移和y方向的偏移,与输入的原图I做采样操作得到粗糙变换的Ocoarse。
具体的S采样过程如下:
精细变换
将前一阶段的输出Ocoarse以及所有输入(图像、关键点和角度)拼接,送入1×-scale的CNN结构中,预测这一阶段两通道的光流信息Dres,并和0.5×-scale阶段的输出相加,得到进一步优化的光流场信息。
(1×-scale处理模块)
(卷积层展开)
两阶段结果叠加函数形式:
最后,对原输入图像进行同样的采样操作,得到最终的变换结果。
02
编码输入数据
模型输入数据包含原始截取的眼部图片、定位的7个关键点以及需要变换的角度α,那么如何将这些数据处理成CNN网络的输入呢?
答案是:万物皆可Embedding!!!
Embedding alpha
通过多层感知机将注视角度的属性值α编码为一个高维向量,具体地:
Fangle(α)=FC(16) → ReLU → FC(16) → ReLU
这样就可以把一个值转变为一个16为的向量,接着把每个向量元素复制扩展为一张和输入图片一样大小的常量特征图,并和输入图像按通道拼接在一起。在训练过程中,多层感知机的参数会随着反向传播同时更新。
Embedding point
尽管CNN可以提取图像的特征并建立起输入图像和真实图像的相应映射关系,但是作者发现加入具有眼睛关键点信息的14个embedding特征图后效果更好。关键点的embedding特征图计算方式如下:
为每个关键点的坐标,W, H为输入图像的宽度与高度,相当于关键点对应那一行或者一列为坐标原点0,然后朝着两个方向缩小或者放大(高斯图效果会不会更好点)。最终,CNN的输入是一个堆叠了33个通道的张量(RGB + 16 angle embedding maps + 14 point embedding maps)
03
光线矫正模块
通过运动预测模块仅仅实现了一个眼睑和瞳孔形变的过程,而生成图像的真实性也离不开重要的光照细节上,光线调整模块将粗细粒度两个阶段的特征和形变后的图像O作为输入,输出一个单独的大小和真实图像相同的映射M,M∈[0, 1]就相当于每个通道下每一个像素的一个光照调节因子,最后简单的逐像素变换,便可以得到最后的转换图像Ofinal。
(光线矫正模块)
04
训练数据
左边为数据采集过程,右边为成对的训练数据(输入:眼部图像+眼部关键点,输出:转换视角后的图像)
目前还没有这类注视角度变换的开源数据集,没有条件,科研工作者们就创造条件,作者找了30个人录制了98个视频序列,每个序列大约有200多个关注的方向(录视频的学生也太难了吧)。每个人录制2-10个视频序列,不同序列的同一个人会有头部姿态、光照和是否戴眼镜的变化,数据的多样性可以使得算法具有更好的鲁棒性。同时,为了减少其他因素的影响,被采集者的头被固定在同一位置,只有眼睛随着屏幕上的点运动而转动。这样就可以保证从同一序列里采样的不同注视角度的两张训练对的头部姿态、光照以及其他参数尽可能的一致。
为了将采集的数据制作成网络训练的格式(右图所示),作者采用了SDM人脸对齐算法对眼睛进行定位,选取了人眼的7个关键点(6个边缘点+瞳孔中心点),并通过关键点计算眼部的边框,将扩大后的边框区域从图片对中截取出来,在训练时,将图片对均缩放到了W × H = 51 × 41的固定大小。
05
实验结果
CFW + LCM (coarse-to-fifine warping + lightness Correction Module) 为本文方法,不同角度下MSE最低,直观效果最佳。
不同角度下的均方误差
不同方法实验结果对比
通过找人来判断,衡量算法生成图像的质量:一组图片包含三张真实眼睛图片和一张生成图片,参与者需要在尽可能短的时间内找出生成图像,前三组数据表示在特定时间内猜对的图片数量(越少越好),最后一组表示所花费的平均时间(越长越好)。
拿Demo搞事情
论文貌似时间太久了(2017年),demo路径不能正常访问了,再也不能愉快地玩耍了,放一些首页的效果图和之前测试的结果。
蒙拉丽莎的思考
梵高,被绑架了,你就眨眨眼
奥巴马的视线也能被控制
来一个斗鸡眼表情包
锄禾日当午,……
最后,Hinton祖师爷镇楼,希望有个好的开始!
长按二维码关注我们
有趣的灵魂在等你