Đề tài Nhận dạng mặt người trên Matlab

MỤC LỤC

 

PHẦN A:GIỚI THIỆU

LỜI CẢM ƠN ii

LỜI MỞ ĐẦU iii

MỤC LỤC iv

LIỆT KÊ HÌNH vi

LIÊT KÊ BẢNG vii

PHÂN B: NỘI DUNG

 CHƯƠNG 1: DẪN NHẬP

1.1 Đặt vấn đề 3

1.2 Lý do chọn đề tài 3

1.3 Mục đích nghiên cứu 3

1.4 Giới hạn nghiên cứu của đề tài 3

 CHƯƠNG 2:CÁC THUẬT TOÁN NHẬN DẠNG KHUÔN MẶT

2.1 Định nghĩa bài toán xác định khuôn mặt người 6

2.2 Ứng dụng của phương pháp xác định khuôn mặt người 6

2.3 Phương pháp xác định khuôn mặt người 7

2.4 Nhận dạng khuôn mặt dùng thuật toán PCA 8

2.5 Nhận dạng ảnh dựa trên PCA 9

 CHƯƠNG 3: ẢNH MÀU TRÊN MATLAB VÀ CÁC LỆNH XỬ LÝ ẢNH

3.1 Giới thiệu ảnh số 14

3.1.1 Biểu diễn ảnh số 14

3.1.2 Ảnh màu 15

3.1.3 Các định dạng ảnh cơ bản trong xử lý ảnh 17

3.2 Các kiểu hình ảnh trong Matlab 19

3.3 Chuyển đổi giữa các kiểu dữ liệu 21

3.4 Các phép toán số học cơ bản đối với dữ liệu ảnh 22

3.5 Các hàm hiển thị ảnh trong Matlab 22

3.6 Các hàm khác được sử dụng trong đề tài 24

 CHƯƠNG 4:GIỚI THIỆU CHƯƠNG TRÌNH

4.1 Giới thiệu chương trình 26

 

 CHƯƠNG 5: SƠ ĐỒ KHỐI VÀ CODE CHƯƠNG TRÌNH

5.1 Sơ đồ khối 32

5.2 Code chương trình 32

 CHƯƠNG 6: PHẠM VI GIỚI HẠN VÀ HƯỚNG MỞ RỘNG ĐỀ TÀI

6.1 Phạm vi giới hạn của đề tài 42

6.2 Hướng mở rộng của đề tài 42

 

 

doc51 trang | Chuyên mục: MATLAB | Chia sẻ: dkS00TYs | Lượt xem: 3462 | Lượt tải: 5download
Tóm tắt nội dung Đề tài Nhận dạng mặt người trên Matlab, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
n chương trình chính
	Đây chính là giao diện chính của chương trình gồm hai khung hiển thị hình ảnh và hai nút nhấn Browse và Search. Để bắt đầu tìm kiếm ta cần load ảnh khuôn mặt người cần kiểm tra bằng cách nhấn vào phím Browse. Hộp thoại mở file xuất hiện, bạn chọn file ảnh bạn muốn kiểm tra. Ở đây ta lấy ví dụ ảnh kiểm tra là ảnh “4.jpg” như hình vẽ: 
Hình 4.4: Chọn ảnh cần kiểm tra
Ảnh cần kiểm tra sẽ được đưa ra giao diện chương trình chính như hình:
Hình 4.5: Ảnh cần kiểm tra
Để kiểm tra xem khuôn mặt người trong ảnh cấn kiểm tra chúng ta nhấn nút Search chương trình sẽ chạy và tìm trong CSDL bức ảnh có khuôn mặt giống với khuôn mặt người trong ảnh cần kiểm tra. Hiển thị ra giao diện chương trình chính.
Hình 4.6: Ảnh trung bình
Hình 4.7: Hình chiếu ảnh lên không gian ảnh
Hình 4.8: Ảnh cần tìm
Chương trình sẽ tìm ra khuôn mặt gần giống nhất với khuôn mặt cấn kiểm tra. Và ở đây kết quả tìm được là hình có tên “7.jpg”.
CHƯƠNG 5
SƠ ĐỒ KHỐI VÀ
CODE CHƯƠNG TRÌNH
5.1 Sơ đồ khối
Hình 5.1: Sơ đồ khối tổng quát của chương trình
5.2 Code chương trình
	function varargout = DOANMONHOC2(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
 'gui_Singleton', gui_Singleton, ...
 'gui_OpeningFcn', @DOANMONHOC2_OpeningFcn, ...
 'gui_OutputFcn', @DOANMONHOC2_OutputFcn, ...
 'gui_LayoutFcn', [] , ...
 'gui_Callback', []);
