%ukážka funkcie detektoru pre anatomickú štruktúru meatus acusticus
%externus (MAE) konkrétne ide o pravú stranu
clc
clear all
close all

load('MAE_databaza_augment.mat'); %nacítanie tréningovej databázy

l=length(vysledok_negativne); %pocet snímok v databázy negatívne detekcie
w=size(vysledok_pozitivne{1},1); %velkost anat. štruktúry
h=size(vysledok_pozitivne{1},2);
s=12; %krok
            
net = vgg16(); %definicia pouzitia siete VGG

for i=1:l
       z=vysledok_negativne{i}; 
       z = uint8(255 .* ((double(z)-min(z(:)))) ./ (max(z(:)-min(z(:)))));% normalizacia

       z=imresize(z,[224 224]);
       vysledok_negativny = cat(3, z, z, z);
       data{i,1}=vysledok_negativny;
end
dataNegativne = cat(4,data{:});
l=length(vysledok_pozitivne); %počet snímok v databázy negatívne detekcie
clear data
for i=1:l
       z=vysledok_pozitivne{i}; 
       z = uint8(255 .* ((double(z)-min(z(:)))) ./ (max(z(:)-min(z(:)))));% normalizacia
       z=imresize(z,[224 224]);
       vysledok_pozitivny = cat(3, z, z, z);
       data{i,1}=vysledok_pozitivny;
end
dataPozitivne = cat(4,data{:});

featureLayer = 'pool5'; %vrstva zo ktorej sa beru priznaky net.Layers
negativne_features = activations(net, dataNegativne, featureLayer, ...
    'MiniBatchSize', 32, 'OutputAs', 'columns'); %vytahnutie priznakov z dataNegativne

pozitivne_features = activations(net, dataPozitivne, featureLayer, ...
    'MiniBatchSize', 32, 'OutputAs', 'columns');%vytahnutie priznakov z dataPozitivne

negativne_features = transpose(negativne_features);
pozitivne_features = transpose(pozitivne_features);

neg=size(negativne_features,1);
poz=size(pozitivne_features,1);

negativne_titles = strings(neg,1);
for i=1:neg
    negativne_titles(i)='negativne';
end

pozitivne_titles = strings(poz,1);
for i=1:poz
    pozitivne_titles(i)='pozitivne';
end

priznaky_titles=[negativne_titles;pozitivne_titles];
priznaky=[negativne_features;pozitivne_features]; %spojenie príznakov
%do jedného súboru


classifier=fitcecoc(priznaky,priznaky_titles);
%save('svm.mat','classifier') %uloženie klasifikátoru


bunka=vysledok_pozitivne{15};
z=bunka; 
z=imresize(z,[224 224]);
z = uint8(255 .* ((double(z)-min(z(:)))) ./ (max(z(:)-min(z(:)))));% normalizacia
vysledok_pozitivny = cat(3, z, z, z);

vysledok_pozitivny = activations(net, vysledok_pozitivny, featureLayer, ...
    'MiniBatchSize', 32, 'OutputAs', 'columns');

vysledok_pozitivny=transpose(vysledok_pozitivny);
[label,score] = predict(classifier,vysledok_pozitivny);
imshow(bunka,[min(bunka(:)) max(bunka(:))])
title(strcat('Výsledok predikcie: ',string(label)));

pacienti = {'data_46.mat' 'data_47.mat'};
vysledky = {};

for pac=1:size(pacienti,2)
    pacient = load(pacienti{pac});
    pacient = struct2cell(pacient)
    pacient = pacient{1};
    pocetRezov = size(pacient,3);
    vsetkyH = [];
    maxH = 0;
    maxAR = 0;

    jeden_rez=pacient(:,:,pocetRezov); 
    bunka = uint8(255 .* ((double(jeden_rez)-min(jeden_rez(:)))) ./ (max(jeden_rez(:)-min(jeden_rez(:)))));% normalizacia
    blackMax=length(bunka(bunka<30))/(512*512);

    jeden_rez=pacient(:,:,1); 
    bunka = uint8(255 .* ((double(jeden_rez)-min(jeden_rez(:)))) ./ (max(jeden_rez(:)-min(jeden_rez(:)))));% normalizacia
    blackMin=length(bunka(bunka<30))/(512*512);

    treshold = blackMax-((blackMax-blackMin)*0.9);
    
    
    
    for AR=1:1:pocetRezov
        tic
        jeden_rez=pacient(:,:,AR); 
        bunka = uint8(255 .* ((double(jeden_rez)-min(jeden_rez(:)))) ./ (max(jeden_rez(:)-min(jeden_rez(:)))));% normalizacia
        black=length(bunka(bunka<30))/(512*512);
        if black < treshold
            bunka=jeden_rez;
            %imshow(bunka,[min(bunka(:)) max(bunka(:))]);
            [r,c]=size(bunka); %veľkost rezu
            Hf=zeros(r,c);
            r=floor((r-h)/s)+1; %koľko krokov sa zmestí na výšku
            c=floor((c-w)/s)+1; %koľko krokov sa zmestí na šírku
            r=r*s;
            c=c*s;
            %počiatočná inicializácia súradnic
            r1=1; 
            c1=1;
            for n=1:s:c
                for m=1:s:r
                    img=bunka(n:n+(w-1),m:m+(h-1)); %výrez okna        
                    z=img;        
                    z = imresize(z,[224 224]);
                    z = uint8(255 .* ((double(z)-min(z(:)))) ./ (max(z(:)-min(z(:)))));% normalizacia
                    z = cat(3, z, z, z);      
                    z = activations(net, z, featureLayer, ...
                        'MiniBatchSize', 32, 'OutputAs', 'columns');
                    z = transpose(z);
                    [pred,scores]=predict(classifier,z);       
                    Hf(n,m)= -scores(1);        
                end    
            end  
            if maxH < max(Hf(:))
                [suradnicaRow,suradnicaCol]=find(max(Hf(:))==Hf);
                maxAR = AR;
                maxH = max(Hf(:))
            end
            max(Hf(:))
            [rowShow,co1Show]=find(max(Hf(:))==Hf);
            jeden_rez=pacient(:,:,maxAR); 
            bunka = uint8(255 .* ((double(jeden_rez)-min(jeden_rez(:)))) ./ (max(jeden_rez(:)-min(jeden_rez(:)))));% normalizacia
   
         bunka = insertShape(bunka,'Rectangle',[co1Show rowShow (h-1) (w-1)],'LineWidth',3);
      
    imshow(bunka);
        end
        AR
        toc
    end
    
vysledky{pac} = [suradnicaRow suradnicaCol maxAR];
clear Hf H
end

for pac=1:size(pacienti,2)
    vysledok=vysledky{pac}   
   
    pacient = load(pacienti{pac});
    pacient = struct2cell(pacient)
    pacient = pacient{1};
   
    jeden_rez=pacient(:,:,vysledok(3)); 
    bunka = uint8(255 .* ((double(jeden_rez)-min(jeden_rez(:)))) ./ (max(jeden_rez(:)-min(jeden_rez(:)))));% normalizacia
    bunka = insertShape(bunka,'Rectangle',[vysledok(2) vysledok(1) (h-1) (w-1)],'LineWidth',3);        
    figure(pac)
    imshow(bunka);
    title(strcat('Pacient: ',string(pac)));
    %w = waitforbuttonpress;
end
%imwrite(bunka,'detektor_zvukovod.jpg','jpg','Comment','My JPEG file')
