语义分割混淆矩阵、 mIoU、mPA计算

news2025/6/17 16:24:48

一、操作

需要会调试代码的人自己改,小白直接运行会出错

这是我从自己的大文件里摘取的一部分代码,可以运行,只是要改的文件地址path比较多,遇到双引号“”的地址注意一下,不然地址不对容易出错

 把 calculate.py和 utiles_metrics.py放在同一文件夹下,然后运行 calculate.py。

二、理解

test_mIou,test_mPA,test_miou,test_mpa=compute_mIoU(gt_dir, pred_dir, image_ids, num_classes, name_classes,weight_name)  # 执行计算mIoU的函数

gt_dir 真实标签文件夹

pred_dir 预测结果文件夹

主要是这两个变量设置,后面的可以选择性修改

image_ids 文件名称 dirList(pred_dir,path_list) saveList(path_list) 这两个函数得到

num_classes 类别数

name_classes 类别名称

weight_name 权重名称

hist为混淆矩阵,mIoU为交并比

三、代码 

 calculate.py

# -*- coding: utf-8 -*-
import torch
import os

from time import time
# from PIL import Image
from utils_metrics import compute_mIoU
def saveList(pathName):
    for file_name in pathName:
        #f=open("C:/Users/Administrator/Desktop/DeepGlobe-Road-Extraction-link34-py3/dataset/real/gt.txt", "x")
        with open("./dataset/gt.txt", "a") as f:
            f.write(file_name.split(".")[0] + "\n")
        f.close

def dirList(gt_dir,path_list):
    for i in range(0, len(path_list)):
        path = os.path.join(gt_dir, path_list[i])
    if os.path.isdir(path):
        saveList(os.listdir(path))

data_path  = './dataset/'


f=open("./dataset/gt.txt", 'w')
gt_dir      = os.path.join(data_path, "real/")
pred_dir    = "./submits/log01_Dink101_five_100/test_iou/iou_60u/"
path_list = os.listdir(pred_dir)
path_list.sort()
dirList(pred_dir,path_list)
saveList(path_list)
num_classes=2
name_classes    = ["nontarget","target"]
weight_name='log01_Dink101_five_100'
image_ids   = open(os.path.join(data_path, "gt.txt"),'r').read().splitlines() 

test_mIou,test_mPA,test_miou,test_mpa=compute_mIoU(gt_dir, pred_dir, image_ids, num_classes, name_classes,weight_name)  # 执行计算mIoU的函数
print('  test_mIoU:  '+str(test_miou))

 utiles_metrics.py

from os.path import join

import numpy as np
import torch
import torch.nn.functional as F
from PIL import Image
import os
import cv2

# from matplotlib import pyplot as plt
import shutil
import numpy as np
# from matplotlib.pyplot import MultipleLocator

def f_score(inputs, target, beta=1, smooth = 1e-5, threhold = 0.5):
    n, c, h, w = inputs.size()
    nt, ht, wt, ct = target.size()
    if h != ht and w != wt:
        inputs = F.interpolate(inputs, size=(ht, wt), mode="bilinear", align_corners=True)
        
    temp_inputs = torch.softmax(inputs.transpose(1, 2).transpose(2, 3).contiguous().view(n, -1, c),-1)
    temp_target = target.view(n, -1, ct)

    #--------------------------------------------#
    #   计算dice系数
    #--------------------------------------------#
    temp_inputs = torch.gt(temp_inputs, threhold).float()
    tp = torch.sum(temp_target[...,:-1] * temp_inputs, axis=[0,1])
    fp = torch.sum(temp_inputs                       , axis=[0,1]) - tp
    fn = torch.sum(temp_target[...,:-1]              , axis=[0,1]) - tp

    score = ((1 + beta ** 2) * tp + smooth) / ((1 + beta ** 2) * tp + beta ** 2 * fn + fp + smooth)
    score = torch.mean(score)
    return score

# 设标签宽W,长H
def fast_hist(a, b, n):
    #--------------------------------------------------------------------------------#
    #   a是转化成一维数组的标签,形状(H×W,);b是转化成一维数组的预测结果,形状(H×W,)
    #--------------------------------------------------------------------------------#
    k = (a >= 0) & (a < n)
    #--------------------------------------------------------------------------------#
    #   np.bincount计算了从0到n**2-1这n**2个数中每个数出现的次数,返回值形状(n, n)
    #   返回中,写对角线上的为分类正确的像素点
    #--------------------------------------------------------------------------------#
    return np.bincount(n * a[k].astype(int) + b[k], minlength=n ** 2).reshape(n, n)  

def per_class_iu(hist):
    return np.diag(hist) / np.maximum((hist.sum(1) + hist.sum(0) - np.diag(hist)), 1) 

def per_class_PA(hist):
    return np.diag(hist) / np.maximum(hist.sum(1), 1) 

