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。

MIoU(Mean Intersection over Union)