Tải bản đầy đủ (.docx) (34 trang)

Nhận dạng ảnh sử dụng thuật toán PCA

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.13 MB, 34 trang )

ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆ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


Nhận dạng ảnh sử dụng thuật toán PCA

MỤC LỤC

Project2 – GVHD : Đỗ Văn Uy

Page 2


Nhận dạng ảnh sử dụng thuật toán PCA

LỜI MỞ ĐẦU
Hiện nay , cùng với sự phát triển của xã hội , vấn đề an ninh, bảo mật
đang được yêu cầu khắt khe tại mọi quốc gia trên thế giới . Các hệ thống
nhận dạng con người, đồ vật .... được ra đời và phát triển với độ tin cậy
ngày càng cao . Với cách tiếp cận đối tượng nhận dạng theo phương


pháp này , chúng ta có thể thu nhận được nhiều thông tin từ đối tượng
hơn, mà không cần tác động nhiều đến đối tượng cũng vẫn đảm bảo tính
chính xác , an toàn , thuận tiện .

Mộ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 .... Tuy
nhiê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 .

Project2 – GVHD : Đỗ Văn Uy

Page 3


Nhận dạng ảnh sử dụng thuật toán PCA

CHƯƠ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, được
giớ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ường
khô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ác
cô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èm
theo thiết bị phần cứng mà phần lớn là mã đóng và được thiết kế riêng
cho từng thiết bị, rất khó khăn cho việc mở rộng ứng dụng.
OpenCV là công cụ hữu ích cho những người bước đầu làm quen
với xử lý ảnh số vì các ưu điểm sau:
- OpenCV là công cụ chuyên dụng: Được Intel phát triển theo
hướng tối ưu hóa cho các ứng dụng xử lí và phân tích ảnh, với cấu trúc
Project2 – GVHD : Đỗ Văn Uy

Page 4


Nhận dạng ảnh sử dụng thuật toán PCA
dữ liệu hợp lý, thư viện tạo giao diện, truy xuất thiết bị phần cứng được
tí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 OpenCV
trở thành công cụ thích hợp cho nghiên cứu và phát triển, với khả năng
thay đổ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ác

công ty lớn như Microsoft, IBM, Sony, Siemens, Google và các nhóm
nghiê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ộng
lớ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
Project2 – GVHD : Đỗ Văn Uy

Page 5


Nhận dạng ảnh sử dụng thuật toán PCA

II.

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
chức năng hình họa máy tính cũng được đặt ở đây.

Project2 – GVHD : Đỗ Văn Uy

Page 6



Nhận dạng ảnh sử dụng thuật toán PCA
- 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ận
diệ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à
“otherlibs”.
+ HIGHGUI : chứa các giao diện vào ra cơ bản, nó cũng chứa các
khả năng cửa sổ mở rộng và vào ra video.
+ CVCAM : chứa các giao diện cho video truy cập qua DirectX
trên nền Windows 32 bits.
Kèm theo thư viện là tài liệu hướng dẫn và các ví dụ mẫu thể hiện
một phần các chức năng của công cụ OpenCV.
Các chức năng của openCV tập trung vào thu thập ảnh, xử lí ảnh và
các thuật toán phân tích dữ liệu ảnh, bao gồm:
- Truy xuất ảnh và phim: đọc ảnh số từ camera, từ file, ghi ảnh và
phim
- 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ông
gian 3D, đối chiếu bản mẫu, xấp xỉ các đơn vị hình học cơ sở - mặt
phẳng, đa giác, ellipse, đường thẳng...

Project2 – GVHD : Đỗ Văn Uy

Page 7



Nhận dạng ảnh sử dụng thuật toán PCA
- 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êm
các phím điều khiển thông qua thao tác chuột, hoặc tích hợp thêm các
thư 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ể
1.1.

Load ảnh.

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,…
cvLoadImage(): Hàm load ảnh.
cvNamedWindow():Thiết lập cửa sổ để hiện thị ảnh.
cvShowImage():Hiển thi ảnh.
cvWaitKey(0):Chờ bấm phím bất kỳ để kết thúc chương trình.
cvReleaseImage( ):Xóa ảnh
cvDestroyWindow( ):Xóa cửa sổ.

Project2 – GVHD : Đỗ Văn Uy

Page 8


Nhận dạng ảnh sử dụng thuật toán PCA


1.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.

Project2 – GVHD : Đỗ Văn Uy

Page 9


Nhận dạng ảnh sử dụng thuật toán PCA

Project2 – GVHD : Đỗ Văn Uy

Page 10


Nhận dạng ảnh sử dụng thuật toán PCA
1.3.

Đổi màu ảnh.

cvCvtColor():Đổi màu ảnh.

1.4.


Đọc ảnh từ VIDEO.

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.

Project2 – GVHD : Đỗ Văn Uy

Page 11


Nhận dạng ảnh sử dụng thuật toán PCA
hệ 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.

1.5.

Đọc ảnh từ Camara

cvCreateCameraCapture(0): hoạt động tương tự như hàm
cvCreateFileCapture()

Webcam máy tính sẽ bật lên,hệ thống sẽ nhận ảnh từ CAMERA.

Project2 – GVHD : Đỗ Văn Uy

Page 12



Nhận dạng ảnh sử dụng thuật toán PCA

CHƯƠNG II :

THUẬT TOÁN PCA

