1. 2 Tổng quan kiến trúc của một hệ thống nhận dạng mặt người
4.2.3. So sánh khoảng cách-Compare Distance
Xét ảnh H có cùng kích thước với những bức ảnh trong tập huấn luyện. H được xem là một vector trong không gian NxP chiều.
Đặt G = H - 𝜓, với 𝜓 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, …, uK}. Khi đó, hình chiếu trực giao của vector u bất kỳ lên W được xác định như sau:
𝑝𝑟𝑤𝑢 = 𝑢0 = ∑(𝑢⃗ , 𝑢⃗⃗⃗ ). 𝑢𝑖 𝑖 𝐾
𝑖=1 - Độ dài || u – u0 || được gọi là khoảng cách từ u đến W.
- Tìm C = ETG là tọa độ hình chiếu Gf của G lên không gian khuôn mặt. C là vector cột Kx1.
𝐺𝑓 = ∑ 𝑐𝑖. 𝑒𝑖 𝐾
𝑖=1 với ci = C(i, 1); ei = E(1, 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 = ET.Ai là tọa độ của hình chiếu Aif của Ai lên không gian khuôn mặt.
Tính: Si = || C – Ci || xem như khoảng cách từ H đến bức ảnh Ti trong tập huấn luyện. Gọi β = eigenDistanceThreshold là khoảng cách ngưỡng riêng, khi đó:
Nếu Si < β thì Ti là bức ảnh của cùng một người với H (H đủ gần với Ti).
TỔNG KẾT CHƯƠNG 4.
Chương 4 bao gồm 2 nội dung chính:
Bài toán phát hiện mặt người trong ảnh-Face Detection.
Bài toán nhận dạng mặt người bằng phương pháp Eigenfaces-sử dụng thuật toán PCA.
Face Detection.
- Giới thiệu bài toán xác định mặt người.
- Giới thiệu các hướng tiếp cận các phương pháp giải quyết bài toán xác định mặt người.
o Hướng tiếp cận dựa trên tri thức (knowledge-based)
o Hướng tiếp cận dựa trên các đặc trưng không đổi (feature invariant)
o Hướng tiếp cận dựa trên phương pháp đối sánh mẫu (Template matching)
o Hướng tiếp cận dựa trên diện mạo (appearance-based).
Recognition-Sử dụng Eigenfaces.
- Giới thiệu thuật toán PCA và ứng dụng trong bài toán nhận dạng mặt người.
CHƯƠNG 5: XÂY DỰNG CHƯƠNG TRÌNH-MÔ PHỎNG 4.3. Xây dựng chương trình.
4.3.1 Phân tích.
Nhiệm vụ chính của chương trình là nhận dạng một khuôn mặt người xem khuôn mặt đó có được biết đến hay chưa. Ngoài ra, chương trình còn thực hiện công việc phát hiện, tách các khuôn mặt người (nếu có) từ một ảnh tĩnh, hoặc từ các frame ảnh thu được từ camera. Sau đó, lưu vào CSDL làm tập mẫu.
Hình 14: Sơ đồ ngữ cảnh của hệ thống.
- Như vậy, các chức năng của chương trình bao gồm:
o Lấy một ảnh từ trong máy tính, hoặc kết nối đến webcam hiển thị lên ImageBox. o Thực hiện tách các khuôn mặt trên ImageBox (nếu có).
o Thực hiện lưu khuôn mặt phát hiện được vào CSDL. Thực hiện xóa, đổi tên…
o Nhận dạng ảnh một khuôn mặt. Nếu “biết” người đó (có lưu thông tin trong CSDL) thì hiển thị tên và một ảnh của người đó. Nếu “không biết” (không có thông tin của người đó trong CSDL) thì hiển thị 1 màu đen lên màn hình và tên người là: “Unknow”
4.4 Thiết kế hệ thống.
Với các chức năng nêu trên, chương trình được chia thành 3 phần chính: 1. Xử lý ảnh đầu vào.
2. Phát hiện khuôn mặt.
Hình 15: Sơ đồ khối thực hiện chương trình.
5.2.1. Xử lý ảnh đầu vào.
Đầu vào của hệ thống là 1 ảnh chứa khuôn mặt cần xử lý, ảnh này có thể là ảnh tĩnh, lấy từ trong bộ nhớ máy tính hoặc là frame ảnh bắt được từ dòng hình ảnh của camera. Sau khi có được ảnh đầu vào thì bắt đầu tiến hành tìm kiếm, phát hiện các khuôn mặt trong ảnh.
Hình 16: Lưu đồ giải thuật chọn ảnh đầu vào.
Code thực hiện chức năng.
private Capture capture;
private Image<Bgr, Byte> ImageFrame, NextFrame;
//Hàm thực hiện mở hộp thoại để lấy ảnh Tĩnh lưu trong máy tính. private void btnBrowse_Click(object sender, EventArgs e)
{
if (oFDtoGetImage.ShowDialog() == DialogResult.OK) {
Image InputImg = Image.FromFile(oFDtoGetImage.FileName); NextFrame = new Image<Bgr, byte>(new Bitmap(InputImg)); CamImageBox.Image = NextFrame;
} }
Hình 17: Hiển thị hình ảnh lấy từ máy tính.
5.2.2. Phát hiện khuôn mặt trong ảnh.
Sau khi nhận được ảnh đầu vào, hệ thống sẽ thực hiện chức năng phát hiện khuôn mặt có trong ảnh. Như đã nói trong phần Giới Thiệu, bài toán phát hiện mặt người trong ảnh là một bài toán khó, nên ta không đi sâu tìm hiểu cách giải quyết bài toán này.
Ở đây, ta sử dụng phương pháp tiếp cận dựa trên diện mạo (appearance-based) được thực hiện nhanh bằng thuật toán adaboost thông qua hàm cvHaarObjects() của bộ thư viện OpenCV. Hàm này thực hiện việc phát hiện đối tượng dựa trên các đặc trưng haar-like, cụ thể là nhờ vào một bộ Cascade được truyền vào cho hàm. Bộ Cascade được xây dựng theo dạng cây (tree-node) và đã được huấn luyện từ trước.
Việc huấn luyện bộ Cascade có thể thực hiện từ những dữ liệu thu thập được để phục vụ cho quá trình nhận dạng. Ví dụ, muốn nhận dạng một người A, ta thu thập các ảnh khuôn mặt của người A với nhiều tư thế, góc chụp và điều kiện chụp khác nhau, sau đó cho bộ nhận dạng học theo thuật toán Cascade training. Kết quả thu được là ta sẽ có một mô hình nhận diện, được sử dụng để nhận dạng các đối tượng.
Code thực hiện chức năng:
private HaarCascade haarface; private CascadeClassifier haar; private int WindowSize = 25;
private Double ScaleIncreaseRate = 1.1; private int MinNeighbors = 3;
// Control Timer
private void timer_getImage_Tick(object sender, EventArgs e) {
MinNeighbors = int.Parse(comboBoxMinNeigh.Text); WindowSize = int.Parse(textBoxWinSiz.Text);
ScaleIncreaseRate = Double.Parse(comboBoxScIncRte.Text); using (Image<Bgr, byte> ImageFrame = capture.QueryFrame()) {
if (ImageFrame != null) {
//STEP1. COnvert the image to Gray scale
Image<Gray, byte> grayframe = ImageFrame.Convert<Gray, byte>(); //STEP2. Detectfaces from the gray-scale image and store into an array of type 'var', i.e 'MCvAvgComp[]'
var faces = grayframe.DetectHaarCascade(haarface, ScaleIncreaseRate,
MinNeighbors,
HAAR_DETECTION_TYPE.DO_CANNY_PRU
NING,
new Size(ImageFrame.Width / 8, ImageFrame.Height / 8))[0];
//STEP3. Draw a green rectangle on each detected face in image
foreach (var face in faces) {
ImageFrame.Draw(face.rect, new Bgr(Color.Gray), 3); }
}
CamImageBox.Image = ImageFrame; }
Hàm thực hiện chức năng phát hiện mặt người trong dòng hình ảnh của camera. Trong đó:
1. The HaarCascade (haarface): Một đối tượng thuộc lớp Mô hình nhận diện: HaarCascade. Đây là tham số đầu tiên trong lời gọi DetectHaarCascade(). Thực chất, đây là một file XML, từ đó, chuỗi dữ liệu được nạp cho bộ phân loại Haar. Có một số thác phát hiện khuôn mặt có trước trong OpenCV (và EmguCV). Các khuôn mặt trong ảnh sẽ được phát hiện nhờ mô hình nhận diện này. OpenCV cung cấp khá nhiều mô hình nhận diện khuôn mặt, không có bộ phân loại nào là tốt nhất, tùy từng trường hợp mà mô hình nhận dạng này cho kết quả tốt hơn mô hình kia. Chúng ta có thể thay đổi mô hình nhận dạng trong phần mềm một cách dễ dàng, chỉ cần thay đổi tên tệp tin XML. Ngoài mô hình nhận diện khuôn mặt, OpenCV còn cung cấp cho chúng ta nhiều mô hình nhận diện khác, như: tròng mắt, mắt, mũi, tay…
Ở đây, ta dùng một mô hình nhận diện khuôn mặt, với: - haarface = “đường dẫn tới mô hình nhận diện”.
- mô hình nhận diện: haarcascade_frontalface_alt_tree.xml.
2. ScaleIncreaseRate: Tham số thứ hai trong lời gọi đến DetectHaarCascade() là tỷ lệ co giãn, sử dụng trong thuật toán lặp-quét ảnh để tìm đối tượng (ở đây là mặt người). Thiết lập này cao hơn làm tăng tốc độ phát hiện khuôn mặt (giảm thời gian tìm kiếm, phát hiện khuôn mặt trong ảnh) bằng cách chạy đường chuyền ít hơn, nhưng nếu nó quá cao, bạn có thể nhảy quá nhanh giữa các phạm vi và phát hiện thiếu các khuôn mặt. Mặc định trong OpenCV là 1.1, nói cách khác, tăng quy mô với hệ số 1.1 (10%) mỗi cái.
Thông số này có thể có một trong các giá trị: 1.1, 1.2, 1.3 hoặc 1.4.
Trong phần mềm, mặc định giá trị của thông số ScaleIncreaseRate là cao nhất tức 1.4. Có nghĩa là nó sẽ chạy số lượng lặp ít nhất, do đó sẽ phát hiện nhanh chóng các khuôn mặt, nhưng cũng có thể bỏ qua một số khuôn mặt. Nếu thiết lập giá trị thấp hơn, việc kiểm tra, phát hiện đối tượng: khuôn mặt hoàn hảo hơn, nhưng sẽ mất nhiều thời gian hơn. Tùy từng bức ảnh đầu vào mà điều chỉnh thông số này để có thể đạt kết quả mong muốn. 3. Minimum Neighbors Threshold (MinNeighbors) : Tham số thứ ba trong lời gọi đến
DetectHaarCascade() là “Ngưỡng hàng xóm tối thiểu”, thiết lập mức độ cắt cho việc loại bỏ hoặc giữ nhóm hình chữ nhật để xây dựng bộ phân loại mạnh từ các bộ phân loại yếu. Giả sử, với 5 hình chữ nhật, ta xác định được một khuôn mặt-bộ phân loại mạnh. Còn bộ phân loại yếu là tập các hình chữ nhật thuộc một bộ phận của khuôn mặt, bộ phân loại yếu ở đây sẽ nhỏ hơn 5.
Nếu số lượng khuôn mặt nhận dạng được ít hơn thực tế thì hãy hạ thấp giá trị của tham số này (Dao động từ 0-4).
4. Canny Pruning Flag: Tham số thứ tư là một biến cờ. Hiện chỉ có hai lựa chọn: 0 hoặc DO-CANNY-PRUNING.
Nếu lựa chọn Canny Pruning được chọn, bộ dò sẽ bỏ qua các vùng mà không có khả năng có chứa một khuôn mặt, giảm chi phí tính toán và có thể loại bỏ một số phát hiện sai. Các
vùng bỏ qua được xác định bằng cách chạy một máy dò cạnh (máy dò cạnh Canny) trên ảnh trước khi chạy máy phát hiện khuôn mặt.
5. Minimum Detection Scale (WindowSize): Quy mô phát hiện tối thiểu.
Tham số thứ 5 trong các lời gọi đến DetectHaarCascade () là kích thước của khuôn mặt nhỏ nhất để tìm kiếm. Quy mô tối thiểu mặc định trong file XML là 24x24. Tuy nhiên, trong phần mềm, chúng ta để mặc định là 25x25.
5.2.3. Xử lý đầu ra.
Các khuôn mặt sau khi được phát hiện sẽ được tách ra khỏi bức ảnh, hiển thị lên picturebox. Người dùng có thể xem, di chuyển qua lại giữa các khuôn mặt được phát hiện (kể cả các ảnh bị nhận nhầm là khuôn mặt).
Các khuôn mặt trước khi được hiển thị lên picturebox sẽ được chỉnh lại kích thước và chuẩn hóa (tăng chỉnh độ sáng, đưa về một kênh màu: Ảnh Xám). Ảnh sau khi chuẩn hóa có thể được kiểm tra nhận dạng hoặc lưu vào CSDL dưới dạng nhị phân.
5.2.4. Thiết kế cơ sở dữ liệu.
CSDL là trái tim của hệ thống, việc thiết kế, tổ chức CSDL ảnh hưởng lớn đến hoạt động của chương trình, bởi dữ liệu cần lưu trữ ở đây là các ảnh. Dù kích thước mỗi ảnh có thể không lớn, nhưng số lượng ảnh cần lưu trữ lại rất lớn. Ảnh hưởng lớn đến tốc độ truy xuất dữ liệu. Do đó cần thiết kế, tổ chức CSDL một cách hợp lý, ngoài ra việc lựa chọn Hệ quản trị CSDL cũng rất quan trọng. Ở đây, Hệ quản trị SQL server được lựa chọn để xây dựng, quản lý CSDL. Đây là một hệ quản trị CSDL mạnh, đáp ứng được nhiều yêu cầu về quản lý các CSDL lớn.
Ta cần xác định các thông tin cần được lưu trữ: 3. Ảnh các khuôn mặt.
4. Tên người có khuôn mặt được phát hiện. 5. Id xác định các đối tượng.
1. Ảnh (FaceImage). Ảnh đầu vào. a. Kiểu dữ liệu: image. b. Is null: true.
2. Tên người (FaceName).
c. Kiểu dữ liệu: nvarchar(200); d. Is null: true;
3. Id (FaceID)
e. Kiểu dữ liệu: Int. f. Khóa chính. g. Mã tự tăng. h. Is null: false.
5.2.5. Thiết kế giao diện chương trình.
Hình 19. Màn hình chính của chương trình.
Giao diện chương trình được thiết kế đơn giản, dễ nhìn. Bố cục giao diện chia làm 3 phần. Phần 1, dành cho người dùng chọn đầu vào, có thể là một ảnh tĩnh từ trong máy tính, hoặc mở webcam để lấy hình ảnh. Phần 2 bao gồm phần điều chỉnh các thông số phát hiện khuôn mặt, thông số nhận dạng khuôn mặt. Và cuối cùng là phần nhận dạng khuôn mặt.
Phần 1:
- Button Browse Image: Mở hộp thoại để lấy một ảnh tùy ý trong máy tính.
- Button Detect face: Thực hiện việc tìm kiếm, phát hiện mặt người trong ảnh, đang hiện trên Imagebox. Nếu có thì hiển thị thông báo số lượng khuôn mặt phát hiện được, tách các khuôn mặt hiển thị lên picturebox.
- Button Start: Khởi động webcam để thu hình ảnh.
- Button Extract face: Tách các khuôn mặt phát hiện được trong dòng hình ảnh của camera hiển thị lên picture box.
Phần 2:
1. Điều chỉnh thông số phát hiện khuôn mặt. - Scale Increase Rate.
- Min Neighbors.
- Min Detection Scale (Window Size). 2. Điều chỉnh thông số nhận dạng khuôn mặt.
- Eigen Distance Threshold: Khoảng cách ngưỡng. Phần 3:
- Picturebox pbInputFaces: Hiển thị ảnh các khuôn mặt phsat hiện được trong ảnh. - Picturebox pbTSFace: Hiển thị các ảnh trong CSDL và kết quả ảnh nhận dạng. - Button Prev, Next: Di chuyển giữa các ảnh khuôn mặt phát hiện được.
- Button btnTSFirst, btnTSPArev, btnTSNxt, btnLoadTSLast: Di chuyển qua lại giữa các ảnh trong CSDL.
- Button btTrainforReg (Trained for Recognizer): Thực hiện huấn luyện các ảnh. - Button btnCheckRecognizer (Check Recognizer): Thực hiện nhận dạng khuôn mặt. - Button btnView (View Information Of TrainingSet): Xem thông tin về CSDL trong
tập Training Set.
- Button btnAddtoTS (Add to Training Set): Lưu ảnh khuôn mặt phát hiện được vào CSDL.
- Button btnUpdateFace (Update Face): Cập nhật lại tên và ID của đối tượng. - Button btnDelFace (Delete Face): Xóa đối tượng khỏi CSDL.
5.3. Một số kết quả thực nghiệm.
- Với khoảng cách ngưỡng riêng β = 3000. Tên Đối tượng Lần nhận dạng Nhận dạng đúng Nhận dạng sai Không nhận dạng được Subject 01 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x Subject 02 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x Subject 03 1 x 2 x
3 x 4 x 5 x 6 x 7 x Subject 04 1 x 2 x 3 x 4 x 5 x 6 x Subject 05 1 x 2 x 3 x 4 x 5 x Subject 06 1 x 2 x 3 x 4 x Subject 07 1 x 2 x 3 x
Subject 08 1 x 2 x Subject 09 1 x Tên đối tượng Số ảnh huấn luyện của 1 đối tượng Số ảnh test Tỷ lệ Nhận dạng đúng. Subject 01 1 9 22.22% Subject 02 2 8 50% Subject 03 3 7 57.14% Subject 04 4 6 16.67% Subject 05 5 5 80% Subject 06 6 4 75% Subject 07 7 3 0% Subject 08 8 2 0% Subject 09 9 1 0%
- Với khoảng cách ngưỡng riêng β = 7000. Tên Đối tượng Lần nhận dạng Nhận dạng đúng Nhận dạng sai Không nhận dạng được Subject 01 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x Subject 02 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 1 x
Subject 03 2 x 3 x 4 x 5 x 6 x 7 x Subject 04 1 x 2 x 3 x 4 x 5 x 6 x Subject 05 1 x 2 x 3 x 4 x 5 x Subject 06 1 x 2 x 3 x 4 x Subject 07 1 x 2 x
3 x Subject 08 1 x 2 x Subject 09 1 x Tên đối tượng Số ảnh huấn luyện của 1 đối
tượng Số ảnh test Tỷ lệ Nhận dạng đúng. Subject 01 1 9 88.89% Subject 02 2 8 75% Subject 03 3 7 71.43% Subject 04 4 6 83.33% Subject 05 5 5 100% Subject 06 6 4 100% Subject 07 7 3 33.33% Subject 08 8 2 50% Subject 09 9 1 100%
Nhận xét: Từ bảng kết quả, ta có thể thấy rằng, kết quả nhận dạng phụ thuộc rất nhiều
vào giá trị của khoảng cách ngưỡng riêng. Do đó, cần điều chỉnh thông số một cách phù hợp để có thể thu được kết quả tốt nhất. Ngoài ra, các ảnh bị nhận dạng sai hoặc không nhận dạng được phụ thuộc vào chất lượng ảnh đầu vào, đa số các ảnh bị nhận dạng sai hoặc không nhận dạng được đều là các bức ảnh bị chụp thiếu sáng.
Một số kết quả nhận dạng với dữ liệu ảnh chưa chuẩn hóa. - Ảnh đầu vào là ảnh tĩnh.
Tổng kết chương.
- Phân tích, thiết kế hệ thống phần mềm nhận dạng mặt người.
o Thiết kế các chức năng của phần mềm.
o Thiết kế cơ sở dữ liệu.
o Thiết kế giao diện.
- Sử dụng phần mềm nhận dạng mặt người dựa trên bộ cơ sở dữ liệu đã được chuẩn hóa Yalefaces. Nhận xét kết quả nhận dạng.
KẾT LUẬN
Báo cáo đồ án môn học đã trình bày các kiến thức cơ bản để giải quyết bài toán nhận dạng