Hình 3.4: Giao diện kết quả sau khi xác định được khuôn mặt chung nhất
3.2 Phát hiện khuôn mặt
Phƣơng pháp phát hiện khuôn mặt dùng đặc trƣng Giống Haar kết hợp Adaboost đã đƣợc cài đặt sẵn trong thƣ viện mở OpenCV của Intel- hàm cvHaarDetectObjects.
Hàm cvHaarDetectObjects có các tham số sau :
CVAPI(CvSeq*) cvHaarDetectObjects( const CvArr* image, CvHaarClassifierCascade* cascade,
CvMemStorage* storage, double scale_factor CV_DEFAULT(1.1),
int min_neighbors CV_DEFAULT(3), int flags CV_DEFAULT(0),
Trong đó CvArr* image là tập các ảnh cần phát hiện khuôn mặt, CvHaarClassifierCascade* cascade là bộ phân lớp và là thành phần quan trọng nhất trong hệ thống, đƣợc tải từ file xml hoặc ymxl đƣợc xây dựng sẵn trên các bộ cơ sở dữ liệu chuẩn. OpenCV cho phép đối với mỗi bộ cơ sở dữ liệu chúng ta có thể xây dựng một file xml riêng, trong thƣ viện cài đặt sẵn hàm xây dựng file xml cvCreateHidHaarClassifierCascade. Để tải một cascade ta có thể sử dụng hàm cvLoad trong OpenCV
char *fdata = "haarcascade_frontalface_alt_tree.xml";
cascade = ( CvHaarClassifierCascade* )cvLoad( fdata, 0, 0, 0 ),
CvMemStorage* storage dùng lƣu trữ tập hợp hình chữ nhật thỏa mãn điều kiện tìm kiếm. Scale_factor là tỷ lệ tăng kích thƣớc của cửa sổ (window) trong quá trình dịch cửa sổ trên toàn bộ bức ảnh. Ví dụ 1.1 có nghĩa là tăng kích thƣớc của cửa sổ 10%, Min_neighbors giá trị nhỏ nhất (trừ đi 1) của những “hình chữ nhật hàng xóm” tạo nên một đối tƣợng, tất cả những nhóm có số lƣợng hình chữ nhật nhỏ hơn min_neighbors –1 đều bị bỏ qua. Nếu min_neighbors = 0 , hàm sẽ không nhóm các hình chữ nhật lại, có thể sử dụng khi mà chúng ta có các thủ tục nhóm riêng. Flags: quy định phƣơng thức thực hiện. Hiện tại chỉ có một cờ đƣợc chỉ rõ là CV_HAAR_DO_CANNY_PRUNING. Nếu cờ đƣợc đặt, hàm sẽ sử dụng bộ phát hiện cạnh Canny để bỏ qua một số vùng có chứa quá ít hoặc quá nhiều cạnh. Giá trị lấy ngƣỡng thực tế đƣợc điều chỉnh cho nhận dạng khuôn mặt, trong trƣờng hợp này, cắt tỉa làm tăng tốc độ xử lý. min_size : kích thƣớc nhỏ nhất chấp nhận đƣợc của khuôn mặt. Kết quả hệ thống của tác giả xây dựng sau khi áp dụng hai hàm vừa trình bày ở trên nhƣ trong hình 3.5.
Hình 3.5: Giao diện kết quả phát hiện khuôn mặt
Sau khi dò tìm và phát hiện đƣợc khuôn mặt trong ảnh, chúng ta cần trích rút những thông tin quan trọng gọi là đặc trƣng của từng khuôn mặt. Trong phạm vi của luận văn, tác giả dùng hai phƣơng pháp là PCA và ASM để trích rút tập đặc trƣng của các khuôn mặt
3.3.1 Phân tích thành phần chính
Phân tích thành phần chính (PCA), còn đƣợc gọi là chuyển đổi Karhunen-Loève, là một biến đổi tuyến tính có thể nắm bắt sự thay đổi của dữ liệu đầu vào. PCA tìm ra một không gian mới theo hƣớng biến thiên mạnh nhất của một tập hợp các vector trong không gian cho trƣớc giúp giảm số chiều của dữ liệu. Trong không gian mới ít chiều hơn, nhƣng lại có khả năng biểu diễn dữ liệu tốt tƣơng đƣơng với không gian cũ đảm bảo đƣợc tối đa thông tin quan trọng nhất. Trong hệ thống, PCA đƣợc sử dụng để tạo ra một ảnh mới từ ảnh ban đầu. Ảnh này có kích thƣớc nhỏ hơn rất nhiều với kích thƣớc ảnh ban đầu nhƣng vẫn mang những đặc trƣng cơ bản nhất mà tác giả muốn trích rút.
Xét trên phƣơng diện toán học, ta cần xác định những thành phần chủ yếu tạo nên khuôn mặt, hay những vector riêng (eigenvector) của ma trận phƣơng sai của tập các ảnh khuôn mặt; coi một ảnh là một điểm(hay vector) với trong không gian kích thƣớc lớn. Các vector riêng đƣợc sắp xếp, mỗi vector đƣợc là một số lƣợng các đặc tính riêng biệt của các khuôn mặt. Các vector riêng này có thể coi là một các đặc tính từ đó tạo ra sự khác biệt giữa các khuôn mặt. Các vector riêng có thể đƣợc biểu diễn giống với dạng một khuôn mặt, do đó ta có thể gọi đây là các khuôn mặt riêng – eigenfaces.
Hình 3.6: Chuyển ảnh khuôn mặt sang vector
Với mỗi ảnh con khuôn mặt I1, I2, …, In có kích thƣớc NxN ta chuyển thành vector N2x 1 chiều (số chiều quá lớn). Mục tiêu của phƣơng pháp PCA là “giảm số chiều” của 1 tập vector trên sao cho vẫn đảm bảo đƣợc “tối đa thông tin quan trọng nhất” . Tức trích rút đặc trƣng- Feature extraction (giữ k thuộc tính “mới”) chứ không phải Lựa chọn đặc trƣng - Feature selection (giữ lại k thuộc tính nguyên gốc ban đầu). Ta có thể khái quát các bƣớc của phƣơng pháp PCA áp dụng trong hệ thống nhƣ sau:
B1 Đƣa các ảnh khuôn mặt I1, I2, … Inđã dò tìm, phát hiện về cùng kích thƣớc chuẩn là 100 x 100 Ảnh khuôn mặt có kích thƣớc NxN Chuyển thành Vector N2x1
Hình 3.7: Tập ảnh khuôn mặt sau khi chuẩn hóa cùng kích thước
B2Biểu diễn mọi ảnh Ii thành các vector xi ta thu đƣợc 1 tập dữ liệu X = [x1, x2,…, xn]
Trong đó n là số lƣợng ảnh khuôn mặt, xi là ảnh khuôn mặt thứ i có kích thƣớc là 200x200. Tức là X là ma trận 2 chiều gồm n hàng và 40 000 cột
B3 Áp dụng hàm khởi tạo PCA::PCA đã có sẵn trong thƣ viện OpenCV
PCA pca(const Mat &data, const Mat &mean, int flags,
int maxComponents=0)
Trong đó Mat &data - là ma trận tập đặc trƣng đầu vào đƣợc lƣu trữ dƣới dạng ma trận hàng. Mat &mean - là giá trị ma trận trung bình, nếu ma trận này rỗng thì giá trị trung bình sẽ đƣợc tính từ tập dữ liệu data. Còn tham số int flags - là cờ hoạt động đƣợc sử dụng để xác định cách bố trí dữ liệu theo hàng hay theo cột,
CV_PCA_DATA_AS_ROW cho biết là các mẫu tập trƣng đầu vào ở đây là mỗi một khuôn mặt đƣợc lƣu trữ nhƣ một hàng của ma trận. CV_PCA_DATA_AS_COL cho biết là các mẫu tập trƣng đầu vào ở đây là mỗi một khuôn mặt đƣợc lƣu trữ nhƣ một cột của ma trận. Cuối cùng maxComponents – là số lƣợng tối các thành phần PCA
đƣợc giữ lại, mặc định tất cả các thành phần đƣợc giữ lại.
Tiếp theo sử dụng hàm PCA::project để chiếu các vector từ không gian ban đầu sang không gian của các thành phần chính.
void project ( const Mat &vec,
CV_OUT Mat &result) const
đầu ra sau khi chiếu vector vec vào không gian các thành phần chính. Trong hệ thống, ở giai đoạn PCA tác giả dùng mỗi một khuôn mặt lƣu trữ tại một hàng của ma trận đặc trƣng - CV_PCA_DATA_AS_ROW. Vì thế ma trận đầu ra result có số lƣợng hàng bằng số lƣợng hàng của vector đầu vào, có nghĩa là result.row = vec.row. Và số lƣợng cột của ma trận đầu ra chính là số lƣợng các thành phần chính( ví dụ maxComponents
chính là số lƣợng đƣợc truyền trong giai đoạn PCA).
3.3.2 Mô hình diện mạo tích cực
ASM là một phƣơng pháp dựa trên mô hình sử dụng một mô hình cho trƣớc của tất cả các mô hình khuôn mặt đã đƣợc xây dựng từ trƣớc. Phƣơng pháp này sau khi huấn luyện và xây dựng mô hình tiến hành so khớp với khuôn mặt trong ảnh, thƣờng thì cố gắng tìm vị trí phù hợp nhất giữa các mô hình với các dữ liệu trong một hình ảnh khuôn mặt. Khi xây dựng mô hình ASM phải có một cơ sở dữ liệu hình ảnh gắn với tập tin chú thích của nó, thƣờng có hai định dạng hỗ trợ là asf và pts. Trong hệ thống, tác giả dùng mô hình có sẵn đã đƣợc huấn luyện, bạn có thể tải mô hình này tại trang chủ blog của greatyao [21]. Tiếp theo hệ thống tiến hành trích rút đặc trƣng khuôn mặt, thuật toán đƣợc mô tả tổng quát nhƣ dƣới hình 3.8:
Hình 3.8:Thuật toán so khớp khuôn mặt
THUẬT TOÁN ASM_FITTING Input: LI – tập ảnh gồm n ảnh
cascade_name – dữ liệu huấn luyện cascade
model_name – dữ liệu mô hình sau khi được huấn luyện
Output: D – Tập đặc trưng khuôn mặt
1. Khởi tạo
nImages n; totalFaces 0;
2. Load dữ liệu
init_detect_cascade(cascade_name); Read(model_name);
3. Mô hình hóa khuôn mặt
For i = 0 to nImages do
Bool flag detect_all_faces(&detshapesi , &nFace, LIi );
If (flag)
For j = 0 to nFaces() do Begin
Sj InitShape(detshapesj ); totalFaces ++;
End;
Sj Fit_asm(Sj)
4. Trích rút đặc trƣng
For k = 0 to totalFaces do Dk Feature(Sk);
Thuật toán ASM_fitting có các tham số đầu vào là một tập ảnh các khuôn mặt cho trƣớc, các dữ liệu haarlike và mô hình sau khi huấn luyện đã nói ở phần trên. Hàm
detect_all_face() nếu phát hiện đƣợc khuôn mặt trong mỗi bức ảnh sẽ trả về giá trị flag = true. Khi phát hiện đƣợc mỗi khuôn mặt trong bức ảnh, hàm InitShape() trả về một hình chữ nhật bao khuôn mặt đƣợc lƣu trữ dƣới dạng hai điểm Top-left và Bottom- Right. Hàm Fit_asm() sẽ so khớp hình dạng đƣợc mô hình hóa từ hàm InitShape()
cho phù hợp với khuôn mặt hiện tại đang xét cho ta 68 điểm mốc. Cuối cùng hàm
Feature() sẽ trích rút đặc trƣng lƣu trữ dƣới dạng phù hợp.
Trong hệ thống thu đƣợc 68 điểm mốc sau quá trình so khớp fitting, một hình dạng đƣợc định nghĩa gồm 68 điểm mốc này, đƣợc thành lập bằng cách kết hợp các phần tử biểu diễn vị trí của các điểm độc lập {(xi, yi)} đƣợc gọi là điểm mốc:
S = ),
Để trích rút đặc trƣng mỗi một khuôn mặt đƣợc biểu diễn dƣới dạng vector X gồm 136 phần tử nhƣ sau:
X = (x1, x2,…,xn, y1, y2,….., yn)
Kết quả tập đặc trƣng thu đƣợc từ N khuôn mặt phát hiện đƣợc là một ma trận gồm N hàng và 136 cột. Trong đó mỗi một khuôn mặt đƣợc biểu diễn là một hàng của ma trận, còn số cột của ma trận chính là 136.
3.4 Xác định khuôn mặt chung nhất
Tác giả áp dụng phƣơng pháp phân cụm phân cụm phân cấp để gom các khuôn mặt tƣơng tự nhau về các cụm khuôn mặt riêng biệt. Từ đó xác định khuôn mặt chung nhất trong tập ảnh. Thuật toán đƣợc mô tả dƣới hình 3.9:
Input: D- Ma trận đặc trƣng cỡ NxN Ouput: F - Khuôn mặt chung nhất For n 1 to N do
For i 1 to N do C[n][i] SIM(Dn,i); I[n] 1;
For k 1 to N – 1 do
<i , m> argAve{<i , m>: i ≠ m ˄ I[i] =1˄I[m] =1 } C[i][m] A.APPEND(<i , m>)
For j 1 to N do
C[i][j] SIM(i,m,j);C[j][i] SIM(i,m,j); I[m] 0;
id MaxFaces(A); FGetFaces(id);
Trong thuật toán trên, đầu tiên chúng ta tính ma trận khoảng cách C cỡ NxN.
Sau đó thực hiện N - 1 bƣớc để sáp nhập các cụm hiện tại có độ tƣơng tự nhỏ hơn một ngƣỡng cho trƣớc. Trong mỗi lần lặp, ta thu đƣợc hai cụm tƣơng tụ đƣợc sáp nhập và các hàng và cột của cụm i đã sáp nhập trong C đƣợc cập nhật. Các cụm đƣợc lƣu trữ
nhƣ một danh sách của việc sáp nhập trong A. Mảng I cho ta biết đƣợc trạng thái của cụm có thể đƣợc sáp nhập. Hàm SIM(i, j, m) tính độ tƣơng tự của cụm j và cụm mới sau khi sáp nhập cụm i với cụm m, ở đây tác giả dùng độ đo Centroid-linkage. Sau
khi có các cụm A khuôn mặt riêng biệt ta xác định chỉ số của cụm có số lƣợng khuôn mặt lớn nhất thông qua hàm MaxFaces(). Khuôn mặt F là khuôn mặt chung nhất trong tập ảnh đƣợc lấy trong cụm có số lƣợng khuôn mặt lớn nhất bằng hàm GetFaces()
3.5 Kết luận chƣơng 3
Trong chƣơng này, tác giả tập trung nghiên cứu các bƣớc để giải quyết xây dựng hệ thống. Ở chƣơng 4, là phần thử nghiệm cho việc dò tìm khuôn mặt chung nhất giữa các bức ảnh khuôn mặt. Sau quá trình thực nghiệm, tác giả tiến hành so sánh và đƣa ra những đánh giá, nhận xét cho bài toán
CHƢƠNG 4: THỬ NGHIỆM VÀ KẾT QUẢ ĐẠT ĐƢỢC 4.1 Cơ sở dữ liệu khuôn mặt thử nghiệm
Để phục vụ cho bài toán tác giả đã thu thập một tập dữ liệu ảnh gồm 3 tập ảnh bao gồm các ảnh ở nhiều độ phân giải khác nhau trong đó mỗi ảnh có nhiều khuôn mặt để thử nghiệm và đánh giá. Tập dữ liệu này đƣợc tác giả thu thập từ các mẫu hình chụp khuôn mặt ngƣời, các ảnh đều đƣợc lƣu ở định dạng JPG. Các ảnh khuôn mặt đều không những chỉ có một khuôn mặt mà có thể có nhiều khuôn mặt trong bức ảnh. Bằng cách thay đổi các hình ảnh khuôn mặt khác nhau trên tập dƣ liệu cho chúng ta thấy hiệu quả của hệ thống
4.2 Một số thực nghiệm
Tác giả tiến hành các thực nghiệm kết quả của hệ thống trên một số tập ảnh đầu vào nhƣ trình bày ở mục 4.1 nhƣ sau để đánh giá hiệu quả của hệ thống.
Thực nghiệm 1:
Tập ảnh đầu vào
Hình 4.2: Tập ảnh đầu vào thực nghiệm 1
Trong tập ảnh trên tổng tất cả có 12 cá nhân, và nhƣ chúng ta thấy khuôn mặt chung nhất giữa các bức ảnh trên là
Hình 4.3: Khuôn mặt chung nhất trong thực nghiệm 1
Cá nhân xuất hiện 4 lần trong tập ảnh đầu vào trên. Hình 4.4 và hình 4.5 dƣới đây là kết quả của hệ thống với từng phƣơng pháp trích rút đặc trƣng.
Hình 4.4: Kết quả của hệ thống trong thực nghiệm 1 - PCA
Thực nghiệm 2:
Tập ảnh đầu vào
Hình 4.6: Tập ảnh đầu vào thực nghiệm 2
Trong tập ảnh trên tổng tất cả có 06 cá nhân, và nhƣ chúng ta thấy khuôn mặt chung nhất giữa các bức ảnh trên là
Hình 4.7: Khuôn mặt chung nhất trong thực nghiệm 2
Cá nhân xuất hiện 4 lần trong tập ảnh đầu vào trên. Hình 4.8 và hình 4.9 dƣới đây là kết quả của hệ thống với từng phƣơng pháp trích rút đặc trƣng.
Hình 4.8: Kết quả của hệ thống trong thực nghiệm 2 - PCA
Hình 4.9: Kết quả của hệ thống trong thực nghiệm 2 - ASM
Thực nghiệm 3:
Tập ảnh đầu vào
Hình 4.10: Tập ảnh đầu vào thực nghiệm 3
Trong tập ảnh trên tổng tất cả có 6 cá nhân, và nhƣ chúng ta thấy khuôn mặt chung nhất giữa các bức ảnh trên là
Cá nhân trong hình 4.11 xuất hiện 3 lần trong tập ảnh đầu vào. Hình 4.12 và hình 4.13 dƣới đây là kết quả của hệ thống.
Hình 4.12: Kết quả của hệ thống trong thực nghiệm 3 - PCA
Hình 4.13:Kết quả của hệ thống trong thực nghiệm 3 - ASM
Với những thực nghiệm trên, tác giả thấy cả 2 phƣơng pháp PCA và ASM cho những kết quả khá chính xác khi xác định khuôn mặt chung nhất trong một tập ảnh trong đó mỗi bức ảnh có nhiều khuôn mặt. Tác giả cũng thực hiện thêm nhiều thực nghiệm khác nhau, kết quả cho thấy rằng đối với phƣơng pháp PCA thì độ sáng của hình ảnh ảnh hƣởng rất lớn đến kết quả, còn ASM thì biểu cảm khuôn mặt thay đổi sẽ làm kết quả thay đổi.
4.3 Kết luận chƣơng 4
Trong chƣơng cuối này, tác giả đã trình bày về tập cơ sở dữ liệu ảnh đầu vào gồm nhiều khuôn mặt trong mỗi bức ảnh và, thu thập kết quả từ các kết quả từ một số thực nghiệm để có những nhận xét và đánh giá về hệ thống.
KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN Kết luận
Trong nội dung của luận văn này, sau khi tiến hành nghiên cứu tổng quan về bài toán xác định đƣợc khuôn mặt giống nhau nhất giữa các bức ảnh gồm nhiều khuôn mặt, và một số phƣơng pháp liên quan để giải quyết bài toán. Tác giả đi sâu vào nghiên cứu và ứng dụng thành công hai phƣơng pháp Active Shape Model, PCA để trích rút đặc trƣng khuôn mặt và áp dụng phƣơng pháp phân cụm phân cấp tích tụ để gom các khuôn mặt giống nhau về cùng một cụm, từ đó ta xác định đƣợc khuôn mặt chung nhất trong tập ảnh thuộc cụm có số lƣợng khuôn mặt lớn nhất. Tác giả tiến hành cài đặt và xây dựng các thử nghiệm thành công, từ đó đƣa ra những nhận xét, đánh giá cho bài toán. Qua thử nghiệm hệ thống đáp ứng tƣơng đối tốt mong muốn của ngƣời