这两天,在一个根本不存在的社交平台FB上推出了一个新功能,可以让拍照时不小心闭上的眼睛,重新睁开,效果如下:

图像识别ai原理(闭眼变睁眼白昼变夜间)(1)

事实上Photoshop Elements 2018里也有一个后期睁眼的功能,下面是闭眼原图、PS睁眼和FB睁眼的对比:

图像识别ai原理(闭眼变睁眼白昼变夜间)(2)

非常明显,FB的睁眼方案真实度更高,一个社交平台居然干翻了几乎是最权威的摄影后期软件,这充分说明了一个问题:在图像处理端,我们已经进入到了算法为王的时代,迷信“权威”并不一定可取。

FB睁眼术的背后,是基于名为“Generative Adversarial Networks” ,简称GANs的深度学习模型,这套算法目前在NVIDIA的支持下,于图形处理相关领域已经有了相当多的应用,比如这张GIF:

图像识别ai原理(闭眼变睁眼白昼变夜间)(3)

全都是欧美明星的照片,看起来很真实,但实际上这些照片从人到背景都是假的!全是通过GANs训练并深度学习模拟计算得出。除此之外通过GANs,NVIDIA还实现了将图像中拍摄的环境做大幅度变换的计算,如下图:

图像识别ai原理(闭眼变睁眼白昼变夜间)(4)

1、3列为原图,2、4列为与之对应的计算结果,第1行演示为白昼与黑夜的切换,第2行则是晴天与雨天的切换,第3行是夏季与冬季的切换,第4行则是改变了路面铺装材质。虽然即便是小图也能看到瑕疵,但GANs作为一种比较激进的深度学习算法,最大的特色就是采用了生成器和判别器的双重机制。

传统的训练机制需要把素材在训练前先一张张地打标签,才能丢到训练器里,数据量大的情况下就会相当费时。而GANs不需要打标签,生成器会根据训练素材来生成样本,而判别器的工作就是区分样本和真实照片,判别为假就打回去重做,这个对抗会一直持续下去,所以生成器通过不断出样、修改、出样、修改……最后生成与真实照片足够相似的样本,瞒过判别器,获得输出。也就有了前面那些名人的假照片,和大幅改变环境样貌的结果。

图像识别ai原理(闭眼变睁眼白昼变夜间)(5)

在这个基础上,实现上图这种美颜效果也不难。但需要注意的是,比起纯粹的美颜算法,GANs并没有明显的优势,这是因为它目前还没有达到特别精细化的水平,而且还没有办法做到很好的是实时演算。


接下来是简单的原理部分,但不涉及太深,只聊个大致,没有基本概念可能看不懂,可以直接跳到后续部分,我有划分割线:

GANs属于宽进严出型的两层式训练法,基本法则是设判别器认定真实样本的数值为1,生成样本为0,对生成器而言就是让生成样本的判别数值尽量靠近1,以获取以假乱真的效果,也就是让输入的x,在经历生成器LG(x)、判别器LD(LG(x))后,得到一个约等于x的值,也即:

图像识别ai原理(闭眼变睁眼白昼变夜间)(6)

图像识别ai原理(闭眼变睁眼白昼变夜间)(7)

生成器LG的函数:

图像识别ai原理(闭眼变睁眼白昼变夜间)(8)

判别器LD的函数:

图像识别ai原理(闭眼变睁眼白昼变夜间)(9)

最终结果是:

图像识别ai原理(闭眼变睁眼白昼变夜间)(10)

这就是基本GANs,因为只有(0,1)值域,所以对应的损失函数是交叉熵f(x)=-log(x),相对比较简单,而且因为基于多层感知,所以训练中也可以辅以很靠谱的反向传播法,理论稳定性还不错。

不过,根据各种GANs变式,损失函数的变化比较大,有二次函数、线性函数、分段线性函数、ReLu、Leaky ReLu等等,选择正确的损失函数才能保证训练结果的收敛和稳定,当然这个就是具体应用具体分析,不多延伸了。


只要控制得当,GANs自动生成的样本就能做到以假乱真,这也是为什么老黄在GTC上会说GANs训练模式是“突破性”的。随便用笔触画一些比一拳超人原作版还要粗糙的框架,就能自动生成一幅完整的照片,比如,先用绿色笔触在画板底部画几笔,就有了草地:

图像识别ai原理(闭眼变睁眼白昼变夜间)(11)

用黑色笔触勾勒一个三角,就有了山峰:

图像识别ai原理(闭眼变睁眼白昼变夜间)(12)

用蓝色笔触在山峰上面简单涂抹,就有了蓝天:

图像识别ai原理(闭眼变睁眼白昼变夜间)(13)

再用白色笔触在山顶上轻点几下,就有了积雪:

图像识别ai原理(闭眼变睁眼白昼变夜间)(14)

