2.Dice系数

1.背景
Dice 系数是常用的分割的评价标准之一 后面还会介绍其他的评价标准 。
而且我发现大家的东西都是互相抄来抄去没有意思
2.Dice系数 原理及定义
【2.Dice系数】公式1
假设 X 是 【也就是我们输出结果】 维度为(3 , 3)
Y 为lable【标签】 维度为(3 , 3)单一分类
首先我们需要明白Dice系数使用判断两个图片(这里我就指的是X Y)的相似度的 , 但是在我们的分割任务当中我们通常将
0 代表背景
1 代表预测分割
现在我们假设
a=[
[1,0,1],
[0,0,0],
[0,1,0]

2.Dice系数

文章插图
b=[
[0,0,0],
[0,0,0],
[0,1,0]
大家需要比较的肯定是1 , 也就是预测分割这部分和真实的label之间的相似度 , 计算方法如下:
计算出 相应位置都是1的个数 1个分别计算出含有1的个数并相加 4个带入公式计算 2*1/4 = 0.5 0.5
代码实现如下:( 实现)
import torchimport numpy as npa_numpy = np.array([[1,0,1],[0,0,0],[0,1,0]])b_numpy = np.array([[0,0,0],[0,0,0],[0,1,0]])a=torch.from_numpy(a_numpy)b=torch.from_numpy(b_numpy)# a * b 代表对应位置相乘 不懂的可以看一下 torch文档 , norm为1范数res =2*(a.float()*b.float()).norm(1)/(a.float().norm(1)+b.float().norm(1))print(res)
输出结果为0.5
为什么使用上述的计算方法了? 因为有时候我们输出的label可能为百分比的时候
a=[
[0.7, 0 , 0.8],
[0.1 , 0.2 , 0.3],
[0.4 , 0.9 , 0.2]
b=[
[0,0,0],
2.Dice系数

文章插图
[0,0,0],
[0,1,0]
我们使用了相同的代码进行计算得出结果为0.3913
如果我们对a进行修改从0.7 升到 1 dice值降到0.3673
可能是我个人的见识比较浅薄 , 我觉得大家如果使用可能性计算Dice的话可能会对极大概率的影响不够充分 , 也就是A与B的交际部分 , 虽然我们乘上了一个2 但是在绝大数 图片中 假设物体分辨率为 3030 , *(小概率)加到分母中 , 我个人认为这是不太合理的 , 希望大家可以批评指正 。
·························································································································
同时为了避免出现X Y 全部都是0 导致公式1 出现分母为0的情况 , 我们通常会对其进行一个平滑调整 也就是加上一个
smooth = 1.a=torch.from_numpy(a_numpy)b=torch.from_numpy(b_numpy)res =(2*(a.float()*b.float()).norm(1) +smooth) / ((a.float().norm(1)+b.float().norm(1))+smooth)print(res)
这里我又不带明白了 这里的 应该是越小对原始的影响应该越小 , 大家好像都设置为1了 可能是一种约定俗称吧
最后就是变种时间 正对 |X| + |Y|
有的人会使用我上面说的1范数 , 但是我发现好像大家也有采用取元素平方求和的做法:
我去 居然有人认为这是更加通用性的代码 , 这明明是用来处理Dice_loss时候的代码 , 大家注意观察不要被骗了 害我想来半天def dice_coeff(pred, target):smooth = 1.num = pred.size(0)m1 = pred.view(num, -1)# Flattenm2 = target.view(num, -1)# Flattenintersection = (m1 * m2).sum()return (2. * intersection + smooth) / (m1.sum() + m2.sum() + smooth)