Python计算语义分割模型的评价指标

news2024/11/28 2:55:00

目录

一、混淆矩阵

二、分类指标

1、Accuracy(准确率)

2、Precision(查准率)

3、Recall (查全率)

4、F1-score 

三、语义分割的评价指标

1、MPA(类别平均像素准确率)

2、IoU(交并比)

3、MIoU(平均交并比)

4、CPA(类别像素准确率)

5、PA(像素准确率)

四、代码实现(基于混淆矩阵) 


一、混淆矩阵

混淆矩阵(confusion matrix)是一种特定的矩阵用来呈现算法性能的可视化效果,其每一列代表预测值,每一行代表的是实际的类别。这个名字来源于它可以非常容易的表明多个类别是否有混淆(也就是一个class被预测成另一个class)。下面是二分类的混淆矩阵:

预测值与真实值相同为True,反之则为False。混淆矩阵的对角线是判断正确的,期望TP和TN越大越好,FN和FP越小越好。 

二、分类指标

1、Accuracy(准确率)

表示预测正确的样本数量占全部样本的百分比。

缺点:当数据类别分布不平衡时,不能评价模型的好坏。

2、Precision(查准率)

表示模型预测为正例的所有样本中,预测正确(真实标签为正)样本的占比:

3、Recall (查全率)

表示所有真实标签为正的样本,有多大百分比被预测出来

4、F1-score 

表示precision和recall的调和平均数,具体公式如下:

三、语义分割的评价指标

1、MPA(类别平均像素准确率)

所有类别像素准确率之和的平均。首先求得每个类别的像素准确率,然后对它们求和再平均。

2、IoU(交并比)

​IoU(Intersection-over-Union)即是预测样本和实际样本的交并比,表达式如下:

3、MIoU(平均交并比)

Mean IoU是在所有类别的IoU上取平均值。

4、CPA(类别像素准确率)

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

5、PA(像素准确率)

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

四、代码实现(基于混淆矩阵) 

import numpy as np
from collections import Counter

# 计算混淆矩阵
def cal_confu_matrix(label, predict, class_num):
    confu_list = []
    for i in range(class_num):
        c = Counter(predict[np.where(label == i)])
        single_row = []
        for j in range(class_num):
            single_row.append(c[j])
        confu_list.append(single_row)
    return np.array(confu_list).astype(np.int32)

# 计算指标
def metrics(confu_mat_total, save_path=None):
    '''
    :param confu_mat: 总的混淆矩阵
    save_path:保存txt的路径
    :return: txt写出指标
    '''
    class_num = confu_mat_total.shape[0]
    confu_mat = confu_mat_total.astype(np.float32)
    col_sum = np.sum(confu_mat, axis=1)  # 按行求和
    raw_sum = np.sum(confu_mat, axis=0)  # 每一列的数量

    pe_fz = 0
    PA = 0 # 像素准确率
    CPA = [] # 类别像素准确率
    TP = []  # 识别中每类分类正确的个数
    for i in range(class_num):
        pe_fz += col_sum[i] * raw_sum[i]
        PA = PA + confu_mat[i, i]
        CPA.append(confu_mat[i, i]/col_sum[i])
        TP.append(confu_mat[i, i])

    pe = pe_fz / (np.sum(confu_mat) * np.sum(confu_mat))
    kappa = (PA - pe) / (1 - pe) # Kappa系数
    PA = PA / confu_mat.sum()
    CPA = np.array(CPA)
    MPA = np.mean(CPA) # 类别平均像素准确率

    # 计算f1-score
    TP = np.array(TP)
    FN = col_sum - TP
    FP = raw_sum - TP

    # 计算并写出f1_score,IOU,Mf1,MIOU
    f1_score = [] # 每个类别的f1_score
    IOU = [] # 每个类别的IOU
    for i in range(class_num):
        # 写出f1-score
        f1 = TP[i] * 2 / (TP[i] * 2 + FP[i] + FN[i])
        f1_score.append(f1)
        iou = TP[i] / (TP[i] + FP[i] + FN[i])
        IOU.append(iou)

    f1_score = np.array(f1_score)
    Mf1 = np.mean(f1_score) # f1_score的平均值
    IOU = np.array(IOU)
    MIOU = np.mean(IOU) # IOU的平均值

    if save_path is not None:
        with open(save_path + 'accuracy.txt', 'w') as f:
            f.write('PA:\t%.4f\n' % (PA * 100))
            f.write('kappa:\t%.4f\n' % (kappa * 100))
            f.write('Mf1-score:\t%.4f\n' % (Mf1 * 100))
            f.write('MIOU:\t%.4f\n' % (MIOU * 100))

            # 写出f1-score
            f.write('f1-score:\n')
            for i in range(class_num):
                f.write('%.4f\t' % (float(f1_score[i]) * 100))
            f.write('\n')

            # 写出 IOU
            f.write('Iou:\n')
            for i in range(class_num):
                f.write('%.4f\t' % (float(IOU[i]) * 100))
            f.write('\n')
            
            # 写出MPA
            f.write('MPA:\n')
            for i in range(class_num):
                f.write('%.4f\t' % (float(MPA[i]) * 100))
            f.write('\n')

            # 写出precision
            f.write('precision:\n')
            for i in range(class_num):
                f.write('%.4f\t' % (float(TP[i] / raw_sum[i]) * 100))
            f.write('\n')

            # 写出recall
            f.write('recall:\n')
            for i in range(class_num):
                f.write('%.4f\t' % (float(TP[i] / col_sum[i]) * 100))
            f.write('\n')

