医学图像分割常用的损失函数

本文探讨了医学图像分割中常用的损失函数,如交叉熵、Dice系数和Focal Loss,详细解析了每种函数的工作原理及其在处理类别不平衡问题上的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要介绍医学图像中常用的损失函数,包括cross entropy, generalized dice coefiicients, focal loss 等。       

一、cross entropy 交叉熵

       图像分割中最常用的损失函数是逐像素交叉熵损失。该损失函数分别检查每个像素,将类预测(深度方向的像素向量)与我们的热编码目标向量进行比较。

cross entropy

      由此可见,交叉熵的损失函数单独评估每个像素矢量的类预测,然后对所有像素求平均值,所以我们可以认为图像中的像素被平等的学习了。但是,医学图像中常出现类别不均衡(class imbalance)的问题,由此导致训练会被像素较多的类主导,对于较小的物体很难学习到其特征,从而降低网络的有效性。

      有较多的文章对其进行了研究,包括 Long et al. 的 FCN 在每个通道加权该损失,从而抵消数据集中存在的类别不均的问题。同时,Ronneberger et al.提出的 U-Net 提出了新的逐像素损失的加权方案,使其在分割对象的边界处具有更高的权重。该损失加权方案以不连续的方式帮助他们的 U-Net 模型细分生物医学图像中的细胞,使得可以在二元分割图中容易地识别单个细胞。

二、dice coefficient 

    dice coefficient 源于二分类,本质上是衡量两个样本的重叠部分。该指标范围从0到1,其中“1”表示完整的重叠。 其计算公式为:

                                                                         Dice = \frac{2\left | A\cap B \right |}{\left | A \right |+\left | B \right | },

    其中 \left | A\cap B \right | 表示集合A、B 之间的共同元素,\left | A \right |  表示 A 中的元素的个数,B也用相似的表示方法。

    为了计算预测的分割图的 dice coefficient,将 \left | A\cap B \right |  近似为预测图和label之间的点乘,并将结果函数中的元素相加。

      intersection

      因为我们的目标是二进制的,因而可以有效地将预测中未在 target mask 中“激活”的所有像素清零。对于剩余的像素,主要是在惩罚低置信度预测; 该表达式的较高值(在分子中)会导致更好的Dice系数。

      为了量化计算 \left | A \right | 和 \left | B \right | ,部分研究人员直接使用简单的相加, 也有一些做法是取平方求和。

cardinality

       其中,在式子中 Dice系数的分子中有2,因为分母“重复计算” 了两组之间的共同元素。为了形成可以最小化的损失函数,我们将简单地使用1-Dice。这种损失函数被称为 soft dice loss,因为我们直接使用预测概率而不是使用阈值或将它们转换为二进制mask。      

      关于神经网络输出,分子涉及到我们的预测和 target mask 之间的共同激活,而分母将每个mask中的激活量分开考虑。实际上起到了利用 target mask 的大小来归一化损失的效果,使得 soft dice 损失不会难以从图像中具有较小空间表示的类中学习。

      soft dice loss 将每个类别分开考虑,然后平均得到最后结果。

              soft dice

    值得注意的是,dice loss比较适用于样本极度不均的情况,一般的情况下,使用 dice loss 会对反向传播造成不利的影响,容易使训练变得不稳定。

