近來也是作學位論文,其中有一張是對比了當前比較多的圖像顯著性方法,不少顯著性算法都或者給出源碼,或者給出可執行程序,或者是提供已分割的結果。算法
在有以上內容後,如何進行顯著性的結果進行評價呢?我看到不少precision-recall
曲線圖,我覺得不少做者都會給出評價的源碼,然而實際並無,雖然評價代碼也很容易能夠經過matlab編程獲得,但不管怎樣,仍是有點麻煩的,起碼我評價9個顯著性算法,它得在我電腦上跑將近半天多(也是我偷懶沒有優化吧)編程
對比的方法有:優化
算法名稱 | 參考文獻 | 實現代碼 |
---|---|---|
譜殘差(SR) | Hou[40] | 做者提供的Matlab代碼 |
頻率調諧(FT) | Achanta[26] | 做者提供的Matlab代碼 |
視覺注意(LC) | Zhai[25] | 做者提供的可執行代碼 |
基於直方圖的對比度(HC) | Cheng[31] | 做者提供的可執行代碼 |
基於區域的對比度(RC) | Cheng[31] | 做者提供的可執行代碼 |
分層顯著性檢測(HSD) | Yan[47] | 做者提供的可執行代碼 |
圖的流形排序(GBMR) | Yang[49] | 做者提供的Matlab代碼 |
全局線索(GC) | Cheng[60] | 做者提供的可執行代碼 |
稠密稀疏重建(DSR) | Li[52] | 做者提供的可執行代碼 |
首先,先看看precision
和recall
的計算方法:spa
假設 \(Result\) 表示實際分割結果的前景像素點集合,\(GT\) 表示該圖像真值(Ground Truth)的前景像素值,則precision
和recall
的計算以下:code
\[ precision = \frac{Result\cap{GT}}{Result} \]
\[ recall= \frac{Result\cap{GT}}{GT} \]
\[ F_{\beta} = \frac{(1+(\beta)^{2})\times{precision\times{recall}}}{(\beta)^{2}precision+recall}\]排序
作過顯著性的應該都知道,顯著性圖是一個從0~255
的灰度圖,並無指定哪些是前景,哪些是背景,那麼是如何評價的呢?ci
對於顯著性圖譜的評測,有種方法叫作固定閾值法,即便閾值從0~255
變化,獲得每個閾值對應的precision
和recall
,遂有了曲線圖,其中最高點即爲該算法的最佳閾值點。源碼
以下,便是對比圖:io
附上我本身寫的比較低效率的評測代碼:table
代碼1,計算實驗所需的數據,並保存:
clc; clear all; srcDir = './Saliency/'; gtFiles = dir([srcDir '*.bmp']); numFile = length(gtFiles); maxPixel = 255; step = 1; preMatrix = zeros([1 maxPixel/step+1]); recMatrix = zeros([1 maxPixel/step+1]); extNames = {'SR', 'FT', 'LC', 'HC', 'RC', 'DSR', 'GBMR', 'GC', 'HSD'}; preMatrixes = zeros([9 maxPixel/step+1]); recMatrixes = zeros([9 maxPixel/step+1]); for k=1:9 fprintf('class: %d ...\n',k); for i=0:maxPixel/step precision = 0; recall = 0; fprintf('%d \t',i); for j=1:numFile [path name ext] = fileparts(gtFiles(j).name); salFilePath = [srcDir name '_' char(extNames(k)) '.png']; gtLogical = logical(rgb2gray(imread([srcDir gtFiles(j).name]))); salFile = imread(salFilePath); salFile(find(salFile >= i*step))=255; salFile(find(salFile < i*step))=0; salLogical = logical(salFile); gtNum = length(find(gtLogical==1)); salNum = length(find(salLogical==1)); interNum = length(find((gtLogical & salLogical)==1)); curPre = interNum/salNum; curRec = interNum/gtNum; precision = precision + curPre; recall = recall + curRec; end precision = precision/numFile; recall = recall/numFile; preMatrix(1,i+1) = precision; recMatrix(1,i+1) = recall; end fprintf('\n'); preMatrixes(k,:) = preMatrix; recMatrixes(k,:) = recMatrix; end save savePreName 'preMatrixes'; save saveRecName 'recMatrixes'
代碼2,利用實驗數據繪製對比數據圖:
clc; clear all; load savePreName.mat; load saveRecName.mat; extNames = {'SR', 'FT', 'LC', 'HC', 'RC', 'DSR', 'GBMR', 'GC', 'HSD'}; lineColors = zeros([9 3]); lineColors(1,:) = [1 0 0]; lineColors(2,:) = [0 1 0]; lineColors(3,:) = [0 0 1]; lineColors(4,:) = [1 1 0]; lineColors(5,:) = [1 0 1]; lineColors(6,:) = [0 1 1]; lineColors(7,:) = [0.4 0.5 0]; lineColors(8,:) = [1 0 0.5]; lineColors(9,:) = [1 0.5 0.5]; figure(1); for k=1:9 recall = recMatrixes(k,:); precision = preMatrixes(k,:); plot(recall, precision, 'Color',lineColors(k,:), 'linewidth', 2); hold on; end hold off; xlabel('Recall'); ylabel('Precision'); legend('SR', 'FT', 'LC', 'HC', 'RC', 'DSR', 'GBMR', 'GC', 'HSD'); grid on; axis([0 1 0 1]); Fbeta = zeros([9 256]); for k=1:9 for i=0:255 rec = recMatrixes(k,i+1); pre = preMatrixes(k,i+1); Fbeta(k,i+1) = (1+0.3)*pre*rec/(0.3*pre+rec); end end figure(2); for k=1:9 plot(Fbeta(k,:),'Color',lineColors(k,:), 'linewidth', 2); hold on; end hold off; xlabel('Threshold'); ylabel('Fbeta'); legend('SR', 'FT', 'LC', 'HC', 'RC', 'DSR', 'GBMR', 'GC', 'HSD'); grid on; axis([0 255 0 1]);