干货 | 谈谈最近爆火的德国神经学家的CVPR风格化工作

最近由于一条微博,加上又在知乎热烈地讨论过了【点击阅读原文可访问知乎原帖】,于是这群德国计算机神经网络科学家提出的可以让电脑模仿任何画家的风格作画的论文一下子火了!大S和好基友SEM最近也在研究相关的内容,所以在这里就结合各位知乎大神的论点,跟大家分享我们对这篇文章的一些看法以及现在demo的运行方法。

这篇由Leon A. Gatys, Alexander S. Ecker, Matthias Bethge提出的A Neural Algorithm of Artistic Style 原文,目前发布在arXiv上面了,具体链接为http://arxiv.org/abs/1508.06576 ,预计要投稿至CVPR2016。【感觉照现在的舆论优势必中啊><】

下面大S来简要介绍一下自己阅读论文之后的简要思路。

这篇文章主要是从神经网络的角度,基于Convolutional Neural Networks,对图片进行了不同层次的分解,然后通过Style Representation和Content Reconstruction两个方面构建映射关系,从而进行风格转换,主要还是一个Global的方法,所以在具体detail的处理上面还存在瑕疵。

实际上 ,在CNN卷积神经网络中,每一层都可以被理解为多个图像滤波器的集合,每个滤波器能够从输入图片中提取出一定的特征。这种特征空间包含了基于特征图的空间信息上不同滤波器的关系。

在Content Reconstruction中可以发现,在网络中的较高层,一些细节的像素信息发生丢失,但是高层的内容信息仍然保留。Style Representation则能够表示在CNN不同层中不同特征的关系。因此在CNN网络中分别获得了内容Content和风格Style的表达。

文中认为我们需要保持原图和结果图的高层语义特征之差尽量小,而作者则认为所谓风格就是所有卷积层的特征。【这里大S其实还是有些困惑的...但是毕竟所谓“风格”目前是无法被准确定义的】作者使用了所有空间位置上【考虑了风格的全局共享性】,特征的协方差矩阵来衡量特征的分布。通过减小原图和风格图的特征分布之间的差距,使得原图和风格图的风格尽量接近。

这篇论文核心价值是把部分artistic style用neural network 方法pattern化了。算法第一个关键点是对content和style的界定,第二个关键点,以及尤为神奇的地方则是那个相关矩阵定义的loss function的使用,通过loss function的运用调整content和style的搭配使得在保持content的情况下完美的添加style!同一批作者也在arXiv还有一篇Leon A. Gatys, Alexander S. Ecker, Matthias Bethge. Texture synthesis and the controlled generation of natural stimuli using convolutional neural networks. arXiv:1505.07376 [cs, q-bio] (2015). ArXiv: 1505.07376. 也是跟这个相关,感兴趣的伙伴们也可以再去仔细看看这篇。
目前有人在 GitHub 上公开了自己的实现https://github.com/kaishengtai/neuralart,但是安装相关平台过程非常繁琐,大S试了一下感觉非常复杂,各种配置要求较高,大S在这里特别邀请了好基友SEM来跟大家分享他配置的经验。

根据描述,这个模型是用一系列开源工具在GPU上训练出的深度神经网络,用到的工具有:CUDA,CAFFE,TORCH7。CUDA是NVIDIA推出的运算平台,用于GPU并行计算;CAFFE是Berkeley BVLC实验室的贾扬清写的深度学习框架,需要安装CUDA才能使用。CAFFE是个很好的深度学习工具,SEM用过几次,感觉它把常用的网络都实现并封装好了,比如卷积层、全连接层、几种损失函数等,我们只需根据自己的设计将网络拼装起来就好,其编写就像写配置文件一样简单。CAFFE是用C++写的,有matlab和python接口,速度比较快,适合商业和科研用途。TORCH7也是机器学习的工具,SEM没有用过,并不了解。

