标签:
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的方法,其他类似学习风格的论文可以参考相关阅读:
style+content=styled content
怎么做呢?首先他定义了两个loss,分别表示最终生成的图x和style图a的样式上的loss
以及x和content图p的内容上的loss,
最终的loss function是两者的加和。通过optimize总的loss求得最终的x。
所用的CNN网络是VGG-16,利用了它16个卷积层和5个pooling层来生成feature。
假设某一层得到的响应是
假设p和x在CNN中的响应分别为Pl和Fl,将他们内容上的loss表示成每个pixel的二范数:
则用梯度下降法,content loss对F求导为:
图x的style表示为
那么每一层style loss为:
其中style图a的在CNN中的响应为A,那么上式可以解释为图a的style响应和最终生成的图x响应之间的loss。
则总的style loss为每一层的加权和:
在定义好了两个loss的形式以后,又回到了最初的问题,就是最小化总的loss:
要注意的是,不同于一般的CNN优化,这里优化的参数不再是网络的w和b,而是初始输入的一张噪声图片x
最终我们想让他变成右图这样styled content。
对同一张content图片运用不同style的结果如下图所示:
total loss中
从上到下表示的是运用不同conv层的feature进行style,conv1->conv5是一个从整体到局部的过程,即传统的感受野认知;
从左到右表示的是不同的
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,这就是高斯降噪的半径。程序在学习模仿画作的过程里会使用两个白噪声图片逼近风格图和内容图,在最终生成的图片里面可能残留一些不必要的噪声点,程序里面可以降噪处理。
|
内存消耗 |
运行时间 |
MXnet |
1440MB |
117s |
Lua Torch 7 |
2809MB |
225s |
A Neural Algorithm of Artistic Style
标签:
原文地址:http://blog.csdn.net/u011534057/article/details/51911562