%% Skript pro vyhodnocení úspěšnosti klasifikátoru a pro vizualizaci výsledku
% Data, která byla získána na výstupu při testování naučené neuronové sítě
% jsou porovnávana s ground truth labely a jsou počítány vyhodnocovací 
% metriky klasifikace.
% Výsledek klasifikace (z neuronové sítě) je dále vizulizován
% (černá barva = pozadí, červená barva = tepny, modrá barva = žíly).

% Stejný postup, jako je zmíněn výše se opakuje i po vynásobení výsledku
% klasifikace s příslušnou segmentační maskou, je tedy eliminována chyba,
% kdy byly špatně klasifikovány pixely pozadí.

clc; clear

%% Načtení dat
lbls_test_location = 'C:\Users\jana-\Documents\FEKT\DP\unet_final\unet_test\labels';            % cesta ke ground truth datům (labely označené experty)
lbls_final_location = 'C:\Users\jana-\Documents\FEKT\DP\unettrain5\labels_final';     % cesta k výsledným souborům klasifikace
seg_location = 'C:\Users\jana-\Documents\FEKT\DP\seg_mask';                % cesta k segmentačním maskám
addpath(lbls_test_location);
addpath(lbls_final_location);
addpath(seg_location);

lbls_test = imageDatastore(lbls_test_location);
lbls_final = imageDatastore(lbls_final_location);
seg = imageDatastore(seg_location);
pocet = length(lbls_test.Files);   
lblfiles_test = lbls_test.Files;
lblfiles_final = lbls_final.Files;
segfiles = seg.Files;

%% Statistika + vizualizace výsledku klasifikace
acc = double([]);               % vektor, do kterého jsou ukládány hodnoty přesnosti klasifikátoru
acc_mask = double([]);          % vektor, do kterého jsou ukládány hodnoty přenosti klasifikátoru - po vynásobení se segmentační maskou

error_rate = double([]);        % vektor, do kterého jsou ukládány hodnoty chybovosti klasifikátoru
error_rate_mask = double([]);   % vektor, do kterého jsou ukládány hodnoty chybovosti klasifikátoru - po vynásobení se segmentační maskou

