利用神经网络进行艺术风格迁移

来源:互联网 发布:java helloword 编辑:程序博客网 时间:2024/05/29 19:38

原文链接:
https://jvns.ca/blog/2017/02/12/neural-style/
How do these “neural network style transfer” tools work?

是否能利用机器学习来自动把我画的画变得更有艺术感?

于是我决定花点时间去理解一下如何实现,重要的是里面的数学原理,而不仅仅是直觉的感受。我从A Neural Algorithm of Artistic Style文章开始,因为它写得简明扼要。

这篇文章的作者另外还建立了一个在线艺术风格迁移的网站,deepart.io。

这里写图片描述

“风格”和“内容”
这篇论文的核心思想就是,你能从一副图像中提取出“风格style”(比如梵高的夜空风格)以及“内容content”(比如你能在画中看出河边有匹马)。你可以告诉机器,”把A用B的风格再画一遍“。

这样讲还不够清楚。神经网络干的事都是数学,所以是怎么用数学定义“风格”呢?这就是这篇文章试图做的事,我们在此简单解释一下。

一个用于分类识别的网络
这些有艺术感的神经网络,倾向于直接包含一个特别的神经网络。这个被用于风格迁移的特殊神经网络在这篇文章中有介绍,出自Oxford大学的VGG团队。

这个网络的目的不是去创造什么有艺术感的东西。它的目的是图像识别,能够识别出图像中是猫还是马。

这个特别的网络赢得了ImageNet2014年的图像识别大赛识别定位组的冠军。
定位,就是说你必须在图片中识别出物体,并且指明这个物体在哪。

我们要定义”风格“和”内容“,那这个网络又是怎么帮助我们去定义呢?

”内容“和”风格“的数学定义
你可以在这里看到神经网络的结构

这里写图片描述

当我们把一张图片输入到这个网络中,会在开始处变成一系列向量(每个像素上包含 红/绿/蓝 三值,代表了图像长什么样)。而在网络的每层中,我们能得到中间向量,它们并没有内在的含义。

但是!如果我们想,我们还是能够随意从中间向量中挑出几个说“你看,我觉得这几个就是代表图像’内容‘的。”

在那篇文章中,他们就把“conv4_2”层当作图像的“内容”层。这看起来有点随意,它不就是网络里比较深的一层嘛。

而定义“风格”就有点复杂了。如果我理解正确的话,定义“风格”这件事,正是那篇文章的独特之处——他们不是就挑了一层说“这个就是‘风格’层”。他们把一层中的所有特征图都拿来(针对每个特征,每一层基本上都有大量的向量),然后对那些向量两两作内积,即求Gram矩阵。这个Gram矩阵就是风格。

我还是不能完全理解内积这件事。这篇文章里可能有更好的解释:Texture Synthesis Using Convolution Neural Networks。

在文章中,他们对不同的看起来能代表风格的层(conv1_1,conv2_1,conv3_1,以及conv4_1)做了实验,也得到了不同的结果。

所以,我们就把conv3_1的Gram矩阵当作“风格”吧,把conv4_2的向量当作图像的“内容”吧。

用油画的风格画你的房子
我们已经定义好了什么是“风格”,什么是“内容”。

我现在有一副画,画的是在河边有很多房子。这幅画里有我想要的内容(就是你在神经网络中的conv4_2层得到的向量)。
另外还有一副梵高的《星空》。这幅画里有我想要的风格,就是当你把画塞进神经网络后,在conv3_1层作Gram矩阵得到的向量。

所以!是否能得到一副画,同时包含“河边有很多房子”的内容,和《星空》的风格呢?开篇提到的文章就做到了。

我们先从一些白噪声开始,把它们当作我们生成图像的基础,然后定义一个损失函数(“how different is the style from the painting, and how different is the content from the photo?”损失函数描述生成图像与风格图像及内容图像之间的差异)。在文章中有公式7如下:
这里写图片描述

然后我们利用梯度下降原理去改变我们的白噪声图像,直到我们能使上面的损失函数值达到最小值。我的感受是,梯度下降速度是很快的,所以我们的确能够快速得到一副图像,它既有“河边房子”的内容,也有《星空》的风格。

或许你奇怪的直觉是对的

令我感到激动的是,这件事我本以为是不可行的。所以或许我对神经网络和艺术之间的其他奇怪想法,都是有可能实现的。当然我得尽可能地去尝试,直到我找到一个合乎逻辑的数学方法去实现他们!我其实没多少时间去做神经网络的实验,但是我或许能找到些别人做的。The Unreasonable Effectiveness of Recurrent Neural Networks 这篇文章值得读一读。

如果你想了解更多数学上的细节,还是要看看开篇提到的文章。它讲的清晰明了,尽管我还是有点不太理解为何那样定义风格。(取决于你对偏导数的理解程度)。我可能在这方面理解会有些问题,毕竟我刚接触神经网络,但我觉得是对的。如果有任何错误情联系我。

这个针对生成音乐和艺术的讲座值得看一下。

补充待续…

0 0