Cơ sở lý thuyết
Ngôn ngữ lập trình Python
Python là ngôn ngữ lập trình hướng đối tượng bậc cao, phổ biến trong phát triển website và ứng dụng Hiện nay, Python được ứng dụng rộng rãi trong lĩnh vực trí tuệ nhân tạo, học máy và học sâu Ngôn ngữ này được tạo ra bởi Guido van Rossum và phát triển trong dự án mã nguồn mở.
Python là ngôn ngữ lập trình lý tưởng cho người mới bắt đầu nhờ cú pháp đơn giản, dễ hiểu và dễ sử dụng Bên cạnh đó, Python còn nổi bật với tính chặt chẽ, hiệu suất nhanh và mạnh mẽ, có mặt trên mọi hệ điều hành.
Python cung cấp hơn 100 thư viện được xây dựng sẵn để thực hiện các thuật toán Machine Learning và Deep Learning Điều này cho phép bạn dễ dàng chạy thuật toán trên tập dữ liệu chỉ với một lệnh cài đặt và tải các gói cần thiết Một số thư viện phổ biến bao gồm numPy, Keras, TensorFlow và PyTorch.
Python hỗ trợ nhiều nền tảng như Windows, MacOS và Linux Khi chuyển mã giữa các nền tảng, bạn có thể sử dụng các gói như PyInstaller để giải quyết các vấn đề về phụ thuộc một cách hiệu quả.
Python có một cộng đồng người dùng lớn mạnh, cung cấp sự hỗ trợ quý giá cho những vấn đề mã hóa Ngoài việc có nhiều người hâm mộ, Python còn sở hữu nhiều cộng đồng, nhóm và diễn đàn giúp các lập trình viên chia sẻ lỗi và hỗ trợ lẫn nhau Việc triển khai các ứng dụng trí tuệ nhân tạo trở nên dễ dàng hơn nhờ vào sự hỗ trợ của Python cho các gói thuật toán đã được xác định trước, giúp giảm thiểu việc phải viết mã Hơn nữa, phương pháp “kiểm tra khi code” trong học Python cũng giúp giảm số lượng mã cần gõ, làm cho quá trình lập trình trở nên hiệu quả hơn.
Hình 2 Hình ảnh minh họa Python
Thư viện OpenCV
OpenCV, viết tắt của Open Source Computer Vision, là một trong những thư viện mã nguồn mở hàng đầu cho xử lý ảnh theo thời gian thực.
• OpenCV chính thức được ra mắt đầu tiên vào năm 1999, OpenCV là thư viện mã nguồn mở miễn phí cho cả học thuật và thương mại.
• OpenCV hỗ trợ đa nền tảng gồm Windows, Linux, Mac OS, iOS và
• OpenCV hỗ trợ ngôn ngữ lập trình C/C++, Python và Java.
• OpenCV được viết bằng C / C ++ và tích hợp OpenCL.
• Thư viện có hơn 2500 thuật toán được tối ưu hóa.
Thư viện OpenCV Dlib
Dlib là một bộ công cụ C++ hiện đại, cung cấp các thuật toán học máy và công cụ phát triển phần mềm phức tạp nhằm giải quyết các vấn đề thực tiễn Nó được ứng dụng rộng rãi trong cả ngành công nghiệp và học thuật, phục vụ nhiều lĩnh vực như robot, thiết bị nhúng, điện thoại di động và môi trường máy tính hiệu suất cao Với giấy phép mã nguồn mở, Dlib cho phép người dùng sử dụng miễn phí trong bất kỳ ứng dụng nào.
Dlib là một thư viện trong OpenCV, hỗ trợ xác định khuôn mặt bằng thuật toán HOG (Histogram of Oriented Gradients) và SVM (Support Vector Machine), giúp giảm thời gian chạy và phù hợp cho hệ thống thời gian thực Gần đây, Dlib cũng đã bổ sung các hàm xác định khuôn mặt dựa trên mạng CNN Để sử dụng thư viện Dlib, người dùng cần có file model shape_predictor_68_face_landmarks.dat.bz2.
Hình 3 Model shape_predictor_68_face_landmarks.dat.bz2
Thư viện Face-recognition
Face-detection là thư viện nhận dạng khuôn mặt nổi tiếng, được phát triển dựa trên dlib của Python và viết bằng C++, ra mắt vào ngày 13 tháng 3 năm 2017 Thư viện này rất hữu ích cho các ứng dụng nhỏ, phù hợp cho mục đích học tập và nghiên cứu, với độ chính xác lên đến 99,38% Tuy nhiên, khả năng nhận dạng của face-detection bị ảnh hưởng bởi các điều kiện bên ngoài và phụ thuộc vào độ phân giải của hình ảnh Dù vậy, face-detection vẫn là một công cụ mạnh mẽ cho các dự án liên quan đến Raspberry Pi và quy trình nhận diện khuôn mặt.
Hình 4 Ví dụ sau khi sử dụng thư viện face-recognition
Bài toán nhận dạng khuôn mặt
2.5.1 Bài toán nhận dạng khuôn mặt
Nhận dạng khuôn mặt là một bài toán phức tạp trong lĩnh vực Computer Vision, yêu cầu giải quyết nhiều vấn đề khác nhau để đạt được kết quả chính xác.
• Việc làm đầu tiên đó là cần phải tìm kiếm tất cả những khuôn mặt có trong bức hình
• Tập trung vào từng khuôn mặt chắc chắn rằng bạn có thể nhận ra cùng một người từ góc nhìn hoặc điều kiện sáng tối khác nhau
• Lựa chọn những đặc trưng trên từng khuôn mặt
Ví dụ như đôi mắt to, khuôn mặt dài,…
• So sánh những đặc trưng này với những người khác để chúng ta có thể biết được tên của họ.
Giải quyết bài toán từng bước, ở mỗi bước sẽ có các thuật toán học máy khác nhau.
2.5.2 Tìm kiếm khuôn mặt (Face Detection)
Để xác định danh tính của một người trong bức hình, bước đầu tiên là xác định vị trí khuôn mặt Việc chuyển đổi bức hình sang ảnh đen trắng là cần thiết, vì ảnh màu không hiệu quả trong việc nhận diện khuôn mặt.
Vẽ các vector chỉ hướng tối dần của các điểm ảnh trong bức ảnh đen trắng, sau đó tạo ra các khung tỉ lệ để xác định các đặc điểm cơ bản của khuôn mặt thông qua các vector này.
Chúng ta nhằm mục đích xác định cách mà các pixel hiện tại có màu tối hơn so với các pixel xung quanh Dựa vào đó, chúng ta sẽ vẽ một mũi tên chỉ hướng mà màu sắc trở nên tối hơn.
Nếu bạn áp dụng quy trình này cho từng pixel trong bức ảnh, mỗi pixel sẽ được thay thế bằng một mũi tên Những mũi tên này được gọi là
Gradients (vectơ độ dốc) thể hiện dòng chảy từ các pixel sáng đến pixel tối trong hình ảnh Mặc dù có vẻ ngẫu nhiên, việc thay thế các pixel bằng gradients là hợp lý Khi phân tích trực tiếp các pixel tối và sáng của cùng một bức ảnh, chúng ta nhận được các giá trị khác nhau Tuy nhiên, nếu xem xét sự thay đổi của hướng sáng, cả hai hình ảnh tối và sáng sẽ cho kết quả với cùng một đại diện chính xác, giúp đơn giản hóa vấn đề.
Việc lưu trữ gradient cho mỗi pixel đơn lẻ mang lại quá nhiều chi tiết, do đó, để dễ dàng nhận diện mô hình cơ bản của hình ảnh, chúng ta nên xem xét dòng chảy sáng/tối ở mức cao hơn Để thực hiện điều này, hình ảnh sẽ được chia thành các ô vuông nhỏ 16x16 pixel Trong mỗi ô vuông, chúng ta sẽ đếm số lượng độ dốc theo các hướng chính như hướng lên, hướng lên phải, hướng phải, v.v Cuối cùng, ô vuông đó sẽ được thay thế bằng các hướng mũi tên nổi bật nhất, giúp thể hiện rõ ràng hơn các đặc điểm chính của hình ảnh.
Kết quả cuối cùng là chúng ta chuyển đổi hình ảnh gốc thành một biểu tượng đơn giản, giúp nắm bắt cấu trúc cơ bản của khuôn mặt một cách dễ hiểu hơn.
Để xác định các khuôn mặt trong hình ảnh HOG, chúng ta chỉ cần so sánh phần hình ảnh với mẫu HOG đã được trích xuất và tìm kiếm sự tương đồng cao nhất.
Hình 8 Kết quả thuật toán HOG
2.5.3 Đổi góc độ cho khuôn mặt
Để thực hiện điều này, chúng ta sẽ điều chỉnh từng bức ảnh sao cho mắt và môi luôn nằm đúng vị trí mẫu Việc này sẽ giúp chúng ta dễ dàng so sánh khuôn mặt trong các bước tiếp theo.
Để thực hiện điều này, chúng ta sẽ áp dụng thuật toán ước lượng mốc mặt, một phương pháp được phát minh bởi Vahid Kazemi và Josephine Sullivan vào năm 2014 Có nhiều cách khác nhau để thực hiện ước lượng mốc mặt, nhưng chúng ta sẽ tập trung vào phương pháp này.
Chúng tôi sẽ xác định 68 điểm cụ thể trên khuôn mặt, bao gồm đỉnh cằm, cạnh ngoài của mỗi mắt và cạnh trong của mỗi lông mày Sau đó, một thuật toán máy học sẽ được huấn luyện để nhận diện những điểm này trên mọi khuôn mặt.
Hình 9 68 điểm mốc trên khuôn mặt
Giờ đây, với việc xác định vị trí của mắt và miệng, chúng ta sẽ áp dụng các phép xoay đơn giản và chia cắt tỷ lệ hình ảnh để căn giữa mắt và miệng một cách tối ưu, được gọi là biến đổi "affine".
Hình 10 Ảnh kết quả sau bước 2
Hiện nay, bất kể cách xoay khuôn mặt, chúng ta có thể dễ dàng tập trung vào mắt và miệng ở cùng một vị trí trong bức ảnh Điều này giúp cải thiện độ chính xác cho các bước tiếp theo trong quá trình xử lý hình ảnh.
2.5.4 Nhận dạng khuôn mặt (Face Recognition)
Sau khi phát hiện khuôn mặt từ hình ảnh đầu vào, quá trình trích xuất các đặc trưng của khuôn mặt được thực hiện Những đặc trưng này sau đó sẽ được so sánh với cơ sở dữ liệu khuôn mặt hiện có để xác định danh tính hoặc các thông tin liên quan.
Phân tích thiết kế hệ thống
Phân tích yêu cầu bài toán
Mặc dù nhiều thuật toán nhận diện khuôn mặt đã được phát triển trong những năm gần đây, nhưng tốc độ và độ chính xác của chúng vẫn chưa tối ưu Tuy nhiên, những tiến bộ gần đây cho thấy vấn đề này sẽ được cải thiện nhanh chóng Chẳng hạn, Facebook có khả năng tự động gán thẻ cho bạn bè trong ảnh chỉ trong vài giây với độ chính xác lên tới 98% Bài viết này sẽ mô tả các bước thực hiện điều đó bằng thư viện face_recognition do Adam Geitgey phát triển.
Chương trình chủ yếu có nhiệm vụ nhận diện khuôn mặt người xem, xác định xem khuôn mặt đó đã được biết đến hay chưa Bên cạnh đó, chương trình còn thực hiện việc phát hiện và tách biệt các khuôn mặt trong ảnh tĩnh hoặc từ các khung hình được ghi lại từ camera, sau đó lưu trữ chúng vào cơ sở dữ liệu để tạo thành tập mẫu.
Trong đồ án này, chúng ta sẽ phân tích bốn vấn đề chính Đầu tiên, cần lấy một bức ảnh từ máy tính hoặc kết nối với webcam để hiển thị trên ImageBox Tiếp theo, thực hiện tìm kiếm và phát hiện các khuôn mặt có trong bức ảnh Sau đó, tập trung vào từng khuôn mặt để nhận diện chúng khi di chuyển trong điều kiện ánh sáng yếu hoặc các góc nhìn bất lợi Bước tiếp theo là mã hóa bức ảnh và so sánh các bức ảnh đã mã hóa với nhau để đưa ra phỏng đoán về danh tính của người đó Nếu người đó đã được lưu thông tin trong cơ sở dữ liệu, hiển thị tên của họ; nếu không, hiển thị là “Unknown” Cuối cùng, tách lấy tên và lưu lại thông tin về tên cùng thời gian có mặt vào cơ sở dữ liệu.
Hình 12 Sơ đồ ngữ cảnh của hệ thống
Triển khai xây dựng chương trình
Cài đặt môi trường
• Đầu tiên chúng ta cần cài đặt python 3.7.2, một phiên bản ổn định được python phát hành vào ngày 24/12/2018(Dec 24, 2018).
• Tiếp theo là là Pycharm
Sau khi hoàn tất việc cài đặt môi trường, bước tiếp theo là cài đặt các thư viện cần thiết bằng lệnh pip của Python, bao gồm: Cmake, Dlib, Face_recognition, Numpy, Opencv-python và Pyodbc.
Hình 16 Cài đặt thư viện