论文解读:《Learning Linear Transformations for Fast Image and Video Style Transfer》,CVPR 2019


转载请注明来源:
https://blog.csdn.net/weixin_43959709/article/details/106847669

0. 论文基本信息

论文标题、作者
《自动学习的线性迁移网络实现快速的图片和视频风格迁移》
会议: CVPR 2019 pp. 3809-3817
被引次数:13 (2020/6/19)
开源代码链接:github [1]
我加了注释的代码:我的git仓库
论文链接:paper [2]

1. 论文解决的问题

a、艺术性的图像风格迁移
b、保留图像内容真实性的风格迁移
c、视频风格迁移
风格迁移
论文里面提出了一种基于统计的前馈网络,在训练完模型后,可以直接输入内容图像和风格图像,经过快速的线性前馈计算就能输出转换后的图像,这里输入的内容图和风格图都是任意的。我下载并学习了他们的开源代码,不过没有自己实现。

2. 此前工作的不足

1、计算量巨大
例如论文引用[8]中基于深度学习图像表示的方法,将优化问题减少到一个神经网络中。通过执行图像搜索匹配样本图像的特征表示来生成新图像
2、缺少通用的方法,不支持任意风格
不少快速前馈网络方法都是对每种风格的迁移都单独训练一个网络。有些工作在网络中训练了多种可选风格(如引用[4]中提供32种,引用[17]中提供1000种) ,选择不同风格只需要对训练完的模型简单调整一些超参数,但是只能转换预先设定好的几种风格,不能做到对任意的风格进行转换,只是和对每种风格都训练一个模型的方法相比多了一些可选择性。本质还不是通用的方法
3、已有的通用方法效果不佳
论文内列举和多种已有的方法,但是这些方法或者效果较差,或者计算量很大,不能很好地解决风格迁移问题

3. 论文亮点

1、提出了一个高效的风格转换器(最快能到140fps)
在Titan XP上:256*256的图像能达到100 FPS,512*512的图像能达到27 FPS,在调整一些参数后能最快能达到140FPS
ps:但是用了VGG19,我的GTX 1050只能跑256大小的图片,再大的size我的显存不够
2、可以应用于多种不同的任务
可以很好地应用到如前面提到的艺术图像风格迁移、真实性图像分割迁移、视频风格迁移等任务中
3、提出了一个线性的前馈网络模块来实现高质量的任意风格迁移
和以往不同的是,论文提出的方法使用了线性的前馈网络来生成一个转移矩阵,很好地适应任意的内容和风格图像,还能生成高质量的非扭曲迁移结果(保留图像真实性)

4. 处理框架

1 VGG encoder:提取高层特征
应用预训练的VGG19网络提取内容图和风格图各自的特征
2 线性前馈网络:计算风格迁移矩阵
输入内容和风格图像的特征,以线性前馈的方式计算出风格迁移矩阵 T
3 迁移计算和decoder:生成迁移后的图像
将内容特征与转移矩阵相乘,得到迁移后的特征,并通过decoder解码为目标图像
4 VGG loss:计算损失和反馈
这个部分是训练网络时用来计算损失的,在进行实际风格迁移的时候不执行这个模块
总框架

5. 框架细节理解

0. 基于encoder、decoder进行转换的原理

这篇论文的方法采用了基于特征计算的思想,和AdaIn / WCT类似的,使用自动编码、解码器结构
自动编码、解码器常用在加密场景,一般是编码器先对原来的数据进行加密降维,得到中间层的数据,解码器再对这加密后的低维信息进行还原,得到近似数据,如右上图可以看到输入的x1…xd在加密层加密后只剩下少数几个特征值,经过解码器解码后近似还原得到x1…xd
在这里插入图片描述
图像压缩和还原中,可以通过卷积网络提取特征后,再对特征进行还原得到原来的图像
风格迁移中,就是通过转换内容图的特征,使其和风格图的特征相似,又保有原来的特征。这样还原后具备了风格
在这里插入图片描述

1. VGG encoder和decoder

