A Neural Algorithm of Artistic Style

reference:

methods part mainly refer to http://blog.csdn.net/elaine_bao/article/details/50502929

and http://www.infoq.com/cn/articles/use-mxnet-in-deep-learning-part02 https://www.zhihu.com/question/47563637/answer/106708095

量化表示“绘画风格”

“绘画风格”是一个抽象定型的词语,它可能和图像的某种高阶统计量相关,但不同的绘画风格有不同的表示,对于一个没有具体定义风格的一般性问题,它很难用人工设计算法去完成。幸运的是,我们知道卷积网络CNN可以通过多层卷积提取物体的抽象特征完成物体识别(请参考Yann
Lecun的深度学习教程
),这一点“提取抽象特性”的能力被作者借用来描述“风格”。也就是说,经过多层CNN抽象之后的图片丢弃了像素级的特征,而保留了高级的绘画风格。下图引用自原论文图1。在文章里,作者定义了一个5层的CNN网络,梵高的星空在通过第一二三层的时候保留了一些原图的细节,但是在第四第五层的时候,就变成了“看起来是梵高星空的样子”这样的抽象特征:

这时候作者机智的想到了,如果把一张梵高一张其他照片同时都放到这个CNN网络里,经过合适的调整让第二张照片在第四五层接近梵高,而第一二三层保持和原来差不多,那就可以模仿梵高了!细节上,作者为了沿用了CNN的特征抽象能力使用了CNN作物体识别的VGG模型。关于mxnet实现CNN作物体类别识别的相关例子,我在下一集会讲到。

学习风格并生成图像

于是让机器模仿绘画风格并生成图片成了一个优化问题:生成的图像要像原内容图,比如我给一张猫的图片最终还是要像猫;生成的图像要像是由风格图画的,比如我给了个梵高的图,我生成的猫的图片要看起来有梵高的风格。

也就是说要找到这样一个中间结果,它的内容表示(第一二三层CNN)接近于猫,它的风格的表示(第四第五层CNN)接近于梵高。

在文章里,作者用一个白噪声图片通过梯度下降生成一个接近内容图的图片,以及另一个白噪声图片生成一个接近绘画图风格的图片。

同时定义了神奇的描述纹理的gram matrix,定义了这两个图的损失函数并加权平均当作优化目标函数,在mxnet的实现里通过梯度下降(SGD)完成收敛找到这样一个内容和风格都搭配中间结果。

举例来说,“猫”和“梵高自画像”的生成过程的200多步的循环里,图像的变化依次如下图所示:

我们可以看到,在刚开始的几十步里,图片更像是原图和绘画的简单纹理的叠加,而随着循环步数增加,程序慢慢学习到了配色和笔触的风格,在150步左右基本成型,最终把破狗的照片绘画成梵高的风格。

模仿风格是不是只有这一个办法?

事实上不是的,很多计算图形学的论文已经针对各种方向做出了一些成果,只是这篇文章利用了深度学习和CNN的方法,其他类似学习风格的论文可以参考相关阅读:

  • "A Parametric Texture Model Based on Joint Statistics of Complex Wavelet Coefficient"http://www.cns.nyu.edu/pub/lcv/portilla99-reprint.pdf这片文章用小波变换的方式提取了图片纹理“风格”所对应的二阶统计量,和本文提到的论文想法是一致的。
  • “Style Transfer for Headshot Portraits”https://people.csail.mit.edu/yichangshih/portrait_web/ 这篇文章针对头像照片的风格做到了很快的风格学习,并且可以实时转换视频,对于这个有严格限制的问题,它的速度比Neural
    art高到不知道哪里去了。

因为风景的表现重点和人像不同,强行把风格画到人像的照片上并不适合,它会看起来像是两幅图简单叠加,这个即使是人类画家也不好画在一起。大家好好玩,下一集会详细讲解卷积网络CNN作物体分类识别,也就是教机器如何识别猫和狗。

style+content=styled content

怎么做呢?首先他定义了两个loss,分别表示最终生成的图x和style图a的样式上的loss

以及x和content图p的内容上的loss,α,β是调节两者比例的参数。

最终的loss function是两者的加和。通过optimize总的loss求得最终的x。

Details

所用的CNN网络是VGG-16,利用了它16个卷积层和5个pooling层来生成feature。

