实例分割计算指标TP,FP,FN,F1(附代码)

目录

源代码:

返回值

 我使用的groundTruth图像:

 预测图像


 

 基于IOU的F1是评价模型实例分割能力的一种评价指标,该指标在2018年的Urban 3D Challenge和2020年的阿里天池建筑智能普查竞赛中作为评价标准。
计算公式如下:

在这里插入图片描述

其余计算指标:

1、IoU:  交并比,两个区域重叠的部分除以两个区域的集合部分, IOU算出的值score > 0.5 就可以被认为一个不错的结果了

2、mIoU(mean IoU):均交并比,识别或者分割图像一般都有好几个类别,把每个分类得出的分数进行平均一下就可以得到mean IoU,也就是mIoU。

3、Precision:精确率,混淆矩阵计算得出,P = TP/(TP+FP)

4、Recall:召回率,R = TP/(TP+FN)

5、Accuracy:准确率,accuracy = (TP+TN)/(TP+TN+FP+FN)

     即PA(Pixel Accuracy,像素精度?标记正确的像素占总像素的比例):表示检测物体的准确度,重点判断标准为是否检测到了物体
IoU只是用于评价一幅图的标准,如果我们要评价一套算法,并不能只从一张图片的标准中得出结论。一般对于一个数据集、或者一个模型来说。评价的标准通常来说遍历所有图像中各种类型、各种大小(size)还有标准中设定阈值.论文中得出的结论数据,就是从这些规则中得出的。

源代码:


from skimage import measure
from scipy import ndimage
import cv2 as cv
import numpy as np

def get_buildings(mask, pixel_threshold):
    gt_labeled_array, gt_num = ndimage.label(mask)
    unique, counts = np.unique(gt_labeled_array, return_counts=True)
    for (k, v) in dict(zip(unique, counts)).items():
        if v < pixel_threshold:
            mask[gt_labeled_array == k] = 0
    return measure.label(mask, return_num=True)


def calculate_f1_buildings_score(y_pred_path, iou_threshold=0.40, component_size_threshold=0):
    #iou_threshold=0.40表示重合面积大于40%,判断为TP
    tp = 0
    fp = 0
    fn = 0


    # for m in tqdm(range(len(y_pred_list))):
    processed_gt = set()
    matched = set()

    #mask_img是预测图像
    # mask_img = cv.imread(r".\predictLabel\Halo-water.jpg", 0)
    # mask_img = cv.imread(r".\predictLabel\Halo_image.png", 0)
    mask_img = cv.imread(r".\predictLabel\RGB_image.png", 0)
    #gt_mask_img 是groundTruth图像
    gt_mask_img = cv.imread(r".\groundtruth\GT_image.png", 0)

    predicted_labels, predicted_count = get_buildings(mask_img, component_size_threshold)
    gt_labels, gt_count = get_buildings(gt_mask_img, component_size_threshold)

    gt_buildings = [rp.coords for rp in measure.regionprops(gt_labels)]
    pred_buildings = [rp.coords for rp in measure.regionprops(predicted_labels)]
    gt_buildings = [to_point_set(b) for b in gt_buildings]
    pred_buildings = [to_point_set(b) for b in pred_buildings]
    for j in range(predicted_count):
        match_found = False
        for i in range(gt_count):
            pred_ind = j + 1
            gt_ind = i + 1
            if match_found:
                break
            if gt_ind in processed_gt:
                continue
            pred_building = pred_buildings[j]
            gt_building = gt_buildings[i]
            intersection = len(pred_building.intersection(gt_building))
            union = len(pred_building) + len(gt_building) - intersection
            iou = intersection / union
            if iou > iou_threshold:
                processed_gt.add(gt_ind)
                matched.add(pred_ind)
                match_found = True
                tp += 1
        if not match_found:
            fp += 1
    fn += gt_count - len(processed_gt)
    precision = tp / (tp + fp)
    recall = tp / (tp + fn)
    if precision == 0 or recall == 0:
        return 0
    f_score = 2 * precision * recall / (precision + recall)
    return f_score , fp ,fn , tp ,precision , recall


def to_point_set(building):
    return set([(row[0], row[1]) for row in building])

#y_pred_path 没用到,随便填
y_pred_path = 'predictLabel'

f_score = calculate_f1_buildings_score(y_pred_path, iou_threshold=0.5, component_size_threshold=1)

print(f_score)

返回值

 我使用的groundTruth图像:

 预测图像

 

在使用PyTorch计算TPFNFP和TN时,可以利用PyTorch的支持numpy的特性来进行判断。下面是一个示例代码: ```python import torch # 假设有两个张量,一个是预测值(predict),一个是真实标签(label) predict = torch.tensor([1, 0, 1, 0]) # 预测值 label = torch.tensor([1, 1, 0, 0]) # 真实标签 # 计算TPFNFP、TN TP = ((predict == 1) & (label == 1)).sum().item() # 预测为正例且真实为正例的数量 FN = ((predict == 0) & (label == 1)).sum().item() # 预测为负例且真实为正例的数量 FP = ((predict == 1) & (label == 0)).sum().item() # 预测为正例且真实为负例的数量 TN = ((predict == 0) & (label == 0)).sum().item() # 预测为负例且真实为负例的数量 print(f"TP: {TP}, FN: {FN}, FP: {FP}, TN: {TN}") ``` 在这个示例中,我们首先创建了两个张量`predict`和`label`,分别表示预测值和真实标签。然后,我们使用逻辑运算符和`sum()`函数来计算TPFNFP和TN的数量。最后,我们使用`item()`方法将结果转换为标量值,并打印出来。 请注意,这只是一个示例代码,你可以根据实际情况对代码进行修改和调整。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [在pytorch 中计算精度、回归率、F1 score等指标的实例](https://download.csdn.net/download/weixin_38720997/14858620)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [如何用keras/tf/pytorch实现TP/TN/FP/FN和accuracy/sensiivity/precision/specificity/f1-score等评价指标...](https://blog.csdn.net/weixin_43509263/article/details/101638713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值