1、图中的VGG encoder用的是预训练好的VGG19网络,用来提取内容图和风格图各自的特征矩阵Fc和Fs
2、将内容图的Fc经过压缩后(图中的c是compress步骤),与风格转换矩阵 T 进行矩阵相乘,再进行解压(图中的u是uncompress步骤),得到迁移后的特征矩阵Fd
3、对Fd进行解码得到迁移后的图像
论文内VGG encoder是直接使用预训练好的VGG19,decoder是在MS-COCO数据集上预训练好的解码器,这两部分后面不再进行学习。但是压缩步骤c和解压步骤u是需要学习的,这部分是为了保证使用VGG的不同层的特征时,维度相同,其实就是普通的卷积,这部分在下面作者开源的代码中可以看到。作者分别使用了VGG的relu4_1层和relu3_1层输出的两种层次的特征,提取出来的是相对高层/低层的特征,高层特征会更加具有抽象艺术效果。

#Matrix.py
class MulLayer(nn.Module):
    def __init__(self, layer, matrixSize=32):
        ###...
        # 可选两种粒度的特征
        if (layer == 'r41'):
        	# 这里可以看到压缩和解压就是普通的卷积,这样可以固定输出的通道数
            self.compress = nn.Conv2d(512, matrixSize, 1, 1, 0)
            self.unzip = nn.Conv2d(matrixSize, 512, 1, 1, 0)
        elif (layer == 'r31'):
            self.compress = nn.Conv2d(256, matrixSize, 1, 1, 0)
            self.unzip = nn.Conv2d(matrixSize, 256, 1, 1, 0)
        ###...

2. 线性前馈网络:计算风格迁移矩阵

前面提到了风格转换矩阵T,论文的方案是只使用内容图和风格图的特征Fc和Fs就可以直接算出风格迁移矩阵T,使整个模型可以对任意的图像和风格进行迁移,这也是这个框架的核心部分
1 Gram矩阵
“风格”本来就是个比较虚的东西,没有固定的表示方法,论文中采用和其他基于统计的方法一样,用提取特征的隐藏层中的feature map的 Gram 矩阵来表示风格,Gram矩阵又称“风格矩阵”,这个矩阵能很好的模拟图像的本质
Gram矩阵计算式
其中左侧 Gl 代表第 l 层feature map对应的Gram矩阵,Fik代表该层第i个卷积核对应的特征图(通常是二维的)的第K个元素。所以Gram矩阵的每一个元素就是求了个内积,把两个特征图之间,和位置无关的一种相关性给求了出来,故能体现风格特征。

2 通过线性前馈网络计算迁移矩阵
在这里插入图片描述
假设Fc、Fs分别代表内容图、风格图的特征矩阵,Fd表示迁移后的特征矩阵(Fd = T × Fc),用φs来表示假设存在的虚拟的风格特征矩阵,即假设φs = φ(Fs),因为Fs可能通过非线性变换得到φs,所以加了一个变换函数φ()。
目标是最小化Fd的协方差和φs的协方差的偏差函数,即最小化结果图和风格图的Gram矩阵的差距:
在这里插入图片描述
该公式在满足下式取得最小值:
在这里插入图片描述
根据奇异值分解SVD原理,有cov(Fc) = Fc × FcT = Vc Dc VcT 和下式
在这里插入图片描述
因此可以得到 T一个只与 Fc 和 φs 相关的 T 的近似解:
在这里插入图片描述
论文提出的方式是通过图中的线性计算流程(3个卷积层和全连接层)直接计算出一个 T 的近似解,矩阵计算式中假设了这个转换对于 Fc 和 φc有着相对固定的计算关系,在这个流程中的参数就是用来学习这个近似计算关系。

# Matrix.py
class MulLayer(nn.Module):
    """
    用于对输入的内容图 / 风格图的特征计算出迁移矩阵 T, 并进行风格迁移
    """
    def forward(self, cF, sF, trans=True):
        ###...
        # 压缩内容特征到指定大小
        compress_content = self.compress(cF)
        b, c, h, w = compress_content.size()
        compress_content = compress_content.view(b, c, -1)
        
        # 对VGG19提取的内容特征和风格特征再进行3层前馈卷积计算
        cMatrix = self.cnet(cF)
        cMatrix = cMatrix.view(cMatrix.size(0), self.matrixSize, self.matrixSize)
        sMatrix = self.snet(sF)
        sMatrix = sMatrix.view(sMatrix.size(0), self.matrixSize, self.matrixSize)
        # 通过矩阵乘法直接计算迁移矩阵 T
        transmatrix = torch.bmm(sMatrix, cMatrix)
        ###...