假设某一层得到的响应是Fl∈RNl?Ml,其中Nl为l层filter的个数,Ml为filter的大小。Flij表示的是第l层第i个filter在位置j的输出。

content loss

假设p和x在CNN中的响应分别为Pl和Fl,将他们内容上的loss表示成每个pixel的二范数:

则用梯度下降法,content loss对F求导为:

Style Loss

图x的style表示为Gl∈RNl?Nl,其中Glij=∑kFlik?Fljk,即CNN同一层不同filter响应的互相关,通过描述互相关来表示style。

那么每一层style loss为:

其中style图a的在CNN中的响应为A,那么上式可以解释为图a的style响应和最终生成的图x响应之间的loss。

则总的style loss为每一层的加权和:

Total Loss

在定义好了两个loss的形式以后,又回到了最初的问题,就是最小化总的loss:

要注意的是,不同于一般的CNN优化,这里优化的参数不再是网络的w和b,而是初始输入的一张噪声图片x

最终我们想让他变成右图这样styled content。

Experiments

  1. 对同一张content图片运用不同style的结果如下图所示:

  2. total loss中α和β的比例: 

    从上到下表示的是运用不同conv层的feature进行style,conv1->conv5是一个从整体到局部的过程,即传统的感受野认知;

    从左到右表示的是不同的α/β的比例,10?5->10?2是指更注重style还是更强调content,可以解释为
    1/10000 1/100 的content和style权重

    run.py里有一些可以调整的参数,如果想调试输出效果可以按照如下解释调整:

    • --model 指定模型。例子里暂时只有vgg这一个模型,以后可能添加前面提到的inception等其他模型。暂时先不用改。
    • --content-image 内容图片,比如上面的“破狗”的照片
    • --style-image 输入的绘画原作的路径,比如上面的的“梵高自画像”。
    • --stop-eps 模型里用eps值代表两幅图的风格相似度,在训练的过程里会看到这个值逐渐收敛,值越小相似度越高。stop-eps参数指定的是收敛的终止值,一般越小就代表画的越像,但如果太小了会需要很多的计算时间来收敛,默认0.005已经可以得到不错的效果,可适当减小到0.004等。
    • --content-weight --style-weight 内容图片和绘画原作的相对权值,默认是10:1,如果发现绘画风格过于强烈涂抹一片,可适当修改为20:1或者30:1,反之改小。
    • --max-num-epochs 最大收敛步数,默认是1000步。不过一般画作在200步左右就能找到差不多合适的eps风格相似值,这个最大收敛步数不需要修改。
    • --max-long-edge 长边最大边长。程序会自动把输入图片按照这个值等比例缩放,比如上面的图就是缩放到高度为512像素。程序运行时间及内存消耗约和图片面积成正比,因为卷积网络的计算量每个像素相关,700像素的图片差不多比500像素的图片多一倍内存和运行时间。在接下来的对比测试里面可以看到,512像素的图差不多需要1.4GB显存,适合2G显存的显卡比如nvidia显卡的macbook pro等娱乐一下就足够了,4GB的显卡差不多最高可以处理到850-900像素的图片,要想上1080p就得有Titan
      X的12GB了。同样的,计算时间也会相应拉长,它也和显卡的CUDA核心数约成反比。现在你基本上明白了为什么上面提到的免费版都需要排队几个小时到几周不等了。
    • --lr logistic regression的梯度下降(SGD)学习率,用来寻找既在内容上满足“像破狗”又在风格上“像梵高”的生成图像。较大的eta收敛较快,节省计算时间但会在最小值附近跳跃。默认值0.1,可以调整到0.2和0.3都可以。
    • --gpu 使用第几个GPU,默认是0号GPU,适合只有一块显卡的用户(比如我家里的机器)。如果土豪你有4块显卡可以并行使用,只需要指定为 --gpu 0,1,2,3就可以了,8块显卡以此类推,mxnet支持多块显卡并行而且显存分配效率很高。如果没有GPU并能忍耐40分钟左右算一张图,--gpu
      -1
      也可以指定为纯CPU计算。
    • --output 输出文件名。
    • --save-epochs 是否保存中间结果,默认每50步保存一下结果。
    • -remove-noise 降噪参数,默认0.2,可以降低一些为0.15,这就是高斯降噪的半径。程序在学习模仿画作的过程里会使用两个白噪声图片逼近风格图和内容图,在最终生成的图片里面可能残留一些不必要的噪声点,程序里面可以降噪处理。
    512像素边长的图片

    内存消耗


    运行时间


    MXnet


    1440MB


    117s


    Lua Torch 7


    2809MB


    225s

    相关参考:

    Image Synthesis

    不同风格的图像合成

    和Neural Art相似,比如这一篇文章:

    Combining Markov Random Fields and Convolutional Neural Networks forImage Synthesis

    http://arxiv.org/pdf/1601.04589v1.pdf

    将老爷车的风格融入现代汽车中,设计出的新款型,非常有意思

