#!/usr/bin/python
# -*- coding: utf-8 -*-import numpy as np
import argparse
import json
from PIL import Image
from os.path import join
import cv2
from mmm.fullcrop import unpadding
from matplotlib import pyplot as plt
# 设标签宽W,长H
def fast_hist(a, b, n):  # a是转化成一维数组的标签,形状(H×W,);b是转化成一维数组的标签,形状(H×W,);n是类别数目,实数(在这里为19)'''核心代码'''k = (a >= 0) & (a < n)  # k是一个一维bool数组,形状(H×W,);目的是找出标签中需要计算的类别(去掉了背景) k=0或1hist = np.bincount(n * a[k].astype(int) + b[k], minlength=n ** 2)# if hist.shape!=(441,):# assert hist.shape==(441,)return np.bincount(n * a[k].astype(int) + b[k], minlength=n ** 2).reshape(n,n)  # np.bincount计算了从0到n**2-1这n**2个数中每个数出现的次数,返回值形状(n, n)def per_class_iu(hist):  # 分别为每个类别(在这里是19类)计算mIoU,hist的形状(n, n)'''核心代码'''return np.diag(hist) / (hist.sum(1) + hist.sum(0) - np.diag(hist))  # 矩阵的对角线上的值组成的一维数组/矩阵的所有元素之和,返回值形状(n,)# hist.sum(0)=按列相加  hist.sum(1)按行相加# def label_mapping(input, mapping):#主要是因为CityScapes标签里面原类别太多,这样做把其他类别转换成算法需要的类别(共19类)和背景(标注为255)
#    output = np.copy(input)#先复制一下输入图像
#    for ind in range(len(mapping)):
#        output[input == mapping[ind][0]] = mapping[ind][1]#进行类别映射,最终得到的标签里面之后0-18这19个数加255(背景)
#    return np.array(output, dtype=np.int64)#返回映射的标签
'''compute_mIoU函数原始以CityScapes图像分割验证集为例来计算mIoU值的(可以根据自己数据集的不同更改类别数num_classes及类别名称name_classes),本函数除了最主要的计算mIoU的代码之外,还完成了一些其他操作,比如进行数据读取,因为原文是做图像分割迁移方面的工作,因此还进行了标签映射的相关工作,在这里笔者都进行注释。大家在使用的时候,可以忽略原作者的数据读取过程,只需要注意计算mIoU的时候每张图片分割结果与标签要配对。主要留意mIoU指标的计算核心代码即可。
'''def compute_mIoU(gt_dir, pred_dir, devkit_dir):  # 计算mIoU的函数"""Compute IoU given the predicted colorized images and"""# with open('/home/ubuntu/DeepLab/datasets/VOCdevkit/VOC2012/ImageSets/Segmentation/info.json', 'r') as fp:#     # 读取info.json,里面记录了类别数目,类别名称。(我们数据集是VOC2011,相应地改了josn文件)#     info = json.load(fp)# num_classes = np.int(info['classes'])  # 读取类别数目,这里是20类# print('Num classes', num_classes)  # 打印一下类别数目# name_classes = np.array(info['label'], dtype=np.str)  # 读取类别名称# # mapping = np.array(info['label2train'], dtype=np.int)#读取标签映射方式,详见博客中附加的info.json文件# hist = np.zeros((num_classes, num_classes))  # hist初始化为全零,在这里的hist的形状是[20, 20]#原代码是有进行类别映射,所以通过json文件来存放类别数目、类别名称、 标签映射方式。而我们只需要读取类别数目和类别名称即可,可以按下面这段代码将其写死num_classes=21print('Num classes', num_classes)name_classes = ["background","aeroplane","bicycle","bird","boat","bottle","bus","car", "cat","chair","cow","diningtable","dog","horse","motobike","person","pottedplant","sheep","sofa","train","tvmonitor"]hist = np.zeros((num_classes, num_classes))image_path_list = join(devkit_dir, 'val.txt')  # 在这里打开记录分割图片名称的txtlabel_path_list = join(devkit_dir, 'val.txt')  # ground truth和自己的分割结果txt一样gt_imgs = open(label_path_list, 'r').read().splitlines()  # 获得验证集标签名称列表gt_imgs = [join(gt_dir, x) for x in gt_imgs]  # 获得验证集标签路径列表,方便直接读取pred_imgs = open(image_path_list, 'r').read().splitlines()  # 获得验证集图像分割结果名称列表pred_imgs = [join(pred_dir, x) for x in pred_imgs]# pred_imgs = [join(pred_dir, x.split('/')[-1]) for x in pred_imgs]#获得验证集图像分割结果路径列表,方便直接读取for ind in range(len(gt_imgs)):  # 读取每一个(图片-标签)对pred = np.array(Image.open(pred_imgs[ind]+'.png'))  # 读取一张图像分割结果,转化成numpy数组label = np.array(Image.open(gt_imgs[ind]+'.png'))  # 读取一张对应的标签,转化成numpy数组# print pred.shape# print label.shape# label = label_mapping(label, mapping)#进行标签映射(因为没有用到全部类别,因此舍弃某些类别),可忽略if len(label.flatten()) != len(pred.flatten()):# 如果图像分割结果与标签的大小不一样,这张图片就不计算# print('Skipping: len(gt) = {:d}, len(pred) = {:d}, {:s}, {:s}'.format(len(label.flatten()),#                                                                      len(pred.flatten()), gt_imgs[ind],#                                                                       pred_imgs[ind]))lab_shape = label.shapepred = unpadding(lab_shape,pred)#todo : uppadding#pred = cv2.resize(pred, label.shape, interpolation=cv2.INTER_NEAREST)hist += fast_hist(label.flatten(), pred.flatten(), num_classes)  # 对一张图片计算19×19的hist矩阵,并累加# if ind > 0 and ind % 10 == 0:  # 每计算10张就输出一下目前已计算的图片中所有类别平均的mIoU值#     print('{:d} / {:d}: {:0.2f}'.format(ind, len(gt_imgs), 100 * np.mean(per_class_iu(hist))))#     print(per_class_iu(hist))mIoUs = per_class_iu(hist)  # 计算所有验证集图片的逐类别mIoU值for ind_class in range(num_classes):  # 逐类别输出一下mIoU值print('===>' + name_classes[ind_class] + ':\t' + str(round(mIoUs[ind_class] * 100, 2)))print('===> mIoU: ' + str(round(np.nanmean( mIoUs) * 100, 2)))  # 在所有验证集图像上求所有类别平均的mIoU值,计算时忽略NaN值return mIoUs# root_dir = '/home/DATA/DATASET/VOC2012/VOC2012/'
# gt_dir = root_dir+'SegmentationClass/'
# list_dir = root_dir+'ImageSets/Segmentation/'
# #pred_dir = '/home/DATA/liutian/tmp/deep/Keras-segmentation-deeplab-v3.1-master/mmm/pred_no_white/'
# pred_dir = gt_dir
# iou = compute_mIoU(gt_dir,
#              pred_dir,
#              list_dir
#              )  # 执行主函数 三个路径分别为 ‘ground truth’,'自己的实验分割结果',‘分割图片名称txt文件’
# print(iou)

