显著性检测(saliency detection)评价指标之sAUC,shuffled AUC的Matlab代码实现

AUC_shuffled.m

function [score,tp,fp] = AUC_shuffled(saliencyMap, fixationMap, otherMap, Nsplits, stepSize, toPlot)
% saliencyMap is the saliency map
% fixationMap is the human fixation map (binary matrix)
% otherMap is a binary fixation map (like fixationMap) by taking the union of
% fixations from M other random images (Borji uses M=10)
% Nsplits is number of random splits
% stepSize is for sweeping through saliency map
% if toPlot=1, displays ROC curve

if nargin < 6, toPlot = 0; end
if nargin < 5, stepSize = .1; end
if nargin < 4, Nsplits = 100; end

score=nan;

% If there are no fixations to predict, return NaN
if ~any(fixationMap)
    disp('no fixationMap');
    return
end 

% make the saliencyMap the size of fixationMap
if size(saliencyMap, 1)~=size(fixationMap, 1) || size(saliencyMap, 2)~=size(fixationMap, 2)
    saliencyMap = imresize(saliencyMap, size(fixationMap));
end

% normalize saliency map
saliencyMap = (saliencyMap-min(saliencyMap(:)))/(max(saliencyMap(:))-min(saliencyMap(:)));

if sum(isnan(saliencyMap(:)))==length(saliencyMap(:))
    disp('NaN saliencyMap');
    return
end

S = saliencyMap(:);
F = fixationMap(:);
Oth = otherMap(:);

Sth = S(F>0); % sal map values at fixation locations
Nfixations = length(Sth);

% for each fixation, sample Nsplits values from the sal map at locations
% specified by otherMap

ind = find(Oth>0); % find fixation locations on other images

Nfixations_oth = min(Nfixations,length(ind));
randfix = nan(Nfixations_oth,Nsplits);

for i=1:Nsplits
    randind = ind(randperm(length(ind))); % randomize choice of fixation locations
    randfix(:,i) = S(randind(1:Nfixations_oth)); % sal map values at random fixation locations of other random images
end

% calculate AUC per random split (set of random locations)
auc = nan(1,Nsplits);
for s = 1:Nsplits
    
    curfix = randfix(:,s);
    
    allthreshes = fliplr([0:stepSize:double(max([Sth;curfix]))]);
    tp = zeros(length(allthreshes)+2,1);
    fp = zeros(length(allthreshes)+2,1);
    tp(1)=0; tp(end) = 1; 
    fp(1)=0; fp(end) = 1; 
    
    for i = 1:length(allthreshes)
        thresh = allthreshes(i);
        tp(i+1) = sum((Sth >= thresh))/Nfixations;
        fp(i+1) = sum((curfix >= thresh))/Nfixations_oth;
    end

    auc(s) = trapz(fp,tp);
end

score = mean(auc); % mean across random splits

if toPlot
    subplot(121); imshow(saliencyMap, []); title('SaliencyMap with fixations to be predicted');
    hold on;
    [y, x] = find(fixationMap);
    plot(x, y, '.r');
    subplot(122); plot(fp, tp, '.b-');   title(['Area under ROC curve: ', num2str(score)])
end

  main.m

clear;
clc;
smap_path='E:\Dataset180303\final_data\smap_Result1\';
gmap_path='E:\Dataset180303\final_data\image_resize_gt\';

smap_file=dir(smap_path);

for j=3:length(smap_file)
    disp(j-2);
    gmap_name=strcat(gmap_path,num2str(j-2), '.jpg');
%     gmap_name=strcat(gmap_path,smap_file(j).name);
    smap_name=strcat(smap_path,num2str(j-2 + 0 ), '.jpg');
%     smap_name=strcat(smap_path,num2str(j-2+ 0 ), '_SaliencyMap', '.jpg');
    gmap=imresize(imread(gmap_name), [224, 224], 'bicubic');
    smap=imresize(imread(smap_name), [224, 224], 'bicubic');
    sal_map=mat2gray(smap);
    if gmap==0
        continue;
    end
    
    if size(gmap,3)==3
        gt_final_map=rgb2gray(gmap);
    else
        gt_final_map = gmap;
    end
    sal_map=imresize(sal_map,0.5);
    gt_final_map=imresize(gt_final_map,0.5);
    
    threshold_value = graythresh(gt_final_map);
    gt_final_map_bin = im2bw(gt_final_map, threshold_value);
    
%     c=calcAUCscore(sal_map,gt_final_map);
% [score,tp,fp] = AUC_shuffled(saliencyMap, fixationMap, otherMap, Nsplits, stepSize, toPlot)
    [c,tp,fp]=AUC_shuffled(sal_map,gt_final_map_bin,gt_final_map);
    idx=find(isnan(c));
    c(idx)=0.5;
    c = abs(c);
    a(j-2,1)=mean(c);
end
% b(i-2,1)=mean(a);
% clear a;
% end
sAUC = mean(a);