三、focal loss

    该损失函数在何凯明 1-stage 目标检测框架中被提出。专为解决 class imbalance 问题。首先定性感受一下 target problem(基于目标检测背景):

    在目标检测领域,常用的损失函数为CE(cross entropy)。但会带来一些问题:

                                                                  CE(p_{t})=-log(p_{t})

                                                          其中,   p_{t}=\left\{\begin{matrix} p & if \,y=1 \\ 1-p& otherwise \end{matrix}\right.

    (1)首先,在目标检测中,一般图像的目标所占的比例会远远小于背景,在传统的样本分类中,被分为 positive 和 negative 两类。由于 negative 样本过多,会造成它的loss太大,容易把 positive 的 loss 遮盖从而不利于整个目标函数的收敛,针对这个问题,用平衡的CE (balanced cross entropy)改进传统CE。

                                                                CE(p_{t}) = -\alpha _{t}log(p_{t})

   \alpha为权重系数,当为正样本时,  \alpha \in \left [ 0,\, 1 \right ] ,为负样本时,1-\alpha

  (2)实际上,从图可以看出大多negative 样本位于背景区,而极少的 negative 位于前景和背景的过渡区。位于背景区的样本分类相对容易,成为easy negative, 训练时对应的score很大,loss 相对很小,在计算反向梯度时,造成easy negative example对参数收敛作用有限。从而导致hard negative 样本很难得到更新,效果不佳。

          究其原因,是由于常用的损失函数,传统CE(cross entropy)包括平衡化的 CE 均只有 positive/ negative 的区分,未考虑到 easy/ hard 的样本区分。根据文章的分类,有以下几类样本:hard positive(IOU>0.5), easy positive, hard negative(IOU<0.4) 以及 easy negative。 

      所以提出了focal loss 加大 hard negative的 loss值,使之更好的训练。具体公式如下:

                                                        FL(p_{t})=-\alpha _{t}(1-p_{t})^{\gamma }log(p_{t})

      主要就是增加了 (1-p_{t})^{\gamma } 这个调节因子。调节因子有两方面作用:1)当网络错分类的时候,p_{t} 很小,(1-p_{t}) \rightarrow 1,公式基本不变,但当 p_{t} 很大,(1-p_{t}) \rightarrow 0,大大降低了 easy example 的损失权重。2)\gamma\in [0,5],称为 focusing parameter, \gamma增强了调节因子的作用。

       整体上看,调节因子降低了 easy example 损失的贡献,调节了简单样本权重降低的速率,并拓宽了样本接收低损失的范围。对于困难样本的学习更有利。值得注意的是, \alpha 和调节因子需要配合使用,具体实现时,可以参考论文中的实验进一步探究。

 

 

    

### 医学图像处理中的常用损失函数医学图像处理领域,尤其是基于深度学习的方法中,选择合适的损失函数对于模型性能至关重要。以下是几种常见的损失函数及其应用场景: #### 1. **均方误差 (Mean Squared Error, MSE)** MSE 是一种广泛使用的回归损失函数,在医学图像重建任务(如超分辨率重建、去噪等)中有广泛应用。其定义如下: \[ L_{MSE} = \frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2 \] 其中 \( y_i \) 表示真实值,\( \hat{y}_i \) 表示预测值。可以通过 PyTorch 的 `nn.MSELoss` 实现该功能[^1]。 ```python import torch.nn as nn loss_func = nn.MSELoss() output = mynet(X) target = Y loss_value = loss_func(output, target) print(loss_value) ``` #### 2. **交叉熵损失 (Cross Entropy Loss)** 交叉熵损失适用于分类任务,尤其在医学图像分割场景下表现良好。它衡量的是预测分布与目标分布之间的差异。PyTorch 提供了内置实现 `nn.CrossEntropyLoss()`,可以直接用于多类别的像素级分类问题[^3]。 ```python criterion = nn.CrossEntropyLoss() output = model(images) labels = targets.long() # 确保标签为整数类型 loss = criterion(output, labels) ``` #### 3. **Dice 损失 (Dice Loss)** Dice 损失是一种专门针对二元分割任务设计的度量方法,特别适合于前景区域较小的情况。它的公式为: \[ L_{Dice} = 1 - \frac{2|A \cap B|}{|A| + |B|} \] 其中 \( A \) 和 \( B \) 分别表示预测掩码和真实掩码。TensorFlow 中可通过自定义方式实现 Dice 损失[^4]。 ```python def dice_loss(y_true, y_pred): numerator = 2 * torch.sum(y_true * y_pred) denominator = torch.sum(y_true + y_pred) return 1 - (numerator / denominator) # 使用示例 loss_dice = dice_loss(target_mask, predicted_mask) ``` #### 4. **联合损失 (Combined Losses)** 为了综合考虑不同类型的错误,通常会将多个损失结合起来形成复合型损失函数。例如,结合 BCEWithLogitsLoss 和 Dice 损失来优化语义分割效果。 ```python bce_criterion = nn.BCEWithLogitsLoss() dice_criterion = dice_loss total_loss = bce_criterion(logits, masks) + dice_criterion(masks, logits.sigmoid()) ``` --- ### 总结 以上列举了几种典型的医学图像处理任务所采用的损失函数,并提供了相应的框架实现代码片段。具体选用哪种取决于实际应用需求以及数据特性。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值