时间: 2024-07-31 09:15:29

A Neural Algorithm of Artistic Style的相关文章

【每一个人都是梵高】A Neural Algorithm of Artistic Style

文章地址:A Neural Algorithm of Artistic Style 代码:https://github.com/jcjohnson/neural-style 这篇文章我认为可以起个浪漫的名字--每一个人都是梵高. 主要做的一件事情非常有意思.就是例如以下图的等式,通过将a图的style和p图的content进行融合.得到第三幅图x.style+content=styled content 怎么做呢?首先他定义了两个loss.分别表示终于生成的图x和style图a的样式上的loss

【每个人都是梵高】A Neural Algorithm of Artistic Style

文章地址:A Neural Algorithm of Artistic Style代码:https://github.com/jcjohnson/neural-style 这篇文章我觉得可以起个浪漫的名字--每个人都是梵高.主要做的一件事情很有意思,就是如下图的等式,通过将a图的style和p图的content进行融合,得到第三幅图x.style+content=styled content怎么做呢?首先他定义了两个loss,分别表示最终生成的图x和style图a的样式上的loss,以及x和co

Artistic Style 3.1

Artistic Style 3.1 Tab 选项 下面的示例显示空白字符.一个空格(space)用一个 . 表示,一个制表符(tab)用 > (大于号) 表示. ** 默认缩进 ** 如果没有设置缩进选项,则使用 4 个空格的默认选项 (例如 - s4 --indent=spaces=4). with default values: void Foo() { ....if (isBar1 ............&& isBar2) // 这一行的缩进可以用最小条件缩进来改变 ..

Artistic Style在windows下的使用(C/C++)

ArtisticStyle是一个开源的源代码格式化工具.主页地址为:http://astyle.sourceforge.net/,它可以应用在C.C++.Objective-C.C#.Java等程序语言中.http://astyle.sourceforge.net/astyle.html中为对使用它的详细介绍. 从http://sourceforge.net/projects/astyle/files/下载windows下文件AStyle_2.05.1_windows.zip,解压缩后,将ASt

【原创】梵高油画用深度卷积神经网络迭代十万次是什么效果? A neural style of convolutional neural networks

作为一个脱离了低级趣味的码农,春节假期闲来无事,决定做一些有意思的事情打发时间,碰巧看到这篇论文: A neural style of convolutional neural networks,译作卷积神经网络风格迁移. 这不是“暮光女”克里斯丁的研究方向吗?!连好莱坞女星都开始搞人工智能发paper,真是热的可见一斑! 这篇文章中讲述了如何用深层卷积神经网络来将一张普通的照片转化成一幅艺术风格的画作(比如梵高的星夜),可以看做是DL(deep learning)在NPR(非真实渲染non p

(转) The Incredible PyTorch

转自:https://github.com/ritchieng/the-incredible-pytorch The Incredible PyTorch What is this? This is inspired by the famous Awesome TensorFlow repository where this repository would hold tutorials, projects, libraries, videos, papers, books and anythi

(转) Learning Deep Learning with Keras

Learning Deep Learning with Keras Piotr Migda? - blog Projects Articles Publications Resume About Photos Learning Deep Learning with Keras 30 Apr 2017 ? Piotr Migda? ? [machine-learning] [deep-learning] [overview] I teach deep learning both for a liv

Awesome Deep Vision

Awesome Deep Vision  A curated list of deep learning resources for computer vision, inspired by awesome-php and awesome-computer-vision. Maintainers - Jiwon Kim, Heesoo Myeong, Myungsub Choi, Jung Kwon Lee, Taeksoo Kim We are looking for a maintainer

Applied Deep Learning Resources

Applied Deep Learning Resources A collection of research articles, blog posts, slides and code snippets about deep learning in applied settings. Including trained models and simple methods that can be used out of the box. Mainly focusing on Convoluti