3. 迁移计算和decoder

计算出迁移矩阵 T 之后,就是对原图的特征矩阵进行迁移计算并生成结果图
1、对Fc进行压缩操作(compress)使其维度符合与 T 矩阵的相乘
2、对相乘后的结果进行解压操作(uncompress)得到迁移后的风格特征矩阵Fd
这里的解压和压缩是简单的一层卷积(见前面的源码)
3、将Fd输入解码器decoder还原得到迁移后的图像结果
在这里插入图片描述

4. VGG loss:计算损失和反馈

论文使用了一个预先训练好的VGG-19网络来计算多个层次的加权风格损失和一个内容损失
输入为原图Ic、风格图Is、迁移结果图Id
在这里插入图片描述
loss包含2部分:内容损失content loss和风格损失style loss
在这里插入图片描述
在这里插入图片描述
从代码中可以看到两种损失的定义:其中内容损失只用了VGG19的relu_4_1一层特征
而风格损失使用了VGG19的4层特征:relu_1_1、relu_2_1、relu_3_1、relu_4_1

# train.py
# 提取内容特征用的VGG隐藏层
parser.add_argument("--content_layers", default="r41", help='layers for content')
# 计算风格损失用的VGG隐藏层
parser.add_argument("--style_layers", default="r11,r21,r31,r41", help='layers for style')

# Criterion.py
class LossCriterion(nn.Module):
    def __init__(self, style_layers, content_layers, style_weight, content_weight):
        ###...
        # 内容损失默认只用一层提取的特征,可以和风格损失一样设置多层
        self.contentLosses = [nn.MSELoss()] * len(content_layers)
        # 风格损失用了多层输出的损失
        self.styleLosses = [styleLoss()] * len(style_layers)
        ###...
        # 总损失是两者加权相加,权重在初始化时的style_weight, content_weight
        loss = totalStyleLoss + totalContentLoss

可见内容损失用的是内容特征和结果图特征的Frobenius范数(MSELoss),其实就是欧几里得距离
风格损失和其他基于统计的方法的思想一样,是通过神经网络提取的不同层特征的Gram矩阵间差的平方Frobenius范数
在这里插入图片描述

class styleLoss(nn.Module):
    def forward(self, input, target):
        # 分别计算结果图和风格图的Gram矩阵
        ib, ic, ih, iw = input.size()
        iF = input.view(ib, ic, -1)
        iMean = torch.mean(iF, dim=2)
        iCov = GramMatrix()(input)
        tb, tc, th, tw = target.size()
        tF = target.view(tb, tc, -1)
        tMean = torch.mean(tF, dim=2)
        tCov = GramMatrix()(target)
        
        # 对每一层的Gram矩阵差异计算损失,这里多计算了一个均值差异
        loss = nn.MSELoss(size_average=False)(iMean, tMean) + nn.MSELoss(size_average=False)(iCov, tCov)
        return loss / tb

5. 可选的SPN模块:保留图像真实性

SPN:空间传播网络,spatial propagation network,NIPS 2017的论文 [22]
具体数学原理比较复杂,我个人没有很看懂,有兴趣的可以去研究一下:
知乎:在CNN中学习和构建空间传播模块
我对SPN的理解是根据图像的feature去学习一个特定的pairwise similarity,即两幅图中各个像素的关联度或相似度(affinity)。
它包含一个CNN,有4个卷积层+池化层,输出构成像素affinity矩阵的所有局部值,以及一个线性传播层,输出滤波后的图像。
论文将原内容图进行白化(生成灰度图)来避免颜色的干扰,将灰度图作为guide图,扭曲度大的地方在SPN中的affinity会比较低,这样就可以过滤掉生成图中过度扭曲的部分
在这里插入图片描述

5. 实验分析

1. 数据集

MS-COCO数据集:用来做content图。这本来是微软构建的用来做目标检测,目标之间的上下文关系,目标的2维上的精确定位等任务的数据集。包含了8w多张自然图片以及生活中常见的目标图片,背景比较复杂,目标数量比较多,目标尺寸很小。
WikiArt数据集:用来做style图。里面是WikiArt.org里面的艺术图片,来自四种西方风格(文艺复兴时期艺术,文艺复兴后艺术,现代艺术和当代艺术)的22个类别(印象派,现实主义等),论文用了约8w张图

2. 评价指标

