文章目录

  • 一、Precision(精确率)与Recall(召回率)
  • 二、PR曲线:精确率——召回率曲线
  • 三、 OIS、ODS、AP的计算
    • 1. ODS
    • 2. OIS
    • 3. AP
  • 四、代码实现
    • 1. 注意数据类型
    • 2. NMS
    • 3. 指标测量
    • 4. 关于对比实验多PR曲线图的绘制

参考博客:1、2
参考代码:HED的源码、画PR曲线


一、Precision(精确率)与Recall(召回率)

  • 目标检测:
    Precision(精确率):预测为正例的结果中有多少是真的正例。强调预测的准确性。
    Recall(召回率):所有真的正例中有多少被预测为正例。强调把多少真正的正例召唤回来。


  • 边缘检测中:
    Precision(精确率):在边缘检测中精确率表示机器生成的边界像素是真实边界像素的概率。
    Recall(召回率):在边缘检测中召回率表示检测到真实边界像素占所有真实边界像素的概率。

二、PR曲线:精确率——召回率曲线

边缘检测得到的edge probability map结果,并不是二值的矩阵。每个矩阵元素,即对应图像中的像素是否为边缘上点的概率,取值为0到1。为了后续的结果评估,需要将此概率二值化得到binary edge map。故需要设计阈值(threshold) ηηη,也可以称为置信度,大于 ηηη 则置0,表示为正例(positive samples);小于 ηηη 则置1,表示为负例(negative samples),以得到用于评估的二值边缘图binary edge map。

PR曲线参数的核心Matlab代码如下(edgesEvalImg.m):

for k = 1:K% threshhold and thin EE1 = double(E>=max(eps,thrs(k)));if(thin), E1=double(bwmorph(E1,'thin',inf)); end% compare to each ground truth in turn and accumualteZ=zeros(size(E)); matchE=Z; matchG=Z; allG=Z;for g = 1:n[matchE1,matchG1] = correspondPixels(E1,G{g},maxDist);matchE = matchE | matchE1>0;matchG = matchG + double(matchG1>0);allG = allG + G{g};end% compute recall (summed over each gt image)cntR(k) = sum(matchG(:)); sumR(k) = sum(allG(:));% compute precision (edges can match any gt image)cntP(k) = nnz(matchE); sumP(k) = nnz(E1);% optinally create visualization of matchesif(nargout<6), continue; end; cs=[1 0 0; 0 .7 0; .7 .8 1]; cs=cs-1;FP=E1-matchE; TP=matchE; FN=(allG-matchG)/n;for g=1:3, V(:,:,g,k)=max(0,1+FN*cs(1,g)+TP*cs(2,g)+FP*cs(3,g)); endV(:,2:end,:,k) = min(V(:,2:end,:,k),V(:,1:end-1,:,k));V(2:end,:,:,k) = min(V(2:end,:,:,k),V(1:end-1,:,:,k));end

上述代码出现的参数分别是:

  • E1:所有手工标注的真值边缘图进行二值化后求“并”的结果,即。有一个边缘图对应的像素点大于阈值就为1,否则为0。
  • matchE:预测的边缘点在所有真值map中有至少一个的对应点为边缘点就表示预测正确预测正确的边缘点为1,否则为0。即,TP=matchE。
  • matchG:预测的边缘点在真值中也为边缘点的点数。
  • allG:在真值中把对应点预测为边缘点的点数。

一个例子:
假如一张3*3的图片有三个真值边界图(在某一阈值下)

E1计算过程如下:

matchE 计算过程如下:

上述matchG的计算过程如下:

allG计算过程如下:

上面代码通过 correspondPixels函数(封装了,未公开)求得上述四个值,再分别计算下述cntR、sumR、cntP和sumP四个值:

cntR: cntR(k) = sum(matchG( : )) 表示对matchG中所有元素求和(即预测正确的点数,若groundTruth有多个子边界图则要把所有子边界图中预测对的求和)
sumR: sumR(k) = sum(allG( : )) 表示对allG中所有元素求和(即所有子边界图中真实边缘点的个数)
cntP: cntP(k) = nnz(matchE) 表示对matchE统计非0元素的个数(预测结果中预测正确的像素数)(nnz表示Number of nonzero,统计非0元素的个数)
sumP: sumP(k) = nnz(E1) 表示对E1统计非0元素的个数(即总边界图中真实边缘点的个数)

最终,求Precision和Recall:

  • Precision:cntP /sumP
  • Recall:cntR/ sumR

通过上一步计算P和R,最后得到的有用的参数:[thrs cntR sumR cntP sumP], thrs表示阈值。每张图片会有一个[id]_evl.txt文件。有99行,分别对应99个不同阈值 ηηη 和相应的cntR sumR cntP sumP值。对于每一个阈值求相应的Precision和Recall就可画出PR曲线。

三、 OIS、ODS、AP的计算

1. ODS

ODS(optimal dataset scale),也称为全局最佳、固定阈值
即数据集固定比例 、检测指标数据集尺度上最优,简单说就是为所有图像设置同样的阈值,即选取一个固定的阈值ηηη应用于所有图片, 使得整个数据集上的F-score最大;

