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

news2024/11/23 11:10:11

语义分割评价指标

混淆矩阵和评价指标

https://cocodataset.org/#stuff-eval


混淆矩阵(Confusion Matrix)

指标公式
准确率、正确率 T P + T N ТР + T N + F P + F N \frac{TP + TN}{ ТР+ TN+FP+FN} ТР+TN+FP+FNTP+TN
精确率、精度 P = T P ТР + F P P= \frac{TP }{ ТР+ FP} P=ТР+FPTP
真正类率、召回率 R = T P ТР + F N R= \frac{TP }{ ТР+ FN} R=ТР+FNTP
F1-Score:精确度和召回率的调和平均值 F 1 = 2 P × R P + R F1=2\frac{P×R}{P+R} F1=2P+RP×R

举例

注:大多数博客的类别像素准确率都是 T P T P + F P \frac{TP}{TP + FP} TP+FPTP,而代码中都是 T P ТР + F N \frac{TP }{ ТР+ FN} ТР+FNTP,其实类别像素准确率应该为混淆矩阵的召回率。

指标公式举例
像素准确率 P A = T P + T N ТР + T N + F P + F N PA = \frac{TP + TN}{ ТР+ TN+FP+FN} PA=ТР+TN+FP+FNTP+TN P A = a + e + i a + b + c + d + e + f + g + h + i PA = \frac{a+e+i}{ a+b+c+d+e+f+g+h+i} PA=a+b+c+d+e+f+g+h+ia+e+i
类别像素准确率 C P A i = T P i T P i + F N i CPA_i =\frac{TP_i}{TP_i + FN_i } CPAi=TPi+FNiTPi C P A 类别 1 = a a + b + c ; C P A 类别 2 = e d + e + f ; C P A 类别 3 = i g + h + i CPA_{类别1} = \frac{a}{ a+b+c};CPA_{类别2} = \frac{e}{d+e+f};CPA_{类别3} = \frac{i}{ g+h+i} CPA类别1=a+b+ca;CPA类别2=d+e+fe;CPA类别3=g+h+ii
类别平均像素准确率 M P A = Σ ( C P A i ) N MPA =\frac{Σ(CPA_i)}{N} MPA=NΣ(CPAi) M P A = C P A 类别 1 + C P A 类别 2 + C P A 类别 3 3 MPA= \frac{CPA_{类别1}+CPA_{类别2}+CPA_{类别3}}{3} MPA=3CPA类别1+CPA类别2+CPA类别3
交并比 I o U i = T P i T P i + F P i + F N i IoU_i = \frac{TP_i}{TP_i + FP_i + FN_i} IoUi=TPi+FPi+FNiTPi I o U 类别 1 = a a + b + c + d + g IoU_{类别1} = \frac{a}{ a+b+c+d+g} IoU类别1=a+b+c+d+ga I o U 类别 2 = e d + e + f + b + h IoU_{类别2} = \frac{e}{ d+e+f+b+h} IoU类别2=d+e+f+b+he I o U 类别 3 = i g + h + i + c + f IoU_{类别3} = \frac{i}{ g+h+i+c+f} IoU类别3=g+h+i+c+fi
平均交并比 M I o U = Σ ( I o U i ) N MIoU = \frac{Σ(IoU_i)}{N} MIoU=NΣ(IoUi) M I o U = I o U 类别 1 + I o U 类别 2 + I o U 类别 3 3 MIoU = \frac{IoU_{类别1} +IoU_{类别2} +IoU_{类别3} }{3} MIoU=3IoU类别1+IoU类别2+IoU类别3
频权平均交并比 F W M I o U = ∑ k = 1 K n k T P k ∑ k = 1 K n k ∗ ( T P k + F P k + F N k ) FWMIoU =\frac{∑_{k=1}^Kn_kTP_k}{∑_{k=1}^Kn_k*(TP_k + FP_k + FN_k)} FWMIoU=k=1Knk(TPk+FPk+FNk)k=1KnkTPk f r e q 1 = a + b + c a + b + c + d + e + f + g + h + i freq1=\frac{a+b+c}{a+b+c+d+e+f+g+h+i} freq1=a+b+c+d+e+f+g+h+ia+b+c f r e q 2 = d + e + f a + b + c + d + e + f + g + h + i freq2=\frac{d+e+f}{a+b+c+d+e+f+g+h+i} freq2=a+b+c+d+e+f+g+h+id+e+f f r e q 3 = g + h + i a + b + c + d + e + f + g + h + i freq3=\frac{g+h+i}{a+b+c+d+e+f+g+h+i} freq3=a+b+c+d+e+f+g+h+ig+h+i F W M I o U = I o U 类别 1 ∗ f r e q 1 + I o U 类别 2 ∗ f r e q 2 + I o U 类别 3 ∗ f r e q 3 f r e q 1 + f r e q 2 + f r e q 3 FWMIoU =\frac{IoU_{类别1}* freq1 +IoU_{类别2} * freq2+IoU_{类别3}* freq3}{freq1 + freq2 + freq3} FWMIoU=freq1+freq2+freq3IoU类别1freq1+IoU类别2freq2+IoU类别3freq3
F 1 − s c o r e F1-score F1score 2 ∗ T P / ( 2 ∗ T P + F P + F N ) 2*TP / (2*TP+FP+FN) 2TP/(2TP+FP+FN) F 1 类别 1 = 2 a 2 a + b + c + d + g + h F1_{类别1}=\frac{2a}{2a+b+c+d+g+h} F1类别1=2a+b+c+d+g+h2a F 1 类别 2 = 2 e 2 e + d + f + b + e + h F1_{类别2}=\frac{2e}{2e+d+f+b+e+h} F1类别2=2e+d+f+b+e+h2e F 1 类别 3 = 2 i 2 i + g + h + c + f F1_{类别3}=\frac{2i }{2i+g+h+c+f} F1类别3=2i+g+h+c+f2i F 1 = F 1 类别 1 + F 1 类别 2 + F 1 类别 3 3 F1=\frac{F1_{类别1}+F1_{类别2}+F1_{类别3}}{3} F1=3F1类别1+F1类别2+F1类别3
Dice系数
ROC和AUC
RR/MRR
"""
refer to https://github.com/jfzhang95/pytorch-deeplab-xception/blob/master/utils/metrics.py
"""
import numpy as np

