发布于 2026-01-06 1 阅读
0

图像分割的 3 种常见损失函数 DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

图像分割中常用的3种损失函数

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

图像分割的应用范围非常广泛,从音乐频谱分离自动驾驶汽车生物医学成像脑肿瘤分割,无所不包。图像分割的目标是将图像(或图像序列)的不同部分在视觉上分离(分割)成独立的对象。例如,在下图所示的 OCR : Transformer Segmentation 论文中,图像中心的汽车是逐像素“检测”出来的。目标检测只会返回汽车周围边界框的坐标,而分割的目标是为给定的图像返回一个图像掩码(1 表示“是汽车”,0 表示“不是汽车”)。

从OCR纸张中分割汽车

在我看来,深度学习对计算机视觉领域的影响远超其他任何领域。过去五年里,各个领域都涌现出了许多创新,运用了各种各样的技术。图像分割可以被视为像素级的分类任务,而分割任务损失函数的选择对于决定机器学习模型的收敛速度以及模型的准确率都至关重要。

损失函数监督训练(从已标注数据中学习)过程中向模型提供反馈,用于评估模型收敛最优模型参数的程度。它用于指导模型寻找将输入数据映射到输出数据(在图像分割中,即从图像映射到掩码)的“理想”近似值。

Shruti Jadon(IEEE 会员)的这篇综述论文将损失函数分为四大类:基于分布的损失、基于区域的损失、基于边界的损失和复合损失。在本篇博文中,我将重点介绍语义图像分割中三种常用的损失函数:二值交叉熵损失、Dice 系数损失和形状感知损失。

二元交叉熵

交叉熵用于衡量两个概率分布之间的差异。它被用作相似性度量,以表示一个随机事件分布与另一个随机事件分布的接近程度,并用于分类(更广义上的分类)和分割。

因此,二元交叉熵(BCE)损失函数试图衡量实际图像掩模和预测图像掩模之间信息含量的差异。它通常基于伯努利分布,并且在类别间数据分布均匀的情况下效果最佳。换句话说,类别严重不平衡的图像掩模(例如,从X光图像中寻找非常小的罕见肿瘤)可能无法被BCE充分评估。

这是因为BCE对图像掩码中的正样本(1)和负样本(0)一视同仁。由于代表特定对象(例如,上图中第一张图里的汽车)的像素分布可能与代表图像其余部分的像素分布不均,因此BCE损失可能无法有效地反映深度学习模型的性能。

二元交叉熵定义为:

L ^ = 日志 ^ 1 o 1 ^ L(y,\hat{y}) = -y\log(\hat{y}) - (1-y)log(1-\hat{y})

数学符号入门:如果 是我们的目标图像分割掩码,并且 ^ \hat{y} 是我们的深度学习模型预测的掩码,损失衡量的是我们想要的结果与我们期望结果之间的差异( )以及模型给出的结果( ^ \hat{y}

TensorFlow 的软件包中已经实现了此功能keras.losses,因此可以直接在您的图像分割模型中使用。

加权 BCE 是标准 BCE 算法的一种改进版本,它通过某个系数对正像素进行加权。它广泛应用于医学成像(以及其他数据集高度偏斜的领域)。其定义如下:

L ^ = β 日志 ^ 1 o 1 ^ L(y,\hat{y}) = -\beta y\log(\hat{y}) - (1-y)log(1-\hat{y})

β β 参数可以进行调整,例如:减少假阴性像素的数量, β > 1 β > 1 、为了减少误报数量,设置 β < 1 β < 1

骰子系数

这是一种广泛用于计算图像相似度的损失函数,类似于交并比(Intersection-over-Union)启发式方法。因此,Dice系数已被改编为损失函数,称为Dice损失函数:

D L ^ = 1 2 ^ + 1 + ^ + 1 DL(y, \hat{y}) = 1 - \frac{2y\hat{y}+1}{y+\hat{y}+1}

一个常见的批评是其产生的搜索空间是非凸的。为了使 Dice Loss 更易于求解,人们对其进行了多项改进,例如使用 L-BFGS 和随机梯度下降法。Dice Loss 可以通过在 TensorFlow 中创建子类来实现,tf.keras.losses如下所示:



class DiceLoss(tf.keras.losses.Loss):
    def __init__(self, smooth=1e-6, gama=2):
        super(DiceLoss, self).__init__()
        self.name = 'NDL'
        self.smooth = smooth
        self.gama = gama

    def call(self, y_true, y_pred):
        y_true, y_pred = tf.cast(
            y_true, dtype=tf.float32), tf.cast(y_pred, tf.float32)
        nominator = 2 * \
            tf.reduce_sum(tf.multiply(y_pred, y_true)) + self.smooth
        denominator = tf.reduce_sum(
            y_pred ** self.gama) + tf.reduce_sum(y_true ** self.gama) + self.smooth
        result = 1 - tf.divide(nominator, denominator)
        return result


Enter fullscreen mode Exit fullscreen mode

形状感知损失

U-Net论文强制其全连接卷积网络学习微小的分离边界,方法是为每个真实像素预先计算权重图。这样做是为了补偿训练数据集中某些类别像素出现频率的差异,权重图是通过形态学运算计算得到的。该权重图的计算方法如下:

西 x = 西 c x + 西 0 e d 1 x + d 2 x 2 2 σ2 w(\bold{x}) = w_c(\bold{x}) + w_0 e^{-\frac{ (d_1(\bold{x}) + d_2(\bold{x}))^2}{2\sigma^2}}

d 1 d_1 d 2 d_2 函数给出到最近和次近单元格的距离。 西 c 厕所 手动调整以根据类别分布对图像中对象实例的类别进行加权。

然后,将该权重项用于典型的交叉熵损失函数中,从而得到以下损失函数:

L ^ = 西 x × [ 日志 ^ + 1 日志 1 p ^ ] L(y, \hat{y}) = -w(\bold{x})\times \left[ y\log(\hat{y}) + (1-y)\log(1-\hat{p})\right]
文章来源:https://dev.to/_aadidev/3-common-loss-functions-for-image-segmentation-545o