邊緣檢測測評標准


是 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,暫時就先不探究了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM