在TF1.x版本中 miou指标可以使用tf.metrics.mean_iou 进行计算:

tf.metrics.mean_iou(labels, predictions, num_classes) 

但是该方法有如下几点限制:

1. 无法在动态图中使用,例如Tensorflow2.x版本中(注:TF2.x中api移动到了tf.compat.v1.metrics.mean_iou中),由于TF2.x默认是开启动态图,因此会报错(见mean_iou方法的源码)

  if context.executing_eagerly():raise RuntimeError('tf.metrics.mean_iou is not supported when ''eager execution is enabled.')

2. 使用必须先 sess.run(tf.local_variables_initializer()) 然后 sess.run(update_op),最后sess.run(mean_iou_v),注意次序不能颠倒,不太方便和tf.keras相关训练代码结合使用

mean_iou_v, update_op = tf.metrics.mean_iou(y_true, y_pred, num_classes=4)
sess = tf.Session()
sess.run(tf.local_variables_initializer())
print(sess.run(update_op))
print(sess.run(mean_iou_v))

3. 只能直接输出所有类别的平均IOU即mean_iou, 而不能输出各个类别对应的 iou

针对上述三个问题,我发现有如下两种解决方案:

目录

方案1:自己实现相关计算代码

方案2:继承调用tf.keras.metrics.MeanIoU类


方案1:自己实现相关计算代码

def cal_mean_iou(num_classes, ignore_labels=None):"""num_classes: int, 表示类别总数ignore_labels: list[int],注意这里ignore_labels必须为列表或None,若为列表则存放int类型数字,表示需要忽略(不需要计算miou)的类别,例如:num_classes=12 ignore_labels=[11] 表示总类别数为12,忽略第11个类别"""def MIOU(y_true, y_pred):"""y_true: Tensor,真实标签(one-hot类型),y_pred: Tensor,模型输出结果(one-hot类型),二者shape都为[N,H,W,C]或[N,H*W,C],C为总类别数,"""y_true = tf.reshape(tf.argmax(y_true, axis=-1), [-1])  # 求argmax后,展平为一维y_pred = tf.reshape(tf.argmax(y_pred, axis=-1), [-1])num_need_labels = num_classes #不忽略的类别总数if ignore_labels is not None:num_need_labels -= len(ignore_labels)for ig in ignore_labels:mask = tf.not_equal(y_true, ignore_labels)  # 获取需要忽略的标签的位置y_true = tf.boolean_mask(y_true, mask)  # 剔除y_true中需要忽略的标签y_pred = tf.boolean_mask(y_pred, mask)  # 剔除y_pred中需要忽略的标签confusion_matrix = tf.confusion_matrix(y_true, y_pred, num_classes)  # 计算混淆矩阵intersect = tf.diag_part(confusion_matrix)  # 获取对角线上的矩阵,形成一维向量union = tf.reduce_sum(confusion_matrix, axis=0) + tf.reduce_sum(confusion_matrix, axis=1) - intersectiou = tf.div_no_nan(tf.cast(intersect, tf.float32), tf.cast(union, tf.float32))num_valid_entries = tf.reduce_sum(tf.cast(tf.not_equal(union, 0), dtype=tf.float32)) #统计union中不为0的总数num = tf.minimum(num_valid_entries, num_need_labels)mean_iou = tf.div_no_nan(tf.reduce_sum(iou), num)  # mean_iou只需要计算union中不为0且不忽略label的return mean_ioureturn MIOU

上述代码是自己实现的各类别IOU以及平均IOU的计算方法,

如果只是想直接显示平均IOU,那么直接这样使用即可:

model.compile(optimizer=optimizer, loss=loss,metrics=[cal_mean_iou(num_classes, ignore_label)])

如果想要在tf.keras训练过程中显示各个类别的IOU,一般是继承tf.keras.callbacks.Callback类,然后重写相关的方法,方法可参考:相关参考博客3

方案2:继承调用tf.keras.metrics.MeanIoU类

方案1中的计算方式和tf.keras.metrics.MeanIoU(num_classes)计算方式类似,需要注意tf.keras.metrics.MeanIoU类中update_state(self, y_true, y_pred, sample_weight=None)方法接受的y_true和y_pred一般是非one-hot编码形式的,即如果网络的输入shape为[N,H,W,C]或[N,H*W,C]形式,需要将y_true和y_pred先求argmax,然后调用该方法

因此遇到上述情况,可以先继承tf.keras.metrics.MeanIoU类,然后重写update_state方法,示例代码如下:

class MeanIoU(tf.keras.metrics.MeanIoU):"""y_true: Tensor,真实标签(one-hot类型),y_pred: Tensor,模型输出结果(one-hot类型),二者shape都为[N,H,W,C],C为总类别数,"""def update_state(self, y_true, y_pred, sample_weight=None):y_true = tf.argmax(y_true, axis=-1)y_pred = tf.argmax(y_pred, axis=-1)super().update_state(y_true, y_pred, sample_weight=sample_weight)return self.result()model.compile(optimizer=optimizer, loss=loss,metrics=[MeanIoU(num_classes)])

