图像分类 图像分割的评价指标(混淆矩阵 正确率 精准率 召回率 F1分数 IOU dice系数)

         在图像分类或者图像分割中,为评价模型的预测效果,在训练过程中通常需要比较预测值与真实标签值的差距,即误差。

目录

图像分类过程的评价指标

混淆矩阵

正确率/准确率

精准率

召回率

F1分数

图像分割过程的评价指标

混淆矩阵

混淆矩阵的生成代码

IOU与MIOU

IOU计算代码

dice系数

dice系数计算代码

IOU与dice系数的关系

图像分类过程的评价指标

混淆矩阵

        混淆矩阵,用来总结分类结果的矩阵,N*N的方阵,N表示类别数。混淆矩阵的表示真实类别,表示预测类别。

        例如:针对一个二分类问题,混淆矩阵为:

预测值=1

预测值=0

真实值=1

TP

FN

真实值=0

FP

TN

        TP为真阳性,FP为假阳性,FN为假阴性,TN为真阴性。

正确率/准确率

        衡量模型在整个数据集上分类正确的比例

 accuracy=\frac{TP+TN}{TP+FP+TN+FN}

精准率

        判别为该类的样本中,正确的有多少

(1)类别1的精准率precision: 

\frac{TP}{TP+FP}

(2)类别0的精准率precision:

\frac{TN}{TN+FN}

召回率

        该类样本中,找回了多少

(1)类别1的召回率recall:

\frac{TP}{TP+FN}

(2)类别0的召回率recall:

\frac{TN}{TN+FP}

注:正确率指全部样本;精准率或召回率指某一类,某一类的精准率或召回率

F1分数

        精准率和召回率的调和平均,可以做到二者兼顾。特点是:如果二者极度不平衡,一个值特别高、另一个值特别低时,得到的F1分数也特别低;只有二者都非常高时,F1才会高。

\frac{2*precision*recall}{precision+recall}

其中,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

        iouintersection over union,交并比)广泛用于语义分割中,指每个类别的预测准确率

 \frac{target\cap prediction}{target\cup prediction}

其中,target为该类别标签数量,prediction为预测该类别的数量

        miou(均交并比)为所有类别iou值的平均值

例1:假设为两个类别的图像分割,混淆矩阵2*2

预测值=1

预测值=0

真实值=1

TP

FN

真实值=0

FP

TN

(1)类别1的IOU:

\frac{TP}{TP+FP+FN}

        此时,target=TP+FN   prediction=TP+FP

(2)类别0的IOU:

\frac{TN}{TN+FP+FN}

        此时,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]之间

s=\frac{2|X\cap Y|}{|X|+|Y|}

对于语义分割而言,X是GT分割图像(Ground Truth),Y是pred分割图像(预测值)

例2:混淆矩阵图与例1相同

(1)类别1的dice系数:

s=\frac{2*TP}{2*TP+FN+FP}

(2)类别0的dice系数:

s=\frac{2*TN}{2*TN+FN+FP}

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=\frac{dice}{2-dice}

因此,可以推导得到

dice=\frac{2*iou}{1+iou}

由于iou取值在[0,1]之间可知,dice系数大于等于iou值。

使用dice系数可以获得更高的分数。

猜你喜欢

转载自blog.csdn.net/m0_63077499/article/details/127509081