学习目标
Dice系数和mIoU是均是语义分割的评价指标,今天这里就着重讲讲Dice系数,顺便提一下Dice Loss,以后有时间区分一下在语义分割中两个常用的损失函数,交叉熵和Dice Loss。
语义分割中评价指标的重要性
语义分割是计算机视觉领域中一项重要的任务,旨在将图像中的每个像素分配给特定的语义类别。与其他图像分析任务(如目标检测或图像分类)不同,语义分割要求对图像进行像素级别的标记,提供更详细和准确的场景理解。
评价指标在语义分割任务中起着关键作用,用于衡量模型预测结果与真实标签之间的相似性和准确性。Dice系数是一种常用的评价指标,适用于像素级别的分割任务。
Dice系数
Dice系数可以度量预测分割结果与真实标签之间的重叠程度,其取值范围在0到1之间。Dice系数越接近1,表示预测结果与真实标签的重叠越好,模型的性能越好。相比于其他指标,Dice系数对于处理不平衡类别和小目标具有优势,因此在许多语义分割任务中被广泛使用。
Dice系数计算公式如下所示:
其中pred是预测值的集合,true为真实值的集合,分母为pred与true的交集,乘以2是因为交集有二者的重叠部分,即存在公共元素,而分母就是pred与true的并集。
(1)预测分割图与真实分割图的点乘:
将 (pred⋂true) 近似为预测图pred和真实图true之间的点乘:
(2)点乘之后进行元素相加:
对于二分类的问题,真实的分割图是One-Hot编码的只有0,1两个值,所以可以有效的将在pred分割图中未在true分割图中激活的所有像素清零。对于激活的像素,可以使低置信度的预测像素在最终结果中的贡献减小,较高值会得到更高的Dice的系数。
(3)计算分子的并集,就直接采取元素的相加:
Dice损失
Dice损失和Dice系数的关系是:DiceLoss = 1 - DiceCoefficient,由此得到Dice Loss的公式为:
当 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博客