风格迁移中主观因素较强,没有很合适的指标和对应的标签数据,有些实验的评价指标采用了人工投票、热度图(heat map)、速度(fps),有些直接描述直观感受

3. 实验设计

模型设置
1. encoder-decoder部分:
编码器来自于在ImageNet数据集上预先训练的VGG-19模型。
解码器在MS-COCO数据集上从零开始重构图像。
然后在剩余的网络训练过程中固定encoder和decoder(不再优化这部分)。

2. 风格迁移部分:
需要学习的有提取特征用的两个3层卷积层(内容图和风格图各自有一个3层卷积层)。
后面的实验会验证将内容图和风格图的卷积层独立开来的必要性。
还有用来维持合适维度的compress和uncompress部分都是一个卷积层,也是需要学习的部分。

3. loss部分:
计算特征时用的也是预训练好的VGG-19模型。

4. 实验结果

1. 风格迁移矩阵计算时的两个独立卷积层的必要性

设计原因:如果Fc和Fs都用同一个卷积层来再提取特征可以减小模型量,那独立为两个网络有没有必要性?
结果:使用共享卷积层时模型无法收敛,因此将内容特征和风格特征分开计算是必要的
在这里插入图片描述
2. 选择风格迁移矩阵计算时的输入
设计原因:迁移矩阵 T 的计算模块可以有三种输入:图片本身、VGG提取的feature map、gram矩阵。本实验是为了验证效果最佳的输入是Gram矩阵。

做法:在使用图片本身的时候,Conv层为5层而不是3层。图片本身和feature map都不进行cov的矩阵乘法。

结果:输入图片的效果不佳,图中©第二行的patch仍然保留了原始内容图像的颜色像素。而使用Gram矩阵计算时比用feature map获得了更多style的特点,如(e)中有更多的抽象线条。因此使用Gram矩阵来计算迁移矩阵 T 是更合适的。
在这里插入图片描述

3. 风格迁移时采用的特征层和计算loss采用的特征层
设计原因:计算风格迁移矩阵时输入的特征可以是VGG encoder计算出来的任意层特征,风格损失也可以选用最后的VGG网络计算出来的任意层的特征,那么选用哪层或哪些层对模型学习效果更好?
做法:encoder选用了relu3_1和relu4_1两层。loss module选用了relu1_1,relu2_1,relu3_1,relu_4_1以及全选
结果
1、低层的内容特征(行(i)中的relu3_1)和低层次的单一损失(列(a)中的relu1_1、列(b)中的relu2_1)有更具真实性的视觉效果。
2、高层的损失(如列©和(d)),可以生成更加具风格图特点的图像。
3、对于所有类型的样式损失,encoder在relu3_1(行(i))生成的图要比在relu4_1(行(ii)) 生成的结果真实性更强
4、论文中的方法的效果比WCT方法的效果好的多,后者在轮廓、扭曲度上都不如论文的方法
分析:论文提出的方法能够很方便地通过选用不同的特征层的组合来获取不同的艺术风格效果和真实度,且效果很好
在这里插入图片描述

4. 艺术风格迁移实验
设计原因:和时下艺术风格迁移效果最好的一些算法进行比较
做法:和下图中分别基于优化的方法、快速前馈网络的方法、基于特征近似转换的方法进行比较,通过人工投票、时间等进行对比
结果
1、论文提出的方法的给人的视觉效果最好(下饼状图(a)中蓝色部分是论文的结果图获得的投票)
2、运行速度很快,下表中在通用方法中第一(最上面的不是通用方法)
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

5. 视频风格迁移实验
做法:为了保留图像的真实性,encoder选用了relu3_1层,与其他一些现有方法进行对比试验
评价指标:不同帧的热量图(heat map)、人工投票
结果:
1、论文内的方法处理的视频在视觉上效果最稳定,可以保持不同帧的内容图像间的自然一致(热量图最接近原图的热量图)
2、对于每组视频,受试者选择的最稳定的视频片段的票数中论文的方法得票占绝大部分比例,说明本方法在的风格转移的稳定性从人的主观角度来说最好
在这里插入图片描述
在这里插入图片描述