__all__ = ['SegmentationMetric']

"""
                  预测
                P    N
        P      TP    FN
真实
        N      FP    TN
"""


class SegmentationMetric(object):
    def __init__(self, numClass):
        self.numClass = numClass
        self.confusionMatrix = np.zeros((self.numClass,) * 2)

    def genConfusionMatrix(self, imgPredict, imgLabel):  # 同FCN中score.py的fast_hist()函数
        # remove classes from unlabeled pixels in gt image and predict
        mask = (imgLabel >= 0) & (imgLabel < self.numClass)
        label = self.numClass * imgLabel[mask] + imgPredict[mask]
        count = np.bincount(label, minlength=self.numClass ** 2)
        confusionMatrix = count.reshape(self.numClass, self.numClass)
        return confusionMatrix

    def addBatch(self, imgPredict, imgLabel):
        assert imgPredict.shape == imgLabel.shape
        self.confusionMatrix += self.genConfusionMatrix(imgPredict, imgLabel)

    def pixelAccuracy(self):
        # 返回所有类别的整体像素准确度
        #  PA = acc = (TP + TN) / (TP + TN + FP + TN)
        acc = np.diag(self.confusionMatrix).sum() / self.confusionMatrix.sum()
        return acc

    def classPixelAccuracy(self):
        # 返回每个类别的像素精度(称为精度的更准确方法)
        # acc = (TP) / TP + FN
        classAcc = np.diag(self.confusionMatrix) / self.confusionMatrix.sum(axis=1)
        return classAcc  # 返回的是一个列表值,如:[0.90, 0.80, 0.96],表示类别1 2 3各类别的预测准确率

    def meanPixelAccuracy(self):
        classAcc = self.classPixelAccuracy()
        meanAcc = np.nanmean(classAcc)  # np.nanmean 求平均值,nan表示遇到Nan类型,其值取为0
        return meanAcc  # 返回单个值,如:np.nanmean([0.90, 0.80, 0.96, nan, nan]) = (0.90 + 0.80 + 0.96) / 3 =  0.89

    def IntersectionOverUnion(self):
        # Intersection = TP Union = TP + FP + FN
        # IoU = TP / (TP + FP + FN)
        intersection = np.diag(self.confusionMatrix)  # 取对角元素的值,返回列表
        union = np.sum(self.confusionMatrix, axis=1) + np.sum(self.confusionMatrix, axis=0) - np.diag(
            self.confusionMatrix)  # axis = 1表示混淆矩阵行的值,返回列表; axis = 0表示取混淆矩阵列的值,返回列表
        IoU = intersection / union  # 返回列表,其值为各个类别的IoU
        return IoU

    def meanIntersectionOverUnion(self):
        IoU = self.IntersectionOverUnion()
        mIoU = np.nanmean(IoU)  # 求各类别IoU的平均
        return mIoU

    def FrequencyWeightedIntersectionOverUnion(self):
        # FWIOU =     [(TP+FN)/(TP+FP+TN+FN)] *[TP / (TP + FP + FN)]
        freq = np.sum(self.confusionMatrix, axis=1) / np.sum(self.confusionMatrix)
        iu = np.diag(self.confusionMatrix) / (
                np.sum(self.confusionMatrix, axis=1) + np.sum(self.confusionMatrix, axis=0) -
                np.diag(self.confusionMatrix))
        FWIoU = (freq[freq > 0] * iu[freq > 0]).sum()
        return FWIoU

    def reset(self):
        self.confusionMatrix = np.zeros((self.numClass, self.numClass))


