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。 
假设某一层得到的响应是 FlRNlMl ,其中 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表示为 GlRNlNl ,其中 Glij=kFlikFljk ,即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是一个从整体到局部的过程,即传统的感受野认知; 
    从左到右表示的是不同的 α/β 的比例, 105 -> 102 是指更注重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 也就是我们熟知的CNN+MRF这一套 :)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值