Dice系数衡量图像分割中的重叠区域

学习目标

Dice系数和mIoU是均是语义分割的评价指标,今天这里就着重讲讲Dice系数,顺便提一下Dice Loss,以后有时间区分一下在语义分割中两个常用的损失函数,交叉熵和Dice Loss。

语义分割中评价指标的重要性

语义分割是计算机视觉领域中一项重要的任务,旨在将图像中的每个像素分配给特定的语义类别。与其他图像分析任务(如目标检测或图像分类)不同,语义分割要求对图像进行像素级别的标记,提供更详细和准确的场景理解。

评价指标在语义分割任务中起着关键作用,用于衡量模型预测结果与真实标签之间的相似性和准确性。Dice系数是一种常用的评价指标,适用于像素级别的分割任务。

Dice系数

Dice系数可以度量预测分割结果与真实标签之间的重叠程度,其取值范围在0到1之间。Dice系数越接近1,表示预测结果与真实标签的重叠越好,模型的性能越好。相比于其他指标,Dice系数对于处理不平衡类别和小目标具有优势,因此在许多语义分割任务中被广泛使用。

Dice系数计算公式如下所示:

Dice=\frac{2*(pred\bigcap true)}{pred\bigcup true}

其中pred是预测值的集合,true为真实值的集合,分母为pred与true的交集,乘以2是因为交集有二者的重叠部分,即存在公共元素,而分母就是pred与true的并集。 

(1)预测分割图与真实分割图的点乘:

 (pred⋂true) 近似为预测图pred和真实图true之间的点乘:

(pred\bigcap true)=\begin{bmatrix} 0.01 &0.03 &0.08 &0.05 \\ 0.02 &0.14 &0.21 &0.06 \\ 0.92 &0.89 &0.90 &0.96 \\ 0.94&0.88 &0.97 & 0.92 \end{bmatrix} * \begin{bmatrix} 0 &0 & 0 &0 \\ 0 &0 & 0 &0 \\ 1 &1 & 1 &1 \\ 1 &1 &1 &1 \end{bmatrix}

(2)点乘之后进行元素相加:

\begin{bmatrix} 0 &0 &0 &0 \\ 0 &0 &0 &0 \\ 0.92 &0.89 &0.90 &0.96 \\ 0.94&0.88 &0.97 & 0.92 \end{bmatrix}=>0.92+0.89+...+0.92=7.38

对于二分类的问题,真实的分割图是One-Hot编码的只有0,1两个值,所以可以有效的将在pred分割图中未在true分割图中激活的所有像素清零。对于激活的像素,可以使低置信度的预测像素在最终结果中的贡献减小,较高值会得到更高的Dice的系数。

(3)计算分子的并集,就直接采取元素的相加:

pred=\begin{bmatrix} 0.01 &0.03 &0.08 &0.05 \\ 0.02 &0.14 &0.21 &0.06 \\ 0.92 &0.89 &0.90 &0.96 \\ 0.94&0.88 &0.97 & 0.92 \end{bmatrix}=>0.01+0.03+...+0.92=7.98

true= \begin{bmatrix} 0 &0 & 0 &0 \\ 0 &0 & 0 &0 \\ 1 &1 & 1 &1 \\ 1 &1 &1 &1 \end{bmatrix}=>8

Dice损失

Dice损失和Dice系数的关系是:DiceLoss = 1 - DiceCoefficient,由此得到Dice Loss的公式为:

Dice \ Loss=1-\frac{2*(pred\bigcap true)}{pred\bigcup true}

当 dice 值上升时,dice loss 会下降,当我们得到 dice 的最大值时,损失值为 0,这意味着模型是完美的。

pytorch实现Dice系数与Dice Loss

# Dice系数 Dice Loss
# 已放入 pyzjr 中,方便调用,版本>= 1.1.7之后可见
import torch

def Dice_coeff(pred, true, reduce_batch_first=False, epsilon=1e-6):
    #  二分类Dice系数
    assert pred.size() == true.size()
    assert pred.dim() == 3 or not reduce_batch_first

    if pred.dim() == 2 or not reduce_batch_first:
        sum_dim = (-1, -2)
    else:
        sum_dim=(-1, -2, -3)

    inter = 2 * (pred * true).sum(dim=sum_dim)
    sets_sum = pred.sum(dim=sum_dim) + true.sum(dim=sum_dim)
    sets_sum = torch.where(sets_sum == 0, inter, sets_sum)

    dice = (inter + epsilon) / (sets_sum + epsilon)
    return dice.mean()


def multiclass_Dice_coeff(pred, true, reduce_batch_first=False, epsilon=1e-6):
    #  多分类Dice系数
    return Dice_coeff(pred.flatten(0, 1), true.flatten(0, 1), reduce_batch_first, epsilon)


def Dice_Loss(pred, true, multiclass=False):
    #  Dice损失
    fn = multiclass_Dice_coeff if multiclass else Dice_coeff
    return 1 - fn(pred, true, reduce_batch_first=True)

参考文章

Dice和Dice Loss之间的区别_求则得之,舍则失之的博客-CSDN博客

Metric评价指标-Dice 与损失函数-Dice Loss - 知乎 (zhihu.com)

科研作图-常用的图像分割指标 (Dice, Iou, Hausdorff) 及其计算_图像分割dice系数如何计算_CV交流会的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/m0_62919535/article/details/132657931