语义分割指标体系Python实现:F-score/DICE、PA、CPA、MPA、IOU、MIOU

语义分割指标体系Python实现:F-score/DICE、PA、CPA、MPA、IOU、MIOU

引言

语义分割评价指标主要有三大类,分别是执行时间、内存占用和准确度。本文主要介绍几种指标和python代码实现:

F-score/DICE

F-score也称为Dice系数或QS(相似商),是一种衡量两个集合之间相似性的度量,对于语义分割任务而言即用来评估网络预测的分割结果与人为标注结果之间的相似度。F-score等于2倍的精确率和召回率的乘积除以精确率和召回率的和.
F 1 = 2 × P × R P + R F1 = \frac{2 \times P \times R}{P+R} F1=P+R2×P×R

# 计算F1-score(F1)
def f1_accuracy(pred, label):
    # pred和label都是二维数组,表示预测和真实的像素类别
    # 返回一个0~1之间的浮点数,表示像素准确率
    # 计算混淆矩阵
    cm = confusion_matrix(y_true.flatten(), y_pred.flatten())
    # 计算F1分数
    return f1_score(y_true.flatten(), y_pred.flatten())

PA:

像素准确率,是一种衡量分割结果中正确分类像素占总像素数的比例。PA等于混淆矩阵中对角线元素之和除以混淆矩阵中所有元素之和。

# 计算像素准确率(PA)
def pixel_accuracy(pred, label):
    # pred和label都是二维数组,表示预测和真实的像素类别
    # 返回一个0~1之间的浮点数,表示像素准确率
    assert pred.shape == label.shape
    return (pred == label).mean()

CPA:

类别像素准确率,是一种衡量每个类别中正确分类像素占该类别总像素数的比例。CPA等于混淆矩阵中第i行第i列元素除以混淆矩阵中第i行所有元素之和。

# 计算类别像素准确率(CPA)
def class_pixel_accuracy(pred, label, num_classes):
    # pred和label都是二维数组,表示预测和真实的像素类别
    # num_classes是一个整数,表示类别数目
    # 返回一个长度为num_classes的一维数组,表示每个类别的像素准确率
    assert pred.shape == label.shape
    cpa = np.zeros(num_classes)
    for i in range(num_classes):
        cpa[i] = (pred[label == i] == i).mean()
    return cpa

MPA:

类别平均像素准确率,是一种衡量所有类别的CPA的平均值。MPA等于所有类别CPA之和除以类别数。

# 计算类别平均像素准确率(MPA)
def mean_pixel_accuracy(pred, label, num_classes):
    # pred和label都是二维数组,表示预测和真实的像素类别
    # num_classes是一个整数,表示类别数目
    # 返回一个0~1之间的浮点数,表示类别平均像素准确率
    assert pred.shape == label.shape
    mpa = class_pixel_accuracy(pred, label, num_classes).mean()
    return mpa

IOU:

交并比,是一种衡量两个集合之间重叠程度的度量,对于语义分割任务而言即用来评估网络预测的分割结果与人为标注结果之间的重叠程度。IOU等于两个集合交集面积除以两个集合并集面积。

# 计算交并比(IoU)
def intersection_over_union(pred, label, num_classes):
    # pred和label都是二维数组,表示预测和真实的像素类别
    # num_classes是一个整数,表示类别数目
    # 返回一个长度为num_classes的一维数组,表示每个类别的交并比
    assert pred.shape == label.shape
    iou = np.zeros(num_classes)
    for i in range(num_classes):
        intersection = ((pred == i) & (label == i)).sum()
        union = ((pred == i) | (label == i)).sum()
        if union > 0:
            iou[i] = intersection / union
        else:
            iou[i] = np.nan
            # 表示该类别不存在于图像中
    return iou

MIOU

平均交并比,是一种衡量所有类别IOU的平均值。MIOU等于所有类别IOU之和除以类别数。

# 计算平均交并比(MIoU)
def mean_intersection_over_union(pred, label, num_classes):
    # pred和label都是二维数组,表示预测和真实的像素类别
    # num_classes是一个整数,表示类别数目
    # 返回一个0~1之间的浮点数,表示平均交并比
    assert pred.shape == label.shape
    miou = intersection_over_union(pred, label, num_classes).mean()
    return miou

猜你喜欢

转载自blog.csdn.net/weixin_51717597/article/details/129399658