如何理解计算机视觉损失函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解计算机视觉损失函数?相关的知识,希望对你有一定的参考价值。

参考技术A 更多信息请查看原文:https://www.yanxishe.com/TextTranslation/2447?from=jianshu0323

计算机视觉是计算机科学中主要关注“数字图像的信息自动提取”的这么一个领域。

在过去的十年里,深度学习的创新、大量数据的易用性以及GPU($$)单元的可访问性,都将计算机视觉领域推向了聚光灯下。它甚至在人脸验证和手写文本识别等任务中展现了超人一般的性能。(事实上,在如今航班登机的过程中,自动人脸验证应用已经越来越普遍)

 近年来,计算机视觉领域在网络结构、激活函数、损失函数等方面有了许多创新。 

4 个每个机器学习工程师都应该知道的CNN网络!

多年来,CNN的各种架构变形的开发,导致了惊人了进步在深…

medium.com

正如我上一篇文章中所讨论的,损失函数对模型的性能起着关键作用。选择正确的损失函数可以帮助您的模型学会关注数据中正确的特征,以获得最佳和更快的收敛速度。

损失函数赢家-您应该知道的常见损失函数

每个ML工程师都应该知道的ML中流行常用的损失函数。进一步了解他们的优点…

medium.com

本文特别总结了计算机视觉中一些重要的损失函数。 

您可以在这个 链接 中找到这里讨论的所有loss函数的PyTorch实现

像素损失函数

(Pixel-wise loss function)

顾名思义,这种损失函数计算预测图像和目标图像间像素对像素的损失。前一篇文章中讨论的大多数损失函数,如MSE(L2 loss)、MAE(L1 loss)、交叉熵损失(cross-entropy loss)等,都可以应用于计算预测变量和目标变量的每一对像素之间的损失。

由于这些损失函数先分别对每个像素向量进行类预测的评估,然后对所有像素点的评估结果进行平均,因此可以明确地说它们在学习过程中对图像中的每个像素一视同仁。对于需要进行像素级预测地语义分割模型,这一点十分有用。

U-Net  等模型对这些损失函数进行了一定变形。明确来说也就是,为了解决图像分割中的类不平衡问题,人们采用了加权像素交叉熵损失函数。

类不平衡是像素级分类任务中常见的问题。当图像数据中的各个类数量相差较大时便会出现这种问题。由于像素损失将所有像素的损失平均了,所以训练过程中数量最多的类将占主导地位。

感知损失函数

(Perceptual loss function)

Johnson等人(2016) 提出,当比较两个看起来相似的不同图像,比如只移动了一个像素点的同一张图片或不同分辨率的相同图片时,感知损失函数比较适用。尽管图像非常相似,但是使用逐像素损失函数会造成很大的误差,在这种情况下,使用能够比较图像之间高级感知和语义差异的感知损失函数会更妥当。

