tensorflow语义分割计算mIoU时忽略某一类别
在做语义分割的时候,有不少数据集中的部分类别是我们不想让其参与mIoU计算的。tensorflow忽略某一类别计算mIoU的方法网上比较少。经过阅读tensorflow文档,总结出一下求解方法:
数据准备:
1、先理解一维张量:
其实数组和张量相通,tensorflow绝大多数情况下能自动转化
假设有张量a,b
a = np.array([0, 1, 2, 3]) # 真实
b = np.array([0, 1, 0, 3]) # 预测
手动计算一下mIoU
类别0:= 交集 / 并集 = 1 / 2 = 0.5
类别1:= 1 / 1 = 1
类别2:= 0 / 1 = 0
类别3:= 1 / 1 = 1
因此 :mIou = (0.5+1+0+1)/4 = 0.625
利用tensorflow的 API计算如下:
import numpy as np
import tensorflow as tfa = np.array([0, 1, 2, 3])
b = np.array([0, 1, 0, 3])iou = tf.keras.metrics.MeanIoU(num_classes=4)
iou.update_state(a, b)
print('mIoU为: ',iou.result().numpy())
上述是所有类别都参与运算的情况,现在假设我们要忽略的类别为3
以下分两种情况讨论:
情况1:
a = np.array([0, 1, 2, 3]) # 真实
b = np.array([0, 1, 0, 3]) # 预测
情况2:
a = np.array([0, 1, 2, 3]) # 真实
b = np.array([0, 1, 0, 0]) # 预测
情况1和情况2的不同点在于,真实值中类别3的位置对应的预测值为3或者其他值时,应该怎么计算单个类别的iou呢?(例如情况2中的类别0)
带着问题我们首先去用tensorflow的API来计算,然后再分析手动计算的方法
先看代码:
情况1:
a = np.array([0, 1, 2, 3])
b = np.array([0, 1, 0, 3])iou = tf.keras.metrics.MeanIoU(num_classes=4)
sample_weight = np.ones_like(a)
sample_weight[a == 3] = 0
iou.update_state(a, b,sample_weight)
print('mIoU为: ',iou.result().numpy())
情况2:
a = np.array([0, 1, 2, 3])
b = np.array([0, 1, 0, 0])iou = tf.keras.metrics.MeanIoU(num_classes=4)
sample_weight = np.ones_like(a)
sample_weight[a == 3] = 0
iou.update_state(a, b,sample_weight)
print('mIoU为: ',iou.result().numpy())
可见两种情况的mIoU计算结果不受类别3位置的元素类别影响,也就是说,在预测结果中真实标签位置的预测值随意,不影响最后的结果
因此手动计算方法可以归纳如下:
把真实标签中被忽略类别的位置记录下来,然后把真实值和预测值在该位置的元素直接删除,然后按照计算常规mIou的计算方法计算即可
下面分析一下API的使用方法:
我们要忽略某一类别,实际是将此类别计算IoU的权重设置为0。tensorflow在MeanIoU类中的update_state()方法有一个sample_weight参数:
该参数的官方解释含义如下:(贴一下连接:tf.keras.metrics.MeanIoU | TensorFlow Core v2.3.0)
sample_weight是一个张量或数组,形状与y_true和y_pred相同,或者广播后相同,为了避免广播造成的错误,建议使用与y_true和y_pred相同的张量。默认情况下sample_weight即使不设置,在计算时tensorflow也会自动补充为1。当我们想忽略某一类别时,直接将sample_weight权重数组对应位置设置为0就行,其他位置的值还保持为1
这样再回头看上述代码,应该就能比较清楚了。
2、高维张量:
一维张量理解后多维的多维的也就能顺理成章的。在此只给出例子:
读者可以自己手动计算一下。
a = np.array([[[0, 1, 2], [0, 1, 2], [0, 1, 3]],[[0, 1, 1], [0, 1, 0], [0, 1, 2]]])
b = np.array([[[0, 1, 2], [0, 1, 2], [0, 1, 3]],[[0, 1, 1], [0, 0, 0], [0, 1, 2]]])
a = np.expand_dims(a,-1)
b = np.expand_dims(b,-1)iou = tf.keras.metrics.MeanIoU(num_classes=4)
sample_weight = np.ones_like(a)
sample_weight[a == 3] = 0
iou.update_state(a, b,sample_weight)
print(a.shape)
print(b.shape)
print('mIoU为: ',iou.result().numpy())
补充:
当我们想要自定义可以忽略某一类别的mIou计算类的时候可以参考如下的自定义方法:
import cv2
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tfa = np.array([[[0, 1, 2], [0, 1, 2], [0, 1, 3]], [[0, 1, 1], [0, 1, 0], [0, 1, 2]]])
b = np.array([[[0, 1, 2], [0, 1, 2], [0, 1, 3]], [[0, 1, 1], [0, 0, 0], [0, 1, 2]]])
a = np.expand_dims(a, -1)
b = np.expand_dims(b, -1)iou = tf.keras.metrics.MeanIoU(num_classes=4)
sample_weight = np.ones_like(a)
sample_weight[a == 3] = 0
iou.update_state(a, b, sample_weight)
print('a的shape:', a.shape)
print('b的shape:', b.shape)
print('tensorflow 内置API计算mIoU为: ', iou.result().numpy())class MeanIoU(tf.keras.metrics.MeanIoU):def __init__(self, num_classes, ignore_class_id, name=None, dtype=None):"""num_classes:需要计算mIoU的像素类别数 +1 !!!一定要加1ignore_class_id: 需要忽略的像素类别 类型为列表"""super(MeanIoU, self).__init__(num_classes, name=name, dtype=dtype)self.ignore_class_id = ignore_class_iddef __call__(self, y_true, y_pred):if self.ignore_class_id:self.sample_weight = np.ones_like(y_true.numpy())for i in self.ignore_class_id:self.sample_weight[y_true.numpy() == i] = 0else:self.sample_weight = Nonereturn super().__call__(y_true, y_pred, sample_weight=self.sample_weight)iou2 = MeanIoU(4, [3, ])
a = tf.convert_to_tensor(a)
b = tf.convert_to_tensor(b)
iou2(a, b)
print("自定义的mIoU类计算结果:", iou2.result().numpy())
tensorflow语义分割计算mIoU时忽略某一类别相关推荐
- 憨批的语义分割重制版2——语义分割评价指标mIOU的计算
憨批的语义分割重制版2--语义分割评价指标mIOU的计算 注意事项 学习前言 什么是mIOU mIOU的计算 1.计算混淆矩阵: 2.计算IOU: 3.计算mIOU: 计算miou 注意事项 这是针对 ...
- 语义分割指标---MIoU详细介绍(原理及代码)
一.IOU理解 在语义分割的问题中,交并比就是该类的真实标签和预测值的交和并的比值 单类的交并比可以理解为下图: TP: 预测正确,真正例,模型预测为正例,实际是正例 FP: 预测错误,假正例,模型预 ...
- TensorFlow语义分割套件开源了ECCV18旷视科技BiSeNet实时分割算法
(欢迎关注"我爱计算机视觉"公众号,一个有价值有深度的公众号~) Github上的开源工程Semantic Segmentation Suite(语义分割套件),由来自美国建筑智能 ...
- 语义分割评价指标mIOU
mIOU定义 Mean Intersection over Union(MIoU,均交并比),为语义分割的标准度量.其计算两个集合的交集和并集之比,在语义分割问题中,这两个集合为真实值(ground ...
- 语义分割计算IOU,python实现
话不多说,直接上代码 #计算IOU,本代码只适用于单通道图片,单类型分割,且分割出来物体的为白色,背景为黑色. from PIL import Image import numpy as np imp ...
- 【语义分割】评价指标:PA、CPA、MPA、IoU、MIoU详细总结和代码实现(零基础从入门到精通系列!)
文章目录 引言 1 混淆矩阵 2 语义分割 PA:像素准确率 CPA:类别像素准确率 MPA:类别平均像素准确率 IoU:交并比 MIoU:平均交并比 3 综合实例 步骤一:输入真实.预测图片 步骤二 ...
- 【CV语义分割】全卷积神经网络FCN(更新ing)
学习总结 (1)paper<Fully Convolutional Networks for Semantic Segmentation> (2)论文翻译可以参考:https://www. ...
- 分割评价指标MIOU
MIOU定义 有很多博客都有写MIOU,参考下面文章 注意点: 类别包含背景,二分类也包含背景 混淆矩阵就是分别统计分类模型归错类,归对类的观测值个数,然后把结果放在一个表里展示出来. 代码实现 &q ...
- CVF2020邻域自适应/语义分割:FDA: Fourier Domain Adaptation for Semantic SegmentationFDA:用于语义分割的傅立叶域自适应算法
邻域自适应/语义分割:FDA: Fourier Domain Adaptation for Semantic Segmentation FDA:用于语义分割的傅立叶域自适应算法 0.摘要 1.概述 1 ...
最新文章
- usb serial for android
- Codeforces Round #743 (Div. 2) E. Paint 区间dp + 暴力
- [Cocos2d-x]Cocos2d-x 3.2 学习笔记
- aop源码分析之 —— 创建代理对象
- 2021数据技术嘉年华 • 嘉宾面对面
- 洛谷 P1762 偶数
- 11_条件随机场CRF1_统计学习方法
- 值得收藏!9个最佳SSD状态监控及性能优化工具
- Actors编程模型
- 移动互联网实战--移动端音频和图形优化处理
- Adobe PS 图片反转
- git 克隆到指定分支
- CSS设置图像的透明度
- 利用百度AI开放平台的语言处理基础技术(Python)
- c语言,计算a+aa+aaa+......,使用函数定义的方法
- qt Android之环境建立
- trim()去除空格
- 主题论文总结2:会议/对话摘要任务(持续更新ing...)
- web前端工程师不同级别分别掌握哪些技能
- python matplotlib绘图、混淆矩阵 汉字字体、数字、英文字母的设置