Các module của chương trình

Một phần của tài liệu NGHIÊN cứu và xây DỰNG hệ THỐNG NHẬN DẠNG mặt NGƯỜI dựa TRÊN ADABOOST (Trang 43 - 56)

Nhóm module xác định khuôn mặt

- function [adaboost_train accuracy] = Train_AdaBoost(T): dùng để

hun luyn cho AdaBoost

%--- % Inputs: T la so luong vong lap Adaboost, chinh la so bo phan loai yeu (weak learners)

%--- % Outputs:

% - adaboost_train : Structure containing all sufficient statistics

% for perceptrons, as well as Adaboost learned parameters

% - accuracy : vector do chinh xac cua các vong lap, Tx1 %---

fprintf('Loading pre-computed features...');

load('precomputed_features.mat');

%mang khoi cac dac trung zll_features([numtotal, numfeature])

all_features = precomp_data.imagefeatures; numfeat = precomp_data.numfeat;

labels = precomp_data.labels; [numtotal d] = size(all_features);

%numtotal:so luong anh dung de huan luyen

fprintf('done\n');

m = length(find(labels == 1)); %tim so luong mau am

l = length(find(labels == -1)); %tim so luong mau duong

numpos = m; numneg = l;

numtotal = numpos+numneg;

%mang trong so cho moi leaner vaf mo image %khoi tao trong so weights

for i=1:numtotal

%neu la mat nguoi tuc mau duong positive

if labels(i) == 1 w(1,i) = 1/(2*m); %neu la mau am elseif labels(i) == -1 w(1,i) = 1/(2*l); end end labels=reshape(labels,numtotal,1); %--- numfeat = numfeat(1);

%mang numtotal chieu, chinh la so luong anh huan luyen %y_weak = zeros(T,numfeat,numtotal);

fprintf('Training one classifier per feature for %d rounds\n---n',T);

for t=1:T

%normalize weights, dung de dua w(t+1,k) ve doan [0,]

w(1,:) = w(1,:)./sum(w(1,:)); %khoi tao mang loi epsilon

epsilon = zeros(numfeat,1);

fprintf('Boosting iteration %d:\n',t);

%-TRAIN ONE CLASSIFIER FOR EACH FEATURE OVER ALL IMAGES (adsbygoogle = window.adsbygoogle || []).push({});

curdata = zeros(numtotal,1);

%chuyen ma tran hang thanh ma tran cot

for k=1:numtotal

%lay ra cac dac trung features cua anh thu k

image_features = all_features{k};

% lay dac trung thu j cua tat ca cac anh

curdata(k) = image_features(j); end

%muc dich chi de xem dang huan luyen toi mau nao de de dang theo

%doi khi huan luyen

if mod(j,1000) == 0

fprintf('...Dang huan luyen bo phan loai thu %d\n',j);

end

%them cot thu hai cho mang du lieu voi toan gia tri 1

curdata = [curdata ones(numtotal,1)];

%tinh trong so voi cac dau vao khoi tao

[weights,mse,acc] = learn_perceptron(curdata,labels,1e-9,1e-

1,1,1234,0,0); %learn on the data

%trong so cho lop yeu

weak_learner(1,j).weights = weights;

%uoc luong nham lan mse

weak_learner(1,j).mse = mse;

%do chinh xac

weak_learner(1,j).acc = acc;

%bo phan loai theo mang perceptron

