数组axis轴及语义分割的mIoU理解
一、axis
1、非运算(删除操作)
删除操作,axis=0时,直接沿着行方向删除行
2、运算
axis=0,沿着行方向计算,mean求列均值,max求列最值
axis=1,沿着列方向计算,mean求行均值,max求行最值
参考链接:https://www.jianshu.com/p/93317c0dca6a
https://zhuanlan.zhihu.com/p/110105054
二、语义分割评价指标mIoU
图像中语义分割序要区分每个pixels的类别
1、集合理解方式
True和False表示是否预测正确(是否猜对)
Positive和Negative表示样本的类别是正类别还是负类别
Model | 预测结果 | 预测是否正确 |
---|---|---|
TP(True Positive) | 预测为正 | 预测正确(猜对了) |
FP(False Positive) | 预测为正 | 预测错误(猜错了) |
FN (False Negative) | 预测为负 | 预测错误(猜错了) |
TN(True Negative) | 预测为负 | 预测正确(猜对了) |
其中,IoU的计算公式为:
I
o
U
=
真正
假负
+
假正
+
真正
IoU = \frac{真正}{假负+假正+真正}
IoU=假负+假正+真正真正
参考链接:https://blog.csdn.net/qq_41731861/article/details/120683905
2、混淆矩阵理解方式
再具体计算IoU任务中,并不需要TN,预测为负且预测正确(不属于需要预测类别,不是类别真实值)
令 k 表示类别, (k+1) 表示加上了背景类,i 表示真实值,j表示预测值,
p
i
j
p_{ij}
pij表示将i预测为j,
p
i
i
p_{ii}
pii表示预测正确的,相当于混淆矩阵的对角线。
m
I
o
U
=
1
k
+
1
∑
i
=
0
k
p
i
i
∑
i
=
0
k
p
i
j
+
∑
i
=
0
k
p
j
i
−
p
i
i
mIoU = \frac{1}{k+1} \sum_{i=0}^{k} \frac{p_{ii}}{ {\textstyle \sum_{i=0}^{k}p_{ij}+ \sum_{i=0}^{k}p_{ji}}-p_{ii} }
mIoU=k+11i=0∑k∑i=0kpij+∑i=0kpji−piipii
计算代码为
import numpy as np
class IOUMetric:
"""
Class to calculate mean-iou using fast_hist method
"""
def __init__(self, num_classes):
self.num_classes = num_classes
self.hist = np.zeros((num_classes, num_classes))
def _fast_hist(self, label_pred, label_true):
# 找出标签中需要计算的类别,去掉了背景
mask = (label_true >= 0) & (label_true < self.num_classes)
# # np.bincount计算了从0到n**2-1这n**2个数中每个数出现的次数,返回值形状(n, n)
hist = np.bincount(
self.num_classes * label_true[mask].astype(int) +
label_pred[mask], minlength=self.num_classes ** 2).reshape(self.num_classes, self.num_classes)
return hist
# 输入:预测值和真实值
# 语义分割的任务是为每个像素点分配一个label
def ev aluate(self, predictions, gts):
for lp, lt in zip(predictions, gts):
assert len(lp.flatten()) == len(lt.flatten())
self.hist += self._fast_hist(lp.flatten(), lt.flatten())
# miou
iou = np.diag(self.hist) / (self.hist.sum(axis=1) + self.hist.sum(axis=0) - np.diag(self.hist))
miou = np.nanmean(iou)
# -----------------其他指标------------------------------
# mean acc
acc = np.diag(self.hist).sum() / self.hist.sum()
acc_cls = np.nanmean(np.diag(self.hist) / self.hist.sum(axis=1))
freq = self.hist.sum(axis=1) / self.hist.sum()
fwavacc = (freq[freq > 0] * iou[freq > 0]).sum()
return acc, acc_cls, iou, miou, fwavacc
参考链接:https://blog.csdn.net/qq_41731861/article/details/120683905
https://blog.csdn.net/u012370185/article/details/94409933
语义分割和实例分割区别:https://zhuanlan.zhihu.com/p/303355997
图像检测mAP的计算:https://zhuanlan.zhihu.com/p/88896868