语义分割评价指标及混淆矩阵(代码)

语义分割评价指标及混淆矩阵

计算混淆矩阵代码

'''
产生n×n的分类统计表
参数a:标签图(转换为一行输入),即真实的标签
参数b:score层输出的预测图(转换为一行输入),即预测的标签
参数n:类别数
'''

def fast_hist(a, b, n):
    #k为掩膜(去除了255这些点(即标签图中的白色的轮廓),其中的a>=0是为了防止bincount()函数出错)
    k = (a >= 0) & (a < n)
    #bincount()函数用于统计数组内每个非负整数的个数
    return np.bincount(n * a[k].astype(int) + b[k], minlength=n**2).reshape(n, n)

注:可以通过改变这里使得求得的混淆矩阵反一下。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评价指标代码

首先需要计算出TF,TP,FP,FN
在这里插入图片描述

import glob
import numpy as np
import cv2
from sklearn.metrics import classification_report
import collections
import os

'''
产生n×n的分类统计表
参数a:标签图(转换为一行输入),即真实的标签
参数b:score层输出的预测图(转换为一行输入),即预测的标签
参数n:类别数
'''

def fast_hist(a, b, n):
    #k为掩膜(去除了255这些点(即标签图中的白色的轮廓),其中的a>=0是为了防止bincount()函数出错)
    k = (a >= 0) & (a < n)
    #bincount()函数用于统计数组内每个非负整数的个数
    return np.bincount(n * a[k].astype(int) + b[k], minlength=n**2).reshape(n, n)


# print(collections.Counter(image))  # 统计查看image的类别数目


if __name__ == '__main__':
    Pa = []
    Cpa = []
    Cpa2 = []
    Iou = []
    Dice = []

    lab_path = glob.glob(os.path.join('test_true/', '*.jpg'))
    pre_path = glob.glob(os.path.join('test/', '*res.png'))
    for i in range(len(lab_path)):

        # 处理图像
        image_path = lab_path[i]
        image = cv2.imread(image_path)
        image = image.ravel()
        image[np.where(image < 122)] = 0
        image[np.where(image >= 122)] = 1

        lable_path = pre_path[i]
        lable = cv2.imread(lable_path)
        lable = lable.ravel()
        lable[np.where(lable == 255)] = 1

        # 计算混淆矩阵
        hist = fast_hist(image, lable, 2)
        TP = hist[0][0]
        TN = hist[1][1]
        FP = hist[1][0]
        FN = hist[0][1]

        # 计算各项指标
        pa = (TN+TP)/(TN+TP+FN+FP)
        cpa = TN/(TN+FN)
        cpa2 = TP/(TP+FP)
        iou = FN/(FN+FP+TN)
        dice = 2*TP/(2*TP+FN+FP)

        Pa.append(pa)
        Cpa.append(cpa)
        Cpa2.append(cpa2)
        Iou.append(iou)
        Dice.append(dice)

    # 列表转为Numpy
    Pa_num = np.array(Pa)
    Cpa_num = np.array(Cpa)
    Cpa_num2 = np.array(Cpa2)
    Iou_num = np.array(Iou)
    Dice_num = np.array(Dice)

    print('图片的平均Pa:{:.4f}±{:.4f}'.format(Pa_num.mean(), Pa_num.std()))
    print('白块的平均Cpa:{:.4f}±{:.4f}'.format(Cpa_num.mean(), Cpa_num.std()))
    print('类别平均像素准确率Mpa:{:.4f}'.format((Cpa_num.mean()+Cpa_num2.mean())/2))
    print('白块类别平均IoU:{:.4f}±{:.4f}'.format(Iou_num.mean(), Iou_num.std()))
    print('Dice系数:{:.4f}±{:.4f}'.format(Dice_num.mean(), Dice_num.std()))




评价指标介绍

在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
语义分割混淆矩阵的计算是通过比较预测结果和真实标签来评估模型的性能。混淆矩阵是一个n×n的矩阵,其中n是别的数量。它记录了模型对每个别的预测结果与真实标签的对应关系。根据引用[2]中提供的代码,以下是计算混淆矩阵的步骤: 1. 首先,要有预测结果和真实标签的数组,分别是label_pred和label_true。 2. 创建一个布尔掩码,用于过滤掉无效的预测结果和真实标签。布尔掩码的条件是label_true大于等于0且小于别数量n_class,即mask = (label_true >= 0) & (label_true < n_class)。 3. 使用np.bincount函数计算直方图,该函数会统计在指定范围内的每个整数值出现的次数。在这里,我们将预测结果和真实标签组合成一个多维数组作为输入,然后将其展平为一维数组。通过指定minlength参数为n_class的平方,确保输出的直方图是一个n×n的矩阵。具体代码是:hist = np.bincount(n_class * label_true[mask].astype(int) + label_pred[mask], minlength=n_class ** 2)。 4. 将一维数组重塑为n×n的矩阵,以得到最终的混淆矩阵。具体代码是:hist = hist.reshape(n_class, n_class)。 这样,就能够得到语义分割混淆矩阵混淆矩阵可以帮助我们了解模型在每个别上的性能,包括准确率、召回率和F1分数等指标。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [语义分割评价指标代码混淆矩阵计算详解](https://blog.csdn.net/weixin_43143670/article/details/104722381)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值