if __name__ == '__main__':
    imgPredict = np.array([0, 1, 2, 2, 0, 1])
    imgLabel = np.array([0, 1, 2, 2, 1, 2])
    metric = SegmentationMetric(3)  # 3表示有3个分类
    metric.addBatch(imgPredict, imgLabel)
    pa = metric.pixelAccuracy()
    cpa = metric.classPixelAccuracy()
    mpa = metric.meanPixelAccuracy()
    IoU = metric.IntersectionOverUnion()
    mIoU = metric.meanIntersectionOverUnion()
    fwmIoU = metric.FrequencyWeightedIntersectionOverUnion()
    print('混淆矩阵:\n', metric.confusionMatrix)
    print('pa:\t', pa)
    print('cpa:\t', cpa)
    print('mpa:\t', mpa)
    print('IoU:\t', IoU)
    print('mIoU:\t', mIoU)
    print('FWmIoU:\t', fwmIoU)

结果

混淆矩阵:
 [[1. 0. 0.]
 [1. 1. 0.]
 [0. 1. 2.]]
pa:	 0.6666666666666666
cpa:	 [1.         0.5        0.66666667]
mpa:	 0.7222222222222222
IoU:	 [0.5        0.33333333 0.66666667]
mIoU:	 0.5
FWmIoU:	 0.5277777777777777

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

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

相关文章

VLAN基础知识1_整体介绍

目录 1.VLAN概述 2.VLAN帧格式 3.VLAN端口类型 4.缺省VLAN 5.VLAN打标签和去标签 6.VLAN划分的方法 1.VLAN概述 VLAN&#xff08;虚拟局域网&#xff09;是一种逻辑上划分网络设备的技术&#xff0c;用于将单个物理网络划分成多个虚拟网络。VLAN可以将网络中的设备分组&…

uni-app开发壁纸图像小程序 瀑布流、懒加载展示

标题&#xff1a;使用uni-app开发壁纸图像小程序&#xff1a;瀑布流与懒加载展示 引言&#xff1a; 在今天的移动应用市场中&#xff0c;壁纸图像小程序备受欢迎。为了提高用户体验&#xff0c;我们可以使用uni-app框架来开发这样的小程序&#xff0c;并实现瀑布流和懒加载展示…

Mybatis常见问题

Mybatis执行流程 理解各组件的联系Sql的执行过程&#xff08;参数映射&#xff0c;sql解析&#xff0c;执行和处理结果&#xff09;首先通过mybatis-config.xml文件去加载连接数据库的相关配置&#xff0c;加载sql的映射文件 通过mybatis的配置文件然后去构建会话工厂SqlSess…

chatgpt赋能python:Python整数筛选方法

Python整数筛选方法 Python是一种极其强大的编程语言&#xff0c;特别适合用于数据科学和数字计算。在数字计算中&#xff0c;经常需要筛选出指定范围内的整数。下面将介绍几种Python中筛选整数的方法。 1. 利用循环筛选 最简单的方法是使用循环&#xff0c;逐个检查每个数字…

关于Sui x KuCoin Labs夏季黑客松的七个关键信息

为促进Sui生态发展更进一步&#xff0c;Sui与KuCoin Labs联合举办夏季黑客松&#xff0c;希望能聚集全球加密英才&#xff0c;利用Sui产业领先的技术堆栈激荡出新的火花&#xff0c;为加密产业和Sui生态引入新的力量。本次黑客松总奖金达28.5万美元&#xff0c;分为多个赛道&am…

【React】React中编写CSS,Redux

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 React中编写CSS内联样式普通csscss modulescss in js动态添加class ReduxJS纯函数如何创建redux…

MVC 模式及对象持久化

MVC 模式及对象持久化 开发框架简介对象关系映射ORM 技术 Struts2 框架的使用Struts2 框架的下载及部署Struts2 配置 开发框架简介 在了解MVC 之前&#xff0c;首先来了解框架的概念。要理解框架的含义得从开发的实际需求说起。在软件开发过程中总有很多基础的功能是相同或者相…

荣耀MagicBook如何重装系统?荣耀MagicBook重装Win10系统教程

荣耀MagicBook如何重装系统&#xff1f;荣耀MagicBook是一款12小时长续航独显轻薄本&#xff0c;深受用户的喜欢&#xff0c;有些用户想知道如何给荣耀MagicBook重装Win10系统&#xff0c;操作难度不会很大&#xff0c;用户们可以根据小编给大家分享的荣耀MagicBook重装Win10系…

