在图像分类或者图像分割中,为评价模型的预测效果,在训练过程中通常需要比较预测值与真实标签值的差距,即误差。
目录
图像分类过程的评价指标
混淆矩阵
混淆矩阵,用来总结分类结果的矩阵,N*N的方阵,N表示类别数。混淆矩阵的行表示真实类别,列表示预测类别。
例如:针对一个二分类问题,混淆矩阵为:
预测值=1 | 预测值=0 | |
真实值=1 | TP | FN |
真实值=0 | FP | TN |
TP为真阳性,FP为假阳性,FN为假阴性,TN为真阴性。
正确率/准确率
衡量模型在整个数据集上分类正确的比例
精准率
判别为该类的样本中,正确的有多少
(1)类别1的精准率precision:
(2)类别0的精准率precision:
召回率
该类样本中,找回了多少
(1)类别1的召回率recall:
(2)类别0的召回率recall:
注:正确率指全部样本;精准率或召回率指某一类,某一类的精准率或召回率
F1分数
精准率和召回率的调和平均,可以做到二者兼顾。特点是:如果二者极度不平衡,一个值特别高、另一个值特别低时,得到的F1分数也特别低;只有二者都非常高时,F1才会高。
其中,precision recall分别为上述的精准率和召回率,也是针对某一类计算F1分数。
图像分割过程的评价指标
混淆矩阵
图像分割是对图像进行逐像素分类,预测值与真实值不再是分类过程的单个标签值(一整个图片表示一个类别),而是一个h*w的二维数组(每个像素点代表一个类别)。因此,可以可以使用.flatten()函数 将预测值及真实值摊平成一维数组,然后逐个遍历,累计混淆矩阵的值。
混淆矩阵的生成代码
"""
class_num:分割类别数
model:模型
inputs:模型输入 shape=(b,c,h,w) b-batchsize c-channel(图片输入通道数)
labels:模型真实标签 shape=(b,h,w)
outputs:模型预测值 shape=(b,class_num,h,w) class_num维度代表此像素点是所有类别的可能性,outputs.max(dim=1)[1]即可得到最大可能性的类别(预测类别)
"""
import numpy as np
conf_mat=np.zeros((class_num,class_num))
outputs=model(inputs)
pre_label=outputs.max(dim=1)[1].cpu().numpy().flatten()
true_label=labels.cpu().numpy().flatten()
# 混淆矩阵
for i,j in zip(true_label,pre_label):
conf_mat[i][j]+=1
IOU与MIOU
iou(intersection over union,交并比)广泛用于语义分割中,指每个类别的预测准确率
其中,target为该类别标签数量,prediction为预测该类别的数量
miou(均交并比)为所有类别iou值的平均值
例1:假设为两个类别的图像分割,混淆矩阵2*2
预测值=1 | 预测值=0 | |
真实值=1 | TP | FN |
真实值=0 | FP | TN |
(1)类别1的IOU:
此时,target=TP+FN prediction=TP+FP
(2)类别0的IOU:
此时,target=TN+FP prediction=TN+FN
IOU计算代码
import numpy as np
confusion=np.array([[100,1],[1,200]]) # 一个2*2的混淆矩阵
iou = np.diag(confusion) / (confusion.sum(axis=1) + confusion.sum(axis=0)- np.diag(confusion))
print(iou) # [0.98039216 0.99009901]
# miou为均交并比
miou=np.mean(iou)
print(miou) # 0.9852455833818676
dice系数
dice系数是一种集合相似度量函数,通常用于计算两个样本的相似度,取值范围在[0,1]之间
对于语义分割而言,X是GT分割图像(Ground Truth),Y是pred分割图像(预测值)
例2:混淆矩阵图与例1相同
(1)类别1的dice系数:
(2)类别0的dice系数:
dice系数计算代码
import numpy as np
conf_mat=np.array([[100,1],[1,200]])
dice = 2 * np.diag(conf_mat) / (conf_mat.sum(axis=1) + conf_mat.sum(axis=0)) # 各个类别的dice系数
print(dice) # [0.99009901 0.99502488]
print(np.mean(dice)) # 0.9925619427614403
IOU与dice系数的关系
因此,可以推导得到
由于iou取值在[0,1]之间可知,dice系数大于等于iou值。
使用dice系数可以获得更高的分数。