Krueger
Wow, proiectul asta e chiar iesit din tipare. Mi se pare ceva nou si foarte original.
Multumesc, asta e reactia pe care o doream. :smile:
wickedman
Presupunand ca ar trebui sa explici unei comisii ce fel functioneaza acest algoritm de recunoastere faciala, cum ai explica?
Pai nu stiu in ce conditii se face evaluarea mea. Si am dubii ca voi fi luat in considerare.
Algoritmul functioneaza cam asa:
Fiecare patrat cu latura de cel putin 48 de pixeli din imagine se trece succesiv prin filtrele cascadei. Daca un singur filtru respinge imaginea (considera ca nu este fata) atunci imaginea e respinsa si de cascada, se returneaza 0 si nu se mai trece imaginea prin celelalte filtre. Acesta este aspectul care ii permite algorimului o viteza mare, intrucat fiecare filtru respinge 50-80% dintre imaginile care
ajung la el.
"Caracteristicile" folosite de algoritm sunt varianta discreta a undietelor Haar. O caracteristica este reprezentata printr-o zona dreptunghiulara.
------------------
| |
| + |
| |
|----------------|
| |
| - |
| |
------------------
Pentru a obtine valoarea caracteristicii, se aduna toti pixelii (valoarea intensitatii luminii intr-un punct, intrucat imaginea analizata este grayscale) din zona cu + si se scad cei din zona cu -. Cele doua dreptunghiuri lipite au arii egale. Alte caracteristici mai sunt:
+++---
+++---
+++---
++--
++--
--++
--++
---++++++---
---++++++---
---++++++---
-------
-------
+++++++
+++++++
+++++++
+++++++
-------
-------
si chiar
------
------
--++--
--++--
------
------
aici valoarea + se inmulteste cu 8 pentru a obtine o "diferenta ponderata".
Caracteristicile se deosebesc prin coordonate, lungime si latime (acestea sunt independente dar se pastreaza aspectul)
Un clasificator slab (CS) este reprezentat prin doi parametri: o valoare prag V(sa zicem) si o caracteristica c. Daca valoarea caracteristicii c intr-o imagine I este mai mare decat valoarea prag V, spunem ca imaginea are acea caracteristica.
Astfel:
class CS
{
int i;
int val;
public int eval(Imagine I)
{
daca (valoarea caracteristicii i corespunzatoare imaginii I > val)
returneaza 1 ; altfel returneaza 0;
}
}
Consideram cate un CS pentru fiecare combinatie caracteristica/prag folosita.
Un clasificator puternic (CP) este un ansamblu de CS-uri. Intr-un CP, fiecarui CS ii apartine o valoare, sau o pondere. Daca suma ponderilor caracteristicilor specifice imaginii este mai mare decat o valoare prag P, atunci CP-ul considera imaginea o fata. Astfel:
class CP
{
int nr; // numarul CS
float P; // prag
float[] ponderi; // vectorul de ponderi
CS[] cs; // vectorul de CS
public int eval(Imaginea I)
{
float sum=0;
for(i=0;i<nr;i++) if (CS[i].eval(I)) sum+=ponderi[i];
...
return 0;
}
}
// e o mica eroare in redarea codului, imi mananca un rand
sed "s/.../if (sum>P) return 1;"
CP-ul este "filtrul" mentionat mai sus.
Daca este nevoie, voi prezenta si algorimtul prin care a fost antrenata cascada. De fapt aceasta e partea grea..