I. Ý tưởng
Khuôn mặt người có rất nhiều nét để nhận biết , nếu như ta gặp
một người bạn sau một thời gian dài, ta có thể nhận ra ngay người đó
dù những chi tiết cụ thể trên người đó có thể thay đổi như da , mái
tóc. Ta nhận ra ngay người đó không phải vì nhớ được đôi mắt , mũi ,
hay môi , tóc , lông mày mà ta nhận ra vì nhớ được diện mạo của
người đó. Tức là tồn tại một nét tổng thể nào đó để có thể nhận diện ,
thuật toán của ta bắt đầu từ ý tưởng này .
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
Project2 – GVHD : Đỗ Văn Uy


Page 13


Nhận dạng ảnh sử dụng thuật toán PCA
mặ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 ..
Tp .
Tính vector ảnh trung bình :

Sự khác biệt giữa những khuôn mặt với ảnh trung bình là những
vector :
Ai = Ti – m , i = 1 ... P
Ý tưởng của việc phân tích thành phần chính là tìm một tập những
vector trực chuẩn uk sao cho những vetor này mô tả tốt nhật sự phân
bố những vector khuôn mặt trong không gian . Những vector uk được
chọn sao cho :

Project2 – GVHD : Đỗ Văn Uy

Page 14


Nhận dạng ảnh sử dụng thuật toán PCA

Nhữ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à
đó ta có :
ATAv =

là trị riêng tương ứng, khi

v <=> AATAv =

Av

Tứ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
có giá trị lớn nhất .
Sau khi có các vector riêng của ma trận AAT , ta sẽ chuẩn hóa
chúng để thu được một cơ sở trực chuẩn của không gian mặt .
Đặt L = ATA , tìm V là tập hợp các vector riêng của L, D là tập hợp
các trị riêng tương ứng .
V bao gồm Q vector riêng ứng với những trị riêng lớn hơn một giá trị
nào đó hoặc tương ứng với Q trị riêng lớn nhất trong D .
Project2 – GVHD : Đỗ Văn Uy

Page 15


Nhận dạng ảnh sử dụng thuật toán PCA
E = 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 :

Độ dài || u – u0 || được gọi là khoảng cách từ u đến W .

Project2 – GVHD : Đỗ Văn Uy

Page 16


Nhận dạng ảnh sử dụng thuật toán PCA
Tập hợp ci = <u / ui>, i = 1,...Q được gọi là tọa độ của u 0 trong không
gian W .
Tìm C = ETAi là tọa độ của hình chiểu Kf của K lên không gian khuôn
mặ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
T i) .
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ờ

Project2 – GVHD : Đỗ Văn Uy

Page 17



Nhận dạng ảnh sử dụng thuật toán PCA
trong 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 .
K(x, y) = H(x, y) – m
Tìm Kf (x, y) là hình chiếu của K(x, y) lên không gian
khuân mặt .
Tính s(x, y) = || K(x, y) - Kf (x, y)) ||
Tập hợp các giá trị s(x, y) tạo thành một bản đồ khuôn mặt
(face map) của H , từ đó ta có thể xác định vị trí những khuôn
mặt trong ảnh .

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 )

Project2 – GVHD : Đỗ Văn Uy

Page 18


Nhận dạng ảnh sử dụng thuật toán PCA
Bâ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 đó
tìm các face map của một bứa ảnh để kiểm tra . Trong ví dụ này thì ảnh
Project2 – GVHD : Đỗ Văn Uy

Page 19


Nhận dạng ảnh sử dụng thuật toán PCA
con 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 .

Hình trên là map của bức ảnh ban đầu
Ta thấy vị trí mỗi khuân mặt là những vùng cực tiểu địa phương trên
bức ảnh (là những đốm đen trong những vùng trắng hình chữ nhật).
Project2 – GVHD : Đỗ Văn Uy

Page 20


Nhận dạng ảnh sử dụng thuật toán PCA
Bâ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 .

Project2 – GVHD : Đỗ Văn Uy

Page 21


Nhận dạng ảnh sử dụng thuật toán PCA
.

CHƯƠNG III : MÔ PHỎNG CHƯƠNG TRÌNH
I. Công cụ sử dụng và một số file liên quan
1.1. Thư viện Opencv 2.4.3
- Là thư viện hỗ trợ xử lý hình ảnh

Project2 – GVHD : Đỗ Văn Uy

Page 22



Nhận dạng ảnh sử dụng thuật toán PCA
1.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
C.
- Công cụ này cần được cộng thêm thư viện của opencv
2.4.3

1.3. Bộ dữ liệu sử dụng
- Hai file :
+ train.txt : lưu thông tin những ảnh được đưa ra để
huấn luyện (bao gồm chỉ số ảnh và đường dẫn đến ảnh)

+ test.txt : Lưu chỉ số và đường dẫn các ảnh dùng để
kiểm tra .

Project2 – GVHD : Đỗ Văn Uy

Page 23


Nhận dạng ảnh sử dụng thuật toán PCA

-

-

File facedata.xml chứa các dữ liệu trong quá trình nhận
dạ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ó
trong nó test1.jpg, test2.jpg ...

Project2 – GVHD : Đỗ Văn Uy

Page 24


Nhận dạng ảnh sử dụng thuật toán PCA

II. 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
chương trình và ảnh thực .

Project2 – GVHD : Đỗ Văn Uy

Page 25


×