Nhóm module xác định khuôn mặt
- function [adaboost_train accuracy] = Train_AdaBoost(T): dùng để
huấn luyện 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
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
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 mặt và vẽ các cửa sổ chứa khuôn mặt
%INPUT: anh: anh dua vao de detect
%OUTPUT: %neu so chieu cua anh la 3 thi chuyen anh do sang anh xam
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 nhận dạng khuôn mặt - Giải thuật nhận dạng với 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;
% 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
- Giải thuật nhận dạng với LDA
function NhanDangBangLDA: Giải thuật nhận dạng với 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;
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';
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
%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
5.3. Giao diện màn hình và hướng dẫn sử dụng
Giao diện chính
Hình 16- Màn hình chính 5.4. Nhận 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 triển :
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 LIỆU THAM KHẢO
[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 dụng phương pháp PCA nhận dạng khuôn mặt 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.