显著性目标检测模型评价指标(二)——PR曲线

本文介绍了显著性目标检测中的PR曲线原理及其Matlab实现。PR曲线是评估模型性能的关键指标,通过计算不同阈值下的查准率(Precision)和查全率(Recall)来绘制。文中详细解释了计算方法及阈值选取,并提供了完整的Matlab代码。

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

显著性目标检测模型评价指标 之 PR曲线原理与实现代码

目录

一、PR曲线原理

在显著目标提取中(关于视觉显著性的简要介绍点此处链接),PR曲线是用来评估模型性能的重要指标之一,PR曲线中的P(Precision)和R(Recall)分布意为“查准率”和“查全率”。以“查准率”为纵坐标,“查全率”为横坐标所做的曲线即为PR曲线(如下图,来自南京大学周志华教授主编的《机器学习》第二章,p31)。
PR曲线示意图
###计算方法
我们将模型所提的显著性目标图谱S进行二值化得到M,然后通过下面公式逐像素对比M与Ground-truth来计算Precision值与Recall值[1]:
这里写图片描述
如下图所示,模型输出的显著性图片与Ground-truth图在一般情况下都不会完全相同,即我们模型所提取出的显著性图mask出了正确被分类的目标(TP)与背景(TN)外,会将一部分本应该是背景的区域划到目标区域(FP),将一部分本应该是目标的区域划为背景区域(FN)。
PR曲线示意图
通过统计我们获得TP、TN、FP、FN的数目,然后利用下式来计算Precision值与Recall值。
这里写图片描述
###阈值选取
将输出图片S进行二值化时,阈值选择为从0到255,每取一个阈值,即可对所有输出图S算得一组相对应的Precision值与Recall值。最后将所有图像在该阈值下的Precision值与Recall值分别求平均,最后将会得到256对P,R值,以Recall为横坐标,Precision为纵坐标绘制曲线图即可得到precision-recall (PR)曲线。

二、Matlab代码

代码块语法遵循标准markdown代码,例如:

function PRcurveHanle
%本程序的功能是对显著性特征提取的结果绘制PR曲线。
%by hanlestudy@163.com
clc
clear
close all
%读取数据库
imnames=dir(path_output);  
imnames2=dir(path_target);  
num=length(imnames);
Precision=zeros(256,num);
Recall=zeros(256,num);
TP=zeros(256,num);
FP=zeros(256,num);
FN=zeros(256,num);
MAES=zeros(num,1);
for j=1:num
    Target=imread(imnames2(j).name);%读图
    Output=imread(imnames(j).name);
    target=rgb2gray(Target);        %二值化ground-truth
    target0=(target)>0;
    for i=0:255
        %以i为阈值二值化Output
        output0=(Output)>i;
        output1=output0*2;
        TFNP=zeros(256,256);
        x=1;
        TFNP(:,:)=output1(:,:,x)-target0;
        TP(i+1,j)=length(find(TFNP==1));
        FP(i+1,j)=length(find(TFNP==2));
        FN(i+1,j)=length(find(TFNP==-1));
        Precision(i+1,j)=TP(i+1,j)/(TP(i+1,j)+FP(i+1,j));
        Recall(i+1,j)=TP(i+1,j)/(TP(i+1,j)+FN(i+1,j));
    end
    j
end
P=mean(Precision,2);
R=mean(Recall,2);
figure,plot(R,P)  

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

##参考文献
[1]: A. Borji, M.-M. Cheng, H. Jiang, and J. Li. Salient object detection: A benchmark. IEEE TIP, 24(12):5706–5722, 2015.

### YOLOv8 目标检测评估指标的实现 以下是基于 Python 的代码示例,展示如何计算目标检测中的评价指标Precision、Recall、AP 和 mAP)。这些指标通常依赖于预测框与真实框之间的 IoU 值。 #### 计算 Precision 和 Recall Precision 和 Recall 是通过比较预测框和真实框得出的结果。以下是一个简单的函数: ```python import numpy as np def calculate_precision_recall(true_boxes, pred_boxes, iou_threshold=0.5): """ 计算 Precision 和 Recall 参数: true_boxes (list): 真实边界框列表 [(x_min, y_min, x_max, y_max), ...] pred_boxes (list): 预测边界框列表 [(x_min, y_min, x_max, y_max, confidence), ...] iou_threshold (float): IoU 阈值,默认为 0.5 返回: precision (float): 精确率 recall (float): 召回率 """ def compute_iou(boxA, boxB): # 计算交集区域坐标 xA = max(boxA[0], boxB[0]) yA = max(boxA[1], boxB[1]) xB = min(boxA[2], boxB[2]) yB = min(boxA[3], boxB[3]) inter_area = max(0, xB - xA + 1) * max(0, yB - yA + 1) boxA_area = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1) boxB_area = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 1) iou = inter_area / float(boxA_area + boxB_area - inter_area) return iou total_true = len(true_boxes) detected = [False] * total_true pred_boxes_sorted = sorted(pred_boxes, key=lambda x: x[4], reverse=True) tp = 0 fp = 0 for pred_box in pred_boxes_sorted: best_iou = 0 match_idx = -1 for idx, true_box in enumerate(true_boxes): iou = compute_iou(pred_box[:4], true_box) if iou > best_iou and not detected[idx]: best_iou = iou match_idx = idx if best_iou >= iou_threshold: detected[match_idx] = True tp += 1 else: fp += 1 precision = tp / (tp + fp) if (tp + fp) != 0 else 0 recall = tp / total_true if total_true != 0 else 0 return precision, recall ``` #### 平均精确度(AP) 平均精确度可以通过 PR 曲线下的面积来计算。这里提供了一个简单的方法: ```python def calculate_ap(precisions, recalls): """ 使用插值法计算 AP 参数: precisions (list): 不同阈值下的精确率 recalls (list): 对应的召回率 返回: ap (float): 平均精确度 """ recalls = np.concatenate(([0.], recalls, [1.])) precisions = np.concatenate(([0.], precisions, [0.])) for i in range(len(precisions) - 1, 0, -1): precisions[i - 1] = max(precisions[i - 1], precisions[i]) indices = np.where(recalls[:-1] != recalls[1:])[0] ap = np.sum((recalls[indices + 1] - recalls[indices]) * precisions[indices + 1]) return ap ``` #### 计算 mAP@0.5 和 mAP@0.5:0.95 mAP 是多个类别上的 AP 平均值。对于 mAP@0.5:0.95,则是对不同 IoU 阈值范围内的 AP 进行平均。 ```python def calculate_map(ap_values, iou_range=np.arange(0.5, 1.0, 0.05)): """ 计算 mAP@0.5 和 mAP@0.5:0.95 参数: ap_values (dict): 每个类别的 AP 值 {class_id: list_of_aps} 返回: map_50 (float): mAP@0.5 map_50_95 (float): mAP@0.5:0.95 """ all_maps = [] for class_id, ap_list in ap_values.items(): map_50 = ap_list[0] # 第一个对应 IoU=0.5 map_50_95 = np.mean(ap_list) # 所有 IoU 范围内的平均值 all_maps.append(map_50_95) overall_map_50 = sum([ap_list[0] for _, ap_list in ap_values.items()]) / len(ap_values) overall_map_50_95 = np.mean(all_maps) return overall_map_50, overall_map_50_95 ``` --- 上述代码实现了 Precision、Recall、AP 和 mAP 的基本逻辑。需要注意的是,在实际项目中可能还需要考虑更多细节,比如多类别支持、背景噪声过滤等[^2]^。
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乐乐lelele

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

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

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

打赏作者

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

抵扣说明:

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

余额充值