而且可以看到在操作界面右侧还有多种备选效果。除此之外利用GANs训练模式,除了天候的变化之外,还可以实现具体物体的变化,比如普通的马变成斑马、一筐橘子变苹果、甚至可以把照片在莫奈、梵高、塞尚甚至浮世绘的画风中互相切换:

图像识别ai原理(闭眼变睁眼白昼变夜间)(15)

图像识别ai原理(闭眼变睁眼白昼变夜间)(16)

GANs在很多研究里的主要方向就是图像修复和替换,那自然也能让改变虚化效果,效果如下图:

图像识别ai原理(闭眼变睁眼白昼变夜间)(17)

不过就真实性来讲,没有办法跟专用的景深算法相媲美。在这方面比较典型的是谷歌的单摄算法,它使用的是图像分割人脸识别,以及双核像素1mm左右的光场基线差获取的离散数据,在渲染时以此为依据来划分深度图层,进行不同程度的模糊化处理,这个说起来又是一篇长文,以后再详聊吧。总之,GANs是属于通用型训练模式,比起已有的专项用途算法来说,它不一定是更好的替代,但潜力显然是巨大的。

而且就目前来看,即便是商业化的算法也有出现错误的几率,对于GANs来说自然也不例外,下列图集就是错误示范:

图像识别ai原理(闭眼变睁眼白昼变夜间)(18)

对于现阶段的GANs训练模式来说,虽然它能大量节约时间,比较省成本,但它的输出效果不太经得起细看,换句话说就是无法完成高复杂度的图像解析,而且算法变式较多,稳定输出需要比较专精的研究,走到前端的目前也就只有FB的睁眼术,不过毫无疑问这起了一个好头。对于图像处理来说,通过机器学习、深度学习得到的辅助方案可以更方便地还原、改变甚至创造内容,这对于需要高效生产力(比如电影业)来说意义非凡,当然,应用到摄影上也能一步步地实现高阶后期的一键化、傻瓜化,再配合手工精修,同样具备很高的现实意义。

不过,有造假的,就有打假的,Adobe也发表了一项基于双数据流Faster R-CNN神经网络的算法,可以通过识别图像中异样的反差和噪声,来判断具体的图像“造假”范围甚至手法:

图像识别ai原理(闭眼变睁眼白昼变夜间)(19)

三行照片分别代表了添加、复制、移除效果,第一列为原图,第二列为修改后,第三列为修改内容。下图是成效对比:

图像识别ai原理(闭眼变睁眼白昼变夜间)(20)

可以看到添加内容、复制物体还是移除物体,Adobe的新算法识别率都比较高。

从算法的角度来看,首先要了解什么是Faster R-CNN,它是随CNN/R-CNN/Fast R-CNN一步步进化而来的图像识别算法,说白了就是把目标识别出来并加入框选,是不是很熟悉?相机里的人脸识别就是典型代表。

但人脸只是图像识别无数个目标中的一个,甚至是相对比较简单,发展也非常成熟的一个。现在要识别的是图像中人为造假的部分,显然需要更聪明的算法甚至算法组合来实现,Faster R-CNN从名字来看就是此类算法中“更快”的那一个,它与前面几种算法的最大不同就是物体边缘也采用神经网络RPN来进行识别,大大减少了候选框的搜索时间,R-CNN需要处理50秒的图像,Faster R-CNN只要0.2秒就能搞定。

速度有了,接下来要解决的就是精度,这就是Adobe采用双数据流的原因,通过RGB和噪声分析,来识别图像中“造假”的部分:

图像识别ai原理(闭眼变睁眼白昼变夜间)(21)

可以看到,RGB流的任务是识别图形中不正常的高反差部分,数据既会通过RPN计算边缘再注入RoI兴趣区池话,也会直接注入;而噪声流则是通过RGB流的SRM(隐写丰富模式)过滤形成噪声蒙版,查找差异区域,并得到相应的RoI。再使用双线性池化组合两者得到的RoI结果,通过全连接层和Softmax层后,获取最终的框选范围。

双数据流的好处在于有2种不同的识别途径,混合结果并识别可以获得很高的精度,比如下图:

图像识别ai原理(闭眼变睁眼白昼变夜间)(22)

第一行,复制左侧的挎包,粘贴在右边并调整一下色彩,单纯的RGB和噪声判定都出现了错误,但混合识别后得到了正确的框选范围。

第二行,桌面下方是从另一张照片PS进去的。可以看到RGB的识别准确度高于噪声,混合后的框选也是以RGB为准。

第三行,中间直接简单粗暴地PS了一只很违和的松鼠,RGB和噪声都能准确识别,最终结果也不例外。

无论是造假还是打假,在图像处理领域,这些有着突破思维的算法对各个视觉处理领域都有着比较深远的影响,求真或许是摄影恒久的核心价值之一,但什么是真什么是假?这或许就要上升到哲学范畴了……

,