图像分割中的混淆矩阵和利用混淆矩阵计算指标

news/2024/11/30 20:49:56/

目录

1. 介绍

2. 创建混淆矩阵

2.1 update 方法

2.2 compute 方法

2.3 str 方法

3. 测试

4. 完整代码


1. 介绍

语义分割中,性能指标可以利用混淆矩阵进行计算

这里实现的方法和图像分类中不一样,需要的可以参考:混淆矩阵Confusion Matrix

 

这里采用的测试数据如下:

 

2. 创建混淆矩阵

混淆矩阵的实现如下

init 是初始化混淆矩阵

update 更新混淆矩阵的数值

reset 将矩阵的值清零

compute 根据update 算出来的混淆矩阵计算相应的性能指标

str 是返回的字符串,就是实例化混淆矩阵后,print的值

 

这里讲解混淆矩阵类的测试数据都是上面的:

2.1 update 方法

如下:

a传入的是真实的label,b传入的是网络预测的值,注:这里的预测值也是和label一样的整型数组

首先通过init初始化方法将混淆矩阵的大小赋值给n(分类类别的个数+1 背景),然后创建混淆矩阵mat,先初始化为0

接下来,k在真正标签a中找到对应的索引,

这里目的是为了将不感兴趣的区域设为False,其余的具体分割标签应该为1,2,3这样的排序方式。因为通常0为背景,255为不感兴趣的区域。

例如,当分割类别为2(1,2),那么加上背景传入的n就是3(0,1,2),同时不感兴趣的区域设置为255(0,1,2,255)。那么在k在真实标签a(0,1,2,255)中的索引,就会将a>=0 & a<n ,也就是0,1,2 的区域设置为True,从而满足了分割要求且拍出来255不感兴趣的

所以,dataset加载数据中,要将前景从1,2,3这样排序

 

然后,通过下面的操作就能将横坐标为true,纵坐标为pred的混淆矩阵update

中间的inds大概是将a和b变为一维向量,那么n*a就会将一维向量变为n个为一组的样子,然后在里面进行计算,最后reshape成n*n的矩阵就行了。具体的可以自己调试一下

 例如,true = 1,pred = 0 的个数是一个,同样在混淆矩阵的值也是1(第0行,第1列)

 

2.2 compute 方法

compute 是利用update产生的混淆矩阵,计算分割任务中的性能指标,关于分割任务的性能指标,可以查看:关于语义分割常见的评价指标

混淆矩阵:横坐标为true,纵坐标为pred

像素准确率 = 混淆矩阵对角线 / 混淆矩阵的sum

acc 这里是指各个类别的召回率 = 各个对角线的值 / 真实值(矩阵的行为ture,所以对行求和)

recall 召回率就是在...召回的个数,...就是label,召回的个数就是预测正确的个数。所以召回率就是在label中,预测正确个数的占比

iou 就是各个对角线的值 / (对应行 + 对应列 - 重复的对角线的值)

2.3 str 方法

python类中str方法,是返回实例化类的print的值

 

因此混淆矩阵类中的str方法返回的是compute计算出的性能指标。

因为这里的str方法自动调用了compute,而compute是根据update计算的。所以调用str之前,一定要先调用update方法,更新混淆矩阵的值

这里的recall和iou都是针对不同类别的,所以返回是个列表

 

3. 测试

测试的代码如下:

 测试的样本为:

这里手动计算分割的参数,验证混淆矩阵

首先是像素准确率:4 / 9 = 0.4444

然后是各个类别的召回率:这里是三个类别0 1 2 

然后是iou:

对于0:1 / 3 =0.3333

对于1:1 / 6 =0.1667

对于2:2 / 5 =0.4

最后mean iou就是iou的均值:(0.3333+0.1667+0.4) / 3 = 0.9 / 3 = 0.3

4. 完整代码

混淆矩阵的代码:

