语义分割损失函数合集

date
Aug 19, 2022
Last edited time
Mar 27, 2023 08:49 AM
status
Published
slug
【损失函数合集】超详细的语义分割中的Loss大盘点
tags
DL
CV
summary
8.19日更新
type
Post
Field
Plat
【损失函数合集】超详细的语义分割中的Loss大盘点
前两天介绍了一下Contrastive Loss,Triplet Loss以及Center Loss。今天正好是周六,时间充分一点我就来大概盘点一下语义分割的常见Loss,希望能为大家训练语义分割网络的时候提供一些关于Loss方面的知识。此文只为抛转引玉,一些Loss笔者暂时也没有进行试验,之后做了实验有了实验结果会继续更新。 其中,表示类别数,是一个 one-hot向量,元素只有和两种取值,如果该类别和样本的类别相同就取,否则取,至于表示预测样本属于的概率。 当类别数等于的时候,这个损失就是二元交叉熵,在Pytorch中提供了一个单独的实现。 交叉熵Loss可以用在大多数语义分割场景中,但它有一个明显的缺点,那就是对于只用分割前景和背景的时候,当前景像素的数量远远小于背景像素的数量时,即的数量远大于的数量,损失函数中的成分就会占据主导,使得模型严重偏向背景,导致效果不好。 代码实现如下: #二值交叉熵,这里输入要经过sigmoid处理 import torch import torch.nn as nn import torch.nn.functional as F nn.BCELoss(F.sigmoid(input), target) #多分类交叉熵, 用这个 loss 前面不需要加 Softmax 层 nn.CrossEntropyLoss(input, target) 带权重的交叉熵Loss,公式为: 可以看到只是在交叉熵Loss的基础上为每一个类别添加了一个权重参数,其中的计算公式为: 其中表示总的像素个数,而表示GT类别为的像素个数。这样相比于原始的交叉熵Loss,在样本数量不均衡的情况下可以获得更好的效果。 何凯明团队在RetinaNet论文中引入了Focal Loss来解决 难易样本数量不平衡,我们来回顾一下。 我们知道,One-Stage的目标检测器通常会产生 10k 数量级的框,但只有极少数是正样本,正负样本数量非常不平衡。我们在计算分类的时候常用的损失--交叉熵的公式如下: 为了解决 正负样本数量不平衡的问题,我们经常在二元交叉熵损失前面加一个参数,即: 虽然平衡了正负样本的数量,但实际上,目标检测中大量的候选目标都是易分样本。这些样本的损失很低,但是由于数量极不平衡,易分样本的数量相对来讲太多,最终主导了总的损失。 因此,这篇论文认为 易分样本(即,置信度高的样本)对模型的提升效果非常小,模型应该主要关注与那些难分样本 。所以Focal Loss横空出世了。一个简单的想法就是只要我们将高置信度样本的损失降低一些就好了吧? 也即是下面的公式: 我们取等于2来感受一下,如果,那么,,损失降低了1000倍。最终Focal Loss还结合了公式(2),这很好理解,公式(3)解决了难易样本的不平衡,公式(2)解决了正负样本的不平衡,将公式(2)与(3)结合使用,同时解决正负难易2个问题!所以最终Focal Loss的形式如下:
【损失函数合集】超详细的语义分割中的Loss大盘点

前言

损失函数的作用是评估预测的分割与地面实况的匹配程度,这是深度学习中的重要组成部分。在本文中,我们概述了如何根据优化目标将当前损失函数分类为有意义的类别。我们区分最小化分布、区域、边界或这些的某种组合的不匹配的损失函数。
我们通常将损失函数 写成以下形式:
其中, 分别是 GT 以及预测的分割结果. 代表有 个像素与 个类别的图像域.
notion image

交叉熵 Loss

交叉熵损失的公式为:
其中, 只有 0 和 1 两种取值, 当位于 位置的像素点类别为 时为 , 否则为 0. 为相应位置的像素点预测类别为 的概率.
二分类情况下:
交叉熵 Loss 可以用在大多数语义分割场景中,但它有一个明显的缺点,那就是对于只用分割前景和背景的时候,当前景像素的数量远远小于背景像素的数量时,即 的数量远大于 的数量,损失函数中 的成分就会占据主导,使得模型严重偏向背景,导致效果不好。

带权交叉熵 Loss

带权重的交叉熵 Loss,公式为:
可以看到只是在交叉熵 Loss 的基础上为每一个类别添加了一个权重参数,其中 的计算公式为: ,其中 表示总的像素个数,而 表示 GT 类别为 的像素个数。这样相比于原始的交叉熵 Loss,在样本数量不均衡的情况下可以获得更好的效果。另外, 也可以自行设置.