%dau ra cua mang perceptron outputs = sign(data*weights')

weak_learner(1,j).classifications = perceptron(weights,curdata);

%épilon(j)=Tong(tu k den n)(w(t,k)|hj(xk)-yk)|

for k=1:numtotal %update errors epsilon(j) = epsilon(j) + w(1,k)*abs(weak_learner(1,j).classifications(k) - labels(k)); end end

%3. chon ra bo phan loai ung voi epsilon nho nhat

[error(t) idx] = min(epsilon); %ta duoc (adsbygoogle = window.adsbygoogle || []).push({});

best_weak.learner(t) = weak_learner(1,idx); best_weak.feature(t) = idx;

%tinh alpha=1/2 ln((1-epsilonj)/epsilonj)

beta(t) = error(t)/(1-error(t));

%eps Spacing of floating point numbers

alpha(t) = log(1/(beta(t)+eps)); %log(1) - log(beta(t));

if t+1 <= T

%wt+1=wt,k/Zt* e^-alpha(t) neu ht(xk)=yk

% = wt,k/Zt* e^alpha(t) neu ht(xk)<>yk

for i=1:numtotal%ht(xk)=yk

if (labels(i) == best_weak.learner(t).classifications(i))

w(1,i) = w(1,i)*exp(-alpha(t));

%update weights for data cases

else w(1,i) = w(1,i)*exp(alpha(t)); end end end

%tim ra so luong mau tinh dung

numincorrect = length(find(h ~= labels)); %do chinh xac cua bo phan loai

accuracy(t) = (numtotal-numincorrect)/numtotal;

fprintf('Accuracy for round %d is %2.2f\n',t,accuracy(t));

end

%luu du lieu vua huan luyen vao file adaboost_train.mat %bo phan loai tot nhat cua bo phan loai

adaboost_train.weak_learners = best_weak;

%do chinh xac

adaboost_train.acc = accuracy;

%he so alpha

adaboost_train.alphas = alpha;

save adaboost_train.mat adaboost_train;

% luu lên dia file huan luyen voi ten adaboost_train.mat

- function [x,y,z,k,count]=FaceDetection(anh): dùng để trượt trên

nh và xác định các khuôn mt và v các ca s cha khuôn mt

%INPUT: anh: anh dua vao de detect

%OUTPUT: %neu so chieu cua anh la 3 thi chuyen anh do sang anh xam (adsbygoogle = window.adsbygoogle || []).push({});

if ndims(anh)==3

anh1=rgb2gray(anh); else

anh1=anh; end

%ham sanh bang luoc do sam cua anh

anh1=histeq(anh1);

% nguong chay trong khoang [-10, 10]

load('adaboost_train.mat'); threshold = -5; imagesc(anh1); hold on; colormap gray; s = fdmex(anh1', threshold); kt=size(s,1); x=zeros(1,kt); y=zeros(1,kt); z=zeros(1,kt); k=zeros(1,kt); count=0;

% doan nay dung de scale anh va ve ra cac vung chua khuon mat

for i=1:kt

h = rectangle('Position',[s(i,1)-s(i,3)/2-2,s(i,2)-s(i,3)/2-

17,s(i,3)+5,s(i,3)+21], ... 'EdgeColor', [1,0,0], 'linewidth', 2); x(i)=s(i,1)-s(i,3)/2-4; y(i)=s(i,2)-s(i,3)/2-17; z(i)=x(i)+s(i,3)+5; k(i)=y(i)+s(i,3)+21; count=count+1; end axis equal; axis off

Nhóm module nhn dng khuôn mt - Gii thut nhn dng vi PCA function NhanDangBangPCA global hinhnhandang global img global k img = hinhnhandang; img2=double(img(:)); if(exist('fdata.dat')==2) load('fdata.dat','-mat');

mtr=zeros(size(data{1,1},1),fnumber); for ii=1:fnumber

% doc anh tu co so du lieu vao dua vao ma tran mtr gom cac vector

mtr(:,ii)=double(data{ii,1}); %Goi hinh tu CSDL

mtr2=double(mtr)/255;

%Vector trung binh cua tap anh

avr = mean(mtr2')'; %Tim gia tri trung binh cua bo huan luyen

%Tinh do lech cua vector anh thu i so voi vector trung binh avr

% mtr2(i) = mtr2(i) - m

for i=1:fnumber

mtr2(:,i) = mtr2(:,i) - avr; end

end

Lmat = mtr2'*mtr2; % Lmat thay the cho ma tran hiep phuong sai

% Nhung phan tu tren duong cheo cua D la nhung eigenvalues cho ca % L=mtr2'*mtr2 & C=mtr2*mtr2'.

[V,D] = eig(Lmat); %Tri rieng (D) and Vector rieng(V) cua ma tran L

%Nhan duoc Eigenfaces

Eigenfaces= mtr2*V*(abs(D))^-0.5 ;

% Tinh do lech giua anh nhan dang va vector trung binh cua tap huan luyen m

Difference=img2-avr; (adsbygoogle = window.adsbygoogle || []).push({});

% vector dac trung cua anh nhan dang

f1=Eigenfaces'*Difference ;

fdata=zeros(max_class,max_class); %Ma tran rong

for ii=1:fnumber

imdata=double(data{ii,1}); classdata=data{ii,2};

cor=Eigenfaces'*(imdata-avr); % Ma tran trong so cua nhung khuon mat duoc luu tru

fdata(:,classdata)=fdata(:,classdata)+cor; end

%Khoang cach eclide

dist=zeros(max_class,1); for ii=1:(max_class) dist(ii)=norm(f1-fdata(:,ii)); end [minf,pminf]=min(dist); k=minf/1000;

hll = waitbar(0,'KIEM TRA CSDL...');

for i=1:2450, waitbar(i/100) end close(hll) if k<=6.1 LayThongTin; end if k>=6.1

msgbox('Khuon mat chua duoc luu vao CSDL','Loi chua luu anh');

return end

else

errordlg('CSDL chua duoc tao. Dinh dang anh khong cho phep. Khong the

nhan dang. Moi ban xem lai!','Loi mo file'); end

clear all

- Gii thut nhn dng vi LDA

function NhanDangBangLDA: Gii thut nhn dng vi LDA

global hinhnhandang global img global k global TrainData; global vNumEachClass; img = hinhnhandang; img2=double(img(:)); if(exist('train\LDA\TrainData.dat')==2)

load('train\LDA\TrainData.dat','-mat'); TrainData=[]; vNumEachClass=zeros(max_class,1); for i=1:max_class TrainData=[TrainData data{i,1}]; vNumEachClass(i)=data{i,3}; end

%Goi ham FLDA DAY LA THUAT TOAN RLDA

%[DFLD_Trans]=FLDA(TrainData,vNumEachClass);

VERY_SMALL=1e-3; I=find(vNumEachClass<=2);

sss_rate=sum(vNumEachClass(I))/sum(vNumEachClass); if sss_rate>=0.5

% v?i L=2; L là nhung mau huan luyen tren de tai (subject)

% thi ta thiet lap cac tham so cho cau truc stRegParam la

stRegParam=struct('Eta_Sw',{1},'Threshold_EigVal_Sb',{0.02},'Update_EigVa

l_Sb',{0.05},'RemainEigVec',{1}); else

% voi L>2; (adsbygoogle = window.adsbygoogle || []).push({});

stRegParam=struct('Eta_Sw',{1e-3}, 'Threshold_EigVal_Sb', {0.02},

'Update_EigVal_Sb',{0.2},'RemainEigVec',{0.8}); end

% khoi tao gia tri tham so chinh qui hoa eta_sw

eta_sw=stRegParam.Eta_Sw;

% Nguong duoc dung de xac dinh nhung gia tri rieng nho nao cua Sb can % dieu chinh. De don gian, ta thiet lap thresh_eigval_sb=0.02 (cua gia % %tri rieng lon nhat cua Sb)

thresh_eigval_sb=stRegParam.Threshold_EigVal_Sb; update_eigval_sb=stRegParam.Update_EigVal_Sb; remain_eigvec=stRegParam.RemainEigVec;

%rowTrain la so mau huan luyen tren mot lop, colTrain la so mau huan luyen

[rowTrain,colTrain]=size(TrainData);

sample_num=colTrain; % so mau ( khuon mat) huan luyen

eachclass_num=vNumEachClass; %mang chua so mau huan luyen cho moi lop

class_num=length(eachclass_num);%so lop ( chinh la so nguoi dua vao tap

huan luyen)

mean_class=mean(double(TrainData),2);% Gia tri trung binh cho toan bo mau

% mang gia tri trung binh cho moi lop huan luyen ma moi cot la mot vector % trung binh cua lop thu i

mean_eachclass=zeros(rowTrain,class_num); t=1; for j=1:class_num tt=t+eachclass_num(j)-1; a=double(TrainData(:,t:tt));

mean_eachclass(:,j)=mean(a,2);%vector gia tri trung binh cho lop j

t=tt+1; end

clear('a');

% Nhung vector rieng m_b (<=class_num-1) dau tien tuong ung voi nhung gia tri rieng lon

% nhat se duoc rut ra tu nhwng vector rieng cua Sb

m_b=class_num-1;% khoi tao dau tien se la max

% Sw : ben trong lop phan tan ma tran hiep phuong sai

Phi_w=zeros(rowTrain,colTrain); j=1;

for i=1:class_num

t=double(TrainData(:,j:j+eachclass_num(i)-1));

%Tích tenxi Kronecker, kron (x,y) chinh la phep nhan ma x voi he so y

m=kron(mean_eachclass(:,i),ones(1,eachclass_num(i))); b=t-m; Phi_w(:,j:j+eachclass_num(i)-1)=b; % Sw=Sw+b*b'; j=j+eachclass_num(i); end clear('m','b','t'); Phi_w=Phi_w/sqrt(sample_num);

% Sb=Phi_b*Phi_b': giua lop phan tan ma tran hiep phuong sai % Sb_t=Phi_b'*Phi_b m=kron(mean_class,ones(1,class_num)); %clear('mean_class'); Phi_b=mean_eachclass-m; clear('m'); for i=1:class_num Phi_b(:,i)=Phi_b(:,i)*sqrt(eachclass_num(i)/sample_num);

end

%Sb=Phi_b*Phi_b'; (adsbygoogle = window.adsbygoogle || []).push({});

Sb_t=Phi_b'*Phi_b;%thay tinh vi ma tran hiep phuong sai Phi_b*Phi_b'

%Ham tinh vector rieng va gia tri rieng tuong ung cho tung lop

[eigvec,eigval]=eig(Sb_t); clear('Sb_t');

% dua ve dang ma tran cheo hoa, nghia la ma tran gom nhung phan tu nam tren

% duong cheo chinh lan luot nhan gia tri rieng

eigval=abs(diag(eigval)');

% sap xep lai ma tran eigval voi cac gia tri eigval se o hang cuoi cung % I la ma trang dong nhat thuc

[eigval,I]=sort(eigval);

% chuyen vi ma tran eigval

eigval_Sb_t=fliplr(eigval);

% chuyen vi ma tran eigvec va hop I ma tran eigvec chuyen vi voi nhau

eigvec_Sb_t=fliplr(eigvec(:,I)); clear('eigvec','eigval');

% dieu chinh gia tri rieng theo phuong phap 1: Sau day la mot cach don gian

% de nem nhung vector rieng cua Sb tuong ung voi nhung gia tri rieng nho % nhat ( )

m_b=round((class_num-1)*remain_eigvec);

% dieu chinh theo phuong phap 2: tang nhung gia tri rieng nho nhat toi mot

% gia tri lon hon (update_eigval_sb), de giam bot su can tro cua chung

aa=eigval_Sb_t/eigval_Sb_t(1);

bb=find(aa<thresh_eigval_sb);% chi de lai nhung vector rieng gia tri

rieng tuong ung nho hon nguong

eigval_Sb_t(bb)=eigval_Sb_t(1)*update_eigval_sb;

% loai bo nhung vector co gia tri rieng tuong ung xap xi =0 va trich rut nhung

% vector rieng m_b lon nhat tuong ung voi cac gia tri rieng lon nhat

eigvec_Sb_t=eigvec_Sb_t(:,1:m_b);% mang vector rieng duoc giu la gom co

m_b pt

eigval_Sb_t=eigval_Sb_t(:,1:m_b);% mang gia tri rieng duoc giu la gom co

% nhung vector rieng dau tien qua trong nhat cua Sb, V= phi*E(gom m phtu)

eigvec_Sb=Phi_b*eigvec_Sb_t; clear('Phi_b','eigvec_Sb_t'); D_b=eigval_Sb_t.^(-1); Z=eigvec_Sb*diag(D_b); %mU_Sw_U=Z'*Phi_w*Phi_w'*Z; %Z'*S_wt^*Z ma S_w=Phi_w*Phi_w' mT=Z'*Phi_w; mU_Sw_U=mT*mT';

clear('Phi_w','D_b','eigval_Sb_t','mT');

% Luc nay ta tiep tuc tien hanh de giu lai M'(<=m_b) eigenvector voi nhung gia tri rieng (adsbygoogle = window.adsbygoogle || []).push({});

%lon nhat di

[eigvec,eigval]=eig(mU_Sw_U); clear('mU_Sw_U');

eigval=abs(diag(eigval)'); %du0c ma tran cheo ma

[eigval,I]=sort(eigval);%sap xep theo thu tu tang dan

U_vec=eigvec(:,I);% Mang vector rieng duoc chon

clear('eigvec'); A=(Z*U_vec)';

clear('Z','U_vec');

D_w=(eta_sw+eigval).^(-1/2); % or mD_t=mP'*mU_St_U*mP;

%Ket qua thu duoc la mang vector rieng

Eigenfaces=diag(D_w)*A;

% Tinh do lech giua anh nhan dang va vector trung binh cua tap huan luyen m

Difference=img2-mean_class;

% vector dac trung cua anh nhan dang

f1=Eigenfaces*Difference; %--- fdata=zeros(class_num,class_num); for ii=1:max_class imdata=mean_eachclass(:,ii); classdata=data{ii,2};

%trong so cua ma tran hiep phuong sai

cor=Eigenfaces*(imdata-mean_class);

end

%---Tinh khoang cach euclide---

dist=zeros(max_class,1);

for ii=1:(max_class)

dist(ii)=norm(f1-fdata(:,ii)); end

%---tim ra gia tri nho nhat va vi tri cua no

[minf,pminf]=min(dist); k=minf/1000;

hll = waitbar(0,'KIEM TRA CSDL...');

for i=1:2450, waitbar(i/100) end close(hll); if k<=6.1 LayThongTinLDA; end if k>=6.1

msgbox('Khuon mat chua duoc luu vao CSDL. Khuon mat gan giong duoc

chi ra trong khung ket qua!','KET QUA','icon'); return

end else

errordlg('CSDL chua duoc tao. Dinh dang anh khong cho phep. Khong the

nhan dang. Moi ban xem lai!','Loi mo file'); end (adsbygoogle = window.adsbygoogle || []).push({});

5.3. Giao din màn hình và hướng dn s dng

Giao diện chính

Hình 16- Màn hình chính 5.4. Nhn xét

Trong luận văn dùng PCA và LDA để nhận dạng. Đây là những phương pháp khá phổ biến hiện nay và nó tương đối đơn giản. Việc phát hiện khuôn mặt dựa vào thuật toán AdaBoost là một thuật toán cho phép chúng ta phát hiện nhanh và độ chính xác cao.

Chương trình có giao diện thân thiện dễ sử dụng, tốc độ nhận dạng và tỉ lệ nhận dạng đúng cao.

Hướng phát trin :

Tận dụng lợi thế của phương pháp AdaBoost sẽ xây dựng chương trình nhận dạng khuôn mặt thời gian thực.

Để tăng độ chính xác cao hơn nữa trong nhận dạng nên kết hợp với một số kỹ thuật nhận dạng khác như SVM, mạng nơron nhân tạo, ICA.

TÀI LIU THAM KHO

[1]. Viola and M. Jones, “Fast and Robust Classification using Asymmetric AdaBoost and a Detect or Cascade”. Mitsubishi Electric Research Lab, Cambridge,

MA, 2001.

[2]. Đồ án tốt nghiệp :“Ứng dng phương pháp PCA nhn dng khuôn mt người

được rút trích t Webcam ”, Cao Ngọc Trinh.

[3]. Freund – “An adaptive version of the boost by majority algorithm”

[4]. http://www.boosting.org

[5]. Thư viện OpenGL của hãng Intel.

[6]. M. Turk, A. Pentland, "Eigenfaces for Recognition", Journal of Cognitive

Neuroscience, 3(1), pp. 71-86, 1991.

[7]. A. Martinez, A. Kak, "PCA versus LDA", IEEE Transactions on Pattern

Analysis and Machine Intelligence, vol. 23, no. 2, pp. 228-233, 2001.

[8]. Yu, Yang, October 2001. “A direct LDA algorithm for high – dimensional data – with application to face recognition. Pattern Recognition”.

[9]. P. N. Belhumeur, J. P. Hespanhan, and D. J. Kriegman, “Eigenfaces vs.Fisherfaces: Recognition using class specific linear projection”, IEEE Trans.

Pattern Anal. Machine Intell, 1997.

[10]. K. Etemad and R. Chellappa, “Discriminant Analysis for Recognition of Human Face Images”, Journal of Optical Society of America, 1997.

Một phần của tài liệu NGHIÊN cứu và xây DỰNG hệ THỐNG NHẬN DẠNG mặt NGƯỜI dựa TRÊN ADABOOST (Trang 43 - 56)