显著性目标检测模型评价指标(二)——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.

MATLAB中绘制PR曲线,可以按照以下步骤操作: 1. 准备好真实标签(Ground Truth)和分类器输出结果,将它们分别存储在两个矩阵中。 2. 计算出不同阈值下的准确率(Precision)和召回率(Recall)。 3. 绘制PR曲线。 下面是具体的代码实现: ```matlab % 真实标签 y_true = [1, 1, 0, 0, 1, 0, 1, 0, 1, 1]; % 分类器输出结果 y_pred = [0.7, 0.8, 0.3, 0.4, 0.6, 0.2, 0.9, 0.1, 0.8, 0.7]; % 计算PR曲线的数据点 [precision, recall, thresholds] = precisionrecall(y_pred, y_true); % 绘制PR曲线 plot(recall, precision, '-'); xlabel('Recall'); ylabel('Precision'); title('PR Curve'); % 定义 precisionrecall 函数 function [precision, recall, thresholds] = precisionrecall(scores, labels) % 对分类器输出结果进行排序 [sorted_scores, sorted_indices] = sort(scores, 'descend'); sorted_labels = labels(sorted_indices); % 计算不同阈值下的准确率和召回率 thresholds = unique(sorted_scores); precision = zeros(size(thresholds)); recall = zeros(size(thresholds)); for i = 1:length(thresholds) threshold = thresholds(i); tp = sum(sorted_labels(sorted_scores >= threshold)); fp = sum(sorted_labels(sorted_scores >= threshold) == 0); fn = sum(sorted_labels(sorted_scores < threshold)); precision(i) = tp / (tp + fp); recall(i) = tp / (tp + fn); end end ``` 上述代码中,我们使用 `precisionrecall` 函数计算出不同阈值下的准确率和召回率,然后绘制PR曲线。该函数的实现方式主要是对分类器输出结果进行排序,然后根据不同阈值计算出TP、FP和FN,从而得到准确率和召回率。最后将所有的准确率和召回率数据点作为PR曲线的坐标点,绘制曲线即可。
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乐乐lelele

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

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

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

打赏作者

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

抵扣说明:

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

余额充值