将每张图片对应的txt文件读出来后,首先计算每一张图片的R、P、F,它们都是T行一列的矩阵,其中T为阈值个数。
代码:

function [R,P,F] = computeRPF(cntR,sumR,cntP,sumP)
% compute precision, recall and F measure given cnts and sumsR=cntR./max(eps,sumR);P=cntP./max(eps,sumP);F=2*P.*R./max(eps,P+R);
end

这样就能找到使F值最大的阈值k,也就是该张图片的最佳阈值。将得到的结果保存在eval_bdry_img.txt内。代码:

function [bstR,bstP,bstF,bstT] = findBestRPF(T,R,P)
% linearly interpolate to find best thr for optimizing F
if(numel(T)==1), bstT=T; bstR=R; bstP=P;bstF=2*P.*R./max(eps,P+R); return; end
A=linspace(0,1,100); B=1-A; bstF=-1;
for j = 2:numel(T)Rj=R(j).*A+R(j-1).*B; Pj=P(j).*A+P(j-1).*B; Tj=T(j).*A+T(j-1).*B;Fj=2.*Pj.*Rj./max(eps,Pj+Rj); [f,k]=max(Fj);if(f>bstF), bstT=Tj(k); bstR=Rj(k); bstP=Pj(k); bstF=f; end
end
end

对每张图片计算[R,P,F] = computeRPF(cntR1,sumR1,cntP1,sumP1); [~,k]=max(F);这样就能找到使F值最大的阈值k,在计算PR曲线时得到的[id]_evl.txt文件中就能读出相应的cntR1(k), sumR1(k), cntP1(k), sumP1(k)。 找到使每张图片F值最大的 cntR, sumR, cntP, sumP,然后分别求和,使用computeRPF(cntR,sumR,cntP,sumP)求出对应的P、R、F就是OIS所需参数。

2. OIS

OIS(optimal image scale),也称为单图最佳、每幅图像的最佳阈值:
即在每一张图片上均选取不同使得该图片F-score最大的阈值ηηη。

直接按照阈值将所有图片的cntR,sumR,cntP,sumP分别求和,使用computeRPF(cntR,sumR,cntP,sumP)得到不同阈值下的T、R、P,然后利用findBestRPF(T,R,P)找到F取到最大值的那一组。对应的T就是ODS方法所取得应用于所有图片的阈值。

3. AP

平均准确率,是PR曲线的积分(即PR曲线下方的面积)。由于PR曲线很难积分,通常在PR曲线上采样求均值。代码:

k=k(end:-1:1);R=R(k);P=P(k);T=T(k);F=F(k);AP=0;
if(numel(R)>1),AP=interp1(R,P,0:.01:1);%插值,来提高精确度AP=sum(AP(~isnan(AP)))/100; %求均值
End

四、代码实现