if __name__ == '__main__':
    y_test = np.array([0, 1, 1, 2, 2, 0, 0, 1, 2, 3, 3, 2, 3, 1, 0, 3, 1, 2, 3, 3, 2, 0, ])
    y_predict = np.array([1, 1, 0, 2, 2, 2, 0, 2, 0, 3, 0, 2, 3, 1, 0, 2, 1, 2, 1, 3, 1, 3, ])
    ma = cal_confu_matrix(y_test,y_predict,4)
    metrics(ma,save_path="")

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STL-stack容器和queue容器

stack概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口 栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为 与queue相似,stack也是一个适配器类,它给底层vector提供了典型的栈接…

C语言——数组

哈喽,大家好,今天我们要学习的是数组的相关知识。 目录 1.什么是数组 2.一维数组 2.1一维数组的创建和初始化 2.2一维数组的使用 2.3一位数组在内存中的存储 3.二维数组 3.1二维数组的创建和初始化 4.2二维数组的使用 4.3二位数组在内存中的存储…

java安全编码规范(0)

JAVA安全编码标准 有这么一指导书,新手可以去看看,这里主要从实践总结,随时会更新。 主要从十个方面去了解下,实际上远远不只这些哦。 ​​​​​​​ 1、引用java security library 环境需求 Java 8Maven 3 a、编译jar包&a…

「锂」清思绪,触达未来 | 锂电池企业如何实现数字化破局?

锂电池制造的困局与破局 锂电池行业产业链的上游主要为正负极材料、电解液、电极基材、隔膜等领域的供应商;中游为电芯制造及封装行业;下游则主要是动力电池、消费电子等锂电池的应用领域。 图1:锂电池行业产业链 近年来,随着相…

虹科方案 | 适用于高压环境或潜在爆炸性环境的加速度计系统

PART 1 加速度系统 加速度计系统通常用于测量振动或运动。测量系统能够记录一个、两个或三个空间方向的运动。所实际使用的传感器是光纤传感器,可提供不受电磁干扰影响的可靠测量值。当然,这样的系统具有高可靠性,即使在不断变化的天气条件下…

转置卷积(Transposed Convolution)可视化过程

目录 1. 介绍2. 标准卷积3. 转置卷积4. 总结 1. 介绍 转置卷积(Transposed Convolution)经常也被称作反卷积,所谓反卷积即为通过标准卷积层生成的输出被反卷积,将得到原始输入。而转置卷积不按值反转标准卷积,而仅按维…

STM32F4_待机唤醒详解

目录 1. 低功耗模式 1.1 降低系统时钟速度 1.2 外设时钟门控 2. 睡眠模式 2.1 进入睡眠模式 2.2 退出休眠模式 3. 停止模式 3.1 进入停止模式 3.2 退出停止模式 4. 待机模式 4.1 进入待机模式 4.2 退出待机模式 4.3 电源控制寄存器:PWR_CR 4.4 电源控…

‘OpenpyxlWriter‘ object has no attribute ‘save‘

使用read_sql(sql,conn)来获取数据库查询的结果, 在将处理完成的表格保存下来时,可能会显示如下错误: 将writer.save()改成writer._save()就可以解决这个问题了。