6. 保留图像真实性实验
设计原因:前面说了论文在真实性迁移中加入了SPN部分,以减少由编码解码引起的失真
做法:在训练阶段,将encoder产生的重构图像输入到传播模块中。传播模块在相应的白化图像的引导下输出细化的重构图像。然后计算精细图像和原始图像之间的欧几里德损失。在训练SPN的阶段不涉及样式转换过程。
在应用阶段,先根据每个内容/风格对的预定义掩码图(白化图像)相应的区域。将预训练好的SPN模块直接应用到迁移生成的图像上,同时将经过白化的内容图像作为guidance引导过滤。
在这里插入图片描述
结果
1、如方框区域所示, 512⇥256图片测试中,由于本文方法线性的迁移和传播方式,当从风格图像转换颜色时,更好地保留了内容图像中的真实细节(如天空或瓶子的纹理)。
2、论文提出的端到端方法比其他方法快几个数量级(大约能达到60fps)
注:在最后一列中,“+ SPN”是加上了SPN模块过滤的结果
在这里插入图片描述

6. 我的想法

以下想法很傻很天真,不要当真,这本身是为了一次作业而写的论文解读
1. 图像风格融合
论文提出的方法是将图像往指定风格进行转换,那有没有一种方案能将多种风格融合在一起,生成一种具有各种特征的新的风格。
思路:
1、对一张图片进行多次不同风格的迁移,这个可能会受后续风格的影响更大。
2、对多种风格的Gram矩阵或feature map进行某种算法的融合,比如像本文中的进行矩阵相乘得到一个迁移矩阵T,对多个Gram矩阵进行加权计算和矩阵相乘等操作。

2. 多风格物体识别与图像风格聚类
多风格物体识别的想法基于我的一门课程的大作业提出,题目是动漫人脸识别。
动漫包含了美漫、日漫等多种风格,即使美漫里也有各种不同风格的作家,画出来的脸也就有各种各样的风格。对于这种人脸检测而言,画风无疑会对检测造成影响。
基于此,对于多风格物体识别,我有两种思路:
1、将所有图像向同一种风格进行迁移(比如通过本文的通用性方法进行迁移),再进行检测。统一风格可以是手选某类风格的图像,也可以是将多种风格的图像进行风格融合。
2、论文内使用的Gram矩阵包含了各特征通道之间的相关度信息,这些通道是图像风格本身的度量。因此可以先基于Gram矩阵(或者feature map)进行同风格的图像聚类,再对每一类型的图像分别学习一个网络进行检测

7. 我对实际效果的认识

1. 生成图像的平均时间
我的GPU是GTX 1050(2G显存),生成一张256大小的图片平均需要约1.5s,下图是我的时间输出
在这里插入图片描述
当我设置图片大小为512时显存不足了,估计是因为VGG19网络过大
论文内称在Titan XP上生成256、512、1024大小的图片需要0.010s、0.036s、0.146s
下图是论文内的运行速度对比,比其他方法快了很多
在这里插入图片描述
2. 训练时间
由于我的GPU不够训练,因此我自己没有进行训练
论文内说在Titan XP GPU上设置batch size=8,iterations=105时,训练需要5小时
3. 可伸缩性
该方法支持任意内容图和风格图的转换,支持各种大小的尺寸,且整个网络除了VGG19外,都是简单的小型前馈网络,几乎没有其他大的计算量。因此该模型可伸缩性很强。

8. 参考文献

注:以下有些标号不按顺序,是为了和原论文引用保持一致,方便查询
[1] https://github.com/sunshineatnoon/LinearStyleTransfer
[2] http://openaccess.thecvf.com/content_CVPR_2019/papers/Li_Learning_Linear_Transformations_for_Fast_Image_and_Video_Style_Transfer_CVPR_2019_paper.pdf
[4] V. Dumoulin, J. Shlens, and M. Kudlur. A learned representation for artistic style. CoRR, abs/1610.07629, 2016.
[8] L. A. Gatys, A. S. Ecker, and M. Bethge. Image style transfer using convolutional neural networks. In CVPR, 2016. 1, 2, 4, 6, 7, 8, 10, 13
[17] Y. Li, C. Fang, J. Yang, Z. Wang, X. Lu, and M.-H. Yang. Diversified texture synthesis with feed-forward networks. In CVPR, 2017.
[22] S. Liu, S. D. Mello, J. Gu, G. Zhong, M.-H. Yang, and J. Kautz. Learning affinity via spatial propagation networks. In NIPS, 2017. 1, 4, 8

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值