Nhận dạng ảnh sử dụng thuật toán PCA
Trang 1VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
BÁO CÁO Project2
NHẬN DẠNG ẢNH SỬ DỤNG THUẬT TOÁN PCA
Nhóm 2
Giảng viên hướng dẩn : ThS Đỗ Văn Uy
Hà Nội: 04-2013
Trang 2
MỤC LỤC
Trang 3Một trong những bài toán được xã hội quan tâm hiện nay là nhận dạng khuôn mặt Chúng ta có thể liệt kê ra một số thuật toán cụ thể để giải quyết vấn đề nhận dạng như : PCA, LDA, ICA, EP, EBGM Tuynhiên vì điều kiện thời gian nên nhóm em chỉ tập trung vào tìm hiểu và làm một ứng dụng nhỏ sử dụng thuật toán đang khá nổi tiếng và thông dụng hiện nay là thuật toán PCA (Principal component analysis) – phân tích thành phần chính
Nội dung trình bày trong báo cáo này ,nhóm em sẽ đi sâu khai thác thuật toán PCA để giải quyết hai vấn đề chính :
Thứ nhất : Xác định vị trí những khuôn mặt trong một bức ảnh
Thứ hai : Tìm một khuôn mặt giống với khuôn mặt cho trước
Trang 4CHƯƠNG I : THƯ VIỆN OPENCV
I. Giới Thiệu Về Thư Viện Mã Nguồn Mở OpenCV.
OpenCV (Open Computer Vision library) do Intel phát triển, đượcgiới thiệu năm 1999 và hoàn thiện thành phiên bản 1.0 năm 2006 Thư viện OpenCV - gồm khoảng 500 hàm – được viết bằng ngôn ngữ lập trình C và tương thích với các hệ điều hành Windows, Linux, Mac OS đóng vai trò xác lập chuẩn giao tiếp, dữ liệu, thuật toán cho lĩnh vực CV
và tạo điều kiện cho mọi người tham gia nghiên cứu và phát triển ứng dụng
Trước OpenCV không có một công cụ chuẩn nào cho lĩnh vực xử
lý ảnh Các đoạn code đơn lẻ do các nhà nghiên cứu tự viết thườngkhông thống nhất và không ổn định Các bộ công cụ thương mại nhưMatlab, Simulink, Halcon, v.v lại có giá cao chỉ thích hợp cho cáccông ty phát triển các ứng dụng lớn Ngoài ra còn có các giải pháp kèmtheo thiết bị phần cứng mà phần lớn là mã đóng và được thiết kế riêngcho từng thiết bị, rất khó khăn cho việc mở rộng ứng dụng
Trang 5dữ liệu hợp lý, thư viện tạo giao diện, truy xuất thiết bị phần cứng đượctích hợp sẵn OpenCV thích hợp để phát triển nhanh ứng dụng
- OpenCV là công cụ mã nguồn mở: Không chỉ là công cụ miễn phí(với BSD license), việc được xây dựng trên mã nguồn mở giúp OpenCVtrở thành công cụ thích hợp cho nghiên cứu và phát triển, với khả năngthay đổi và mở rộng các mô hình, thuật toán
- OpenCV đã được sử dụng rộng rãi: Từ năm 1999 đến nay,OpenCV đã thu hút được một lượng lớn người dùng, trong đó có cáccông ty lớn như Microsoft, IBM, Sony, Siemens, Google và các nhómnghiên cứu ở Standford, MIT, CMU, Cambridge Nhiều forum hỗ trợ
và cộng đồng người dùng đã được thành lập, tạo nên kênh thông tin rộnglớn hữu ích cho việc tham khảo tra cứu
Hình 1.8 Nhận dạng khuôn mặt với Haar classifier
Trang 6II. Tổ chức thư viện OpenCV
Hình 1.7 Tổ chức thư viện OpenCV
- CXCORE chứa các định nghĩa kiểu dữ liệu cơ sở Ví dụ, các cấu
trúc dữ liệu cho ảnh, điểm và hình chữ nhật được định nghĩa trong
cxtypes.h CXCORE cũng chứa đại số tuyến tính và phương pháp thống
kê, chức năng duy trì và điều khiển chuỗi Một số ít, các chức năng đồhọa để vẽ trên ảnh cũng được đặt ở đây
- CV chứa các thuật toán về xử lý ảnh và định kích cỡ camera Các
Trang 7- CVAUX được mô tả trong tài liệu của OpenCV như chứa các mã
cũ và thứ nghiệm Tuy nhiên, các giao diện đơn cho sự nhận diện ảnh ởtrong module này Code sau này chúng được chuyên dụng cho nhậndiện mặt và chúng được ứng dụng rộng rãi cho mục đích đó
- HIGHGUI và CVCAM được đặt trong cùng thư mục là
- Cấu trúc dữ liệu ảnh số và các dữ liệu hỗ trợ cần thiết: ma trận,
vector, chuỗi, xâu và cây
- Xử lí ảnh căn bản: các bộ lọc có sẵn, tìm chi tiết cạnh, góc, chỉnh
đổi màu, phóng to thu nhỏ, và hiệu chỉnh histograms
- Xử lí cấu trúc: tìm viền, nhận chuyển động, thay đổi trong khônggian 3D, đối chiếu bản mẫu, xấp xỉ các đơn vị hình học cơ sở - mặtphẳng, đa giác, ellipse, đường thẳng
Trang 8- Phân tích dữ liệu ảnh: nhận dạng thực thể, theo dõi các chi tiết và
phân tích chuyển động
- Tạo giao diện đơn giản: hiển thị ảnh, thao tác bàn phím, chuột,
thanh trượt để chỉnh thông số (nếu cần thiết các bạn có thể tự tạo thêmcác phím điều khiển thông qua thao tác chuột, hoặc tích hợp thêm cácthư viện về giao diện như wxWidgets)
- Chức năng vẽ, chú thích lên ảnh.
III Hàm cho một số chức năng cụ thể
IplImage: kiểu cấu trúc lưu giữthông tin file ảnh cần load, như: định
dạng, kích thước, dung lượng, màu sắc,…
Trang 91.2. Chức năng Lọc Nhiễu.
cvCreateImage():Tạo 1 ảnh mới có các thông số tương ưng với ảnh
gốc
cvSmooth():Thưc hiện bộ lọc trung bình.
cvNamedWindow():Tạo cửa sổ hiển thị ảnh.
Trang 111.3. Đổi màu ảnh.
cvCvtColor():Đổi màu ảnh.
cvNamedWindow( ):Tạo cửa sổ để hiển thị ảnh
CvCapture:cấu trúc chứa thông tin của File AVI.
cvCreateFileCapture(): Lấy thông số từ File Avi được Load.
Trang 12hệ thống sẽ đọc các ảnh từ đoạn VIDEO và xếp chúng thành một dãy các ảnh động liên tiếp nhau nên ta cũng có cảm giác như đang xem một VIDEO.
Trang 13CHƯƠNG II : THUẬT TOÁN PCA
Phân tích thành phần chính (Principal Component Analysis) gọi tắt
là PCA là thuật toán nhận dạng ảnh dựa trên những nét tổng thể của khuôn mặt
Ban đầu ta có một tập ảnh khuôn mặt gọi là tập ảnh huấn luyện (training set) Giả sử mỗi ảnh có kích thước M*N , ta coi mỗi bức ảnh này là một vector trong không gian M*N chiều Bây giờ mỗi
khuôn mặt là một vector , ta thấy những vector này không phân bố ngẫu nhiên trong không gian ảnh mà phân bố theo một quy luật tươngđối nào đó, ta cI.ó thể nói những vector này nằm trong một không gian còn gọi là không gian khuôn mặt Từ những vector trong tập huấn luyện , ta sẽ tìm một cơ sở trực chuẩn cho không gian khuôn
Trang 14mặt Những vector thuộc cơ sở này có thể coi là những vector mang những nét tổng thể đặc trưng về khuôn mặt
II Phân tích thành phần chính PCA
Giả sử tập huấn luyện có P ảnh , khi đó ta sẽ sở P vector : T1, T2
Trang 15Những vector uk và giá trị vô hướng , chính là những vector riêng
và trị riêng tương ứng của ma trận AAT có kích thước M*N x M*N,
do kích thước ma trện này quá lớn nên ta không thể tìm được những vector riêng và trị riêng trực tiếp được , thay vào đó ta sẽ tìm những vector riêng của ma trận ATA có kích thước PxP
Nếu v là một vector riêng của ATA và là trị riêng tương ứng, khi
đó ta có :
ATAv = v <=> AATAv = AvTức Av là một trị riêng của ma trận AAT
Thông thường ta chỉ lấy một số Q vector riêng ứng với Q trị riêng
Trang 16E = AV là tập các vector riêng của AAT Do đây là những vector riêng , mà nó lại có dạng khuôn mặt nên còn gọi là Eigenfaces E là
ma trận M*NxQ , mỗi cột là một vector riêng
Chuẩn hóa các vector cột trong E (chia mỗi vector cho độ dài của vector đó )
Bây giờ ta có thể coi E là một trực chuẩn của không gian khuân mặt Với H là bức ảnh có cùng kích thước với tập huấn luyện Ta sẽ xét nó có phải là bức ảnh khuôn mặt hay không, cũng như tìm bức ảnh giống với nó nhất trong tập huấn luyện
H được xem là một vector trong không gian M*N chiều
Đặt K = H – m với m là vector ảnh trung bình
Cho V là một không gian có tích vô hướng hữu hạn chiều và W
là một không gian con của V Giả sử W có một cơ sở trực chuẩn là {u1, ,uQ} Khi đó hình chiếu trực giao của vector u bất kì lên W được xác định như sau :
Trang 17Tập hợp ci = <u / ui>, i = 1, Q được gọi là tọa độ của u0 trong khônggian W
Tìm C = ETAi là tọa độ của hình chiểu Kf của K lên không gian khuônmặt C là vector cột Q x 1
Với ci = C(i, 1); ei = E( : , i)
Với Ai là một cột trong ma trận A (tương ứng với bức ảnh Ti trong tập huấn luyện) Ta tính Ci = ETAi là tọa độ của hình chiếu Aif của A lên không gian khuôn mặt
Ta tính hai đại lượng sau :
• S = || K – Kf || xem như là khoảng cách từ bức ảnh H đến không gian khuôn mặt
• Si = || C- Ci || xem như là khoảng cách từ H đến bức ảnh Ti trong tập huấn luyện
Xét a và b là hai ngưỡng nào đó :
• s < a thì H là bức ảnh khuôn mặt (do H đủ gần với không gian khuôn mặt )
• si < b thì Ti là bức ảnh của cùng một người với H (đủ gần với
Ti) Vậy là ta có thể tìm được bức ảnh trong tập huấn luyện giống với bức ảnh H hay xác định đó có phải là bức ảnh trong tập huấn luyện Tuy nhiên ảnh H phải có cùng kích thước với những bức ảnh trong tập huấn luyện Bây giờ
Trang 18trong một bức ảnh lớn hơn H có nhiều khuôn mặt ta sẽ xác định vị trí của những khuôn mặt trong bức ảnh
Tại mỗi vị trí (x, y) trong H , đặt H(x, y) là một vùng trong H có kích thước M x N tại (x, y) , ta xem ảnh con H(x, y) là một vector M*N chiều
III Hình ảnh minh họa
Trong ví dụ này ta có một tập huấn luyện gồm những khuôn mặt có kích thước 180 x 200 pixel , dưới đây là một số hình ảnh của những eigenfaces thu được (lưu ý đây chỉ là các vector trực giao , những
eigenfaces thực sự chính là những vector này được chuẩn hóa )
Trang 19Bây giờ ta chiếu hai bức ảnh lên không gian khuôn mặt này :
Như ta đã thấy nếu bức ảnh là khuân mặt người thì hình chiếu của nó
sẽ khá giống với ảnh gốc , còn khi bức ảnh không phải là người thì hình chiếu sẽ khác với ảnh gốc rất nhiều , do đó khoảng cách từ bức ảnh mặt người tới không gian mặt sẽ nhỏ hơn rất nhiều so với khoảng cách từ bức ảnh không phải mặt người tới không gian mặt
Dưới đây là một ví dụ khác , ta có một tập huấn luyện gồm những bức ảnh có kích thước 18 x 27 pixel , ta cũng tìm các Eigenfaces và sau đó
Trang 20con H(x, y) vùng hình chũ nhật có tâm tại (x, y) trên bức ảnh và có kích thước 18 x 27 pixel
Trang 21Bây giờ nếu ta có một cơ sở dữ liệu những ảnh không phải khuân mặt (ta thường tập trung vào những hình ảnh xung quanh khuân mặt như cổ
áo , một phần của khuôn mặt ) Tìm face map của bức ảnh ban đầu với không gian không phải của khuôn mặt này , ta thu được kết quả như sau
Hình trên cũng khá giống với face map ứng không gian khuôn mặt nhưng tại mỗi vùng sáng trên hình chữ nhật thì không hề có tâm ở giữa Thực ra từ face map ứng với không gian khuôn mặt , nếu ta có một thuật toán tốt để tìm những vị trí cực tiểu địa phương thì đã có thể xác định vị trí các khuôn mặt Face map ứng với không gian không phải khuôn mặt chỉ là một cách đơn giản giúp ta tìm chính xác hơn thôi
Tất cả những điều thu được ở trên chỉ là kết quả hoàn toàn dựa trên lý thuyết , trong thực tế những thuật toán nhận dạng mặt người đã phát triển lên rất nhiều từ ý tưởng của thuật toán PCA mới có được độ chính xác yêu cầu
Trang 22CHƯƠNG III : MÔ PHỎNG CHƯƠNG TRÌNH
I Công cụ sử dụng và một số file liên quan
Trang 231.2 Công cụ Visual studio C++ 2010 Express
- Chúng ta sẽ sử dụng công cụ này để viết ứng dụng bằng
+ test.txt : Lưu chỉ số và đường dẫn các ảnh dùng để kiểm tra
Trang 24- File facedata.xml chứa các dữ liệu trong quá trình nhậndạng như số ảnh huấn luyện , vector ảnh trung bình
- Các thư mục ảnh S1 , S2 , S3 , S40 , trong mỗi thư mục có chứa 10 ảnh của cùng một người trong các trạng thái khác nhau chương trình sẽ lấy một số ảnh trong các thư mục này để làm đầu vào trong việc huấn luyện và tìm khuôn mặt giống với khuôn mặt cho trước
- Các ảnh để chúng ta tìm và đánh dấu các khuôn mặt có
Trang 25II Các biến , hàm trong sử dụng trong chương trình
2.1 Chức năng tìm khuôn mặt giống với khuôn mặt cho trước
Sử dụng các biến toàn cục :
- int nTrainFaces : số ảnh được đưa ra để huấn luyện
- int nEigens : số các giá trị riêng
- IplImage **faceImgArr : mảng chứa các ảnh
- IplImage *pAvgTrainImg : ảnh trung bình
- IplImage **eigenVecArr : vector riêng
- CvMat *personNumTruthMat : mảng chứa các chỉ số
ảnh
- Cv *projectedTrainFaceMat : lưu trữ các khuôn mặt
huấn luyện sau khi chiếu lên không gian con PCA
Sử dụng các hàm :
- learn() : thực hiện công việc
+ load dữ liệu (chỉ số và đường dẫn ảnh để huấn luyện trong file train.txt)
+ thực hiện thuật toán PCA để tìm không gian con+ chiếu dữ liệu huấn luyện lên không gian con+ lưu lại tất cả các thông tin (giá trị riêng, vector riêng, ảnh trung bình, chỉ số ảnh , khuôn mặt được chiếu)
- recognize() : thực hiện công việc : + load dữ liệu (chỉ số và đường dẫn ảnh để kiểm tra
trong file “test.txt”)
+ chiếu ảnh cần kiểm tra lên không gian con PCA
(dùng hàm cvEigenDecomposite( ))
+ đưa ra kết quả là chỉ số ảnh nhận dạng được theo
Trang 26- doPCA() : khởi tạo các biến số , ma trận để làm đầu
vào và nhận kết quả đầu ra khi gọi hàm xử lý theo thuậttoán PCA (cvCalcEigenObjects( ))
- storeTrainingData() : lưu tất cả dữ liệu vào file
“facedata.xml”
- loadTrainingData( Cv **pTrainPersonNumMat) :
load dữ liệu trong file “facedata.xml”
- findNearestNeighbor ( float *projectedTestFace ) : so
sánh từng ảnh test với từng ảnh train , tìm và trả lại chỉ
số của ảnh train có khoảng cách nhỏ nhất với nó
- loadFaceImgArray(char *filename) : load ảnh cũng
như chỉ sổ của nó lưu trữ vào mảng
2.2 Chức năng tìm và đánh dấu khuôn mặt có trong ảnh
Sử dụng các biến toàn cục:
- CvHaarClassifierCascade *pCascade : load dữ liệu từ
file XML trong opencv
Trang 27Sau khi chạy chương trình , màn hình xuất hiện
Ta chọn chức năng 1, màn hình yêu cầu nhập tên file ảnh
Trang 28Nhập tên file ảnh , chương trình cho kết quả
Trang 29Tắt cửa sổ ảnh , chương trình hỏi bạn có muốn tiếp tục tìm kiếm khuôn mặt nữa không , bạn chọn “y” và nhập tên file ảnh và lặp lại quá trình trên
Nếu không muốn thực hiện thao tác này ta chọn “n” , chương trình hỏi bạn có muốn tiếp tục với chức năng khác không , nếu chon “n” chương trình sẽ dừng , chọn “y” chương trình trở về menu ban đầu
Trang 30Ta chọn chức năng 2
Trang 31Chọn tiếp chức năng 1.
Chương trình hỏi tiếp ta nhập “n”
sau đó nhập “y” để đồng ý nhận dạng ảnh, chương trình hiển thị kết quả
Chức năng 2 trong Mục lựa chọn tiếp cũng cho kết quả tương tự
Trang 33KẾT LUẬN
PCA là phương pháp dùng để xây dựng đặc trưng khuôn mặt , nó
là một nền tảng đẻ phát triển các thuật toán khác Thực tế có rất
nhiều tác giả đã áp dụng thuật toán PCA , kết hợp với những phương pháp như mạng neuralb , xác xuất thông kê để xây dựng những thuật toán có độ chính xác cao Ưu điểm của thuật toán PCA là nó dễ cài đặt , nếu ta xét bài toàn tìm khuôn mặt giống nhau thì chỉ cần áp dụnghoàn toàn vào lý thuyết là đã có độ chính xác khá cao, nếu áp dụng cho bài toán tìm vị trí khuôn mặt thì cần phải có một thuật toán nữa
để sử dụng face map thu được theo lý thuyết Khuyết điểm của PCA
là các mẫu khuôn mặt luân phụ thuộc vào tập huấn luyện , có nghĩa làcác khuôn mặt trong ảnh kiểm tra phải giống với các ảnh huấn luyện
về kích thước , tư thế , độ sáng Thực tế trong tập huấn luyện gồm nhiều nhóm hình , mỗi nhóm hình là hình của một người với tư thế và
đã cung cấp một cơ sở rất đễ dàng cho việc mô tả đặc trưng khuôn mặt ,
để từ đó có thể phát triển những thuật toán nhận dạng khác Vì vậy có
Trang 34thể PCA không phải là tốt nhất , nhưng là thuật toán phổ biến nhất được
áp dụng trong bài toán nhận dạng mặt người
TÀI LIỆU THAM KHẢO
https://en.wikipedia.org/wiki/Principal_component_analysis
http://www.cognotics.com/opencv/servo_2007_series/part_2/index.htmlhttp://www.bytefish.de/blog/pca_in_opencv/
http://www.pages.drexel.edu/~nk752/tutorials.html
http://dphtuan.uphero.com/dphtuannews/posts