Dice系数

1.背景

Dice 系数是常用的分割的评价标准之一 后面还会介绍其他的评价标准。
而且我发现大家的东西都是互相抄来抄去没有意思

2.Dice系数

  1. 原理及定义
    Dice系数公式1
    假设 X 是 Output【也就是我们输出结果】 维度为(3,3)
    Y 为lable【标签】 维度为(3,3)
  2. 单一分类
    首先我们需要明白Dice系数使用判断两个图片(这里我就指的是X Y)的相似度的,但是在我们的分割任务当中我们通常将

0 代表背景
1 代表预测分割

现在我们假设
a=[
[1,0,1],
[0,0,0],
[0,1,0]
]

b=[
[0,0,0],
[0,0,0],
[0,1,0]
]
大家需要比较的肯定是1,也就是预测分割这部分和真实的label之间的相似度,计算方法如下:

  1. 计算出 相应位置都是1的个数 1个
  2. 分别计算出含有1的个数并相加 4个
  3. 带入公式计算 2*1/4 = 0.5 0.5

代码实现如下:(pytorch 实现)

import torch
import numpy as np

a_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],
[0,0,0],
[0,1,0]
]
我们使用了相同的代码进行计算得出结果为0.3913
如果我们对a进行修改从0.7 升到 1 dice值降到0.3673

可能是我个人的见识比较浅薄,我觉得大家如果使用可能性计算Dice的话可能会对极大概率的影响不够充分,也就是A与B的交际部分,虽然我们乘上了一个2 但是在绝大数512512 图片中 假设物体分辨率为 3030,261244*(小概率)加到分母中,我个人认为这是不太合理的,希望大家可以批评指正。

·························································································································
同时为了避免出现X Y 全部都是0 导致公式1 出现分母为0的情况,我们通常会对其进行一个平滑调整 也就是加上一个smooth

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)

这里我又不带明白了 这里的smooth 应该是越小对原始的影响应该越小,大家好像都设置为1了 可能是一种约定俗称吧

最后就是变种时间 正对 |X| + |Y|
有的人会使用我上面说的1范数,但是我发现好像大家也有采用取元素平方求和的做法:

上一篇:LeGO-LOAM论文重点总结


下一篇:NOIP 模拟 $32\; \rm Smooth$