import torch# 混淆矩阵
class ConfusionMatrix(object):def __init__(self, num_classes):self.num_classes = num_classes      # 分类个数(加了背景之后的)self.mat = None         # 混淆矩阵def update(self, a, b):      # 计算混淆矩阵,a = Ture,b = Predictn = self.num_classesif self.mat is None:         # 创建混淆矩阵self.mat = torch.zeros((n, n), dtype=torch.int64, device=a.device)with torch.no_grad():k = (a >= 0) & (a < n)inds = n * a[k].to(torch.int64) + b[k]      # 统计像素真实类别a[k]被预测成类别b[k]的个数(这里的做法很巧妙)self.mat += torch.bincount(inds, minlength=n**2).reshape(n, n)def reset(self):if self.mat is not None:self.mat.zero_()def compute(self):      # 计算分割任务的性能指标h = self.mat.float()acc_global = torch.diag(h).sum() / h.sum()     # 计算全局预测准确率(混淆矩阵的对角线为预测正确的个数)acc = torch.diag(h) / h.sum(1)                 # 计算每个类别的 recalliou = torch.diag(h) / (h.sum(1) + h.sum(0) - torch.diag(h))     # 计算ioureturn acc_global, acc, ioudef __str__(self):acc_global, acc, iou = self.compute()return ('global correct: {:.4f}\n''recall: {}\n''IoU: {}\n''mean IoU: {:.4f}').format(acc_global.item() ,['{:.4f}'.format(i) for i in acc.tolist()],['{:.4f}'.format(i) for i in iou.tolist()],iou.mean().item())

测试的代码:

confmat = ConfusionMatrix(num_classes=3)    # 实例化混淆矩阵ture = torch.LongTensor([[1,2,1],[0,2,2],[0,1,1]])
pred = torch.LongTensor([[1,2,0],[1,2,1],[0,2,2]])confmat.update(ture, pred)  # update 混淆矩阵的值
print(confmat)
'''
global correct: 0.4444
recall: ['0.5000', '0.2500', '0.6667']
IoU: ['0.3333', '0.1667', '0.4000']
mean IoU: 0.3000
'''


http://www.ppmy.cn/news/43021.html

相关文章

springboot+jwt令牌简单登录案例

1. 什么是JWT&#xff1f;JSON Web Token JSON Web Token (JWT)是⼀个开放标准(RFC 7519)&#xff0c;它定义了⼀种紧凑的、⾃包含的⽅式&#xff0c;⽤于 作为JSON对象在各⽅之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名的。 1.1 什么时候应该⽤…

webgl-画一个彩色矩形

html <!DOCTYPE html> <head> <style> *{ margin: 0px; padding: 0px; } </style> </head> <body> <canvas id webgl> 您的浏览器不支持HTML5,请更换浏览器 </canvas> <script src"./main.js"></script&g…

SDUT操作系统课程(CAST)专题二+专题四参考总结

专题二+进程调度算法 RR q=1(含做题代码) 总结:到达时间一到对应进程进入,执行队首进程一次,对应的服务时间划一记号(推荐用正字),队首进程未执行到完成的话重新进入队尾,队首进程执行到完成的话出队,下一秒继续执行队首进程,当5个进程全部入队之后只要执行后两步操…

更新按日期分表,多个表添加字段

更新日志表 SET sql ‘’; SELECT GROUP_CONCAT(CONCAT(‘ALTER TABLE , table_name, ADD COLUMN result_total bigint(20) NULL DEFAULT 0 COMMENT “接口返回数据量”;’) SEPARATOR ’ ) INTO sql FROM information_schema.tables WHERE table_name LIKE ‘t_dg_service_…

九龙证券|这一刻,资本市场进入全新时代!

2023年4月10日&#xff0c;第一批10家主板注册制企业上市鸣锣敲钟&#xff0c;奏响了触及本钱商场灵魂深处革新的序曲。 动能切换中的我国对于高效资源配置的渴望&#xff0c;与革新进行时的本钱商场对于全面注册制的探究&#xff0c;一起凝集成一股连绵有力之暖流&#xff0c;…

数据一致性校验(pt-table-checksum)

介绍 pt-table-checksum 和 pt-table-sync 是 percona 公司发布的、检查 MySQL 主从数据库数据一致性校验的工具。pt-table-checksum 利用 MySQL 复制原理&#xff0c;在主库执行校验和计算&#xff0c;并对比主从库校验和&#xff0c;由此判断主从库数据是否一致。如果发现数…

ChatGPT热潮下,因生成式AI失业的人出现,我成了第一批失业的人

近几个月来&#xff0c;越来越多的知名人士预计&#xff0c;年内大热的ChatGPT有望掀起一场新的工业革命。而纵观历史&#xff0c;历次工业革命往往会深远改变当时的社会结构——从机械织布机到内燃机再到第一台计算机&#xff0c;新技术的出现总是会引起人们对于被机器取代的恐…

博弈论在电动车和电网系统中分布式模型预测控制研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…