为了计算语义分割的指标miou,需要生成的中间过程就是混淆矩阵。
iou = intersection / union
每个类别的平均iou就是mean iou。
使用sklearn自带的confusion_matrix能很容易生成混淆矩阵,可以进行混淆矩阵的可视化观察哪个类别分割的不好。
from sklearn.metrics import confusion_matrix# 定义总的混淆矩阵
matrix = np.zeros((self.n, self.n), dtype=np.int64)# 每个batch的数据都按照一下的方法添加进混淆矩阵:
# pred: NxC
# label: Npred_l = pred.max(dim=1)[1]
matrix += confusion_matrix(label.int().cpu().numpy(), pred_l.cpu().numpy(), labels=range(13))
一定要设置 labels=range(13),否则labels不全可能生成不了完整尺寸的混淆矩阵。
可以使用seaborn进行可视化。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as pltsns.heatmap(data=matrix / np.sum(matrix, axis=0, keepdims=True), annot=True,fmt=".2f", xticklabels=class_name,cmap='GnBu')
plt.xticks(rotation=45, ha='right')
plt.ylabel('Pred')
plt.xlabel('True')
plt.title('Confusion Matrix')plt.tight_layout()plt.savefig("confusion.png")
matrix按照列进行求和,这样能够按照label值归一化到1。