def compute_mIoU(gt_dir, pred_dir, png_name_list, num_classes, name_classes,weight_name):  
    # print('Num classes', num_classes)  
    #-----------------------------------------#
    #   创建一个全是0的矩阵,是一个混淆矩阵
    #-----------------------------------------#
    hist = np.zeros((num_classes, num_classes))
    
    #------------------------------------------------#
    #   获得验证集标签路径列表,方便直接读取
    #   获得验证集图像分割结果路径列表,方便直接读取
    #------------------------------------------------#
    gt_imgs     = [join(gt_dir, x + ".png") for x in png_name_list]  
    pred_imgs   = [join(pred_dir, x + ".png") for x in png_name_list]  
    # building_iou=[]
    # background_iou=[]
    m_iou=[]
    # building_pa=[]
    # background_pa=[]
    m_pa=[]

    #------------------------------------------------#
    #   读取每一个(图片-标签)对
    #------------------------------------------------#
    for ind in range(len(gt_imgs)): 
        #------------------------------------------------#
        #   读取一张图像分割结果,转化成numpy数组
        #------------------------------------------------#
        pred = np.array(Image.open(pred_imgs[ind]))
        
        #------------------------------------------------#
        #   读取一张对应的标签,转化成numpy数组
        #------------------------------------------------#
        label = np.array(Image.open(gt_imgs[ind]))  
        
        # 如果图像分割结果与标签的大小不一样,这张图片就不计算
        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]))
            continue

        #------------------------------------------------#
        #   对一张图片计算21×21的hist矩阵,并累加
        #------------------------------------------------#
        a=label.flatten()
        a//=254
       
        b=pred.flatten()
        b//=254
        hist += fast_hist(a, b,num_classes)  
        # # 每计算10张就输出一下目前已计算的图片中所有类别平均的mIoU值
        # mIoUs   = per_class_iu(hist)
        # mPA     = per_class_PA(hist)
        # m_iou.append(100 * np.nanmean(mIoUs[1]))
        # m_pa.append(100 * np.nanmean(mPA[1]))
        # # if ind > 0 and ind % 10 == 0:  
        # #     print('{:d} / {:d}: mIou-{:0.2f}; mPA-{:0.2f}'.format(ind, len(gt_imgs),
        # #                                             100 * np.nanmean(mIoUs[1]),
        # #                                             100 * np.nanmean(mPA[1])))
    mIoUs   = per_class_iu(hist)
    mPA     = per_class_PA(hist)
    print(mIoUs)

    # plt.figure()
    # x=np.arange(len(m_iou))
    # plt.plot(x,m_iou)
    # plt.plot(x,m_pa)
    # plt.grid(True)
    # y_major_locator=MultipleLocator(10)#把y轴的刻度间隔设置为10,并存在变量里
    # ax = plt.gca()
    # ax.yaxis.set_major_locator(y_major_locator)
    # ax.set_ylim(0,100)
    # plt.xlabel('Order')
    # plt.ylabel('mIOU & mPA')
    # plt.legend(['mIOU','mPA'],loc="upper right")

    # targ=os.path.join(pred_dir,os.path.pardir)
    

    # plt.savefig(os.path.join(targ, weight_name[:-3]+"_sin_miou.png"))

    return m_iou,m_pa,str(round(mIoUs[1] * 100, 2)),str(round(mPA[1] * 100, 2))

调试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/752838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

prometheus调整默认数据存储时间

调整kubernetes部署的prometheus数据存储时间 由于prometheus是用kuberentes部署的&#xff0c;没办法像传统部署方式那种直接在启动参数增加存储时间的参数。需要在configmap里或者在deployment里添加&#xff0c;我这里使用的方式是在deployement里添加调整存储时间的参数。…

数据库基本操作--------MySQL事务

目录 一、MySQL事务的概念 二、事务的ACID特点 1、原子性 2、一致性 3、隔离性 4、持久性 三、事务之间的相互影响 四、MySQL及事务隔离级别 1、查询全局事务隔离级别 2、查询会话事务隔离级别 3、设置全局事务隔离级别 4、设置会话事务隔离级别 五、事务控制语句 1、测…

ant 后台自定义左侧菜单的图标

最终达成结果&#xff1a; 操作步骤 1.登录阿里图库新增项目 iconfont-阿里巴巴矢量图标库 &#xff0c;点击资源管理-我的项目-新增项目&#xff0c;如图所示&#xff1a; 填写项目名称&#xff0c;项目名称随便填&#xff0c;不重要 填写前缀和font family&#xff0c;如上…

Linux的未来前景:多领域发展势头强劲

Linux在未来的发展前景非常广阔&#xff0c;可以涵盖多个领域和职业方向。刚好&#xff0c;我这里有嵌入式学习路线&#xff0c;毕设&#xff0c;各种项目&#xff0c;需要留个6。以下是一些可能的Linux发展方向&#xff1a;服务器方向&#xff1a;Linux在服务器领域应用广泛&a…

性能测试之性能问题分析

目录 开始性能测试前需要了解的内容&#xff1a; 测试策略&#xff1a; 压测中遇到的性能问题及解决办法&#xff1a; 性能问题分析流程 开始性能测试前需要了解的内容&#xff1a; 1、项目具体需求。 2、指标&#xff1a;响应时间在多少以内&#xff0c;并发数多少&#xff…

从技术出发or从场景出发:大模型开始“路线分化”?