这是直接改好的VOC2012,官方解压目录分级,只要你是官方文件夹直接解压,那么都是下面这样。代码不用改,只需要指定自己预测图片目录,图片保存格式要和官方一样,具体保存上色代码:https://blog.csdn.net/u013249853/article/details/94715443

    PATH = '/home/DATA/DATASET/VOC2012/VOC2012'    gt_dir = root_dir + 'SegmentationClass/'list_dir = root_dir + 'ImageSets/Segmentation/'pred_dir = savedir#这里是你自己图片保存的目录import miouresult = miou.compute_mIoU(gt_dir,savedir,list_dir)print(result)

这个代码得到的miou与deeplabv3+稍有出入,高了0.5%

可以接受

参考:https://blog.csdn.net/weixin_42188270/article/details/86632714#comments

https://blog.csdn.net/jiongnima/article/details/84750819

miou 代码 VOC2012相关推荐

  1. 混淆矩阵与miou代码

    一.混淆矩阵 # 计算混淆矩阵 def generate_matrix(num_class,gt_image, pre_image):#正确的gt_maskmask = (gt_image >= ...

  2. 语义分割MIoU代码解析

    1. MIoU 源码解析TensorFlow 和 PyTorch 源码解析 2.[语义分割]语义分割评估指标mIOU 3. 语义分割代码阅读-评价指标mIoU的计算 4. 深度学习计算机视觉图像分割领 ...

  3. python 图像语义分割mIOU代码详解

    mIOU公式在此不赘述. 1.fast_hist(label.flatten(), pred.flatten(), num_classes) 2.生成关于像素的混淆矩阵 k = (a >= 0) ...

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

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

  5. 【Dilated Conv】《Multi-Scale Context Aggregation by Dilated Convolutions》

    ICLR-2016 文章目录 1 Background and Motivation 2 Advantages / Contributions 3 Method 3.1 Dilated Convolu ...

  6. 通过对比对象掩码建议的无监督语义分割

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 小白导读 论文是学术研究的精华和未来发展的明灯.小白决心每天为大家 ...

  7. CFPNet:用于实时语义分割的通道特征金字塔

    论文地址:CFPNet: Channel-wise Feature Pyramid for Real-Time Semantic Segmentation 代码地址: https://github.c ...

  8. 隐私合规:收集SDK部分介绍

    com.meizu.cloud.pushsdk.SystemReceiver 魅族推送服务是由魅族公司为开发者提供的消息推送服务,开发者可以向集成了魅族 push SDK 的客户端实时地推送通知或者消 ...

  9. 图像分割评测指标MIOU之python代码详解

    Pixel Accuracy(PA,像素精度):这是最简单的度量,为标记正确的像素占总像素的比例. Mean Pixel Accuracy(MPA,均像素精度):是PA的一种简单提升,计算每个类内被正 ...

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

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