TopK Loss

TopK 损失旨在迫使网络在训练期间专注于困难样本。
其中, 为设定的阈值, 为二元指示函数。换句话说,容易分类的像素,即损失低于 的像素,被丢弃。
 

Focal Loss

何凯明团队在 RetinaNet 论文中引入了 Focal Loss 来解决难易样本数量不平衡,我们来回顾一下。 我们知道,One-Stage 的目标检测器通常会产生10k数量级的框,但只有极少数是正样本,正负样本数量非常不平衡。我们在计算分类的时候常用的损失——交叉熵的公式如下:
为了解决正负样本数量不平衡的问题,我们经常在二元交叉熵损失前面加一个参数 ,即:
虽然 平衡了正负样本的数量,但实际上,目标检测中大量的候选目标都是易分样本。这些样本的损失很低,但是由于数量极不平衡,易分样本的数量相对来讲太多,最终主导了总的损失。
因此,这篇论文认为易分样本(即,置信度高的样本)对模型的提升效果非常小,模型应该主要关注与那些难分样本 。所以 Focal Loss 横空出世了。一个简单的想法就是只要我们将高置信度样本的损失降低一些就好了吧? 也即是下面的公式:
我们取 等于 2 来感受一下,如果 ,那么,,损失降低了 100 倍。最终 Focal Loss 结合了这两个公式,一个解决了难易样本的不平衡,一个解决了正负样本的不平衡. 所以最终 Focal Loss 的形式如下:
下面这张图展示了 Focal Loss 取不同的 时的损失函数下降。
notion image
实验结果展示,当, 时,效果最好,这样损失函数训练的过程中关注的样本优先级就是正难 > 负难 > 正易 > 负易了。

Sensitivity-specificity Loss

Sensitivity-specificity Loss 通过提高特异性的权重来解决不平衡问题。
参数 控制前景与背景的权重.
 

Dice Loss

医学图像分割之 Dice Loss - AI 备忘录
  • Dice 系数:根据 Lee Raymond Dice[1] 命令,是用来度量集合相似度的度量函数,通常用于计算两个样本之间的像素,公式如下:
    • 分子中之所以有一个系数 是因为分母中有重复计算 的原因, 最后的取值范围是 。而针对我们的分割任务来说, 表示的就是 Ground Truth 分割图像,而 代表的就是预测的分割图像。这里可能需要再讲一下,其实除了上面那种形式还可以写成:
      其中分别代表真阳性,假阳性,假阴性的像素个数。
  • Dice Loss 可以直接优化Dice系数,这是最常用的分割评估指标。与加权交叉熵不同,它不需要对不平衡的分割任务进行类别重新加权。公式定义为 :

IOU Loss

目标检测的loss
目标检测任务的损失函数由Classificition Loss和Bounding Box Regeression Loss两部分构成。本文介绍目标检测任务中近几年来Bounding Box Regression Loss Function的演进过程,其演进路线是Smooth L1 Loss IoU Loss GIoU Loss DIoU Loss CIoU Loss,本文按照此路线进行讲解。 本方法由微软rgb大神提出,Fast RCNN论文提出该方法 1.1 假设x为预测框和真实框之间的数值差异,常用的L1和L2 Loss定义为: 1.2 上述的3个损失函数对x的导数分别为: 从损失函数对x的导数可知: 损失函数对x的导数为常数,在训练后期,x很小时,如果learning rate 不变,损失函数会在稳定值附近波动,很难收敛到更高的精度。 损失函数对x的导数在x值很大时,其导数也非常大,在训练初期不稳定。 完美的避开了 和 损失的缺点。 1.3 实际目标检测框回归任务中的损失loss为 其中 表示GT 的框坐标, 表示预测的框坐标,即分别求4个点的loss,然后相加作为Bounding Box Regression Loss。 缺点: 上面的三种Loss用于计算目标检测的Bounding Box Loss时,独立的求出4个点的Loss,然后进行相加得到最终的Bounding Box Loss,这种做法的假设是4个点是相互独立的,实际是有一定相关性的 实际评价框检测的指标是使用IOU,这两者是不等价的,多个检测框可能有相同大小的
目标检测的loss
IOU Loss 和 Dice Loss 一样属于 metric learning 的衡量方式,公式定义如下:
它和 Dice Loss 一样仍然存在训练过程不稳定的问题,IOU Loss 在分割任务中应该是不怎么用的,如果你要试试的话代码实现非常简单,在上面 Dice Loss 的基础上改一下分母部分即可,不再赘述了。我们可以看一下将 IOU loss 应用到 FCN 上在 VOC 2010 上的实验结果:
可以看到 IOU Loss 是对大多数类别的分割结果有一定改善的,但是对Person类却性能反而下降了。
notion image

