顯著性圖譜的評價

近來也是作學位論文,其中有一張是對比了當前比較多的圖像顯著性方法,不少顯著性算法都或者給出源碼,或者給出可執行程序,或者是提供已分割的結果。算法

在有以上內容後,如何進行顯著性的結果進行評價呢?我看到不少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] 做者提供的可執行代碼

首先,先看看precisionrecall的計算方法:spa

假設 \(Result\) 表示實際分割結果的前景像素點集合,\(GT\) 表示該圖像真值(Ground Truth)的前景像素值,則precisionrecall的計算以下: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變化,獲得每個閾值對應的precisionrecall,遂有了曲線圖,其中最高點即爲該算法的最佳閾值點。源碼

以下,便是對比圖:io

precision-recall

fbeta

附上我本身寫的比較低效率的評測代碼: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]);
相關文章
相關標籤/搜索