由于传统的L1,L2 loss是针对于像素级的损失计算,且L2 loss与人眼感知的图像质量并不匹配,单一使用L1或L2 loss对于超分等任务来说恢复出来的图像往往细节表现都不好。

现在的研究中,L2 loss逐步被人眼感知loss所取代。人眼感知loss也被称为perceptual loss(感知损失),它与MSE(L2损失)采用图像像素进行求差的不同之处在于所计算的空间不再是图像空间。

研究者们常使用VGG等网络的特征,令φ来表示损失网络,Cj表示网络的第j层,CjHjWj表示第j层的特征图的大小,感知损失的定义如下:可以看出,它有与L2 loss同样的形式,只是计算的空间被转换到了特征空间。

 Perceptual Loss(感知损失)&Perceptual Losses for Real-Time Style Transferand Super-Resolution论文解读

本篇文章首次提出感知损失,分别在图像风格转化和单张图像超分上进行实验和对比,证明了感知损失的有效性。

下面针对单张图像的超分进行解释说明。

感知损失通过一个固定的网络(VGG16,VGG19..),分别用prediction 和 groundtruth作为VGG16输入, 得到对应的输出特征,pre-vgg,gt-vgg。

然后让pre-vgg和gt-vgg构造损失(L2-Loss)。使预测结果和真实值之间的深层信息(感知信息)不断接近。

相比于普通的L2-Loss,使用感知损失可以更好的增强输出的细节信息。

构建感知损失准备:

1.预训练好的VGG网络,只需要prediction阶段(前向即可)。

2.送入prediction和ground truth分别通过VGG前向,并得到pre-vgg,gt-vgg。

3.计算pre-vgg和gt-vgg的L2损失。 注:往往pre-loss(感知损失)为正则项,需要配合其他损失函数进行指导,可以通过自定参数调节感知损失的惩罚(调节)力度。

在提取特征时,通常不会只使用一层的特征,而是使用网络中浅层,中层,深层特征,进行组合。 比图vgg16会使用 3 ,5,7层进行组合,并对输出特征进行累加。

原论文中,针对单张图像超分问题。 作者并不鼓励输出图像ˆy=fW(x)的像素与目标图像y的像素完全匹配,而是鼓励它们具有与损失网络φ计算的相似的特征表示。

设φj (x)为处理图像x时网络φ的第j层的激活情况;如果j是一个卷积层,那么φj (x)将是形状Cj×Hj×Wj的特征图。特征重建的损失是特征表示之间的(平方,归一化)欧氏距离:

Perceptual Loss(感知损失)&Perceptual Losses for Real-Time Style Transferand Super-Resolution论文解读

如下图所示,找到一个使早期层特征重建损失最小的图像ˆy往往会产生视觉上与y无法区分的图像。 当从更高的层次重建时,图像内容和整体空间结构被保留,但颜色、纹理和精确的形状没有被保留。使用特征重建损失进行训练,我们的图像转换网络鼓励输出图像ˆy在感知上与目标图像y相似,但并不迫使它们精确匹配。

 Perceptual Loss(感知损失)&Perceptual Losses for Real-Time Style Transferand Super-Resolution论文解读

 上面所述殴打简而言之一句话:针对于单张图像的超分问题,选择浅层(论文说是relu2_2)的特征图进行损失计算,而对于风格转化任务,选择深层特征或深层结合浅层的特征图来计算损失。

下图是实验结果:

Perceptual Loss(感知损失)&Perceptual Losses for Real-Time Style Transferand Super-Resolution论文解读

Perceptual Loss(感知损失)&Perceptual Losses for Real-Time Style Transferand Super-Resolution论文解读

代码:

Perceptual Loss(感知损失)&Perceptual Losses for Real-Time Style Transferand Super-Resolution论文解读

Perceptual Loss(感知损失)&Perceptual Losses for Real-Time Style Transferand Super-Resolution论文解读

2023.2.16 

在使用vgg作为模型推导的感知损失时,突然发现一个问题,都说一般选择浅层和深层的网络作为损失函数的计算层,比如这里我取第三层卷积和第13层卷积,可是第三层卷积有64个通道,第13层卷积后有256个通道,这么多通道要怎么计算损失呢?是求均值吗?后面看了别人的代码是这样处理的。这里直接上整体代码。关键一行是:np.mean() 也就是说应该是64个通道求均值了。

还有一点特别要注意,看到很多人分享的代码都是定义relu层为损失计算层,我亲自测试过发现,relu后特征可视化会变的偏向黑色,甚至在刚开始训练的时候就是全黑的,全黑的图像和半黑的GT图计算损失,损失可能会变成0.0000000007这样的,所以选择层的时候一定要选择卷积后的层,而不是relu后的层,目前选择卷积后的层[0,14,24] 特征可视化和损失函数均正常。

更新一下感知损失的结果,在训练接近拟合后,打印出预测和GT的特征图,已经非常相似了,损失函数也到达0.000001这样了,特征图如下:(左边的是预测的结果,右边是GT)

Perceptual Loss(感知损失)&Perceptual Losses for Real-Time Style Transferand Super-Resolution论文解读

 测试了一下发现没有明显的涨点,但是感知损失理论上也不会明显的涨点,感知损失的主要作用还是增强图像的细节,虽然这次测试也没有看到细节的增强,但是原因应该是模型还没有拟合完全,后续更新结果。

更新。。

上面说的应该选择卷积层作为特征图,是自己分析的结论,实验结果发现是可行的,但是原论文中说明的是relu2_2层,然后原论文还说应该选择L2loss做为感知损失的计算函数,可是有其他研究表明L1loss+L2loss的效果更好,至于选择哪个loss 选择 哪个层 这个还是亲身实践去试一试吧,下面贴一些第一次实验的结果。

Perceptual Loss(感知损失)&Perceptual Losses for Real-Time Style Transferand Super-Resolution论文解读

Perceptual Loss(感知损失)&Perceptual Losses for Real-Time Style Transferand Super-Resolution论文解读

Perceptual Loss(感知损失)&Perceptual Losses for Real-Time Style Transferand Super-Resolution论文解读

 上面三张从上到下分别是GT,不加感知损失的结果,加入感知损失(3,14,27卷积层累加)的结果。

在psnr上没有明显的变化,对于细节来说,仔细看是可以看到感知损失的细节强化效果(噪声减小了,对应gt来说细节也有所强化)。

2.28继续更新感知损失,这次使用L1来计算感知损失,且加入不同比列来增强或抑制感知损失与原始损失的比例,细节效果明显得到提高,效果如下:

Perceptual Loss(感知损失)&Perceptual Losses for Real-Time Style Transferand Super-Resolution论文解读左图是未加入感知损失的推理结果,右图为加入感知损失的结果,细节提升十分明显。

Perceptual Loss(感知损失)&Perceptual Losses for Real-Time Style Transferand Super-Resolution论文解读

发表回复