Label:L
0 | 1 | 2 | 3 | 1 | 1 | 2 | 2 | 3 | 4 |
Prediction: P
0 | 1 | 2 | 3 | 1 | 5 | 1 | 2 | 1 | 4 |
Step 1 乘法加法
n × L + P
0 | 7 | 14 | 21 | 7 | 11 | 13 | 14 | 19 | 28 |
n指的是标签类别的数量,这里一共6个类别,n=6
第三行,第三列,这个14这样来的。6 × 2 + 2 = 14。就是这样算,没错。
Step 2 bincount统计频数
L和P是分类结果,一共6类,所以取值范围是0-5。那么第三行的 n × L + P 取值范围是什么?6×0+0=0,这是最小值。6×5+5=35,这是最大值,取值范围是0到35.我们把第三行的值的一个频数统计,如下表。第一行是所有可能的取值,第二行是每种取值在我们这个数据里出现的次数
这个表格就是代码里bin_count这个函数干的事情,函数里的bin这个关键字代表可能数字的个数=max(n×L+P)+1。这里之所以用max是因为n×L+P这个式子里面的L和P的取值的你分类的标签,是变量,你分出来哪个就是哪个,我取最大的那个n和L算出来的(n×L+P)。这里是35+1=36个类别。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | .. | 35 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 1 | 0 | 1 | 2 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | .. | 0 |
Step 3 转成混淆矩阵
下面把这个bincount计数变成一个二维的形式。上面那36个数,按照一行6个来,就是一个6×6的矩阵,像下面这样
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 1 | |||||
1 | 2 | 1 | ||||
2 | 1 | 2 | ||||
3 | 1 | 1 | ||||
4 | 1 | |||||
5 |
列对应的是预测的标签,行对应的是真实的标签
举个例子,带着你看看一看。以第二行,行标签为1的这一行为例。意思是真实为1,有2个被分类成了1,有1个被你分类成了5。
现在去最开始的两行label和prediction里面看看,下面黄色标注了,和我说的一样。
Label:L
0 | 1 | 2 | 3 | 1 | 1 | 2 | 2 | 3 | 4 |
Prediction: P
0 | 1 | 2 | 3 | 1 | 5 | 1 | 2 | 1 | 4 |
这里有同学要问了,那用的找你这么麻烦,我遍历L,把每个category出现的prediction的类别和数字统计好就行了,用得着你这个吗?
但是你说的这种方法的的时间复杂度没有我的小。因此用我这个。
Step 4 根据混淆矩阵计算评估指标
PA(Pixel Accuracy)
只有对角线上的元素,表示我分类正确对了。
所以,PA=对角线和 / 总和
MPA(Mean Pixel Accuracy)
均类像素精度,统计每个类内部的像素精度,然后这些类再做平均。(因为数据大多存在imbalance的问题,他的目的是弱化样本过多的类别对score的影响,提高样本量过少的类别对score的影响)
做法:每一行求和出来一个长度为6的向量,然后再拿着对角线这6个数组成的向量去除以前面那个向量。
IoU(Intersection over Union)
交集比并集
对角线/(行和+列和-对角线)
对角线的维度是6,整行求和出来的维度是6,整列求和的维度也是6,对角线的维度也是6
行和+列和的时候对角线被加了2遍,所以要删掉一个,好比删掉intersection
注意这里IoU出来是,一个向量是6个label的IoU。