python实现二分类分割精度评价指标批量计算并保存为txt文件(F1、mIoU、recall、precision、accuracy)

该代码实现了一个功能,通过比较预测结果和真实标签,计算道路提取任务的混淆矩阵,包括真正例(TP)、真负例(TN)、假正例(FP)和假负例(FN)。接着,基于这些值计算准确率、精准率、召回率、MIoU和F1分数,并将结果保存到txt文件中。适用于模型性能评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from PIL import Image
import os
import json


# 获取混淆矩阵四个值(以道路提取为例,道路区域【255,255,255】,背景区域【0,0,0】)
# TP:被模型预测为正类的正样本(预测道路且标签道路)
# TN:被模型预测为负类的负样本(预测背景且真实背景)
# FP:被模型预测为正类的负样本(预测道路但真实背景)
# FN:被模型预测为负类的正样本(预测背景但真实道路)
def get_vaslue(predict_folders_path, label_folders_path):
    # 加载文件夹
    predict_folders = os.listdir(predict_folders_path)
    label_folders = os.listdir(label_folders_path)
    TP = 0
    TN = 0
    FP = 0
    FN = 0
    for folder in predict_folders:
        # 获取图片路径
        predict_folder_path = os.path.join(predict_folders_path, folder)
        label_folder_path = os.path.join(label_folders_path, folder)
        # 加载图像并赋值四通道
        predict = Image.open(predict_folder_path)
        predict = predict.convert('RGBA')
        label = Image.open(label_folder_path)
        label = label.convert('RGBA')
        heigh, width = predict.size
        # save_name = str(folder).split('.')[0]
        for i in range(heigh):
            for j in range(width):
                r_1, g_1, b_1, a_1 = predict.getpixel((i, j))
                r_2, g_2, b_2, a_2 = label.getpixel((i, j))
                if r_1 == 255:
                    if r_2 == 255:
                        TP += 1
                    if r_2 == 0:
                        FP += 1
                if r_1 == 0:
                    if r_2 == 255:
                        FN += 1
                    if r_2 == 0:
                        TN += 1
    return float(TP), float(TN), float(FP), float(FN)


# list转存txt
def list2txt(list, save_path, txt_name):
    with open(save_path + r'/' + txt_name, 'w') as f:
        json.dump(list, f)


def evoluation(TP, TN, FP, FN):
    evo = []
    # 准确率
    accuracy = (TP + TN) / (TP + TN + FP + FN)
    # 精准率
    precision = TP / (TP + FP)
    # 召回率
    recall = TP / (TP + FN)
    # miou
    miou = (TP / (TP + FP + FN) + TN / (TN + FN + FP)) / 2
    # F1
    f1 = 2 * ((precision * recall) / (precision + recall))
    evo.append('accuracy:{}  precision:{}  recall:{}  miou:{} f1:{}'.format(accuracy, precision, recall, miou, f1))
    print(evo)
    list2txt(evo, r"", '')
    return evo


if __name__ == '__main__':
    predict_path = r''
    label_path = r''
    TP, TN, FP, FN = get_vaslue(predict_path, label_path)
    evoluation(TP, TN, FP, FN)

在这里插入图片描述
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RuiXuan Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值