最新文章

  1. (转)JS正则表达式元字符
  2. Spring-AOP 基于Schema配置切面
  3. IEEE CSO 2009 修订版论文要求
  4. ArcGIS Server9.3+ArcGIS Desktop9.3破解安装(for microsoft .net)
  5. 久谦咨询python笔试题目_python笔试含答案
  6. java 项目心得_读懂JAVA WEB项目的一点心得 | 学步园
  7. 字符串 -- 将整数字符串转换为成整数值 -- 图解
  8. 使用oracle执行txt语句,oracle常用SQL语句.txt
  9. css3实现loading动画效果
  10. 关于领域模型与技术架构的关系的思考
  11. 三年磨一剑——微信OCR轻松提取图片文字
  12. MakeApie 将于 2月15号开始暂停服务
  13. 第九篇:万丈高楼平地起-驱动编程基础知识点
  14. 偶像和粉丝关系该是什么样的?
  15. 公司域名邮箱如何注册?163公司邮箱注册好用吗?
  16. c语言程序设计 大学考试题库,广东工业大学《C语言程序设计》考试复习重点题库.pdf...
  17. EditText 里的属性
  18. python qt 按钮_Python QtWidgets.QPushButton方法代码示例
  19. Echarts 图表不能渲染问题整理
  20. 无线网络监控分析工具

热门文章

  1. 300 页干货!李宏毅《一天搞懂深度学习》(附下载)
  2. sublime开发apicloud项更新apploader解决
  3. win10下什么拼音输入法好用
  4. go语言实战学习笔记
  5. java面试简历项目经验,java面试题项目中的难点
  6. 华为杯数学建模竞赛百分百获奖经验分享(获奖 == 四分经验,三分运气,三分实力)
  7. access 江苏计算机二级_关于江苏省计算机二级MS OFFICE考试的建议
  8. 基于网易云API做的一个扫码登录
  9. 大年三十整理的asp.net资料!(不得不收藏)
  10. Autodesk 首届开发者训练营所有讲座课程介绍(包括云,建筑,机械,多媒体以及娱乐几个大方向)