if nargin && ischar(varargin{1})
 gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
 [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
 gui_mainfcn(gui_State, varargin{:});
end
function DOANMONHOC2_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
clc;
% --- Outputs from this function are returned to the command line.
function varargout = DOANMONHOC2_OutputFcn(hObject, eventdata, handles) 
varargout{1} = handles.output;
function Search_Callback(hObject, eventdata, handles)
load TestImage;
axes(handles.anhtimduoc);
TrainPath='train';
T = taoCSDL(TrainPath);
[m, A, Eigenfaces] = taoEF(T);
OutputName = nhandien(TestImage, m, A, Eigenfaces);
anhtim = strcat(TrainPath,'\',OutputName);
anhtim = imread(anhtim);
imshow(anhtim);
title('Anh tim duoc');
str = strcat('Ten anh :',OutputName);
set(handles.tenanh,'String',str);
function Browse_Callback(hObject, eventdata, handles)
 [file_name file_path] = uigetfile ('*.jpg','Chon anh kiem tra ','test\2.jpg');
 if file_path ~= 0
 TestImage = imread ([file_path,file_name]);
 end
axes(handles.anhkiemtra);
if file_path ~= 0 
imshow(TestImage);
end
save TestImage;
function T = taoCSDL(trainPath)
% trainPath la duong dan toi thu muc csdl anh .Thu muc nay ngoai nhung
% file anh con chua nhung file khac co ten : . , .. , Thumbs.db
% Bien tat ca anh kich thuoc MxN thanh vector cot M*Nx1 , su dung
% ham reshape cua Matlab , sau do dat vao ma tran T , cuoi cung ma tran T
% se co kich thuoc M*NxP
% return T
csdl = dir(trainPath);
soanh = 0;
for i = 1:size(csdl,1) % dem nhung file la anh trong csdl
 if not(strcmp(csdl(i).name,'.')|strcmp(csdl(i).name,'..')|strcmp(csdl(i).name,'Thumbs.db'))
 soanh = soanh + 1; % so anh chua trong tap csdl
 end
end
% Tao ma tran tu nhung tam anh
T = [];
for i = 1 : soanh 
 % Trong csdl cua vi du nay thi cac file anh co ten : 1.jpg , 2.jpg ... 
 str = int2str(i);
 str = strcat('\',str,'.jpg');
 str = strcat(trainPath,str); % lay ten day du cua file anh 
 img = imread(str);
 img = rgb2gray(img); 
 [dong cot] = size(img); 
 tam = reshape(img',dong*cot,1); % bien anh thanh vector
 T = [T tam]; % tang dan kich thuoc ma tran T 
end
function [m, A, E] = taoEF(T)
% T la mot ma tran kich thuoc M*NxP chua tat ca anh trong csdl , moi anh la 
% mot vector cot trong ma tran T .
% Theo thuat toan PCA ,dau tien ta se tinh ra m la trung binh cua tat ca cac anh
% trong ma tran T.
% Sau do ta se lay tung buc anh trong T tru cho anh trung binh , ta se duoc mot ma 
% tran A kich thuoc M*NxP 
% Ta can tim Eigenface la nhung vector rieng cua ma tran A*A' , nhung ma
% tran A*A' kich thuoc là M*NxM*N qua lon , ta se tim nhung vector rieng
% cua ma tran A'*A co kich thuoc PxP . Ta se tim nhung vector rieng 
% bang ham eig trong MatLab
% Gia su v la mot vector rieng cua ma tran A'*A , khi do A*v la vector 
% rieng cua ma tran A*A' .
% tap hop nhung vector rieng cua ma tran A*A' goi la Eigenfaces
% tra ve 3 gia tri :
% m anh trung binh
% A tap hop nhung (anh-anh trung binh )
% E nhung vector rieng cua ma tran A*A' 
%tinh toan anh trung binh
m = mean(T,2); 
soanh = size(T,2);
%xuat ra hinh anh cua m
show(m,'Anh trung binh');pause;
% tinh do lech giua anh moi buc anh voi anh trung binh
A = []; 
for i = 1 : soanh
 temp = double(T(:,i)) - m; % T(:,i): vector cot thu i chinh la mot buc anh
 if i<6 
 show(temp,'Anh - Anh TB');pause;
 end 
 A = [A temp];
end
% tim nhung tri rieng va nhung vector rieng cua ma tran A'*A , tu do tim
% nhung vector rieng cua ma tran A*A' la nhung Eigenface
L = A'*A; 
[V D] = eig(L); 
%V chua nhung vector rieng , con D chua nhung tri rieng trong do vector
%rieng V(:,i) ung voi tri rieng D(i,i)
D1=diag(D);
D1=sort(D1);
s=size(D1);s=s(1);
D1=D1(s-18);
LeigV = [];%tap hop vector rieng cua ma tran L=A'*A
for i = 1 : size(V,2) 
 if( D(i,i)>D1 )
 LeigV = [LeigV V(:,i)];
 end
end
%ta chi lay 18 vector rieng ung voi 10 tri rieng lon nhat
%nhu da noi o tren , sau khi co cac vector rieng cua ma tran A'*A , ta tim
%cac vector rieng cua ma tran A*A' bang cach lay ma tran A nhan voi cac
%vector rieng nay , tap hop cac vector rieng cua ma tran A*A' con duoc goi 
%la Eigenface do day la nhung vector rieng va no giong hinh khuon mat .
E = A * LeigV;
%xuat ra mot so hinh anh cua cac Eigenface
for i=1:5
 anh=E(:,i);
 show(anh,'Eigenface');pause;
end
%E la mot co so gom nhung vector truc giao , ta se chuan hoa no de E bien
%thanh mot co so truc chuan
sovector=size(E,2);
for i=1:sovector
 dodai=norm(E(:,i));
 E(:,i)=E(:,i)/dodai;
end
end
function show(m,t)
%ham show duoc su dung de hien thi hinh anh voi kich thuoc mau
%m la matran anh can hien thi
%t la chuoi the hien tieu de cua anh
im=imread('anhmau.jpg');
try
 im=rgb2gray(im);
catch
end
[dong,cot]=size(im);% lay kich thuoc (anhmau.jpg coi nhu bien tam luu kich thuoc) 
tam=reshape(m,cot,dong);
tam=tam';
imshow(tam);
dem=1;
for i=1:dong
 for j=1:cot 
 im(i,j)=tam(i,j);
 end 
end
imshow(im);title(t)
end
function anhtim = nhandien(InputImage, m, A, E)
%Ham nay se so sanh buc anh kiem tra voi tung buc anh trong CSDL .
%Dau tien tinh toa do hinh chieu cua buc anh kiem tra , sau do tinh toa do
%hinh chieu cua tat ca buc anh trong csdl . Cuoi cung do khoang cach giua
%toa do hinh chieu cua nhung buc anh trong csdl voi toa do hinh chieu cua
%anh kiem tra . Buc anh trong csdl co khoang cach ngan nhat voi anh kiem
%tra chinh la buc anh tuong ung voi buc anh kiem tra .
%Inputimage la duong dan toi buc anh can kiem tra
%m la anh trung binh cua cac anh trong csdl 
%A la ma tran , moi cot la do lech giua mot anh trong csdl so voi anh trung
%binh , con goi la vector anh trung tam
%E la tap hop nhung vector rieng cua ma tran A*A'
%m,A va E duoc lay tu ham 'taoEF'
%anhtim la ten cua buc anh tim duoc trong csld
toado = [];%tap toa do hinh chieu cua moi buc anh trong csdl
sovector = size(E,2);%so vector rieng trong E ( la so cot )
for i = 1 : sovector
 tam = E'*A(:,i); %toa do hinh chieu cua buc anh Ai
 toado = [toado tam]; 
end
tam = rgb2gray(InputImage);
[dong cot] = size(tam);
InImage = reshape(tam',dong*cot,1);
%tinh do lech giua anh kiem tra va anh trung binh trong csdl , do lech la
%mot vector cot giong nhu cac vector cot trong ma tran A
dolech = double(InImage)-m; 
%tuong tu nhu khi tim toa do hinh chieu cua cac vector cot cua A , bay gio ta
%tim toa do hinh chieu cua buc anh kiem tra 
toadoKT = E'*dolech; 
%
hinhchieuKT=double(InImage)*0;
for i=1:sovector
 hinhchieuKT=hinhchieuKT + toadoKT(i,1)*E(:,i);
end
show(hinhchieuKT,'Hinh chieu anh len KG anh');pause;%figure;
kc=norm(double(InImage)-hinhchieuKT);
str=num2str(kc);
str=strcat('Khoang cach tu anh kiem tra toi khong gian khuon mat : ',str);
disp(str);
%Bay gio ta se tinh khoang cach giua toa do hinh chieu cua buc anh kiem tra voi
%tat ca toa do hinh chieu cua cac buc anh trong csdl . Toa do hinh chieu cua 
%anh kiem tra se co khoang cach ngan nhat voi hinh chieu cua buc anh tuong 
%ung trong csdl (Hai buc anh cung la khuon mat cua mot nguoi )
%
%ta luu y la moi toa do hinh chieu la mot vector , ta se dung chuan Euclid de tinh
%khoang cach giua 2 vector (2 toa do hinh chieu)
khoangcach = [];
for i = 1 : sovector
 q = toado(:,i);
 tam = ( norm( toadoKT - q ) )^2;
 khoangcach = [khoangcach tam];
endA
%lay ra khoang cach ngan nhat va vi tri cua buc anh tim duoc trong csdl ,
%ta luu y la nhung file anh trong csdl co ten la : 1.jpg , 2.jpg ....
[minKC , vitri] = min(khoangcach);
str=num2str(minKC);
str=strcat('Min khoang cach hai toa do hinh chieu : ',str);
disp(str);
anhtim = strcat(int2str(vitri),'.jpg');
CHƯƠNG 6
PHẠM VI GIỚI HẠN VÀ
HƯỚNG MỞ RỘNG CỦA ĐỀ TÀI
6.1 Phạm vi giới hạn của đề tài
	Do thời gian tiến hành nghiên cứu tài liệu tham khảo có hạn. Đề tài “Nhận dạng mặt người trên Matlab” chỉ sử dụng một thuật toán duy nhất là thuật toán PCA. Nên làm cho chương trình nhận dạng phụ thuộc rất nhiều vào tập huấn luyện, vị trí các khuôn mặt trong hình. Trong quá trình chạy chương trình các ảnh được xử lý tạo ra như: ảnh trung bình, ảnh-ảnh trung bình, EigFace không được lưu lai. Nên khi chạy lại chương trình các ảnh trên sẽ được khỏi tạo lai từ đầu.
6.2 Hướng mở rộng của đề tài
	Đề tài có thể được phát triển thành một phần mện nhận dạng mặt người tốt hơn, bằng cách kết hợp với một số thuật toán nhận dạng và xử lý ảnh hiện đại hơn. Cho ra kết quả chính xác hơn. Có thể phát triển thành đề tài nhận dạng qua webcam…

File đính kèm:

  • docĐề tài Nhận dạng mặt người trên Matlab.doc