Neuronháló újratöltve

     Mint már a korábbi bejegyzésekben is említettem, egy nenuronháló lesz megtanítva, hogy különbséget tegyen arcok és nem arcok között. Ennek a neuronhálónak a tanításához a Matlabot használtam fel, de ugyanígy bármilyen programozási nyelvet fel lehet használni (hiszen a Levenberg Marquardt féle minimumkeresés szinte minden programozási nyelvben implementálva van).



     A Levenberg Marquardt algoritmus egy numerikus módszer többparaméteres függvény minimumkeresésére, illetve egy nagyon jó és gyors módszer a neuronháló tanítására, ahol a kimeneti és elvárt érték közötti hiba kiszámításaután behangolásra kerül a neuronháló súlyzója. Sokak szerint nem ez a legjobb megoldás neuronháló tanításra, ott van még vagy nyolc másik módszer, köztük a "Scaled Conjugate Gradient" vagy a "Fletcher-Powell Conjugate Gradient", viszont ezzel az LM módszerrel sokkal (a francokat sokkal... csak egy kicsivel) jobb eredményeket értem el, sokkal kevesebb tanítási ciklus alatt. S hogy mi megy a háttérben? Na azt nem tudom...

     Optimum 1.-ből tanultuk, hogy ha globális minimumot szeretnénk megkapni, akkor több helyről kell elindítani a minimumkereső algoritmusunkat, és kiválasztani a sok megoldásból a legkisebbet, vagy ha mindenik megoldás ugyanoda vezet, akkor valószínűsíthető, hogy az a megoldás a globális minimum. Én is ezt tettem. Beállítottam, hogy a bemeneti értékeket véletlenszerűen ossza szét tanító, tesztelő és megerősítő (validáló) adatokra és lefuttattam 10szer egymás után a tanítást. A tanítás eredményéből kimásoltam a bemeneti súlyzókat (ezek döntik el, hogy az egyes tulajdonságok milyen mértékben vesznek részt a kimeneti válasz alakításában, mert minél nagyobb egy súlyzó értéke abszolút értékben, annál több "szavazati joga" van a kimenet alakulásába). Ezeket a súlyzókat növekvő sorrendbe helyeztem (mint már mondtam, abszolút értékben) és a következő listát kaptam :

103, 24, 101, 99, 85, 89, 38, 47, 54, 39, 57
103, 24, 101, 99, 85, 84, 39, 89, 38, 83, 63
103, 24, 101, 99, 85, 89, 38, 54, 55, 39, 84
103, 24, 101, 85, 38, 89, 39, 99, 84, 57, 47
103, 24, 101, 99, 85, 39, 54, 57, 89, 38, 84
103, 24, 101, 85, 38, 99, 89, 39, 54, 84, 57
103, 24, 101, 99, 85, 89, 54, 38, 39, 57, 84
101, 103, 24, 38, 57, 89, 99, 90, 54, 85, 84
103, 24, 101, 99, 85, 38, 89, 84, 47, 39, 63
103, 24, 101, 99, 85, 38, 47, 89, 63, 57, 84

     Az eredmény magáért beszél. Ez  a lista azt jelenti, hogy azok, akik ott szerepelnek, nagy valószínűséggel van annyi beleszólásuk a kimenet alakulásába, hogy ők tizen el tudják dönteni, hogy mi legyen a kimenet.


 
 
Itt látható a tanítás eredménye egy átlagos tanitási ciklusra a tízből. 85.3%-os hatékonysággal ismeri fel az arcokat, illetve 99%-os hatékonysággal ismeri fel a nem arcokat. Ez mindenképp számomra nagyon jó eredmény, mert egy ilyen neuronnal már kategorizálni lehetne a képeknek nagy részét, minimális fals pozitív találattal. Ennek az eredménynek a tanítási ciklusa a következő ábrán látható:

      Itt a képre kattintva láthatjuk, hogy a tanítás kilenc ciklus alatt véget is ért. Az alatt a 10 teszt tanítás alatt átlagosan 7-12 tanítási ciklus alatt elértük a fent említett eredményt. Most, hogy megvan a 10 legnagyobb szavazattal rendelkező bemenet, megpróbálok valami jó eredményt kihozni csak azt a tizet felhasználva.

      Sajnos elsőre elég elszomorító eredményeket kaptam, ami a többségi szavazatokat illeti. Az arcoknak csak harminchat százaléka volt arcnak felismerve, illetve fals pozitív találat is volt, a nem arcok két százaléka, ami a végső összetételben az arcok tizenhat százalékát teszi ki... Lásd a képet lennebb...

     Ilyenkor az egyik megoldás az arcok többségbe helyezése. Ezzel befolyásolhatjuk a minimumpont elhelyezkedését. Másik megoldás a minimum kereső algoritmus többszöri lefuttatása... Először ezt próbálom ki, hátha valami jobb eredménnyel kecsegtet...

     Tíz perccel később: Semmi változás. Arcok több mint hatvan százalékát nem ismeri fel.

     Egy órával később: Előszedtem egy régebbi programomat, amivel lehetett képekre is tesztelni a súlyzóimat, meg az eltolásokat.

      Íme a program:

