• 边缘检测测评标准


    是 https://blog.csdn.net/AAAAshin/article/details/106793101#comments_13207070 中的第3种方法

    也就是https://github.com/xwjabc/hed中使用的

     (评价指标可以参考:https://blog.csdn.net/AAAAshin/article/details/108042346)

    评价指标有PR曲线、ODS、OIS、AP、(FPS可以有)

    1.PR曲线

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

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

    由于核心算法correspondPixels是mexw封装的,没有办法查看到,给代码的理解带来了一定困难。通过对19行FP、TP、FN三个变量的理解,可以反推出:

    E1:所有边缘图(手工标注的真值,共6个)二值化的结果(大于阈值的为1,反之为0)

    matchE:预测正确的边缘为1,否则为0(预测为边缘的点,在6个真值中存在至少一个对应点为边缘),所以TP=matchE。也就是说预测的边缘点在6个真值中的对应点有一个为边缘,就算你预测的对

    matchG:你预测的边缘点在真值中的对应点也为边缘的数量(0~6),也就是说,matchE是matchG二值化的结果(非0值设为1)

    allG:真值中把该点预测为边缘的数量(0~6)

    这几个变量大小都是H*W的跟输入图片的高宽相同的二维矩阵。

    另外,correspondPixels算法中有一个maxDist,作用是对预测结果tolerant,也就是在预测的边缘的maxDist范围内存在真值为边缘,就算你对。代码默认设置为0.0075,应该是相对图片大小的相对量。

    cntR

    cntR(k) = sum(matchG(:))

    sumR

    sumR(k) = sum(allG(:));

    cntP 

    cntP(k) = nnz(matchE)

    sumP

    sumP(k) = nnz(E1);

    最后获得的有用参数为:[thrs cntR sumR cntP sumP],每张图片会在有一个[id]_evl.txt文件与之对应。有99行,分别对应99个不同阈值和相应的cntR sumR cntP sumP值

    之后参考:https://github.com/yun-liu/plot-edge-pr-curves 就可以画出如下的PR曲线(图来自HED)

    2.OIS/ODS

    2.1.OIS

    将每张图片对应的txt文件读出来后

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

    求出R、P、F,都是矩阵[T,1],其中T为阈值个数。

    然后求其中使F值最大的值

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

    这里使用了一个线性插值,通过对相邻阈值插值,可以得到更细致的阈值,使结果更好(把阈值间隔细化100份)

    然后将得到的结果保存在eval_bdry_img.txt内。

    对每张图片计算[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.2.ODS

    比OIS的求法更简单,直接将所有图片的cntR,sumR,cntP,sumP安阈值分别求和,computeRPF(cntR,sumR,cntP,sumP得到不同阈值下的T、R、P,然后利用findBestRPF(T,R,P)找到其中能让F取到最大值的那一组。

    3.AP

     AP指平均准确率,为PR曲线的积分(也就是PR曲线下方的面积),因为PR曲线没有表达式,所以难以积分,通常做法是在PR曲线上采样求均值。

     1 [~,k]=unique(R);%去重,阈值改变,可能查全率不变,这样准确率也不会变,这样的点在PR曲线上是同一个点,不应该统计多次
     2  k=k(end:-1:1);
     3  R=R(k);
     4  P=P(k);
     5  T=T(k);
     6  F=F(k);
     7  AP=0;
     8 if(numel(R)>1), 
     9     AP=interp1(R,P,0:.01:1);%插值,来提高精确度
    10     AP=sum(AP(~isnan(AP)))/100; %求均值
    11 end

    4.R50

    代码如下

    [~,o]=unique(P); R50=interp1(P(o),R(o),max(P(o(1)),.5));
    

      代码同时给出R50这一标准,但是论文中没有R50,暂时就先不探究了。

  • 相关阅读:
    继承与多态——动手又动脑
    类与对象--动手又动脑
    Go语言接口
    GO语言结构体
    GO指针
    GO函数
    GO获取随机数
    GO基础
    Go语言的%d,%p,%v等占位符的使用
    GO语言常量和变量
  • 原文地址:https://www.cnblogs.com/jiangnanyanyuchen/p/13868320.html
Copyright © 2020-2023  润新知