【FPGA零基础学习之旅#8】阻塞赋值与非阻塞赋值讲解

&#x1f389;欢迎来到FPGA专栏~阻塞赋值与非阻塞赋值 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家…

Redis从入门到精通【高阶篇】之底层数据结构跳表(SkipList)

文章目录 0.前言1.跳表(SkipList)基本详解2. 源码解析3.总结4.思考题5. Redis从入门到精通系列文章 0.前言 上个篇章回顾&#xff0c;我们上个章节我们学习了《Redis从入门到精通【高阶篇】之底层数据结构整数集(IntSet)详解》&#xff0c;我们从源码层了解整数集由一个头部和…

Day08 Python数据结构(数据容器)详解

文章目录 第五章 Python数据容器5.1. 容器类型介绍5.2. 数据容器运算符5.2.1. 成员运算符5.2.2. 身份运算符 5.3. 字符串str5.3.1. 字符串的定义5.3.2. 运算符的相关操作5.3.3. 索引和切片5.3.3.1. 索引5.3.3.2. 切片 5.3.4. 字符串遍历5.3.5. 字符串的相关操作5.3.5.1. 获取的…

git安装以及git小乌龟使用

一、下载git 打开git官网地址&#xff1a;https://git-scm.com/进行下载 下载完安装&#xff0c;一直next就好&#xff0c;如果愿意就可以改下安装路径&#xff0c;改在d盘。 具体可以参考&#xff1a;git安装教程 二、安装完下载小乌龟以及语言包 下载地址&#xff1a;小乌龟…

【OpenMMLab AI实战营二期笔记】第六天 目标检测和MMDetection

1.什么是目标检测&#xff1f; 目标检测 vs 图像分类 目标检测的应用 &#xff08;1&#xff09;人脸识别 &#xff08;2&#xff09;智慧城市 &#xff08;3&#xff09;自动驾驶 &#xff08;4&#xff09;下游视觉任务&#xff1a;场景文字识别、人体姿态估计 目标检测技术…

微服务 springcloud 08.zuul框架,API网关,整合ribbon和hystrix框架

01.zuul是作为springcloud中的一个网关框架来使用的。 zuul API 网关&#xff0c;为微服务应用提供统一的对外访问接口。 zuul 还提供过滤器&#xff0c;对所有微服务提供统一的请求校验。 在项目中的位置&#xff1a; 02.新建 sp11-zuul 项目 03.pom.xml 需要添加 sp01-com…

【雕爷学编程】Arduino动手做(111)---震动提醒模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

纺织工厂运营神技,不会你就OUT了!

在纺织工业中&#xff0c;保持适宜的生产环境是至关重要的。温湿度、能耗、设备运行状态以及空气质量等因素对纺织品的质量和生产效率都有着重要影响。 为了实现对生产环境的全面监控和管理&#xff0c;纺织企业越来越多地采用动环监控系统。 客户案例 湖州市某纺织工厂监控项目…

USART2实现Motbus485通信

本文用的单片机是原子的战舰V4 1. 先来驱动一下usart2 USART驱动配置一般步骤: STEP1&#xff1a;使能相关时钟&#xff0c;这块板子usart2用到了A2、A3分别为TX脚、RX脚&#xff0c;D7的作用是发送接收模式控制。下面开启GPIO与USART2时钟&#xff1a; RCC_APB1PeriphClockCm…

SpringBoot中打印 sql 语句

系列文章目录 文章目录 系列文章目录前言一、在配置文件中 application.yml 配置即可二、#Log4g打印SqL语句三、配置Logback总结 前言 在SpringBoot中&#xff0c;我们可以使用日志框架来打印SQL语句&#xff0c;常用的日志框架有Logback和Log4j2。下面以Logback为例&#xff…

35:考虑virtual函数以外的其他选择

假设你正在写一个视频游戏软件&#xff0c;你打算为游戏内的人物设计一个继承体系&#xff0c;剧中人物被伤害或因其他因素而降低健康状态的情况并不罕见。你因此决定提供一个成员函数healthValue&#xff0c;它会返回一个整数&#xff0c;表示人物的健康程度。 由于不同的人物…

Linux x86_64平台同时编译x86_64和arm64两个架构的Qt应用程序出现XRes库无法找到

一 背景 在ubuntu x86_64平台上需要同时编译x86_64和arm64两个架构的Qt应用程序。在实践过程中&#xff0c;发现XRes库只能安装在其中一个平台。 二 根因 安装amd64版本的XRes库会删除arm64版本的库&#xff0c;反之亦然。 在安装amd64版本时&#xff0c;会删除arm64版本&a…