mIoU的计算
# mIoU 的计算
1、首先计算混淆矩阵
self.confusion_matrix = np.zeros((self.num_class,)*2)
def _generate_matrix(self, gt_image, pre_image, ignore_labels):
mask = (gt_image >= 0) & (gt_image < self.num_class)
for IgLabel in ignore_labels:
mask &= (imgLabel != IgLabel)
label = self.num_class * gt_image[mask].astype('int') + pre_image[mask]
count = np.bincount(label, minlength=self.num_class**2)
confusion_matrix = count.reshape(self.num_class, self.num_class)
return confusion_matrix
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
混淆矩阵是一个 num_class*num_class
的矩阵,表示每个类的
- 首先,只计算
0~num_class
的mask - 对于
ignore_labels
的标签值,直接忽略掉 np.bincount
计算了从 0 到 这 个数中每个数出现的次数,返回值形状为 (n, n)
计算某一个类的 IoU
# hist 即为 混淆矩阵
def per_class_IoU(hist):
# 矩阵的对角线上的值组成的一维数组/矩阵的所有元素之和,返回值形状(n,)
return np.diag(hist) / (hist.sum(1) + hist.sum(0) - np.diag(hist))
mIoU = np.mean(per_class_iu(hist)
1
2
3
4
5
6
2
3
4
5
6
计算某个类的 TP
# hist 即为 混淆矩阵
def per_class_TP(hist):
# 矩阵的对角线上的值组成的一维数组/矩阵的所有元素之和,返回值形状(n,)
return np.diag(hist) / (hist.sum(1) + hist.sum(0) - np.diag(hist))
1
2
3
4
5
6
2
3
4
5
6
计算某个类的 TN
# hist 即为 混淆矩阵
def per_class_TN(hist):
pass
1
2
3
2
3
计算某个类的 FP
# hist 即为 混淆矩阵
def per_class_FP(hist):
pass
1
2
3
2
3
计算某个类的 FN
# hist 即为 混淆矩阵
def per_class_FN(hist):
pass
1
2
3
2
3
# 在预测的所有正样本中,预测正确的比例
precision = TP / (TP + FP)
# 在所有正样本中,预测为正样本的比例
recall = TP / (TP + FN)
# 精确率和召回率的一种权衡
F1 = 2 * precision * recall /(precision + recall)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
参考资料
- https://yearing1017.gitee.io/2020/02/07/%E8%AF%AD%E4%B9%89%E5%88%86%E5%89%B2%E6%8C%87%E6%A0%87MIoU/
上次更新: 2023/03/25, 19:58:09
- 02
- README 美化05-20
- 03
- 常见 Tricks 代码片段05-12