zoukankan      html  css  js  c++  java
  • A neural algorithm of artistic style论文理解

    本文的核心思路如下: 
    - 使用现成的识别网络,提取图像不同层级的特征。 
    - 低层次响应描述图像的风格,高层次响应描述图像的内容。 
    - 使用梯度下降方法,可以调整输入响应,在特定层次获得特定的响应。 
    - 多次迭代之后,输入响应即为特定风格和内容的图像。

    本文介绍一个酷炫的深度学习应用:风格迁移。作者Gatys等人在2015年提出基于神经网络的风格迁移算法[1],随后发表在CVPR 2016上[2]。斯坦福大学的Justin Johnson(cs231n课程的主讲人之一)给出了Torch实现neural-style([3])。

    Figure.1. 内容重构与风格重构
    内容重构content reconstruction
    给定一张图片p⃗ p→和训练好的卷积网络,那么在每层可以得到多个feature map,个数取决于每层滤波器的个数NlNl。我们把个feature map向量化,得到大小为MlMl的向量。把每一层的NlNl个特征向量保存到矩阵Fl∈RNl×MlFl∈RNl×Ml中,其元素FlijFijl表示第ll层的第ii个滤波器在位置jj上的激活响应。
    现在指定一层的特征表示,希望生成一张新的图片x⃗ x→使其在该层的特征表示PlPl等于原特征表示FlFl(内容匹配)。定义损失函数如下:
    Lcontent(p⃗ ,x⃗ ,l)=12∑i,j(Flij−Plij)2.(1)
    (1)Lcontent(p→,x→,l)=12∑i,j(Fijl−Pijl)2.
    文中是通过把x⃗ x→初始化为白噪声图片,然后通过反向传播算法进行优化得到的。其实生成的x⃗ x→可以认为是该层特征向量包含的信息的可视化。

    高层的特征映射只包含了图像的内容(高层次)以及图像的空间结构信息,忽略了颜色、纹理及形状等信息。

    风格重构style reconstruction
    本文用Gram矩阵作为风格图片的风格。
    Gram矩阵包含了图片纹理信息以及颜色信息,其定义如下:
    Glij=∑kFikFjk(2)
    (2)Gijl=∑kFikFjk

    于是Gl∈RNl×NlGl∈RNl×Nl,称为风格表示style representation。现在希望通过反向传播算法优化白噪声图片,使其风格特征和原风格特征一致。给定风格图片a⃗ a→,希望生成的图片为x⃗ x→,对应第ll层的Gram矩阵分别为AlAl和GlGl,定义该层损失函数如下:
    El=14N2lM2l∑i,j(Glij−Alij)2,(3)
    (3)El=14Nl2Ml2∑i,j(Gijl−Aijl)2,

    总损失函数为
    Lstyle=∑l=0LωlEl,(4)
    (4)Lstyle=∑l=0LωlEl,

    ωlωl是每层的权重,文章中取style层对应的权重是style层数目的倒数,其他层权重为0。
    看到到这里不得不问两个问题:为什么Gram矩阵可以表示图片的风格?是否有其他方法表示图片风格?

    风格迁移
    为了生成融合图片a⃗ a→的风格和图片p⃗ p→的内容的图片x⃗ x→,同时最小化图片x⃗ x→与p⃗ p→的某层内容表示之间的差距和x⃗ x→与a⃗ a→的多层风格表示之间的差距。损失函数为
    Ltotal(p⃗ ,a⃗ ,x⃗ )=αLcontent(p⃗ ,x⃗ )+βLstyle(a⃗ ,x⃗ ).(5)
    (5)Ltotal(p→,a→,x→)=αLcontent(p→,x→)+βLstyle(a→,x→).
    实验
    网络模型采用19层的VGG网络。首先以内容图片作为输入,得到内容层的特征矩阵,作为内容目标;以风格图片作为输入,得到风格层的Gram矩阵,作为风格目标。在VGG中添加内容损失层以及风格损失层,以白噪声图片作为输入,通过反向传播计算损失函数关于输入的梯度,然后更新图片。这个过程不同于一般的训练过程:并不更新中间层的参数,这是Deconvolution操作。

    Johnson的复现实验[3]指定输入图片的大小默认为512*512,这个时候需要的内容大概是4.5G(通过监控实验过程中消耗的内存百分比得到的)。我的GPU内存只有3G,所以如果在GPU上运行程序,会出现内存不够的错误。所以改用较慢的CPU,为一幅图片进行风格迁移花了大概50mins。

    算法存在的问题
    本文算法虽然生成的图片看起来很不错,但是仍存在以下问题:

    由于每次迁移都要对网络进行训练,速度是非常慢的,无法实现实时迁移;
    应用在照片上进行风格迁移,会出现失真的情况;

    针对第一个问题,Johnson提出的fast-neural -style在本文网络模型前增加一个转换网络,转换网络的输入是内容图片,输出是风格迁移图片。而本文的网络模型称为损失网络,用于计算损失。为每个风格图片训练一个网络,这样在测试时,给定一张内容图片,只需要一次前向过程即可得到生成图片。关于此改进的详细信息,请查看博客 深度学习之风格迁移(二)——Fast Neural Style(Johnson) 。

    这对第二个问题,康奈尔大学和Adobe公司合作推出了一篇文章:Deep Photo Style Transfer,通过对损失函数进行改进,使得可以在照片之间进行风格迁移且不失真。具体请看博客 深度学习之风格迁移(三)——Deep Photo Style Transfer(Fujun Luan) 。
    (要把存在的问题以及解决的方法看一下)

  • 相关阅读:
    2019年江苏大学885编程大题
    2018年江苏大学885编程题
    python-类和对象
    unity游戏框架学习-登录模块
    unity游戏框架学习-AssetBundle
    记 Firebase Crashlytics 接入遇到的坑
    c# 枚举Enum
    unity性能优化-UGUI
    unity性能优化-GPU
    unity性能优化-CPU
  • 原文地址:https://www.cnblogs.com/h694879357/p/13372969.html
Copyright © 2011-2022 走看看