2007 12 Detekcja i rozpoznanie twarzy w C [Programowanie C C ]


Biometryka
w C++
Detekcja i rozpoznanie twarzy w C++
Damian Ostraszewski
dobie coraz bardziej brutalnego świata i
idących za tym zagrożeń dla zwykłego Definicja Biometryki
Wobywatela (chuligani, złodzieje, pseudo
Biometryka nie jest terminem nowym, wywodzi się z języ-
kibice, terroryści) nikogo nie powinien dziwić fakt
ka greckiego i oznacza: bio  życie i metrein  mierzyć.
poszukiwania coraz to nowocześniejszych rozwią-
W odniesieniu do opisywanej gałęzi nauki jest to  technika
zań w systemach zabezpieczeń.
dokonywania pomiarów istot żywych . Natomiast systemy
Jedną z dziedzin nauki, która wychodzi naprze-
biometryczne zajmują się analizą, rozpoznawaniem i zapa-
ciw najnowszym rozwiązaniom technicznym, mają-
miętywaniem fizycznych i behawioralnych cech ludzkich
cym na celu szeroko rozumiane bezpieczeństwo,
takich jak: odcisk palca, tęczówka oka, miara dłoni, model
jest biometryka. Są dwa rodzaje systemów biome- głosu i twarzy w celu rozpoznania konkretnej osoby. Istnie-
trycznych: fizyczne i behawioralne. Behawioralne są ją dwie podstawowe drogi rozpoznawania tych cech: iden-
używane głównie w weryfikacji, podczas gdy fizycz- tyfikacja i weryfikacja.
Identyfikacja  odnosi się do tego kim jest dana oso-
ne w identyfikacji lub weryfikacji.
ba. Pozwala na uzyskanie pełnej identyfikacji osoby pod-
Z uwagi na fakt, że biometryka jest dziedziną
dawanej rozpoznaniu poprzez wyszukanie, np. w bazie
bardzo rozległą i nie sposób byłoby omówić wszyst-
danych, czyli posłużenie się wzorcem  jeden obraz iden-
kie systemy, w niniejszym artykule skupiono uwagę
tyfikowany  wiele wzorców .
tylko jednym z nich, a mianowicie metodzie identyfi-
Weryfikacja  odnosi się do tego czy dana osoba
kacji osób na podstawie geometrii twarzy.
jest tą, za którą się podaje. Działa na zasadzie porówny-
Do zalet tej metody możemy niewątpliwie zaliczyć
wania  jeden wzorzec  jeden obraz identyfikowany .
niską inwazyjność podczas weryfikacji, np. pobra-
nie zdjęcia z kamery podczas przechodzenia przez
bramkę na lotnisku, metrze, stadionie lub innym miej- nież czuły na zakłamania, czyli nie powinien brać
scu. Jest to metoda w miarę tania i nie wymaga wy- pod uwagę twarzy znajdujących się na billbordach,
specjalizowanego sprzętu. Wystarczy kamera o od- koszulkach oraz twarzy manekinów i posągów. Jed-
powiednio wysokiej rozdzielczości, jednostka obli- nym słowem, warunków do poprawnej weryfikacji
czeniowa i oprogramowanie gwarantujące niski po- osoby jest dużo, dlatego trzeba dobrze przemyśleć
ziom błędu. Aatwo ją zaadaptować wszędzie tam gdzie i jak go zastosować.
gdzie nie mamy bezpośredniego kontaktu z osobą
identyfikowaną lub zbyt duży przepływ ludzi unie- Pozyskanie obrazu z urządzenia
możliwia wykonanie jednostkowej weryfikacji. Kon- wejściowego (np. kamera, aparat)
takt bezpośredni z osobą identyfikowaną nie jest ko- Pierwszym krokiem w rozpoznaniu twarzy jest pozy-
nieczny. Metoda ta cieszy się dużym przyzwoleniem skanie obrazu z kamery lub pliku video. Najprost-
społecznym. Potwierdza to fakt, że nikt z nas już nie szym sposobem pozyskania obrazu z kamery jest
zwraca uwagi na kamery zamontowane w hipermar- wykorzystanie gotowej biblioteki Intela OpenCV
ketach czy nawet w małych sklepikach osiedlowych. Open Source Computer Vision Library. Tego rodza-
Detekcja osób  na żywo niesie za sobą poważ- ju biblioteka posiada kolekcję różnych funkcji napi-
ne utrudnienia w poprawnym rozpoznaniu cech twa- sanych w C i C++, które ułatwiają przechwytywanie
rzy, które miałyby być poddane weryfikacji. Sys- i obróbkę obrazu. Na Listingu 1 jest przykład wyko-
tem identyfikujący musi rozpoznawać twarz z obra- rzystania biblioteki OpenCv celem przechwycenia
zu. Jest to o tyle trudne, że mogą pojawić się różni- obrazu z kamery. W C# do przechwycenia obrazu z
ce w wyglądzie danej twarzy jeżeli poszczególne jej kamery może zostać wykorzystana biblioteka Open-
obrazy będą wykonane w różnych warunkach. Za- CVDotNet lub SharperCV. Obie bazują na zródłach
sadniczy wpływ ma tu intensywność i rodzaj oświe- OpenCV Intela.
tlenia, kąt patrzenia i odległość kamery, kąt nachy-
lenia twarzy, starzenie się osoby rozpoznawanej, mi- Obróbka wstępna
mika oraz dodatki takie jak okulary, wąsy, broda, pozyskanego obrazu
nakrycia głowy itp. Taki system powinien być rów- Proces wstępnej normalizacji obrazu ma za zada-
nie usunięcie szumów, tła otaczającego twarz, wy-
ostrzenie oczekiwanej cechy, zredukowanie niepo-
Autor jest projektantem  programistą w firmie  Sztuczna
żądanej barwy, usunięcie zbędnych elementów w
Inteligencja Sp. z o.o. .
obrazie (tj. okulary, wąsy, broda, makijaż) oraz pod-
Kontakt z autorem: ostraszewski@o2.pl
danie obrazu procedurze skalowania i rotacji wzglę-
28
www.sdjournal.org
Software Developer s Journal 12/2007
Detekcja i rozpoznanie twarzy w C++
(x2,y2)
(x1,y1)
Listing 1. Przechwycenie obrazu z kamery
#include "cv.h"
#include "highgui.h"
1
#include
// przykład prostej struktury która umożliwi uzyskanie
obrazu z kamery
int main() {
CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY );
if( !capture ) {fprintf( stderr, "ERROR: capture is
NULL \n" );
getchar();
2
return -1;
}
// stwórz okno gdzie przechwycony obraz będzie
(x3,y3)
przedstawiony
Rysunek 1. Parametryzacja cechy Haar-like feature cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE );
dem oczu i ust. Filtry powinny być ściśle dostosowane do al- // pokaż przechwycony obraz z kamery w oknie i powtórz
gorytmu wykrywania twarzy, jak i jej charakterystycznych while( 1 ) {
cech. Z reguły filtry takie dobierane są doświadczalnie, tak,
aby główny algorytm dał jak najlepszy efekt. // pobierz klatkę
Jednym z takich filtrów jest filtr medianowy, którego za- IplImage* frame = cvQueryFrame( capture );
daniem jest usunięcie szumów impulsowych w obrazie, czy- if( !frame ) { fprintf( stderr, "ERROR: frame is
li zakłóceń pojedynczych próbek sygnału (np. pikseli obra- null...\n" );
zu). Wartość zaszumionych próbek może znacznie różnić się getchar();
od swego sąsiedztwa. Działanie filtru medianowego polega break;
na zastąpieniu każdego piksela obrazu punktem, który jest }
średnią jego otoczenia. Kryterium wyboru mediany jest po- cvShowImage( "mywindow", frame );
ziom jasności jego otoczenia. Przykład na Listingu 2.
Innym filtrem stosowanym w celu wzmocnienia szczegó- // usuń wyższe bity za pomocą operatowa AND
łów w obrazie jest filtr górnoprzepustowy. Za jego pomocą if( (cvWaitKey(10) & 255) == 27 ) break;
można również nieco wyeksponować krawędzie oraz doko- }
nać zmiany jasności. Filtr ten jednak powoduje wzmocnienie cvReleaseCapture( &capture );
szumu. Maski dla filtra górnoprzepustowego są w Tabeli 1. cvDestroyWindow( "mywindow" );
Do wygładzenia obrazu wyjściowego stosujemy filtr dol- return 0;
noprzepustowy. Powoduje on lekkie rozmycie obrazu. Filtr }
dolnoprzepustowy możemy również zastosować do wyostrza-
nia obrazu poprzez odjęcie rozmycia od oryginału. Maski dla
filtra dolnoprzepustowego są w Tabeli 2. we stosujemy zazwyczaj parami. Listing 4 przedstawia imple-
Listing 3 odpowiada filtrom dolno i górnoprzepustowym mentację a Tabela 4 przykładowe maski. Maski są stosowa-
oraz wykrywającym linie. Filtr krawędziowy stosowany jest ne jak we wszystkich filtrach krawędziowych parami.
do wykrywania samych krawędzi w obrazie. Otrzymujemy
wtedy czarny obraz o jasnych krawędziach. Filtry krawędzio- Detekcja twarzy w obrazie
Jedną z metod rozpoznawania obiektów w obrazie jest kla-
syfikator Haar  like features. Metoda ta została przedstawio-
na przez Paula Viol a, a jej zadaniem jest rozpoznanie obiek-
tu w obrazie. Haar-like feature jest linearną kombinacją sum
intensywności pikseli, kilku prostokątnych regionów, które
Rysunek 2. Przykład wykrycia twarzy na wprost Rysunek 3. Próba wykrycia twarzy z różną mimiką i pochyleniem
Software Developer s Journal 12/2007 www.sdjournal.org
29
Biometryka
w C++
Listing 2. Filtr Mediana Listing 4 Filtry krawędziowe
X,Y  współrzędne piksela w obrazie int nPixel1;
N.M  wysokość, szerokość obrazu int nPixel2;
Mj,mi  wymiary macierzy filtru
macierz  macierz oryginalnego obrazu for ( Y = 1; Y < N-1; Y++ )
wyjście  macierz wynikowa przetworzonego obrazu {
int wartosc; for ( X = 1; X < M-1; X++ )
for ( Y = 1; Y < N-1; Y++ ) {
{ // macierz 3x3.
for ( X = 1; X < M-1; X++ ) for ( j = -1; j < mj-1; j++ )
{ {
// macierz 3x3 daje najlepsze wyniki pod względem for ( i = -1; i < mi-1; i++ )
wydajności i szybkości obliczeń {
mediany. nPixel1 += filtr_poziomy[j+1][i+1] *
for ( j = -1; j < mj-1; j++ ) macierz[Y+j][X+i];
{ nPixel2 += filtr_pionowy[j+1][i+1] *
for ( i = -1; i < mi-1; i++ ) macierz[Y+j][X+i];
{ }
// Utworzenie filtra 3x3 dla poszczególnego piksela w }
obrazie If (nPixel < 0) nPixel = 0;
filtr[j+1][i+1] = macierz[Y+j][X+i]; If (nPixel >255) nPixel = 255;
} // sqrt  pierwiastek kwadratowy, pow  do kwadratu
} wyjscie[X][Y] = Sqrt(Pow(nPixel1,2)+Pow(nPixel2,2));
// podmiana wartości piksela nową wartością z filtru; }
sortuj( filtr ); }
wartosc = srodek ( filtr );
wyjscie[X][Y] = wartosc;
} reprezentowana przez trzy wektory (x1, y1), (x2, y2), (x3,
} y3) i parametry ą1, ą2. Tutaj parametry ą1, ą2 reprezentują
względną lokację w mniejszym prostokącie z większego.
Używając tych 8 parametrów Ćx = (Ćx1, w 1, Ćx2, w 2, Ćx3,
są przybliżane przy użyciu dwóch różnych prostokątnych re- w 3, ą1, ą2), jakiegoś opisu cechy obiektów można by sfor-
gionów. Aproksymacja Haar-like feature jest pokazana na Ry- mułować warunkowe prawdopodobieństwo gdzie ^x jest
sunku 1, gdzie prostokąty są odznaczone wypełnieniem uko- wektorem parametrów określającym miejsce i model Haar-
śnym i prostopadłym. Przybliżana jest różnica pomiędzy pro- like feature. Pierwszym krokiem w tej metodzie jest przygo-
stokątnymi regionami. Aproksymacja Haar-like feature jest towanie odpowiedniej bazy obrazów z obiektem, który bę-
dziemy chcieli wykryć (np. twarzy z przodu, samochodu, sa-
mych oczu itd.) oraz tzw. obrazków fałszywych, które nie za-
Listing 3. Filtr górno lub dolnoprzepustowy
wierają interesującego nas obiektu. Aby można było przy-
//Dla macierzy 3x3 stąpić do uczenia klasyfikatora Haar-a, należy poddać trans-
int waga; formacji wcześniej przygotowane obrazki. Taką transfor-
int nPixel; mację można wykonać ręcznie (tworząc własne rozwiąza-
for ( Y = 1; Y < N-1; Y++ ) nie) krok po kroku: przeskalowanie obrazków do rozmiaru
{ np. 20x20, rotację, zastosowanie filtrów usuwających szumy
for ( X = 1; X < M-1; X++ ) (przykłady zostały przedstawione wcześniej), zmiana koloru
{ (konkretnie koloru na odcienie szarości), zmiana koloru tła
// macierz 3x3 tak, aby nasz obiekt się na nim wyróżniał. Do sporządzenia
for ( j = -1; j < mj-1; j++ ) zbioru uczącego można wykorzystać narzędzia dostarczone
{
for ( i = -1; i < mi-1; i++ )
{
nPixel += filtr[j+1][i+1] * macierz[Y+j][X+i];
}
}
If (waga== 0) {waga = 1};
wyjscie[X][Y] = nPixel /waga;
}
}
Rysunek 4. Detekcji twarzy dla siedmiu typowanych próbek za
pomocą metody Eigenface
30
www.sdjournal.org
Software Developer s Journal 12/2007
Detekcja i rozpoznanie twarzy w C++
Tabela 2. Maski dla filtra dolnoprzepustowego
Listing 5. Detekcja twarzy przy wykorzystaniu
uśredniający lp2 Gaussa
Kaskadowego klasyfikatora Haar'a
1, 1, 1 1, 1, 1 1, 2, 1
// Funkcja do detekcji I obrysowania twarzy na
przechwyconych klatkach z kamery lub
1, 1, 1 1, 4, 1 2, 4, 2
obrazka
1, 1, 1 waga 9 1, 1, 1 waga 12 1, 2, 1 waga 16
void detect_and_draw( IplImage* img )
{
int scale = 1; oczu lub nosa to przykładów pozytywnych powinno być
//Tworzy nowy obraz opierający się na obrazie min. 3000;
wejściowym " -info IplImage* temp = cvCreateImage( cvSize(img->width/ ty z interesującymi nas obszarami> ;
scale,img->height/scale), 8, 3 ); " plik info.txt: parametry (x,y -punkty startowe; x,y - szero-
// Utworzenie dwóch punktów reprezentujących kość, wysokość prostokąta);
lokalizację twarzy " przykład zapisu w pliku info.txt:
CvPoint pt1, pt2; " plik.jpg 1 140 100 45 45;
int i; " plik2.jpg 2 100 200 50 50 50 30 25 25,
// Czyszczenie pamięci " punkty prostokąta można wyznaczyć w każdym progra-
cvClearMemStorage( storage ); mie graficznym:
// Znajduje wcześniej załadowaną kaskadę i znajduje " bgcolor twarz o ile jest. lę szarości>;
if( cascade ) " w { (standardowo 24)>;
// Może być więcej niż jedna twarz w danym obrazie. " h // Wykryj objekty i zachowaj w kolejność dardowo 24) >.
CvSeq* faces = cvHaarDetectObjects( img, cascade,
storage,1.1, 2, CV_HAAR_DO_CANNY_ Przykład wywołania funkcji:
PRUNING, cvSize(40, 40) );
// Loop the number of faces found. " createsamples.exe -info info.txt -vec positives.vec -num
for( i = 0; i < (faces ? faces->total : 0); i++ ) 2000
{
// Rysowanie prostokąta dla nowo wykrytej twarzy Powinny być stworzone cztery grupy obrazów na których bę-
CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); dzie opierała się praca klasyfikatora Haar a.
//Znajdowanie przestrzeni twarzy i skalowanie jeżeli to
będzie konieczne. " grupa próbek obrazów reprezentatywnych, na których
pt1.x = r->x*scale; będzie opierać się trening;
pt2.x = (r->x+r->width)*scale; " następna grupa próbek pozytywnych, która posłuży do
pt1.y = r->y*scale; testowania;
pt2.y = (r->y+r->height)*scale; " grupa próbek negatywnych (lub tzw. tło obrazu) do testo-
// Rysowanie prostokąta na wejściowym obrazku wania;
cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 ); " inne próbki negatywne do testowania.
}
} Następnym krokiem po stworzeniu próbek obrazów pozytyw-
nych i negatywnych oraz positives.vec jest trenowanie klasy-
fikatora Haar a. Opiera się on na jednym z typów boosting u
wraz z biblioteką OpenCV OpenCV\bin\ createsamples.exe. (GAB,  Gentle Ada Boost ). Boosting (wzmocnienie) jest ogól-
Z linii komend można podać odpowiednie parametry za cre- ną metodą, u podstaw której leży idea poprawy dokładności
atesamples działania dowolnego algorytmu uczącego. Technika ta polega
na stosowaniu sekwencji prostych modeli, przy czym każdy ko-
" -vec ; lejny model przykłada większą wagę do tych obserwacji, które
" -img ; zostały błędnie zaklasyfikowane przez poprzednie modele.
" -num Tabela 3. Filtry wykrywające linie (maski filtrujące linie w
dów (standardowo jest ustawionych 1000)> Jeżeli ma być
obrazie)
wykorzystany klasyfikator Haar a do wykrywania samych
linia pozioma +45 pionowa -45
Tabela 1. Maski dla filtra górnoprzepustowego
-1, -1, -1 -1, -1, 2 -1, 2, -1 2, -1, -1
-1,-1,-1 1,-2, 1 0, -1, 0
2, 2, 2 -1, 2, -1 -1, 2, -1 -1, 2, -1
-1, 9,-1 -2, 5,-2 -1, 20, -1
-1, -1, -1 2, -1, -1 -1, 2, -1 -1, -1, 2
waga 0 waga 0 waga 0 waga 0
-1,-1,-1 waga 1 1,-2, 1 waga 1 0, -1, 0 waga 16
Software Developer s Journal 12/2007 www.sdjournal.org
31
Biometryka
w C++
Listing 6. Implementacja algorytmu Eigenfaces
// Eigenface implementacja przy użyciu OpenCV for( i=0; i// Algorytm Eigerface został wykorzystany z strony eigens[i] = cvCreateImage( cvSize(M,N), IPL_DEPTH_32F, 1 );
// http://www.vrac.iastate.edu/575x/S07/doku.php?id= avg = cvCreateImage(cvGetSize(imges[0]), IPL_DEPTH_32F, 1);
// murshed:homework:hw4 criteria.type = CV_TERMCRIT_ITER|CV_TERMCRIT_EPS;
#include criteria.max_iter = 10;
#include criteria.epsilon = 0.1;
#include // Obliczanie eigenobjects i eigenvals
#include cvCalcEigenObjects( n, images, eigens, 0, 0, 0,
#include &criteria, avg, vals );
#include //obliczanie dekompozycji współczynników
#include for( i=0; i#include cvEigenDecomposite( images[i], nEigens, eigens, 0, 0, avg,
int main() { coeffs[i] );
int N=128; // wysokość każdego obrazu twarzy //Pobieranie wiersz GetEigenface
int M=120; // szerokość każdego obrazu twarzy float *Image[n-1];
const int n = 9; // liczba zdjęć wykorzystanych IplImage *Img[n-1];
const int nEigens = n-1; // liczba eigen obiektów uchar *fImg[n-1];
int i, j, k; // zmienne for (int i = 0; iint s_image = 14; // miejsce cyfry w eignenfaces cvGetImageRawData(eigens[i], (uchar**)&Image[i]);
int f_image= 9; // miejsce cyfry w nazwie obrazu Img[i] = cvCreateImage( cvSize( M, N), IPL_DEPTH_8U, 1);
// szablon próbek obrazów wejściowych cvGetImageRawData( Img[i], (uchar**)&fImg[i]);
char name[30] = "./faces/F1_a.bmp"; }
// szablon dla obrazów w projekcie // Znajdowanie maksimum i minimum wartości piksela
char projimg[30]="./project/proj1.bmp"; // w eigenfaces
// szablon dla Eigenface images float maxx, min;
// jedna liczba dla każdego obrazu w array maxx = min = 0.0;
char eigenfc[30]="./eigen/eigens1.bmp"; for (int i = 0; ichar nums[10] = "123456789"; for(int b=0; b< Img[i]->width * Img[i]->height; b++) {
// dist pomiędzy obrazami w przestrzeni nEigens if(maxx < Image[i][b])
double max, val, dist; maxx = Image[i][b];
CvMemStorage* storage = cvCreateMemStorage(0); if(min > Image[i][b])
IplImage* images[n]; // wejściowy image min = Image[i][b];
IplImage* eigens[nEigens]; // eigenobjects }
// dekompozycja rzutowanych obiektów w  eigen sub-space }
IplImage* proj[n]; // Normalizacja eigenface wartość pomiędzy 0 and 255
IplImage* avg; // uśredniony obiekt for (int i = 0; i// kryteria do zatrzymania obliczeń eigen objects for(int c = 0; c< Img[i]->width * Img[i]->height; c++)
CvTermCriteria criteria; fImg[i][c] = (uchar)(( 255 * (( Image[i][c] -
float vals[nEigens];// eigenvalues min)/ (maxx - min)) ));
float coeffs[n][nEigens]; // rozkład współczynników }
float normCoeffs[n][nEigens];// normalizacja współczynników // Pokaż i zapisz eigenfaces
cvNamedWindow( "projections", CV_WINDOW_AUTOSIZE); for( i=0; icvNamedWindow( "images", CV_WINDOW_AUTOSIZE); cvvShowImage( "Eigenfaces", Img[i] );
cvNamedWindow("Eigenfaces", CV_WINDOW_AUTOSIZE); eigenfc[s_image] = nums[i];
cvNamedWindow("average", CV_WINDOW_AUTOSIZE); cvSaveImage(eigenfc, Img[i]);
// Czytanie obrazka z pliku cvvWaitKey(0);
for( i=0; i name[f_image] = nums[i];// pobierz nazwę pliku // Normalizacja współczynników dekompozycji
//ładowanie obrazka do IplImage objects for( i=0; i IplImage* temp = cvvLoadImage(name); max = -100000.00;
images[i] = cvCreateImage( cvSize(M,N), IPL_DEPTH_8U, 1); for( j=0; j cvCvtColor( temp, images[i], CV_BGR2GRAY ); val = fabs( coeffs[j][i] );
cvReleaseImage( &temp ); if( val > max )
cvvShowImage( "images", images[i] ); max = val;
cvvWaitKey(0); }
proj[i] = cvCreateImage( cvSize(M,N), IPL_DEPTH_8U, 1 ); for( j=0; j} normCoeffs[j][i]=coeffs[j][i]/max;
32
www.sdjournal.org
Software Developer s Journal 12/2007
Detekcja i rozpoznanie twarzy w C++
Listing 6. C.d. implementacja algorytmu Eigenfaces
} for( i=0; i// Obliczanie rzutowania do eigen subspace cvReleaseImage( &images[i] );
for( i=0; i cvEigenProjection( eigens, nEigens, 0, 0, coeffs[i], }
avg, proj[i] ); for( i=0; i// Pokaż rezultat rzutowania cvReleaseImage( &eigens[i] );
for( i=0; i cvvShowImage( "projections", proj[i] ); cvClearMemStorage(storage );
projimg[s_image] = nums[i]; cvDestroyWindow("projections");
cvSaveImage(projimg, proj[i]); cvDestroyWindow("images");
cvvWaitKey(0); cvDestroyWindow("Eigenfaces");
} return 0;
//Magazynowanie Images }
Algorytm AdaBoost w pierwszym kroku swojego działania tora można wykorzystać multi-processor, aby to zrobić należy
inicjalizuje wagi dla każdej obserwacji nadając im tym sa- przekompilować cvhaartraining z włączonym OpenMP.
mym wartość 1/m. Kolejno następują iteracje:
" -data " normalizacja wag; kator>;
" wyznaczenie klasyfikatora; " -vec ;
" wyznaczenie błędu klasyfikatora; " -bg " wyznaczenie nowych wag na podstawie błędu klasyfika- cych oczekiwanego obrazu>;
tora. " -npos ;
" -nneg ;
Proces iteracji kończy się, gdy błąd klasyfikatora przekro- " -nstages ;
czy wartość 1D 2 lub gdy numer iteracji równy jest danej sta- " -mem łej L (ustalonej maksymalnej liczbie iteracji). Ostateczny kla- ciej policzy>;
syfikator wyznaczamy na podstawie metody zwanej głosowa- " -nonsym niem większościowym. ustawiona przyspieszy proces owal off (np. twarz z przo-
W większości przypadków do wykrywania różnych obiek- du) obiekt o różnej geometrii on (np. twarz z boku) >;
tów w obrazie dobry jest Gentle Ada Boost użyty OpenCV; " -mode  Basic uży-
tylko niektóre standardowe parametry zostaną zmienione. wa tylko pionowych cech, Core cechy przekręcone o 45
Rozszerzona grupa cech powinna być wykorzystana, a licz- stopni, All jedne i drugie;
ba etapów powinna sięgać min. 20. Jeżeli etapów jest za du- " -w ;
żo to trening można przerwać w dowolnym momencie. Jeże- " -h wysokość i szerokość musi być taka sa-
li za mało  można wznowić narzędzie treningowe i etapy bę- ma jak w  Create Sample ;
dą dodane do istniejącej kaskady (punktem startowym jest " przykład wywołania: haartraining.exe -data cascade -vec
ostatni zakończony etap). Jeżeli obiekt jest symetryczny (jak positives.vec -bg negatives.txt -npos 1300 -nneg, 5350 -
np. kula, owal) to parametr -nonsym nie jest potrzebny. nstages 30 -mem 1300 -mode ALL -w 24 -h 24.
Do trenowania kaskadowego klasyfikatora można wyko-
rzystać narzędzie dostarczone w raz z biblioteką OpenCV. Kolejnym krokiem będzie przetestowanie uzyskanej kaska-
OpenCV\bin\ haartraining.exe. W szybszym uczeniu klasyfika- dy. W tym celu należy wykorzystać narzędzie z OpenCV;
Tabela 4. Maski dla filtra krawędziowego
Sobel Prewitt Roberts
poziomy pionowy poziomy pionowy poziomy pionowy
1, 2, 1 1, 0, -1 1, 1, 1 1, 0, -1 -1, 0 0, 1
0, 0, 0 2, 0, -2 0, 0, 0 1, 0, -1 0, 1 -1, 0
-1,-2,-1 waga 0 1, 0, -1 waga 0 -1,-1,-1 waga 0 1, 0, -1 waga 0 waga 0 waga 0
Kirsh
poziomy pionowy poziomy pionowy
0, 0, 0 0,-1, 0 -3, -3, -3 5, -3, -3
-1, 1, 0 0, 1, 0 -3, 0, -3 5, 0, -3
0, 0, 0 waga 0 0, 0, 0 waga 0 5, 5, 5 waga 0 5, -3, -3 waga 0
Software Developer s Journal 12/2007 www.sdjournal.org
33
Biometryka
w C++
OpenCV\bin\performance.exe. Program ten zaznacza obrazy,
Tabela5. Filtr krawędziowy wykrywający punkty  Laplasjan
poprawia ostrość obrazu
na których zostały rozpoznawane konkretne obiekty.
0, 1, 0 0, -1, 0 -1, -1, -1 1, 1, 1
" -data <ścieżka do zapisanego klasyfikatora>;
1, -4, 1 -1, 4, -1 -1, 8, -1 1, -8, 1
" -info ;
" -w, -h . 0, 1, 0 0, -1, 0 -1, -1, -1 1, 1, 1
waga 0 waga 0 waga 0 waga 0
Przykład wywołania:
" kompresja i dekompresja są prostymi operacjami do
" performance.exe -data cascade -info positives/test/plik.txt przedstawienia podanych parametrów modelu - wymaga-
-w 24 -h 24 -rs 30. ją tylko mnożenia macierzy.
Tak przygotowany klasyfikator można zastosować do znajdo- Pierwszym krokiem jest stworzenie bazy obrazów treningo-
wania twarzy i jej obrysowania. Listing 5 przedstawia funkcję wych. Aby otrzymać wynik miarodajny należy wziąć około
wykorzystującą kaskadowy klasyfikator Haar a. 1000 różnych próbek, w tym każda osoba powinna mieć zro-
Jak można zauważyć na Rysunku 2, kaskadowy klasyfika- bionych kilka zdjęć twarzy w różnych warunkach (różne tło,
tor Haar a nie wykrył przechylonej twarzy. Aby można było pra- mimika, kąty nachylenia i oświetlenia). Wszystkie testowane
widłowo wykryć osobę z przechyloną twarzą lub twarz z profi- twarze powinny mieć taki sam rozmiar w pikselach. Listing
lu, należałoby rozbudować klasyfikator o odpowiednie zdjęcia 6 przedstawia użycie metody Eigenface przy użyciu OpenCV
takich osób. Przykładowych zdjęć powinno być min.1000, aby do przedstawienia punktów. Rysunek 3 przedstawia wynik
klasyfikator dobrze radził sobie z zakłóceniami. działania algorytmu Eigenface w identyfikacji twarzy. Poszu-
kiwaną osobą jest BOOT ze strony http://www.sztucznaintelig
Rozpoznawanie twarzy encja.pl znajdujący się na zdjęciu w lewym, górnym rogu (ob-
Posiadając wykrytą twarz można przystąpić do obróbki twa- raz oryginalny). Resztę zdjęć stanowią wynikowe próbki wy-
rzy pozyskanych. Każda twarz posiada swoje charaktery- typowane przez algorytm Eigenface. Pięć próbek zdjęć zo-
styczne punkty takie jak: rozkład kości, rozstawienie oczu, stało wytypowanych prawidłowo i na ich podstawie można
ogólny kształt twarzy, ułożenie i wielkość ust, kształt nosa wyliczyć dość wysokie prawdopodobieństwo poprawnego
itd. Przed pobraniem obrazu twarzy powinniśmy najpierw rozpoznania twarzy. Omawiany algorytm nie rozróżnia twarzy
przeskalować ostatnio uzyskaną ramkę z algorytmu kaska- żywych ludzi od twarzy przedstawionych na bilbordach lub
dowego klasyfikatora Haar a, aby ramka przedstawiła całą manekinach. Zastosowanie tej metody np. w sklepach lub
głowę, ponieważ poniższa metoda PCA daje w takich warun- centrach miast (czyli miejscach gdzie występuje duża liczba
kach lepsze wyniki. ludzi, bilbordów, wystaw sklepowych itp.) spowoduje znacz-
Pobrany obraz twarz musi być odpowiednio przeskalowa- ne opóznienia w działaniu systemu, gdyż algorytm będzie
ny do wielkości takiej jak zostały utworzone próbki. W poniż- analizował wszystkie wykryte twarze.
szym przykładzie została wykorzystana Principal Component Rozwiązań tego problemu może być kilka. Jednym z nich
Analysis (PCA  analiza głównych składowych). Algorytm po- jest zastosowanie algorytmu do detekcji ruchu w obrazie i
zwala na ekstrakcję eigenvectors (wektory własne) i eigenva- analiza tylko tych próbek, które nie są statyczne. Do tego ce-
lues (wartości własne) dużej liczby wielowymiarowych da- lu można wykorzystać wynik klasyfikatora Haar a i poklatkowe
nych. Główny komponent analizy PCA jest szeroko stosowa- porównanie pojawiających się lub przesuwających prostoką-
ny w technice redukcji wymiarowej przy analizie danych. Je- tów. Dla osób programujących w C# przyda się również biblio-
go popularność bierze się z trzech istotnych właściwości: teka SharperCV, która została napisana na podstawie zródeł
OpenCV i zawiera większość jej funkcjonalności. Detekcja i
" jest to optymalny (w rozumieniu błędu kwadratowego) li- wykrywanie twarzy w obrazie może być przedstawiana na wie-
niowy schemat w kompresji zestawu; le różnych sposobów, z których każdy ma swoje zalety i wady.
" wektorów (high dimensional vectors) do zestawu wekto- W powyższym artykule została pokazana droga przy użyciu
rów (lower dimensional vectors), a następnie dokonania kaskadowego klasyfikatora Haar'a i Eigenface (PCA). Sposób
rekonstrukcji; ten spisuje się doskonale w stałych warunkach, gdzie jest ma-
" parametry modelu mogą być wyliczane wprost z bazy da- ło czynników zakłócających, takich jak oświetlenie, pochyle-
nych  np. przez diagonalizację kowariancji próby; nia próbki pobranego obrazu, starzenie się jednostki identyfi-
kowanej czy zmiana jej wyglądu. Rozwiązaniem tego problemu
może być zastosowanie kamery termowizyjnej i odpowiednie
W Sieci
dostosowanie bazy wiedzy klasyfikatora Haar'a do wykrywa-
nia twarzy oraz odpowiednie przygotowanie próbki dla meto-
l
http://www.lienhart.de/ICIP2002.pdf
dy Eigenface. Temperatura poszczególnych części twarzy jest
l
http://dapissarenko.com/resources/2002_12_01_eigenfaces.pdf
wyższa od pozostałych. Uwarunkowane jest to strukturą kost-
l
http://www.rcis.hiroshima-u.ac.jp/21coe/pdf/3rd_WS/Poster.13-
ną, gęstością mięśni i ułożeniem naczyń krwionośnych. Czyn-
P.109.pdf
niki te są niezmienne w czasie, a więc zmiana w wyglądzie nie
l
http://www710.univ-lyon1.fr/~bouakaz/OpenCV-0.9.5/docs/
l będzie wpływała na rozpoznanie osoby. Zastosowanie takiej
http://www.cs.ru.ac.za/research/groups/SharperCV/
l
http://code.google.com/p/opencvdotnet/ kamery wykluczyło by również zbędne analizowanie twarzy
 martwych (obrazach, manekinach i bilbordach itp.) n
34
www.sdjournal.org
Software Developer s Journal 12/2007


Wyszukiwarka

Podobne podstrony:
Informatyka ProgramStudiowI 2007
Raporot z przebiegu procesu negocjacj i dokumentów programowych na lata 2007 2013 Warszawa styczeń
2007 01 Grę każdy napisać może! [Programowanie]
2007 11 Extreme Programming i CMMI [Inzynieria Oprogramowania]
2007 05 Type Tool Texmacs a Convenient Layout Program for Your Text Documents
Narodowy Program Zdrowia na lata 2007–2015
2007 08 OpenKODE [Programowanie C C ]
2007 02 Programowanie równoległe z Qt [Programowanie]
2007 03 Pomysły na szybkie C [Programowanie]
filologia polska minimum programowe dla studentów MISH 2006 2007
Razem bezpieczniej Program RM 2007 15 prezentacja
0 Program wykładów 2007
0 Program wykładów 2007
2007 03 Photo Fix Improving Digital Images with the Gnu Image Manipulation Program
2007 05 Variadic templates w C 0x [Programowanie C C ]
2007 10 Extreme Programming (XP) i CMMI – Kreatywność, czy Dyscyplina [Inzynieria Oprogramowania]
zestawy cwiczen przygotowane na podstawie programu Mistrz Klawia 6
2007 01 Web Building the Aptana Free Developer Environment for Ajax
Międzynarodowy Program Badań nad Zachowaniami Samobójczymi

więcej podobnych podstron