Tversky Loss

论文地址为:
实际上 Dice Loss 只是 Tversky loss 的一种特殊形式而已,我们先来看一下 Tversky 系数的定义,它是 Dice 系数和 Jaccard 系数(就是 IOU 系数,即 )的广义系数,公式为:
这里 表示预测值而 表示真实值。当 均为 的时候,这个公式就是 Dice 系数,当 均为 的时候,这个公式就是 Jaccard 系数。其中 代表 FP(假阳性),代表 FN(假阴性),通过调整 这两个超参数可以控制这两者之间的权衡,进而影响召回率等指标。下表展示了对 FCN 使用 Tversky Loss 进行病灶分割,并且取不同的 参数获得的结果,其中 Sensitivity 代表召回率 Recall,而 Specificity 表示准确率 Precision:
notion image
在极小的病灶下的分割效果图如下:
notion image
 
而在较大的病灶下的分割效果图如下:
notion image
 

Focal tversky Loss

Focal Tversky loss [1] 应用了focal loss 的概念来关注低概率的困难样本.
是一个在 范围内的超参数.

Generalized Dice loss

论文原文全称为:Generalized Overlap Measures for Evaluation and Validation in Medical Image Analysis
刚才分析过 Dice Loss 对小目标的预测是十分不利的,因为一旦小目标有部分像素预测错误,就可能会引起 Dice 系数大幅度波动,导致梯度变化大训练不稳定。另外从上面的代码实现可以发现,Dice Loss 针对的是某一个特定类别的分割的损失。当类似于病灶分割有多个场景的时候一般都会使用多个 Dice Loss,所以 Generalized Dice loss 就是将多个类别的 Dice Loss 进行整合,使用一个指标作为分割结果的量化指标。GDL Loss 在类别数为 2 时公式如下:
其中 表示类别 在第 个位置的真实像素类别,而 表示相应的预测概率值,表示每个类别的权重。 的公式为:

BCE + Dice Loss

即将 BCE Loss 和 Dice Loss 进行组合,在数据较为均衡的情况下有所改善,但是在数据极度不均衡的情况下交叉熵 Loss 会在迭代几个 Epoch 之后远远小于 Dice Loss,这个组合 Loss 会退化为 Dice Loss。

Focal Loss + Dice Loss

这个 Loss 的组合应该最早见于腾讯医疗 AI 实验室 2018 年在《Medical Physics》上发表的这篇论文:https://arxiv.org/pdf/1808.05238.pdf。论文提出了使用 Focal Loss 和 Dice Loss 来处理小器官的分割问题。公式如下:
其中 分别表示对于类别 c 的真阳性,假阴性,假阳性。可以看到这里使用 Focal Loss 的时候,里面的两个参数 直接用对于类别 c 的正样本像素个数来代替。具体实验细节和效果可以去看看原论文。

Exponential Logarithmic loss

这个 Loss 是 MICCAI 2018 的论文3D Segmentation with Exponential LogarithmicLoss for Highly Unbalanced Object Sizes提出来的,论文地址为:https://arxiv.org/abs/1809.00076。这个 Loss 结合了 Focal Loss 以及 Dice loss。公式如下:
这里增加了两个参数权重分别为 ,而 为指数 log Dice 损失, 为指数交叉熵损失。公式如下:
其中, 表示像素位置, 表示类别标签, 表示位置 处的 ground truth 类别,表示经过 softmax操作之后的概率值。其中:, 其中 表示标签 出现的频率,这个参数可以减小出现频率较高的类别权重。 可以提升函数的非线性,如 Figure2 所示:
notion image

Lovasz-Softmax Loss

这是今天要介绍的最后一个 Loss,Kaggle 神器。这篇论文是 CVPR 2018 的,原地址为:https://arxiv.org/pdf/1705.08790.pdf。对原理感兴趣可以去看一下论文,这个损失是对 Jaccard(IOU) Loss 进行 Lovaze 扩展,表现更好。

Boundary Loss

Boundary loss由 Boundary loss for highly unbalanced segmentation 这篇文章提出,用于图像分割loss,作者的实验结果表明dice loss+Boundary loss效果非常好,一个是利用区域,一个利用边界。作者对这两个loss的用法是给他们一个权重,训练初期dice loss很高,随着训练进行,Boundary loss比例增加,也就是说越到训练后期越关注边界的准确,边界处理得更细一些。
为了以不同的方式计算两个边界之间的距离 Boundary Loss 使用边界上的积分,而不是区域上的不平衡积分,以减轻高度不平衡的分割的困难。
.
notion image
, 则为 . 若 , 则为 , 则 .
 

© Lazurite 2021 - 2024