最近在找上述PR曲线,OIS和ODS的代码实现,跑自己的数据集。找来找去,最后发现这个链接(https://github.com/zeakey/edgeval)给的matlab代码最方便。

按照官方给的例子最后实现的PR曲线如下图:

核心代码是benchmarkBoundary.m
修改预测边缘地址data_dir与真值图地址gtDir即可跑通自己的数据集。

1. 注意数据类型

预测边缘图:
二维0-255(.png)格式的预测边缘图

真值图:
仅含有0和1(.mat)格式的文件,mat文件内是cell封装的struct格式的数据,如下所示:

每个struct保存一个标记者标注的真值图。

其中boundary只含有0和1;segmentation即语义分割图,1到n,n为类别数;这里我们只需要Boundary这个数据类型。

为此,保存自己的真值图为mat文件的python代码示例如下:

io.savemat(label_name, {'groundTruth'[{'Boundaries':label_1},{'Boundaries':label_2}, {'Boundaries':label_3}]})

label1、label2、label3即不同标注者标记的真值图。

2. NMS

这一段代码就是调用NMS, 注意这里的核心函数edgesNmsMex被封装,看不到具体实现

3. 指标测量

核心函数是edgesEvalDir,参数如下图:

注意maxDist这个参数,即最大容忍误差,默认值0.0075对应4.3pixel(论文说的,我也不知道为什么)。

感谢网友科研小白猫的评论关于maxDist参数的解答,在此复制他的见解,作为补充:

maxdist=0.0075对应4.3pixel。图像斜对角距离,例如:图像321×481,斜对角距离为根号下321×321+481×481=578,578×0.0075=4.3。

4. 关于对比实验多PR曲线图的绘制

关于怎么绘制多段PR曲线到一张图上,这个仓库的matlab最好用。

核心代码是edgesEvalPlot.m,我们需要修改的是plot_xx.m文件,具体来说:

  • 建立一个文件夹命名为your_dir_name存放各个对比实验产生的xxx_eval_bdry.txt和xxx_eval_bdry_thr.txt文件
  • 修改plot_xx.m里colors、lines、years、names信息,注意是一一对应的
  • 修改plot_xx.m里调用edgesEvalPlot.m的参数
  • Done! 官方效果图:

边缘检测的评价指标:PR曲线,OIS,ODS,AP的计算与代码实现相关推荐

  1. 机器学习100天(二十):020 分类模型评价指标-PR曲线

    机器学习100天!今天讲的是:分类模型评价指标-PR曲线! <机器学习100天>完整目录:目录 上一节我们已经了解了混淆矩阵的概念,并掌握了精确率.召回率的计算公式,在这里.现在我们来学习 ...

  2. 2020-08-24绘制ROC   PR曲线 核心方法总结 ,计算AUC核心方法

    #1   绘制ROC AUC   PR曲线 #核心方法 roc_curve(y_test, preds)  #  preds为概率形式 #source code import matplotlib.p ...

  3. Detection:目标检测常用评价指标的学习总结(IoU、TP、FP、TN、FN、Precision、Recall、F1-score、P-R曲线、AP、mAP、 ROC曲线、TPR、FPR和AUC)

    目录 前言 1. IoU 2. TP.FP.TN.FN 2.1 混淆矩阵 2.2 TP.FP.TN.FN的定义 2.3 TP.FP.TN.FN在目标检测中的对应内容 2.3.1 TP,FP在目标检测中 ...

  4. yoloV3测试map和画PR曲线

    参考1:https://blog.csdn.net/qq_33350808/article/details/83178002 2:https://blog.csdn.net/weixin_437175 ...

  5. 保姆级 边缘检测评价OIS、ODS、PR曲线绘制 ——在自己的数据集上

    1.数据的处理部分 首先,通过我们训练好的网络,我们可以得到训练后的test图像.以及训练集的GT 由于原benchmark是针对于BSDS数据集进行评价,我们先进行一些数据的处理. 将GT中的图片格 ...

  6. yolov3--25--Detectron目标检测可视化-P-R曲线绘制-Recall-TP-FP-FN等评价指标

    Detectron目标检测平台 评估训练结果(生成mAP) CUDA_VISIBLE_DEVICES=4 python tools/test_net.py --cfg experiments/2gpu ...

  7. 目标检测中的评估指标:PR曲线、AP、mAP

    文章目录 1.precision & recall 2.P-R曲线 3.AP计算 4.mAP计算 5.COCO Evaluation Result 1.precision & reca ...

  8. 【机器学习基础】TP,TN,FP,FN,Precision,Recall,PR曲线,AP,MAP,TPR,FPR,ROC曲线,AUC值等的解释

    1.TP,TN,FP,FN: 下面两个图说的就很明白了吧.左侧有点混淆矩阵的感觉     P:标签为正样本.     N:标签为负样本.     T:预测对了.     F:预测错了     TP:正 ...

  9. 目标检测评价指标汇总—mAP,PR曲线,F1分数,FPPI,log-average miss rate等

    对于了解目标检测的评价指标是很重要的,否则自己不懂这个代表什么意思,如何调参.网上有太多资料,可是杂乱,甚至有一乱说,记录下自己所学,总结下,也分享出来,也便于自己自己复习. 分为三块,1.解释相关概 ...

最新文章

  1. OpenCV 中的 convertTo 函数
  2. JFinal 源码导读第二天(2)configPlugin,configRoute
  3. P7 频域分析法-《Matlab/Simulink与控制系统仿真》程序指令总结
  4. Linux命令之 mount -- 文件系统挂载
  5. 机器学习:算法模型:决策树
  6. Python 代码优化常见技巧
  7. 安装JDK失败,再次安装时出现已经安装过了的,解决办法
  8. FlashFXP设置文件传输速度
  9. MSM8937系统启动流程【转】
  10. http下载文件(常用方式+支持在线打开方式)
  11. 在东京大学感受_东京最好的街头小吃在哪里找到
  12. 七月流火,让我们共享一场开源数据库的饕餮盛宴
  13. win10文件夹加密_文件隐私保护工具文件夹隐藏精灵
  14. 微信分享链接网页下载的无法打开解决方案,微信跳转外部浏览器
  15. 定积分的基本性质4 绝对可积性
  16. 育网云盘签约北京市大兴区黄村镇第一中心小学云端租赁服务
  17. SAP FICO CBS接口-银企直连联盟收款功能开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)
  18. GROUP BY 条件查询最新时间记录
  19. fillpolygon
  20. B站离线多机房架构实践

热门文章

  1. 罗克韦尔自动化任命Susana Gonzalez为EMEA地区总裁
  2. linux 通过ssh上传文件
  3. 关系规范化之满足第三范式3NF的函数依赖保持分解算法
  4. DBC文件的编辑方法
  5. 一篇就够!数据增强方法综述
  6. 时光不会辜负你一直以来的坚持——读《人生效率手册》
  7. 广州互联网公司和生活成本
  8. CUBEMX配置STM32实现FTP文件传输以及使用SNTP获取网络时间并写入RTC
  9. 怎么做web接口测试
  10. jQuery_删除及清空节点