Đề 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
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:
- Đề tài Nhận dạng mặt người trên Matlab.doc