%Keppel tesztelo fuggvenyt hivjuk meg;
clear all
close all
clc

img=imread('gs.jpg');
kepint=cumsum(cumsum(double(img)),2);
hol=zeros(3,1);
szelesseg=650;
magassag =487;
feature=zeros(1,5);

for meret=200:4:240        
    for x_megy=1:meret/2:(magassag-meret-1)
        for y_megy=1:meret/2:(szelesseg-meret-1)
            int=kepint(x_megy:x_megy+meret,y_megy:y_megy+meret);
            [arc_e,bemenet] = elsoszint(int,meret);
            if(arc_e ==1)
                %disp('Elsoszint Megvolt.');
                [arc_e,bemenet]=masodikszint(int,meret,bemenet);
                if arc_e==1
                    %disp('Masodik Szint Megvolt.');                    
                    [arc_e,bemenet]=harmadikszint(int,meret,bemenet);
                    if arc_e==1
                        hol=[hol [meret;x_megy;y_megy]];
                    end
                else
                   % disp('<<<NEMARC>>>');
                end
                
            else
                %disp('NemARC');
            end
%             dispimg=img;
%             dispimg(x_megy:x_megy+meret,y_megy)=255;
%             dispimg(x_megy:x_megy+meret,y_megy+meret)=255;
%             dispimg(x_megy,y_megy:y_megy+meret)=255;
%             dispimg(x_megy+meret,y_megy:y_megy+meret)=255;
%             imshow(dispimg);
            %pause
        end
        clc
    end
end
hol=hol';
dispimg=img;
for i=2:length(hol)
    if(hol(i,1))>0 & (hol(i,2))>10 & (hol(i,3))>10
            dispimg(hol(i,2):hol(i,2)+hol(i,1),hol(i,3))=255;
            dispimg(hol(i,2):hol(i,2)+hol(i,1),hol(i,3)+hol(i,1))=255;
            dispimg(hol(i,2),hol(i,3):hol(i,3)+hol(i,1))=255;
            dispimg(hol(i,2)+hol(i,1),hol(i,3):hol(i,3)+hol(i,1))=255;
    end
end
imshow(dispimg);
% x_megy=round(mean(hol(2,:)));
% y_megy=round(mean(hol(3,:)));
% meret=hol(1,length(hol));
% 
%             dispimg=img;
%             dispimg(x_megy:x_megy+meret,y_megy)=255;
%             dispimg(x_megy:x_megy+meret,y_megy+meret)=255;
%             dispimg(x_megy,y_megy:y_megy+meret)=255;
%             dispimg(x_megy+meret,y_megy:y_megy+meret)=255;
%             imshow(dispimg);


      FIGYELEM : A következő képeken kitalált személyek láthatóak. Bármilyen egyezés valós személyekkel csak a huncut fantáziám nomeg a véletlen műve lehet. Ha mégis akadna bárki, aki a képek között magára ismer (és lessz olyan genya, hogy nem járul hozzá a tudomány fejlődéséhez és személyiségjogokkal való visszaélés miatti perrel fenyeget), az kérem jelezzen, hogy a képét cseréljem ki egy másik (szintén fiktív) személy képére.

     Pár tesztkép, amire lefuttattam, és viszonylag jó eredményeket kaptam :


      Aztán rájöttem, hogy a legegyszerűbb módja a többes találat kiküszöbölésének az, ha a találatokból átlagot számolok. Vagyis, ha van harminchat találatom egy bizonyos területen, akkor fogom az egészet, s összegyúrom egy globális X és egy globális Y koordinátába, s majd megmondom a póknak, hogy pont annak a közepére nézzen. Ezek a többes találatok vannak a második és negyedik képen kiküszöbölve.

     Persze azt meg kell említeni, hogy az arc méretét (vagyis egy bizonyos tartományt) mindíg kézzel kell bevinni, viszont valószínűleg egy komolyabb méréssorozat után majd a póknál tudok egy konkrét tartományt adni, amin belül érdemes az arcokat keresni... Itt is többnyire 200 és 350 pixel közötti méretben keres a program, viszont mindig kell egy kicsit hangolni, amiatt, hogy nem ugyanolyan távolságról voltak készítve...

     Egyre jobban tetszik ez a program... Már csak az a lényeg, hogy a MicroBlaze-be beleférjen...


     Na hülyeségből ennyi elég mára... Ha minden jól megy, holnap este felprogramozom a Microblaze-re is a harmadik szintet (ez most három szintes vizsgálatnak veti alá az egyes képrészleteket), s kipróbálom, mit tudok kihozni belőle... De addig... Addig relax van... Holnap megyek, megnézem a jamikat... S relax...

2 megjegyzés:

Gabor

Probalsz csajozni a kepemmel:p:))

Joco

Jaja... Sokan kérdezték, hogy van-e rólad még kép... De nem adtam senkinek :P

Megjegyzés küldése

Return top