3.1.4.1 Thu thập ảnh khuôn mặt
Việc thu thập ảnh khuôn mặt có thể đơn giản là đưa những ảnh đã được xử lý khuôn mặt vào một biến mảng cùng với các nhãn đã dán cho khuôn mặt đó. Ví dụ, ta có thể sử dụng 10 khuôn mặt đã được xử lý trước của người đầu tiên và 10 gương mặt được xử lý trước của một người thứ hai, vì vậy đầu vào của thuật toán nhận dạng khuôn mặt sẽ là một mảng gồm 20 gương mặt được xử lý trước và một mảng gồm 20 số nguyên (trong đó 10 số đầu tiên là 0 và 10 số tiếp theo là 1). Thuật toán thu thập dữ liệu ảnh khuôn mặt được mô tả như Hình 3.9.
Trang 78
Hình 3.9. Thuật toán thu thập ảnh, lưu cơ sở dữ liệu trên PC
Các thuật toán nhận dạng khuôn mặt sau đó sẽ học làm thế nào để phân biệt giữa những khuôn mặt của những người khác nhau. Đây được gọi là giai đoạn huấn luyện và tập các khuôn mặt được gọi là tập huấn luyện. Sau khi các thuật toán nhận dạng khuôn mặt đã được huấn luyện xong, thì khi đó ta có thể lưu cơ sở dữ liệu vào tập tin hoặc bộ nhớ và có thể sử dụng lại nó để nhận dạng ra những người đang đứng trước máy ảnh. Đây được gọi là giai đoạn kiểm tra. Nếu ta sử dụng nó trực tiếp từ đầu vào máy ảnh thì khuôn mặt xử lý trước sẽ được gọi là ảnh kiểm tra, và nếu ta thử nghiệm với nhiều ảnh (một thư mục ảnh), thì được gọi là tập thử nghiệm.
Trang 79
Trang 80
Điều quan trọng là ta phải có tập huấn luyện tốt, tức là tập huấn luyện phải bao gồm tất cả các trường hợp mà ta đoán nó có thể xảy ra trong tập kiểm tra. Ví dụ, nếu như ta chỉ tiến hành thử nghiệm với những khuôn mặt toàn nhìn thẳng về phía trước (như hình trong thẻ chứng minh), thì khi đó ta chỉ cần cung cấp các ảnh huấn luyện với các khuôn mặt hoàn toàn thẳng về phía trước. Nhưng nếu người đó nhìn bên trái hoặc phía trên, thì khi đó ta nên chắc chắn tập huấn luyện cũng sẽ bao gồm những khuôn mặt của người đó như vậy, nếu không các thuật toán nhận dạng khuôn mặt sẽ gặp khó khăn khi nhận ra chúng. Điều này cũng áp dụng đối với các nhân tố khác như biểu hiện trên khuôn mặt (ví dụ như nếu người đó luôn luôn mỉm cười trong tập huấn luyện nhưng không mỉm cười trong bộ thử nghiệm) hoặc hướng ánh sáng (ví dụ như ánh sáng mạnh là phía bên trái khi huấn luyện nhưng phía bên tay phải trong bộ thử nghiệm). Các bước tiền xử lý khuôn mặt mà chúng ta nhìn thấy ở trên chỉ giúp giảm đi phần nào những vấn đề như vậy, nhưng chắc chắn là nó sẽ không loại bỏ hoàn toàn các yếu tố đó, đặc biệt hướng nhìn của khuôn mặt, vì nó ảnh hưởng lớn đến vị trí của tất cả các yếu tố trên mặt.
Một cách để có được một tập huấn luyện tốt sẽ bao gồm nhiều điều kiện thực tế khác nhau là ta cho người cần thu thập ảnh xoay đầu của họ đủ mọi phía như nhìn trái, nhìn phải, nhìn lên, nhìn xuống, nhìn thẳng …. Sau đó, nghiêng đầu sang một bên, nghiêng lên nghiêng xuống, đồng thời cũng thay đổi biểu hiện trên khuôn mặt, chẳng hạn như xen kẽ mỉm cười, giận dữ, hay bình thường... Nếu người được tiến hành thu thập ảnh khuôn mặt theo chỉ dẫn này thì khi đó ta có cơ hội tốt hơn khi nhận dạng người đó với các điều kiện khác nhau trong thực tế. Để có kết quả tốt hơn nữa, thì ta phải được thực hiện một lần nữa với các vị trí thu thập ảnh khác nhau để có các điều kiện ánh sáng khác nhau…
Trang 81
3.1.4.2 Huấn luyện
Sau khi ta đã thu thập đủ khuôn mặt cho mỗi người cần nhận dạng, thì ta phải tiến hành huấn luyện hệ thống để nó học dữ liệu bằng cách dùng thuật toán máy học tập phù hợp với việc nhận dạng khuôn mặt.
Có rất nhiều các thuật toán nhận dạng khuôn mặt khác nhau, nhưng đơn giản nhất là Eigenfaces và mạng noron nhân tạo. Eigenfaces có xu hướng thực hiện tốt hơn so với ANNs, và mặc dù nó đơn giản hơn, và nó có hoạt động của nó cũng gần giống như nhiều thuật toán nhận dạng khuôn mặt phức tạp khác, do đó, thuật toán này đã trở nên rất phổ biến như các thuật toán nhận dạng khuôn mặt cơ bản cho người mới bắt đầu cũng như dùng để so sánh với các thuật toán nhận dạng mới. Dưới đây là ba thuật toán nhận dạng khuôn mặt có thể thực hiện với OpenCV v2.4.8:
FaceRecognizer.Eigenfaces: Eigenfaces, còn được gọi là PCA, được sử dụng đầu tiên bởi Turk và Pentland vào năm 1991.
FaceRecognizer.Fisherfaces: Fisherfaces, còn được gọi là LDA, do Belhumeur, Hespanha và Kriegman phát minh vào năm 1997.
FaceRecognizer.LBPH: mô hình histogram nhị phân cục bộ, phát minh bởi Ahonen, Hadid và Pietikäinen vào năm 2004.
Các thuật toán nhận dạng khuôn mặt có lớp FaceRecognizer ở module contrib của OpenCV. Vì vậy, ta nên gọi hàm cv::initModule_contrib()
trước khi truy cập vào thuật toán nhận dạng khuôn mặt FaceRecognizer.
Để sử dụng một trong các thuật toán nhận dạng khuôn mặt, ta phải tạo ra một đối tượng FaceRecognizer bằng cách sử dụng hàm
Trang 82
Một khi ta đã nạp thuật toán nhận dạng khuôn mặt lên thì ta có thể dễ dàng gọi hàm huấn luyện FaceRecognizer::train() cho tập các khuôn mặt đã
thu thập trước đó:
Nếu ta chỉ có một vài người với ít hơn 20 khuôn mặt, thì khi đó việc huấn luyện này sẽ được thực hiện rất nhanh chóng, nhưng nếu ta có nhiều người hơn với nhiều khuôn mặt hơn, thì hàm train() có thể sẽ mất vài giây hoặc thậm chí vài phút để xử lý tất cả các dữ liệu.
3.1.5 Nhận dạng khuôn mặt
Nhờ có lớp FaceRecognizer của OpenCV, ta có thể xác định được người nào trong ảnh chỉ đơn giản bằng cách gọi hàm FaceRecognizer::predict()
trên một ảnh khuôn mặt như sau:
Giá trị identity này chính là con số đánh nhãn mà ban đầu ta sử dụng khi thu thập khuôn mặt cho việc huấn luyện. Ví dụ, 0 cho người đầu tiên, 1 cho người thứ hai, vv…
Vấn đề đối với con số nhận dạng này là đầu ra của nó luôn là con số, mặc dù ngay cả khi đầu vào là ảnh của một người chưa biết hoặc là ảnh của một chiếc xe. Nó sẽ cho ta biết rằng người nào là người có khả năng nhất trong bức ảnh đó, Vì vậy ta rất khó tin được kết quả này. Giải pháp là ta phải có một con số đánh giá độ tin cậy của kết quả thu được từ việc nhận dạng. nếu kết quả có độ tin cậy thấp thì khi đó ta quyết định rằng đó là người chưa biết.
Trang 83
3.1.5.1 Thẩm định khuôn mặt:
Để xác định được liệu kết quả của việc dự đoán là đáng tin cậy hay không, hay người mà nhận dạng được là người chưa được biết tới, thì chúng ta tiến hành thực hiện thẩm định khuôn mặt (còn được gọi là xác thực khuôn mặt). FaceRecognizer của OpenCV có thể trả về độ tin cậy khi ta thực hiện hàm predict() nhưng độ tin cậy đó chỉ đơn giản dựa vào khoảng cách trong không gian con riêng Eigen, vì vậy giá trị này không đáng tin cậy.
Phương pháp ta sẽ sử dụng đó là tái tạo lại ảnh khuôn mặt bằng cách sử dụng vector riêng và giá trị riêng, và tiến hành so sánh ảnh này tái tạo với những ảnh đầu vào để thẩm định khuôn mặt.
Nếu người đó có nhiều gương mặt nằm trong tập huấn luyện, thì khi đó việc xây dựng lại từ các vector riêng và giá trị riêng đã học được thực hiện khá tốt, nhưng nếu người đó không có bất kỳ khuôn mặt nào trong tập huấn luyện (hoặc không có bất kỳ khuôn mặt nào tương đương với nét mặt và độ sáng như trong tập thử nghiệm), thì khi đó khuôn mặt thu được từ việc xây dựng lại sẽ trông rất khác so với khuôn mặt đầu vào, việc này báo hiệu rằng đây là khuôn mặt chưa được biết tới.
Ở phần trước, các thuật toán Eigenfaces và Fisherfaces được dựa trên quan điểm rằng một ảnh có thể được tạm biểu diễn như là một tập hợp các vector riêng (ảnh khuôn mặt) và giá trị riêng (tỷ lệ pha trộn). Vì vậy, nếu chúng ta kết hợp tất cả các vector riêng với các giá trị riêng của một trong những khuôn mặt trong tập huấn luyện, khi đó ta sẽ có được một bản sao khá giống với ảnh huấn luyện ban đầu. Áp dụng với ảnh khác tương tự với tập huấn luyện - nếu chúng ta kết hợp các vector riêng đã được huấn luyện với các giá trị riêng từ một ảnh kiểm tra tương tự, thì chúng ta có thể xây dựng lại một ảnh tương tự với bản sao với ảnh kiểm tra.
Trang 84
Hình 3.11 cho thấy hai khuôn mặt điển hình được tái tạo lại. Khuôn mặt ở phía bên trái (Hình 3.11a) được xây dựng lại tốt hơn bởi vì nó được dựng lên từ người đã biết, trong khi khuôn mặt ở phía bên phải (Hình 3.11b) được xây dựng lại xấu hơn vì nó được dựng lên từ người chưa biết hoặc từ một người được biết đến nhưng với điều kiện ánh sáng/biểu cảm trên khuôn mặt/hướng của khuôn mặt chưa được biết đến.
Hình 3.11. Ảnh tái tạo khuôn mặt
Để tính toán sự giống nhau giữa khuôn mặt tái tạo với khuôn mặt trong ảnh đầu vào ta có thể sử dụng hàm getSimilarity() như đã trình bày ở phần
trước để so sánh hai ảnh, với giá trị thu được nhỏ hơn 0,3 có nghĩa là hai ảnh rất giống nhau.
Đối với Eigenfaces, có một vector riêng cho từng khuôn mặt, vì vậy việc xây dựng lại có xu hướng làm việc tốt và do đó ta có thể sử dụng ngưỡng so sánh là 0,5, nhưng đối với Fisherfaces chỉ có một vector riêng cho mỗi người, vì vậy việc xây dựng lại sẽ không tốt so với Eigenfaces và do đó ta có thể sử dụng ngưỡng cao hơn, chẳn hạn khoảng 0.7.
Trang 85
Bây giờ ta có thể xuất ra được id của khuôn mặt cần nhận dạng. Phương pháp nhận dạng khuôn mặt và phương pháp thẩm định khuôn mặt này chỉ đáng tin cậy trong các điều kiện nhất định mà ta huấn luyện cho nó. Vì vậy, để có được độ nhận dạng chính xác tốt, ta cần phải đảm bảo rằng các tập huấn luyện của mỗi người bao hàm đầy đủ các điều kiện về ánh sáng, nét mặt, và góc độ của tất cả các trường hợp có thể xảy ra. Giai đoạn tiền xử lý mặt giúp giảm một số khác biệt về điều kiện ánh sáng và hướng khuôn mặt quay trong mặt phẳng (nếu người đó nghiêng đầu qua trái hoặc qua phải), nhưng sự khác biệt khác như khuôn mặt quay theo chiều khác (nếu người đó quay đầu qua trai hay phải) thì nó chỉ hoạt động tốt khi có trong tập huấn luyện.
3.2 Hệ thống máy chủ web thời gian thực 3.2.1 Mô hình hệ thống 3.2.1 Mô hình hệ thống
Hình 3.12. Mô hình thiết kế hệ thống máy chủ Webserver thời gian thực để điều khiển thiết bị và điều khiển vào ra.
Trang 86
3.2.2 Nguyên lý
Hệ thống máy chủ Raspi webserver thời gian thực được xây dựng trên nền Java, sử dụng NodeJS [28] và giao thức websocket (Socket.IO [29]) giúp điều khiển thiết bị dễ dàng. Giao diện điều khiển được viết bằng HTML5 kết hợp CSS và jQuery.
Khi Client yêu cầu kết nối với Server, lúc này, server sẽ gửi cho client các thông tin như thông tin thiết bị, thông tin lịch sử (được truy vấn từ cơ sở dữ liệu MySQL) và đồng thời gửi giao diện điều khiển cho client. Việc trao đổi thông tin này do socket.io đảm nhiệm, và được truyền theo thời gian thực. Điều này thích hợp cho hệ thống có nhiều người sử dụng. Nó đảm bảo khi có nhiều client (người dùng) cùng kết nối đến server thì nó sẽ quan sát được tất cả các thông tin trao đổi giữa server với các client khác.
Nhờ viết trên nền web, nên ta có thể truy xuất điều khiển hệ thống một cách linh hoạt, ta có thể điều khiển thông qua webbrowser trên PC trên điện thoại hay máy tính bảng ở bất cứ nơi đâu có kết nối Internet.
Trang 87
3.3 Phát triển trên hệ thống nhúng Raspberry 3.3.1 Kết quả 3.3.1 Kết quả
Trang 88
Hình 3.14. Giao diện chương trình hoạt động trên iPad
Trang 89
Hình 3.16. Chức năng thêm thiết bị
Trang 90
Hình 3.18. Chứng thực không thành công
Trang 91
Hình 3.20. Một số người dùng khác (2)
Trang 92
3.3.2 Hoạt động
Sau khi thu thập dữ liệu ảnh, huấn luyện trên máy PC ta được cơ sở dữ liệu khuôn mặt. Cơ sở dữ liệu này sẽ được chép vào Raspi để thực hiện tham chiếu trong việc nhận dạng khuôn mặt.
Với thẻ nhận dạng khuôn mặt (face recognition - Hình 3.17). Để thực hiện nhận dạng, hệ thống sau khi đã khởi động xong (đèn khởi động màu xanh dương sáng, đi kèm là âm thanh) người dùng nhấn vào nút thực thi. Lúc này, ta làm theo giọng nói chỉ dẫn của hệ thống (được phát ra loa). Khi đèn trạng thái sáng (màu đỏ), chỉ thị hệ thống đang xử lý, quá trình xử lý được cập nhật theo thời gian thực và hiển thị trên giao diện đồ họa. Khi đèn xác nhận sáng (màu xanh lá) chỉ thị là việc nhận dạng thành công. Lịch sử nhận dạng và xác thực sẽ được lưu vào cơ sở dữ liệu MySQL (Hình 3.21). Ta có thể xóa lịch sử bằng nút Clear all.
Hình 3.22. Bảng điều khiển
Với thẻ điều khiển (control panel - Hình 3.15) . Người dùng có thể thêm các thiết bị thông qua nút Add devices, khi đó hộp thoại Hình 3.16 sẽ hiện lên để ta điền vào thông tin cần thiết. Vì lý do tiết kiệm thời gian và chi phí, nên trong đề tài chỉ thực hiện tượng trưng khả năng điều khiển thiết bị
Trang 93
thông qua nền web thời gian thực bằng việc thay bảng điều khiển (Hình 3.22) thành “thiết bị”. Khi đó các nút 1, 2, 3, 4 thành các nút tắt mở thiết bị, các led sẽ hiển thị trạng thái của thiết bị đó. Tất cả các thiết bị, và trạng thái của nó đều được lưu vào cơ sở dữ liệu MySQL.
Trang 94
CHƯƠNG 4
KẾT LUẬN
Trải qua thời gian thực hiện Chuyên đề 1, Chuyên đề 2 và Luận văn “Xây dựng trung tâm xử lý cho tòa nhà thông minh trên hệ thống nhúng Linux”, bước đầu thực hiện đề tài cũng gặp nhiều khó khăn, do mới tìm hiểu về hệ thống nhúng linux, lý thuyết về nhận dạng ảnh cũng như do tình trạng về sức khỏe. Tuy nhiên được sự hỗ trợ, động viên tận tình của Thầy Lưu Thanh Trà và đầu tư của bản thân, đến nay luận văn tốt nghiệp đã hoàn thành và đạt được yêu cầu đề ra.
4.1 Đánh giá kết quả
Đối với nhận dạng trong điều khiển vào ra: Số lượng tập ảnh huấn luyện là 638 ảnh (của bốn người, dung lượng 1.3G), số lượng tập ảnh kiểm tra là 400 ảnh, tất cả được thu thập bằng camera 5Mega pixel của Raspberry với điều kiện chiếu sáng khác nhau, về biểu hiện của khuôn mặt, hướng của khuôn mặt.
Toàn bộ tập huấn luyện này được xử lý và huấn luyện trên máy tính laptop, với cấu hình CPU core i7, 2.0GHz, Ram 4GB, đạt tốc độ xử lý và huấn luyện nhanh với thời gian là 30s. Cơ sở dữ liệu sau huấn luyện có dung lượng thấp (642.3KB).
Tập kiểm tra được nhận dạng trên hệ thống Raspberry với cấu hình CPU ARM 700MHz, Ram 512MB, bộ nhớ SD 8GB, cho kết quả nhận dạng ổn định và tin cậy. Tuy nhiên do cấu hình thấp, nên tốc độ (bắt đầu tính từ khởi động chương trình, đọc ảnh, xử lý và nhận dạng ảnh) không được nhanh, trung bình khoảng 7s cho mỗi ảnh.
Trang 95
Đối với việc điều khiển thiết bị trên nền web thời gian thực, cho tốc độ điều khiển tốt, đáp ứng nhanh, có thể thực hiện trên mọi thiết bị như PC hay điện thoại, máy tính bảng. Ưu điểm của phương pháp này là nếu có nhiều người sử dụng cùng lúc, ta có thể thấy được trạng thái hoạt động của