文 | 智能相对论 作者 | 叶远风 大模型时代&#xff0c;厂商们狂奔突袭&#xff0c;技术创新一浪高过一浪。 在这个过程中&#xff0c;先赶上风口做出一个大模型产品&#xff0c;宣传一波、站稳脚跟&#xff0c;再慢慢谈场景应用、价值落地&#xff0c;是很多厂商的做法——…

第二届计算与人工智能国际会议 | ACM-ICPS独立出版 | 快速检索

会议简介 Brief Introduction 第二届计算与人工智能国际会议(ISCAI 2023) 会议时间&#xff1a;2023年10月13 -15日 召开地点&#xff1a;中国上海 大会官网&#xff1a;www.iscai.org 2023年第二届计算与人工智能国际会议(ISCAI 2023)将围绕“计算与人工智能”的最新研究领域而…

【学会动态规划】使用最小花费爬楼梯(3)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

webpack项目和vue项目发布,浏览器存在缓存

项目是webpack搭建的每次发步到线上&#xff0c;经常需要手动清楚浏览器缓存才能有效果。vue项目设置在最下面 项目打包的js&#xff08;css也是一致&#xff09;名称都采用哈希值 问题&#xff1a;哈希值在有些情况下打包会不变&#xff0c;导致浏览器使用自己缓存的资源 解…

洗地机选哪个牌子好、洗地机排名

洗地机可以说是现代家居清洁首选设备。因为它比拖把拖地更加高效率&#xff0c;同时对比扫地机和吸尘器拥有更多的清洁功能&#xff0c;干湿垃圾一起拖少。并且自清洁功能能够帮助它更好的清理干净滚刷和管道&#xff0c;清洁使用非常省心省力。下面小编就给大家分享几款家庭清…

红队打靶:Brainpan打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现和端口扫描 第二步&#xff1a;web渗透 第三步&#xff1a;缓冲区溢出漏洞识别 第四步&#xff1a;定位eip寄存器&#xff08;确定溢出字符串的长度&#xff09; 第五步&#xff1a;ESP扩容&#xff08;判断ESP寄存器的大小是否…

如何在 3ds Max 中使用 Mental Ray 制作逼真的草地和带有光晕的天空

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 首先&#xff0c;您将创建一个平面对象&#xff0c;然后添加一个噪点修改器。在此之上应用毛发和毛皮修饰符。 这将用于模拟逼真的草地。 我们用日光系统创造太阳和天空。为太阳添加镜头和戒指效果以及酷炫…

防火墙规则过期通知

作为规则管理最佳实践&#xff0c;大多数安全管理员为其防火墙规则设置到期日期。过期后&#xff0c;需要更正防火墙规则才能再次激活。但是&#xff0c;由于大多数组织都有数百个规则和多个安全管理员处理这些规则&#xff0c;因此几乎不可能查看过期的规则并手动纠正它们。这…

GPT的体验与思考

文章目录 一、GPT使用过程之对话二、AI大模型训练之文生图三、总结与思考 本文用到的词汇偏口语&#xff0c;甚至是小编自己创造&#xff1b;本文主要关注点在于使用和使用后的思考。 一、GPT使用过程之对话 在chart-gpt刚刚爆火出圈的时候&#xff0c;我并没有选择立马使用、…

力扣 309. 最佳买卖股票时机含冷冻期

一、题目描述 给定一个整数数组 prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;&#xff1a; 卖出股票后&#xff0c…

Star History 月度开源精选|2023 年 6 月

上一期 Star History 月度精选是写给市场、运营人员的&#xff0c;而这一期回归到 DevTools 类别&#xff0c;我们六月发现了好一些开发者可以用的不错工具&#xff01; AI Getting Started 还记得 Supabase “Build in a weekend” 的广告词吗&#xff01;AI Getting Started…

10个项目瓜分5万美元,邀您参与Sui夏季黑客松最喜爱奖项投票

已经顺利完成第二阶段的项目选拔&#xff0c;40个项目成功入围最终的Demo Day。随着Sui Builder House巴黎站活动的临近&#xff0c;黑客松第三阶段Demo Day的气氛也逐渐热烈。 此次Demo Day将采用线上线下的形式为大家呈现精彩的项目路演&#xff0c;无法到达现场参与活动的朋…

vite + vue 白屏 Uncaught Syntaxerror: Unexpected token ‘?‘

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 一、问题的描述 突然收到业务方发来的反馈&#xff1a; 浏览器一片空白&#xff0c;开控制台输出&#xff1a;Uncaught Syntaxerror: Unexpected token ? 这个是语法错误。 二、 问题分析&#xff1a; 根据vit…

【数据分享】1929-2022年全球站点的逐年最大持续风速数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…

母婴市场进入增长寒冬,AIGC能否为孩子王“供暖”?

文|螳螂观察 作者| 青月 人口负增长这件事&#xff0c;已经使母婴行业成了首批受到冲击的板块之一。用「母婴行业观察」的话来概括&#xff0c;就是“母婴行业正在进入销量低增长甚至零增长、营收利润低增长的挤压式竞争新阶段&#xff0c;并且已经开始了”。 行业内的玩家&…