在做语义分割的时候,有不少数据集中的部分类别是我们不想让其参与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时忽略某一类别相关推荐

  1. 憨批的语义分割重制版2——语义分割评价指标mIOU的计算

    憨批的语义分割重制版2--语义分割评价指标mIOU的计算 注意事项 学习前言 什么是mIOU mIOU的计算 1.计算混淆矩阵: 2.计算IOU: 3.计算mIOU: 计算miou 注意事项 这是针对 ...

  2. 语义分割指标---MIoU详细介绍(原理及代码)

    一.IOU理解 在语义分割的问题中,交并比就是该类的真实标签和预测值的交和并的比值 单类的交并比可以理解为下图: TP: 预测正确,真正例,模型预测为正例,实际是正例 FP: 预测错误,假正例,模型预 ...

  3. TensorFlow语义分割套件开源了ECCV18旷视科技BiSeNet实时分割算法

    (欢迎关注"我爱计算机视觉"公众号,一个有价值有深度的公众号~) Github上的开源工程Semantic Segmentation Suite(语义分割套件),由来自美国建筑智能 ...

  4. 语义分割评价指标mIOU

    mIOU定义 Mean Intersection over Union(MIoU,均交并比),为语义分割的标准度量.其计算两个集合的交集和并集之比,在语义分割问题中,这两个集合为真实值(ground ...

  5. 语义分割计算IOU,python实现

    话不多说,直接上代码 #计算IOU,本代码只适用于单通道图片,单类型分割,且分割出来物体的为白色,背景为黑色. from PIL import Image import numpy as np imp ...

  6. 【语义分割】评价指标:PA、CPA、MPA、IoU、MIoU详细总结和代码实现(零基础从入门到精通系列!)

    文章目录 引言 1 混淆矩阵 2 语义分割 PA:像素准确率 CPA:类别像素准确率 MPA:类别平均像素准确率 IoU:交并比 MIoU:平均交并比 3 综合实例 步骤一:输入真实.预测图片 步骤二 ...

  7. 【CV语义分割】全卷积神经网络FCN(更新ing)

    学习总结 (1)paper<Fully Convolutional Networks for Semantic Segmentation> (2)论文翻译可以参考:https://www. ...

  8. 分割评价指标MIOU

    MIOU定义 有很多博客都有写MIOU,参考下面文章 注意点: 类别包含背景,二分类也包含背景 混淆矩阵就是分别统计分类模型归错类,归对类的观测值个数,然后把结果放在一个表里展示出来. 代码实现 &q ...

  9. CVF2020邻域自适应/语义分割:FDA: Fourier Domain Adaptation for Semantic SegmentationFDA:用于语义分割的傅立叶域自适应算法

    邻域自适应/语义分割:FDA: Fourier Domain Adaptation for Semantic Segmentation FDA:用于语义分割的傅立叶域自适应算法 0.摘要 1.概述 1 ...

最新文章

  1. usb serial for android
  2. Codeforces Round #743 (Div. 2) E. Paint 区间dp + 暴力
  3. [Cocos2d-x]Cocos2d-x 3.2 学习笔记
  4. aop源码分析之 —— 创建代理对象
  5. 2021数据技术嘉年华 • 嘉宾面对面
  6. 洛谷 P1762 偶数
  7. 11_条件随机场CRF1_统计学习方法
  8. 值得收藏!9个最佳SSD状态监控及性能优化工具
  9. Actors编程模型
  10. 移动互联网实战--移动端音频和图形优化处理
  11. Adobe PS 图片反转
  12. git 克隆到指定分支
  13. CSS设置图像的透明度
  14. 利用百度AI开放平台的语言处理基础技术(Python)
  15. c语言,计算a+aa+aaa+......,使用函数定义的方法
  16. qt Android之环境建立
  17. trim()去除空格
  18. 主题论文总结2:会议/对话摘要任务(持续更新ing...)
  19. web前端工程师不同级别分别掌握哪些技能
  20. python matplotlib绘图、混淆矩阵 汉字字体、数字、英文字母的设置

热门文章

  1. 咪咕音乐的下载音乐存储路径(MAC)
  2. 前端通用SEO技术优化指南
  3. 音视频从入门到精通——FFmpeg之swr_convert音频重采样函数分析
  4. ESP8266的Web配网以及强制门户的实现(连接wifi自动打开网页)
  5. 驱动程序获取微软数字签名的方法
  6. 理解计算 从根号2到AlphaGo 第3季神经网络的数学模型
  7. linux (ubuntu)安装包安装sublime
  8. 使用sklearn进行增量学习
  9. windows10访问ubuntu子系统中的文件的方法
  10. 手游联运平台是什么?