不管在任何领域,我们都需要设计对应的指标和评价标准。这些指标通常用来评判我们的工作做的如何,与上次的工作相比是否有所进展。这些指标有助于我们去分析和理解,我们这次的工作方向是否正确。不管是否有进展,我们都需要总结Why it works?How it works?
就像数值分析课程上讲解最小二乘法拟合的时候,数学老师会问你误差是多少?以后你在科研工作经常会被问到这个问题,那么误差在这里就是我们的评价指标。我们在开始一项工作前,一定要设计这项工作的评价指标,这样在我们进行工作的时候,我们才能知道我们的工作进展如何,从而把评价指标作为反馈,来调整我么你的工作方向。这才是一个自动化的学生,从《自动控制原理》中悟到的精髓。
扯远了,我们言归正传说回计算机视觉领域。
那么在图像分类领域,我们有准确率、精确率和召回率作为我们评价图像分类结果的标准。那么在语义分割领域,我们也需要相对应的指标来定义我们的模型和算法对于图像的分割结果到底如何。那么这篇博客将给大家详细介绍,各种的语义分割指标,并用numpy给大家解释如何使用并计算的。
import numpy as np
pre_image=np.array([[0,0,0,0],#网络的预测图像的输出是4*4*1的大小
[0,1,0,0],
[0,0,2,0],
[0,0,0,0]])
gt_image = np.array([[0,0,0,0],#图像的标签也是4*4*1的大小
[0,1,0,0],
[0,0,3,0],
[0,0,0,0]])
p在当前的数据集下,标签中一共有四类,0代表background,1,2,3分别代表图像每个像素的预测分类,比如是人、车、树。
pre_image代表图像的预测结果
gt_image代表标签的结果
ps:pre_image的前一步是分割网络的输出。那么会是一个4×4×4的矩阵,针对每个像素是一个1×1×4的向量,就是对于这个像素的分类结果输出四个概率,那么我们取预测概率最大的那个结果作为当前像素的预测分类。从而就从一个4×4×4的预测概率的三维输出降维成了4×4×1。
num_class=7
confusion_matrix = np.zeros((num_class,)*2)
print(confusion_matrix)
mask = (gt_image >= 0) & (gt_image < num_class)#
label = num_class * gt_image[mask].astype('int') + pre_image[mask]
print(label)
count = np.bincount(label, minlength=num_class**2)
print(count)
confusion_matrix = count.reshape(num_class, num_class)
#预测正确的像素个数/图像像素大小
np.diag(confusion_matrix).sum() / confusion_matrix.sum()
#混淆矩阵的对角线元素之和/图像像素大小
#print(Acc)
#step1:每一类别的预测准确率
Acc = np.diag(confusion_matrix) / confusion_matrix.sum(axis=1)
#混淆矩阵对角线元素除以
print(Acc)
#step2:7类准确率的平均值
Acc = np.nanmean(Acc)
print(Acc)
交并比的概念很好理解。 就是pre_image和gt_image的交集合比上他们的并集。 交集:即预测正确的地方。 np.diag(confusion_matrix)为混淆矩阵的对角线元素。 np.sum(confusion_matrix, axis=1)代表混淆矩阵按行相加。
miou = np.delete(np.diag(confusion_matrix),0) / np.delete((
np.sum(confusion_matrix, axis=1) + np.sum(confusion_matrix, axis=0) -
np.diag(confusion_matrix)),0)
print(miou)
miou = np.nanmean(miou)
print(miou)
1.损失函数的使用完全一样
2.计算指标的时候先生成