Segmentation 평가 - Dice

boingboing·2024년 7월 1일
  • 순간 햇갈렸는데, white가 object고 black이 background임.
  • 너무너무 햇갈리긴 하는데, 1 pixel 하나 당 TF / FN가 하나씩 나옴.
  • 예측 결과 1 pixel과, ground truth 1 pixel의 일치 여부를 비교함.
  • tmp는 tmp2는
 - TN : 예측 픽셀 / 실제 픽셀 둘 다 배경. 
 - TP : 예측 픽셀 / 실제 픽셀 둘 다 object. 
 - FP : false positive.  
 - UNION : 교집합 면적. 1을 더하는게 이상하긴 한데 그냥 1x1 픽셀 하나 당이라 +1 된거임. 1은 1m^2
 
% close all;
% clear all;
% clc;
N = 328
st = 0;
Fsc=[];
MIU=[];
PA=[];
bestfsc=0;
bestmiu=0;
bestpa=0;
bestep = 0;

folder = '/media/jeyamariajose/7888230b-5c10-4229-90f2-c78bdae9c5de/Data/monuseg/resized/test/labelcol/';
listinfo = dir(strcat(folder,'*.png'));
lm = length(listinfo); # 테스트 이미지의 갯수. 

# listinfo : 0001.png, 0002.png ...


for k = 1:10
    k
    Fsc=[];
    MIU=[];
    PA=[];
    
for i = 1:lm
   %I = double(imread(strcat(folder,listinfo(i).name)));
   imgfile = strcat(folder,listinfo(i).name); # test폴더의 label(mask) 이미지
   imgname = listinfo(i).name(1:27)  ;
   i;
   %gname = strcat('./Brain_test/',num2str(i,'%04d'),'.png');
   
   lname = '/media/jeyamariajose/7888230b-5c10-4229-90f2-c78bdae9c5de/Data/Projects/axialseg/KiU-Net-pytorch/results/monuseg/medTr/';
   # 결과가 들어있는 폴더 명
   
   labelname = strcat(lname, num2str(k*10),'/', imgname);
   # 결과폴더명/10/이미지명  ( 결과폴더명/10/0001.png, 결과폴더명/10/0002.png ) 
   # 결과폴더명/20/이미지명  ( 결과폴더명/20/0001.png, 결과폴더명/20/0002.png ) 
   	
   
   %imgname
   I = double(imread(imgfile)); # test 폴더의 label(mask) 이미지
   tmp2=zeros(512,512); # tmp2를 0으로 초기화. 
   %I = rgb2gray(I);
   
   tmp2(I>127) = 255; 
   tmp2(I<126) = 0;  # tmp2는 그냥 테스트 폴더의 ground truth(label) mask 이미지를 0과 255로 binary화 한 것.
   tmp = double(imread(labelname)); # tmp는 학습 result 결과로 생성된 mask.
   
   tmp(tmp<127)=0;
   tmp(tmp>126)=255;
   %tmp2 = I;
   tp=0;fp=0;fn=0;tn=0;uni=0;ttp=0;lab=0;
   
   for p =1:512
       for q =1:512
           if tmp(p,q)==0   # 배경(black)
               if tmp2(p,q) == tmp(p,q) # 둘다 배경임. 
                   tn = tn+1;  # True Negative. 둘 다 배경 -> negative 
               else
                   fp = fp+1;   # 학습 result는 배경이고 실제 mask는 object.
                   uni = uni+1; # Union : 합집합. 한쪽만 object라도 그 픽셀은 union에 포함시킴. 
                   ttp = ttp+1; # 진양성과 거짓양성을 모두 합한 값. Pixel Accuracy(PA) 계산에 사용됨. 
               end
           elseif tmp(p,q)==255 # 목표 사물(흰색) 
               lab = lab +1; # ? 
               if tmp2(p,q) == tmp(p,q)  # 둘 다 목표사물
                   tp = tp+1;   #  true positive에 plus 
                   ttp = ttp+1; # 진양성과 거짓양성을 모두 합한 값. Pixel Accuracy(PA) 계산에 사용됨. 
               else
                   fn = fn+1; 
               end
               uni = uni+1;
           end
           
       end
   end
   
   if (tp~=0)
       F = (2*tp)/(2*tp+fp+fn); # F1 Score  
       MIU=[MIU,(tp*1.0/uni)];  # Mean IoU = True Positive / Union 
       PA=[PA,(tp*1.0/ttp)];   # Pixel Accuracy. , 전체 픽셀 중 얼마나 많은 픽셀이 정확하게 분류되었는지를 평가함
       Fsc=[Fsc;[i,F]];
   else
       MIU=[MIU,1];
       PA=[PA,1];
       Fsc=[Fsc;[i,1]];
   
   end
   

   
end

   if bestfsc <= mean(Fsc) & (mean(Fsc) ~= 1)
   bestfsc = mean(Fsc);
   bestmiu = mean(MIU,2);
   bestpa = mean(PA,2);
   bestep = 10*k;
   
   end
   mean(Fsc)
end

bestfsc
bestmiu
%bestpa
bestep

% plot(Fsc(:,1),Fsc(:,2),'-*')
% hold on
% plot(Fsc(:,1),Fsc1(:,2),'-s')
% hold off
% figure();plot(Fsc(:,1),PA,'-*');hold on
% plot(Fsc(:,1),PA1,'-s');hold off
% Fsc1=Fsc;
% MIU1=MIU;
% PA1=PA;

0개의 댓글