for i = 1:pocet
   currentfilename_test = lblfiles_test(i);
   currentfilename_final = lblfiles_final(i);
   currentfilename_seg = segfiles(i);
   currentlbl_test = imread(currentfilename_test{1, 1});
   currentlbl_final = imread(currentfilename_final{1, 1});
   currentseg = imread(currentfilename_seg{1, 1});
   
   %% Výpočet statistických metrik
   % výpočet správně a špatně klasifikovaných pixelů
   spravne = 0;
   nespravne = 0;
   for m = 1:size(currentlbl_final, 1)
       for n = 1:size(currentlbl_final, 2)
           if (currentlbl_final(m, n) == currentlbl_test(m, n)) == 1
               spravne = spravne + 1;
           else
               nespravne = nespravne + 1;
           end
       end
   end
   acc_pom = spravne / (size(currentlbl_final, 1) * size(currentlbl_final, 2)) * 100; % procento přesnosti klasifikace
   acc = [acc; acc_pom];

   error_rate_pom = nespravne / (size(currentlbl_final, 1) * size(currentlbl_final, 2)) * 100;  % procento chybovosti klasifikace
   error_rate = [error_rate; error_rate_pom];
   
   % vytvoření matice záměn
   C = confusionmat(reshape(currentlbl_test, [], 1), reshape(currentlbl_final, [], 1), 'Order', [1, 2, 3]);
   CCH = confusionchart(C);
   save(['matice_zamen' num2str(i) '.mat'], 'C')  % uložení matice záměn
   
   %% Vizualizace výsledku klasifikace
   vysledek_klas_R = size(currentlbl_final);
   vysledek_klas_G = size(currentlbl_final);
   vysledek_klas_B = size(currentlbl_final);
   for s = 1:size(currentlbl_final, 1)
       for t = 1:size(currentlbl_final, 2)
           if currentlbl_final(s, t) == 1      % pixely pozadí -> černá
               vysledek_klas_R(s, t) = 0;
               vysledek_klas_G(s, t) = 0;
               vysledek_klas_B(s, t) = 0;
           elseif currentlbl_final(s, t) == 2  % pixely tepen -> červená
               vysledek_klas_R(s, t) = 255;
               vysledek_klas_G(s, t) = 0;
               vysledek_klas_B(s, t) = 0;
           elseif currentlbl_final(s, t) == 3  % pixely žil -> modrá
               vysledek_klas_R(s, t) = 0;
               vysledek_klas_G(s, t) = 0;
               vysledek_klas_B(s, t) = 255;
           end
       end
   end      
   
   vysledek_klas = cat(3, vysledek_klas_R, vysledek_klas_G, vysledek_klas_B); % vytvoření RGB obrazu
   save(['vysledek_klas' num2str(i) '.mat'], 'vysledek_klas')                 % uložení obrazu
   
   %% Výsledek klasifikace vynásoben se segmentační maskou
   currentseg = imbinarize(currentseg);                                       % binarizace masky
   currentlbl_final_mask = immultiply(currentlbl_final, currentseg);          % násobení obrazu a masky
   currentlbl_final_mask(currentlbl_final_mask == 0) = 1;                     % hodnoty pixelů pozadí nastaveny na 1
   
   %% Výpočet statistických metrik - se segmentační maskou
   % výpočet správně a špatně klasifikovaných pixelů
   spravne_mask = 0;
   nespravne_mask = 0;
   for m = 1:size(currentlbl_final_mask, 1)
       for n = 1:size(currentlbl_final_mask, 2)
           if (currentlbl_final_mask(m, n) == currentlbl_test(m, n)) == 1
               spravne_mask = spravne_mask + 1;
           else
               nespravne_mask = nespravne_mask + 1;
           end
       end
   end
   acc_mask_pom = spravne_mask / (size(currentlbl_final_mask, 1) * size(currentlbl_final_mask, 2)) * 100;           % procento přesnosti klasifikace
   acc_mask = [acc_mask; acc_mask_pom];

   error_rate_mask_pom = nespravne_mask / (size(currentlbl_final_mask, 1) * size(currentlbl_final_mask, 2)) * 100;  % procento chybovosti klasifikace
   error_rate_mask = [error_rate_mask; error_rate_mask_pom];
   
   % vytvoření matice záměn
   C_mask = confusionmat(reshape(currentlbl_test, [], 1), reshape(currentlbl_final_mask, [], 1), 'Order', [1, 2, 3]);
   CCH_mask = confusionchart(C_mask);
   save(['matice_zamen_mask' num2str(i) '.mat'], 'C_mask')  % uložení matice záměn
   
   %% Vizualizace výsledku klasifikace - se segmentační maskou
   vysledek_klas_R_mask = size(currentlbl_final_mask);
   vysledek_klas_G_mask = size(currentlbl_final_mask);
   vysledek_klas_B_mask = size(currentlbl_final_mask);
   for s = 1:size(currentlbl_final_mask, 1)
       for t = 1:size(currentlbl_final_mask, 2)
           if currentlbl_final_mask(s, t) == 1       % pixely pozadí -> černá
               vysledek_klas_R_mask(s, t) = 0;
               vysledek_klas_G_mask(s, t) = 0;
               vysledek_klas_B_mask(s, t) = 0;
           elseif currentlbl_final_mask(s, t) == 2   % pixely tepen -> červená
               vysledek_klas_R_mask(s, t) = 255;
               vysledek_klas_G_mask(s, t) = 0;
               vysledek_klas_B_mask(s, t) = 0;
           elseif currentlbl_final_mask(s, t) == 3   % pixely žil -> modrá
               vysledek_klas_R_mask(s, t) = 0;
               vysledek_klas_G_mask(s, t) = 0;
               vysledek_klas_B_mask(s, t) = 255;
           end
       end
   end      
   
   vysledek_klas_mask = cat(3, vysledek_klas_R_mask, vysledek_klas_G_mask, vysledek_klas_B_mask); % vytvoření RGB obrazu
   save(['vysledek_klas_mask' num2str(i) '.mat'], 'vysledek_klas_mask')                           % uložení obrazu
   
end