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博客

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天是冰红茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值