语义分割评价指标代码:混淆矩阵计算详解

关于语义分割评价指标和混淆矩阵的基本知识和代码这篇博客讲得很详细,我这里只是详解一下混淆矩阵计算的代码。

# 计算混淆矩阵
def _fast_hist(label_true, label_pred, n_class):
    mask = (label_true >= 0) & (label_true < n_class)
    hist = np.bincount(
        n_class * label_true[mask].astype(int) +
        label_pred[mask], minlength=n_class ** 2).reshape(n_class, n_class)
    return hist

很佩服写出这段代码的大佬,几乎一句代码就计算出了混淆矩阵。
很多博客也有讲,但是我觉得其中的核心代码没有解释清楚,大多都是告诉我们这个函数最终可以得到混淆矩阵,但具体怎么就得到混淆矩阵了还是搞不清楚。

先看输入:label_true, label_pred, n_class
label_true,表示真实的标记,这里是一个二维数组,也可以理解为一张灰度图,每个像素点的这对应于一个类别(用数字表示0,1,2,…)
label_pred,表示预测结果,格式同label_true
n_class,类别总数

假设输入label_true为:
在这里插入图片描述
假设输入label_pred为:
在这里插入图片描述
n_class = 3

函数第一句:
mask = (label_true >= 0) & (label_true < n_class)
这一句是为了保证标记的正确性(标记的每个元素值在[0, n_class)内),标记正确得到的mask是一个全为true的数组。
在这里插入图片描述
函数第二句:
hist = np.bincount(
n_class * label_true[mask].astype(int) +
label_pred[mask], minlength=n_class ** 2).reshape(n_class, n_class)

这一句是计算的核心,步骤有点多,下面拆分成几个小步来分析理解。(np.bincount函数学习链接:numpy.bincount详解)

为方便书写,记 a = label_true[mask].astype(int) ,即label_true被拉平为一维数组
在这里插入图片描述
记 b = label_pred[mask]
在这里插入图片描述
则,这里的操作即相当于np.bincount(a*n + b).reshape(n, n)
(n_class记为n, minlength=n_class ** 参数是为了保证输出向量的长度为n_class * n_class。)

记 c = a*n + b, d = np.bincount( c )
在这里插入图片描述在这里插入图片描述
根据np.bincout的特性,c中元素的每一个值是为d中以其值为index的元素+1,也就是说c中元素的值其实是对应与d的index,即d = np.bincount(c, minlength=n**)的计算相当于:

d = np.zeros((n*n,))
for ci in c:
    d[ci] +=1

在这里插入图片描述
再将d.reshape(n, n)
则d[i, j] 的值就为,i*n + j 的值在c中出现的次数,而i是a中的值,j是b中的值,且它们在a与b相同的位置处,恰好代表了真实类别与预测类别,即d[i, j] 代表了预测结果为类别 j,实际标签为类别 i 的所有像素点的数目。

这恰好与混淆矩阵的定义相同!

  • 18
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
混淆矩阵是用于评价语义分割模型性能的一种标准格式。混淆矩阵以n行n列的矩阵形式展示,其中n代表类别数量。混淆矩阵的行代表实际类别,列代表模型预测的类别。每个单元格中的数值表示实际类别与预测类别相交的像素数量。 评价指标是根据混淆矩阵计算得出,包括总体精度、制图精度和用户精度等。总体精度表示所有正确分类的像素占总像素数的比例。制图精度表示每个类别的像素正确分类的比例。用户精度表示每个像素被正确分类为某个类别的概率。 总结来说,混淆矩阵评价指标是用于衡量语义分割模型分类性能的工具。 【1】【3】<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [解读混淆矩阵语义分割FCN指标计算中的应用(含代码实现)](https://blog.csdn.net/m0_62128864/article/details/124461430)[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: 50%"] - *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: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值