必须了解的mysql三大日志-binlog、redo log和undo log

目录 一,前言二,binlog-备份日志1,作用2,使用场景3,日志形式4,binlog刷盘时机 三,redo log-重做日志1,概念2,为什么需要redo log3,日志形式4,redo…

数据结构之树(一)

一.概念 边:一棵n个结点树有n-1条边 结点深度:从根到当前结点的路径的深度。 结点高度:从当前结点到叶子结点最长路径的长度。 树的性质 树中的结点总数等于所有结点的度1;m叉树中第i(i>1)层上至多可以有m^(i-1)个节点; 高…

互联网大厂手把手教你搭建数据服务中台(附下载链接)

摘要: 随着公司业务的发展,对于数据的需求会越来越多。怎么在业务系统中高效的使用数据,让业务系统处理大数据时化繁为简,数据服务化基本是必经之路。那么什么是数据服务化,简单理解就是数据SaaS,通过一些数据库语言把…

true or false?

有同学在星球问了这样一个问题。 代码是这样的: public class Main {private static final Main instance new Main();private boolean b a;private static boolean a initA();private static boolean c a;private static boolean initA() {return true;}priva…

洛谷B2099 矩阵交换行

矩阵交换行 题目描述 给定一个 5 5 5 \times 5 55 的矩阵(数学上,一个 r c r \times c rc 的矩阵是一个由 r r r 行 c c c 列元素排列成的矩形阵列),将第 n n n 行和第 m m m 行交换,输出交换后的结果。 输入格式 输入共 6 6 6 …

DataEase 本地源码启动详细教程

本教程将引导你通过本地源码部署的方式启动 DataEase,同时我还录制了相应的视频教程,你可以跟随视频进行操作: DataEase 本地源码启动_哔哩哔哩_bilibili 1、下载并安装IDEA开发工具 2、下载安装Mysql 5.7 以及 JDK 1.8 如果你使用的是wi…

使用pdf.js展示pdf文件(亲测可用)

简单的实现方式 如果只是电脑端,可通过 iframe 标签嵌套预览 ios手机端可通过 a 标签包裹点击跳转预览(安卓端不行) 安卓电脑ios的通用方法 资料 老版本github地址 全版本地址 获取当前客户端类型 judgeClient() {let client if (/(iPh…

鲁大师智能化评测新项目——鲁大师真续航测试1.0正式发布

随着社会的高速发展,人们出行的交通工具正变得多种多样,有电单车、摩托车、自行车、两轮平衡车、甚至滑板等。不过如我们所见,电动两轮车已经成为了大多数近途出行用户的选择,因电单车具有方便、快捷、灵活、小巧、易停放等优点而…

MySQL基础篇4

MySQL基础 1. 数据类型1.1 整数类型1.2 浮点类型1.3 定点数类型1.4 位类型1.5 日期时间类型1.6 文本字符串类型1.6.1 CHAR类型和VARCHAR类型1.6.2 TEXT类型 1.7 ENUM枚举类型1.8 SET类型1.9 二进制字符串类型1.10 JSON数据类型 2. 约束2.1 前置知识2.1.1 为什么需要约束2.1.2 约…

亚马逊云科技围绕需求发力,赋能医疗与生命科学行业数字化创新

2023年4月27日,亚马逊云科技医疗与生命科学行业峰会召开,会议汇聚了业界专家和思想领袖,共同探讨行业数字化转型和创新之道。作为全球医疗及生命科学行业云计算引领者,亚马逊云科技将围绕数据、算力和行业用户体验三大需求发力&am…

移远“5G+Wi-Fi 6”方案双重加速,为用户带来更具性价比的连网体验

近年来,人们对于高速宽带连接的需求猛增,这对网络传输速率、稳定性与时延都提出了更高的要求。在离开网络寸步难行的今天,插电即用、免拉宽带的5G CPE受到了广泛关注。 在地广人稀的部分海外市场,受制于光纤铺设成本、周期、路由规…

Day966.从组件团队到Spotify模型 -遗留系统现代化实战

从组件团队到Spotify模型 Hi,我是阿昌,今天学习记录的是关于从组件团队到Spotify模型的内容。 团队结构现代化。这个方向跟管理有关,但无论掌控全局的 CTO、架构师,还是身处遗留系统一线战队的队员,都有必要了解现代…