下面说说具体如何将代码运转起来。首先,机器需要有支持CUDA的GPU,而且要装好配套的显卡驱动(驱动配套非常重要)。接着我们来安装CUDA和CAFFE,网上有很多教程,SEM参考的是http://www.cnblogs.com/platero/p/3993877.html。这个是CAFFE + Ubuntu14.04 + CUDA6.5配置教程,现在已经出到了CUDA7.5,不过不推荐使用最新的,SEM使用的是CUDA7.0,配置方法类似,其中matlab和python这次可以不装。其实配置的过程很可能出现各种问题。SEM配置的时候,花了一整个晚上,最后根据错误日志一点点把缺的东西都装了,该更新的都更新了,眼泪很多。接下来安装TORCH7。网上有说需要安node.js等好几个东西,但SEM并没有安,参照的是http://blog.csdn.net/a130737/article/details/45745467,感觉很简单。readme中说还需要安loadcaffe和cudnn.torch。SEM不知道loadcaffe是什么,就点进了它的链接https://github.com/szagoruyko/loadcaffe,根据它的readme安装了,很简单很顺利cudnn.torch,是NVIDIA出的GPU加速工具,SEM没有管它,因为其实此时SEM已经把机器上的GPU拆了……
至此,环境已经搭好了,可以直接下代码运行了。下载完代码,进入根目录后,运行 th neural_style.lua -style_image image.jpg -content_image image.jpg –gpu 0. 其中,-style_image后跟风格图片名,-content_image后跟你想要转变风格的图片名,-gpu后跟GPU编号(一般都是从零开始编号,只有一块GPU的话就写0),-1代表CPU。例如:SEM使用的命令是:

th neural_style.lua -style_image data/style-1.jpg -content_image data/input-1.jpg –gpu -1

程序默认运行1000次迭代,每一百次迭代会保存一个结果,结果默认保存在根目录。程序支持很多参数,具体见readme。
运行时间方面,Readme中说,在默认配置下用泰坦X跑一副图片大概2分钟,用Core i7-4790k的CPU跑大概40分钟,有人说用K40跑大概要一分半,而SEM用的Xeon e5 2630要一个多小时……,高下立判。效果方面,一开始玩的时候觉得挺新奇挺吃惊的,跑了几幅图片后就发现,其实效果和理想还是有一定差距的(当然,这个模型和想法很厉害,我等底层科研人员是肯定做不出来的)。

SEM跑了几组结果,觉得其实虽然总体看起来炫酷,不过在detail方面还是有很多缺憾处理的不够好。如果加上更多风格化的局部约束或许会更好,因为风格毕竟是一个又Global又Local的内容,画家的艺术风格不仅需要总体的和谐,在很多细节也有不同的处理方法让画面看起来更具艺术性。如果拿一幅风景油画去处理一幅人像来做风格迁移,某种程度上效果就不一定会好,因为整体的处理风格可能就不对应。不知道大家有什么看法呢?

恩,完全不像蒙娜丽莎...这张真是风格太难模仿!

经典的戴珍珠耳环的少女!大S的女神斯嘉丽约翰逊当年也是美美美!场景一致的前提下效果还是不错的~

Taylor隆重登场!梵高这明显的线条果然被直接搬过去了,人脸失真的真奇怪...

最后,这张风景还是相当不错哒!

另外,Stanford最近搞了一个implementation https://github.com/jcjohnson/neural-style,然后也还是需要安装很多相关的内容,大家也可以试试看。还有最近发现的最新版本python实现https://github.com/andersbll/neural_artistic_style,应该相对比caffe和torch配置起来简单一些。
当然了还有大神们做了一个微信公众号,叫「画风刷」,大家只要把图片传上去,就可以得到指定某几种画风的结果啦!这样就可以避免要配置环境的问题了,他就是基于Stanford的implementation并做了进一步优化,目前计算时间在2分钟左右。大S大概试了一下,效果还是不错哒!
这篇文章算是开了神经网络做风格化的先河吧,很期待之后可以实现到什么样子!不过大S认为科学是科学,原创的艺术创作那种丰富的想象力是机器不可比拟的,也是不可取代的。

原文地址:https://www.cnblogs.com/shishupeng/p/5694783.html