相关参考博客:

1.图像分割常用指标及MIoU计算 - 简书

2.MIoU 源码解析 - Wenshan's Blog

3.Keras上实现recall和precision,f1-score(多分类问题)_热爱学习的Valeria的博客-CSDN博客_keras precision

4.Tensorflow中tf.keras.metrics.MeanIoU在shape不一致错误_Bluish White的博客-CSDN博客

Tensorflow keras中实现语义分割多分类指标:IOU、MIOU相关推荐

  1. TensorFlow中的语义分割套件

    TensorFlow中的语义分割套件 描述 该存储库用作语义细分套件.目标是轻松实现,训练和测试新的语义细分模型!完成以下内容: 训练和测试方式 资料扩充 几种最先进的模型.轻松随插即用 能够使用任何 ...

  2. 深度学习论文精读01——基于多任务学习的肿瘤医学影像语义分割与分类研究

    基于多任务学习的肿瘤医学影像语义分割与分类研究 文章目录 基于多任务学习的肿瘤医学影像语义分割与分类研究 1 背景介绍 2 主要内容 3 材料和方法 3.1卷积神经网络 多层感知模型(全连接) 3.1 ...

  3. CV之IS:计算机视觉中图像分割(语义分割)最diao炸(完)天(整)的思维导图

    CV之IS:计算机视觉中图像分割(语义分割)最diao炸(完)天(整)的思维导图 导读:此语义导图为某大牛精心整理,感谢无私分享. 目录 语义分割思维导图(完整) 相关文章 CV之IS:计算机视觉之图 ...

  4. Tensorflow Keras中的masking与padding的学习笔记

    Tensorflow Keras中的masking与padding 1. 背景 2. padding填充序列数据例子 3. 遮盖(masking ) 3.1 添加一个 keras.layers.Mas ...

  5. 计算机视觉-语义分割任务常用指标

    计算机视觉-语义分割任务常用指标 呐,这篇笔记记录了语义分割任务中十分常用的指标(包括PA,MPA,mIOU)的计算方式.整体来看,都是像素数目的比值. 首先我们需要先定义语义分割任务的类别 K + ...

  6. 汇总 | 深度学习中图像语义分割基准数据集详解

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 汇总图像语义分割那些质量最好的数据集与常用benchmark数据集 ...

  7. pytorch 语义分割loss_关于pytorch语义分割二分类问题的两种做法

    形式1:输出为单通道 分析 即网络的输出 output 为 [batch_size, 1, height, width] 形状.其中 batch_szie 为批量大小,1 表示输出一个通道,heigh ...

  8. 一、深度卷积神经网络中图像语义分割研究总结

    时间:20220410 内容:语义分割研究进程总结 参考:深度卷积神经网络图像语义分割研究进展 http://www.cjig.cn/html/jig/2020/6/20200601.htm 语义分割 ...

  9. 图像语义分割python_遥感图像语义分割常用精度指标及其python实现(支持多类)

    前言 在介绍个精度指标前我们先来明确以下几个概念,对应的示意图如下图所示:TP(True Positive):分类准确的正类,意思是预测结果为正类,实际上是正类. FP(False Positive) ...

最新文章

  1. 用计算机辅助实验系统做验证牛顿第三定律,用计算机辅助实验系统(
  2. WP评论系统更换小结(转)
  3. hdu 5441 Travel(Kruskal+离线)
  4. 06-CABasicAnimation基础核心动画
  5. 【转】Asp.net的生命周期之应用程序生命周期
  6. (27)System Verilog设计UART接收
  7. Java基础学习总结(91)——阿里巴巴Java开发手册公开版
  8. MyBatis基于Maven入门实例
  9. QT5.3.2与VS2013 fatal error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突_(解决方案)...
  10. oh my Zsh使用手册
  11. 140.单词拆分II
  12. Java思维导图(七)
  13. Android 银行账号
  14. java programer认证_关于考SUNJAVAPROGRAMMER的几点建议
  15. 制药企业计算机管理软件,制药企业erp管理系统
  16. 一直想当5G老大的美国,现在进展怎样了?
  17. 我的世界服务器空岛删除怎么找回,我的世界-删除空岛指令 岛屿删除指令分享...
  18. 谷歌论文Weight Agnostic Neural Networks(WANN)权重无关神经网络
  19. 计算机组成原理课设题目详解
  20. PPT模板下载(二)--- 新科技、区块链

热门文章

  1. WSL2 Ubuntu18.04 apt-get update失败
  2. VS2022为什么会出现找不到指定文件?
  3. 关于ARMv8另外几个问题
  4. 基于Python+MySQL的书店销售管理管理子系统设计
  5. asp.net销售管理系统的设计和实现
  6. 互联网日报 | 雷军新年首场直播带货金额破1.88亿;京东正式上线“京喜拼拼”;三峡电站创造新世界纪录...
  7. UML软件建模StarUML
  8. 推荐 3 个非常好用的谷歌插件
  9. 工厂自动化系统,架构设计图
  10. 华为鸿蒙系统小窗口,mate30pro升鸿蒙后小窗应用调不出来