以一个图像分类网络比如已经在ImageNet数据集的数百万个图像上进行了训练的VGG为例,该网络的第一层倾向于提取低级特征(比如线、边或颜色梯度,最终卷积层则更倾向于处理更复杂的特征(例如特定的形状和图案)。根据Johnson等人的说法,在前几层中捕获的低层特征对于比较非常相似的图像十分有用。

例如,我们构建一个网络以生成输入图片的超分辨率图片。训练过程中,我们将会得到一系列中间目标图片,它们是输入图片的超分辨版本。我们的目标是比较输出图片与目标图片之间的差异。为此,我们使这些图像通过预先训练的VGG网络,并提取VGG中前几个块的输出值,从而提取图像的低级特征信息, 然后我们用一个简单的逐像素损失来比较这些低层特征张量。

图像分类的预训练损失网络

感知损失的数学表示

其中,V_j(Y)表示在处理图像Y时VGG网络第j层的激活,其大小为(C_j,H_j,W_j)。我们使用L2 loss比较真实图像Y和预测图像Y的激活,并利用图像形状对其进行归一化。 如果您想使用VGG网络的多个特性映射作为损失计算的一部分,只需将多个j层的L_j值相加。

内容风格损失函数-神经风格转移

(Content - Style loss functions — Neural style transfer)

风格转换是将图像的语义内容呈现为不同风格的过程。样式转换模型的目标是,给定一个内容图像(C)和一个样式图像(S),使用C的内容和S的样式生成输出图像 。

在这里,我们将讨论用于训练这种风格转换模型的内容风格损失函数的简单实现之一。内容风格损失函数的许多变体已在后续的研究中的得到应用,下一节将讨论这些变体的其中一种,纹理损失。

内容风格损失的数学表示

研究发现,CNNs在较高的层次上捕获内容的信息,而在较低的层次上更关注单个像素值.

因此,我们取CNN的一个或多个高层,计算原始内容图像(C)和预测输出(P)的激活图——

类似地,可以通过计算预测图像(P)和样式图像(S)低层特征映射的L2距离来计算风格损失。由此净损失函数定义为

alpha和beta是可以调节的超参数。 

注意:仅通过减少内容风格损失来进行优化会导致高像素的噪声输出。为了解决这个问题,保证生成图像的空间连续性和平滑性, 全变分损失(total variation loss) 上用场。

纹理损失函数

(Texture loss function)

为计算图像风格转换中的风格损失, Gatys等人(2016) 引入了纹理损失。

纹理损失是一种基于感知函数来加以改进的损失函数,特别适用于捕获图像风格样式。 Gatys等人 发现,我们可以通过观察VGG网络中的激活或特征映射,利用它们值的空间相关性来提取图像的风格表示。这可以Gram矩阵来实现——

对于VGG网络的l层,Gram矩阵是该层矢量化特征映射F_i和F_j的内积,它可以捕捉特征在图像不同部分共同出现的趋势。

纹理损失的数学表示

这里,G^l和A^l分别是模型输出和目标图像的l层风格表示,N_l是层l中不同特征映射的数量,M_l是层l中特征地图的大小(即通道*宽度*高度,E_l是层l的纹理损失。

净纹理损失是所有纹理损失的加权和,如下所示——

这里,a为原始图像,x为预测图像。

注意:虽然这里的数学看起来有点复杂,但是实际上纹理损失只是一个应用在特征映射的gram矩阵上的感知损失。

拓扑感知损失函数

(Topology-aware loss function)

最近 Mosinska等人(2017) 在文献中介绍了另一个有趣的损失函数,拓扑感知损失函数。它应用于分割掩模预测,可以视作感知损失的拓展。

Mosinska等人认为,在图像分割问题中使用的逐像素损失,如交叉熵损失,仅依赖于局部测度而不考虑拓扑结构的特征,如连接部件或孔洞的数量。因此,传统的分割模型,比如U-Net,往往会对薄层结构进行错误分类。这是因为使用逐像素损失时,薄层像素错误分类的成本低。因此,他们建议引入基于VGG-19网络生成的特征映射的惩罚项(类似于感知损失)以用来计入拓扑信息的影响,从而对逐像素损失进行改进。

来自 论文 :(c)利用逐像素损失法检测神经元膜后得到的分割结果;(d) 利用拓扑损失法检测神经元膜后得到的分割结果。

这种方法也特别适用于对有所遮挡(比如树木遮挡)的卫星图像中道路的分割。

拓扑感知损失的数学表示

这里,l(m,n)表示VGG19网络中第n层中的第m个特征映射。Mu是衡量像素损失和拓扑损失相对重要性的标量

对比损失/三重损失

(Contrastive Losses / Triplet Losses)

Florian Schroff等人 在 FaceNet(2015) 中引入了三重态损失,其文章旨在用一个有限小规模的数据集构建一个人脸识别系统(例如办公室的人脸识别系统)。传统的CNN人脸识别体系结构在无法应对这一情况。

Florian-Schroff等人 等人的研究重点是,在一个小样本空间内进行人脸识别,其不仅要能够正确识别人脸匹配,而且要能够准确区分两个不同的人脸。为了解决这个问题,FaceNet的论文引入了一个叫做孪生神经网络(Siamese Network)的概念。

在孪生神经网络中,我们将一个图像A输入网络,将其转换为一个称为嵌入的较小表示。现在,在不更新网络的任何权重或偏差的情况下,我们对一个与A不同的图像B重复此过程并提取其嵌入。如果图像B与图像A中的人相同,则其对应的嵌入必须非常相似。如果它们属于不同的人,那么它们相应的嵌入必须非常不同。

重申一下,孪生神经网络的目标 —— 确保一个人(锚 anchor)的图片,相比其他人(负 negative)的图片来说,更接近他本人的(正 positive)的任意一张图片。

为了训练这样的网络,他们引入了三重损失函数。输入一个三元组-[锚,正,负](见图片)。三重损失定义如下——

1. 定义距离度量d=L2范数

2. 计算锚图像嵌入与正图像嵌入之间的距离=d(a,p) 

3. 计算锚图像嵌入与负图像嵌入之间的距离=d(a,n)

4. 三重损失=d(a,p)-d(a,n)+偏移量

三重损失的数学表示

这里,x^a->锚,x^p->正,x^n->负。

注:为了实现快速收敛,在损失计算中选取正确的三重样本是至关重要的。FaceNet的文章讨论了两种实现此功能的方法:三元组离线生成和三元组在线生成。我们将改天详细讨论这个问题,与此同时,你可以参考一下 FaceNet论文 。

生成性对抗网络损失

(GAN Loss)

最早由 Ian Goodfellow等人(2014) 提出的生成性对抗网络(generative Adversarial Networks, GANs),是目前最流行的图像生成任务解决方案。GANs受到博弈论的启发,使用一种对抗性的方案,以使其可以在无监督的情况下接受训练。

GANs可以被看作是一个二人博弈,在这里我们将生成器(比如生成一个超级分辨率的图像)与另一个网络(鉴别器)进行对抗。鉴别器的任务是,评估图像是来自原始数据集(真实图像)还是由其他网络生成(假图像)。虽然生成器使用鉴别器作为损失函数,但鉴别器模型与其他深度学习神经网络一样也会更新,这意味着生成器的损失函数是隐式的,并且在训练过程中可以不断学习。对于典型的机器学习模型而言,收敛性是所选损失函数在训练数据集上的最小限度。在GAN中,收敛标志着二人博弈的结束。取而代之的是寻找生成器和鉴别器损失之间的平衡点。 

对于GAN,生成器和鉴别器是博弈双方,它们的模型权重将被轮流更新。这里我们将总结一些用于GAN网络的损失函数。

1. 最小-最大损失函数

(Min-Max Loss function)

然而,在实际应用中,人们发现这种损失函数对于生成器来说容易饱和。也就是说,如果它不能像鉴别器那样快速地学习,鉴别器就赢了,游戏也就结束了,模型也就不能得到有效的训练。

2. 非饱和GAN损失

(Non-Saturating GAN Loss)

非饱和GAN损失是对生成器损失的一种修正。其利用一个细微的变化克服了饱和问题。生成器没有最小化生成图像的鉴别器反向概率的对数,而是最大化生成图像的鉴别器概率的对数。

3. 最小二乘GAN损失

(Least squares GAN loss) 

该损失由 Xudong Mao等人(2016) 。当生成图像与真实图像非常不同时,此损失函数特别有用. 它可以使梯度非常小或消失,进而导致模式更新很少或没有。

4. Wasserstein GAN 损失

(Wasserstein GAN Loss)

该损失由 Martin Arjovsky等人(2017年) 提出。他们观察到,传统的GAN关注于最小化真实图像和生成图像的实际和预测概率分布之间的距离,即所谓的Kullback-Leibler(KL)散度。然而他们的建议是,对 搬土距离问题 进行建模,根据将一个分布转换为另一个分布的成本来计算两个概率分布之间的距离。

使用Wasserstein损失的GAN将鉴别器的概念转变为了比生成器更新更频繁(例如,比生成器快5倍)的评判器。评论器给图像一个实数评分而不是预测概率。它还要求模型权重保持在较小值。分数的计算使得真假图像分数之间的距离最大化。Wasserstein损失的好处是,它几乎一直提供了一个有用的梯度以允许模型持续训练。

5. 循环一致性损失

(Cycle Consistency Loss)

图像到图像的转换是一个图像合成任务,需要对给定图像进行定向修改,生成一个新的图像。例如,把马翻译成斑马(或相反),把画翻译成照片(或相反)等。 

该损失由 Jun-Yan Zhu等人(2018) 提出,用于图像到图像的转换。训练用于图像到图像转换的模型通常需要大量成对示例的数据集,这些示例很难找到。CycleGAN是一种没有成对例子的自动训练技术。这些模型是在无监督的情况下,使用来自源域和目标域的不需要任何关联的图像集合来进行训练。

CycleGAN是GAN体系结构的衍生,它包括两个生成器模型和两个鉴别器模型的同时训练。一个生成器从第一个域获取图像作为输入并输出图像到第二个域,另一个生成器从第二个域获取图像作为输入并生成图像至第一个域。然后使用鉴别器模型来确定生成的图像的合理性,并相应地更新生成器模型。 

循环一致性是指第一生成器输出的图像可以用作第二生成器的输入,并且第二生成器的输出应该与原始图像匹配。反之亦然。

 CycleGAN通过添加额外的损失来衡量生成器2的输出图像与原始图像(即生成器1的输入图像)之间的差异,以及其反循环(即生成器1的输出图象与生成器2的输入图像)的结果,从而鼓励循环一致性。这种损失被用作生成器模型的正则化项,引导新域中的图像生成过程朝原图像转换。 

本文总结了计算机视觉中一些重要损失函数术语集。感谢您的阅读,希望对您有所帮助。

更多信息请查看原文:https://www.yanxishe.com/TextTranslation/2447?from=jianshu0323

深度学习系列专题

写作目的:旨在将所有深度学习相关的东西进行一个总结,把能想到的东西先写下来,完了之后再进行调序。

专题一:多层感知机(传统概念的神经网络)

专题二:什么是卷积神经网络(CNN), 循环神经网络(RNN)

专题三:如何优化参数(需要定义损失函数,有哪些损失函数?怎么优化?)

专题四:计算机视觉(low-level)

专题五:计算机视觉(mid-level)

专题六:计算机视觉之图像分类

专题七:计算机视觉之目标检测

以上是关于如何理解计算机视觉损失函数?的主要内容,如果未能解决你的问题,请参考以下文章

交叉熵损失函数关于交叉熵损失函数的一些理解

计算机视觉与深度学习线性分类器

计算 SVM 损失函数的梯度

1. 深度学习简介|计算机视觉简介|得分函数|损失函数作用|前向传播整体流程

Pytorch NLLLOSS 的理解

深度学习系列专题