GIỚI THIỆU VỀ ĐỀ TÀI
Tính cấp thiết của đề tài
1.1.1 Lý do chọn đề tài
Tính quan trọng của nhận diện khuôn mặt trong nhiều lĩnh vực, như an ninh, giao thông, nhận dạng cá nhân và giao diện người máy Độ phức tạp tương đối thấp của thuật toán LBPH, giúp đơn giản hóa việc nghiên cứu và triển khai trong các ứng dụng có tài nguyên hạn chế.
1.1.2 Ý nghĩa khoa học Đóng góp vào lĩnh vực nhận diện khuôn mặt và hiểu rõ hơn về phương pháp truyền thống như LBPH so với các phương pháp hiện đại khác. Phân tích đặc điểm khuôn mặt và tương quan giữa chúng, đóng góp vào việc hiểu và mô phỏng quá trình nhận diện khuôn mặt.
1.1.3 Tính cấp thiết Ứng dụng thực tế trong nhiều lĩnh vực, giúp giải quyết các vấn đề về an ninh, quản lý dữ liệu cá nhân và nhận diện cá nhân Tính chính xác tương đối của thuật toán LBPH trong điều kiện đơn giản và ánh sáng tốt.
Sẵn có trong thư viện OpenCV, giúp giảm thời gian và công sức triển khai.
Có khả năng điều chỉnh và tối ưu hóa theo yêu cầu của ứng dụng cụ thể thực tế chẳng hạn như việc đóng mở cửa, tăng cường tính bảo mật.
Mục tiêu nghiên cứu của đề tài
Với đề tài "Nhận diện khuôn mặt mở cửa" mục đích của chúng tôi là xây dựng hệ thống nhận diện khuôn mặt và mở cửa tự động, tích hợp OpenCV,PyCharm và Arduino, với hiệu suất và độ chính xác cao.
Đối tượng và phạm vi nghiên cứu
Các đối tượng cần nghiên cứu và phạm vi nghiên cứu có thể giải quyết được đề tài:
- Đối tượng nghiên cứu: Lập trình Python OpenCV, Arduino Uno
- Phạm vi nghiên cứu: Thuật toán LBPH, các thư viện trong Pycharm:opencv, numpy, os, serial, time, pyttsx3.
Phương pháp nghiên cứu
Để thiết kế mô hình nhận dạng khuôn mặt mở khóa cửa dựa trên việc lấy dữ liệu từ wedcam, sau đó xử lý dữ liệu huấn luyện bằng thuật toán LBPH và cuối cùng là nhận diện khuôn mặt xuất tín hiệu ra Arduino để lệnh mở hoặc đóng cửa được thực thi được áp dụng các phương pháp nghiên cứu chính như phương pháp phân tích, tham khảo tài liệu, phương pháp tổng hợp tài liệu lý
Kết cấu của đề tài
Chương 1 GIỚI THIỆU VỀ ĐỀ TÀI
Chương 2 CƠ SỞ LÝ THUYẾT
Chương 3 XÂY DỰNG CHƯƠNG TRÌNH
Chương 4 KẾT QUẢ ĐẠT ĐƯỢC
CƠ SỞ LÝ THUYẾT
Mô hình Classifier Cascade
2.1.1 Đặc trưng Haar Like (mô tả đối tượng trong hình ảnh) Đặc trưng Haar Like được tạo thành bằng việc kết hợp các hình chữ nhật đen, trắng với nhau theo một trật tự, một kích thước nào đó
Hình 2 1 Các đặc trưng Haar-Like cơ bản Đây là một phương pháp đặc trưng được sử dụng để mô tả các đối tượng trong hình ảnh, chẳng hạn như khuôn mặt Nó dựa trên việc tính toán tổng giá trị pixel của các vùng quan tâm trong hình ảnh Các đặc trưng Haar-like bao gồm đặc trưng góc, đặc trưng cạnh và đặc trưng trung tâm, và chúng được tính toán trên các vùng khác nhau của hình ảnh. Đặc trưng Haar-like có ba loại chính: góc, cạnh và trung tâm.
- Corner feature: Sử dụng hai ô vuông lớn và hai ô vuông nhỏ để tính tổng giá trị pixel Đặc trưng này giúp nhận diện góc và biên cạnh trong hình ảnh.
- Edge feature: Cũng sử dụng hai ô vuông lớn và hai ô vuông nhỏ, nhưng tính tổng giá trị pixel khác nhau Đặc trưng này giúp nhận diện các biên cạnh trong hình ảnh.
- Center feature: Bao gồm một ô vuông lớn và hai ô vuông nhỏ để tính tổng giá trị pixel Đặc trưng này giúp nhận diện sự khác biệt giữa các vùng trong hình ảnh.
Các đặc trưng này được tính toán trên các vùng khác nhau của hình ảnh và được sử dụng để xác định các đối tượng quan tâm trong mô hình Classifier Cascade
2.1.2 Thuật toán AdaBoost (huấn luyện các bộ phân loại) Đây là một thuật toán học máy được sử dụng để huấn luyện một loạt các bộ phân loại yếu thành một bộ phân loại mạnh Trong mô hình Classifier Cascade, AdaBoost được sử dụng để huấn luyện các bộ phân loại dựa trên các đặc trưng Haar-like AdaBoost tập trung vào việc đào tạo các bộ phân
Hình 2 2 Phân loại các đặc trưng Haar-
Like loại yếu trên các mẫu huấn luyện khó khăn hơn để tạo ra một bộ phân loại tổng thể hiệu quả hơn.
Hình 2 3 Kết hợp các bộ phân loại yếu thành bộ phân loại
2.1.3 Mô hình phân tầng Cascade (loại bỏ các vùng không quan trọng) Đây là một cấu trúc mô hình được sử dụng để nhanh chóng loại bỏ các vùng không quan trọng trong hình ảnh không chứa đối tượng quan tâm, như khuôn mặt Mô hình phân tầng Cascade bao gồm nhiều giai đoạn (stage), mỗi giai đoạn chứa một số bộ phân loại Trong quá trình nhận diện, hình ảnh sẽ được chạy qua các giai đoạn tuần tự Các bộ phân loại trong mỗi giai đoạn sẽ kiểm tra các đặc trưng Haar-like và quyết định xem vùng đó có chứa đối tượng hay không Nếu một vùng không vượt qua một giai đoạn nào đó, nó sẽ bị loại bỏ, giúp tăng tốc quá trình nhận diện.
Hình 2 4 Mô hình phân tầng Cascade
Kết hợp ba thành phần này giúp mô hình đạt được hiệu suất cao và tốc độ xử lý nhanh trong việc nhận diện đối 2.1.4 Tổng quát
Mô hình Cascade Classifier chứa giải thuật Haar Cascade là một phần trong quá trình xây dựng mô hình Cascade Classifier, và mô hình Cascade Classifier sử dụng Haar Cascade để nhận diện các đặc trưng và phân loại đối tượng trong hình ảnh.
Trong thư viện OpenCV, các tệp XML phổ biến nhất liên quan đến Haar Cascade là các tệp được sử dụng để nhận diện khuôn mặt Dưới đây là một số tệp XML khuôn mặt phổ biến:
"haarcascade_frontalface_default.xml": Đây là một tệp XML phổ biến nhất và được sử dụng rộng rãi để nhận diện khuôn mặt phía trước.
"haarcascade_frontalface_alt.xml": Đây là một phiên bản khác của tệp XML nhận diện khuôn mặt phía trước, có khả năng nhận diện các khuôn mặt có góc nhìn và chi tiết khác nhau.
"haarcascade_profileface.xml": Đây là một tệp XML được sử dụng để nhận diện khuôn mặt phía bên.
Trong hệ thống nhận diện khuôn mặt được xây dựng trong đề tài, có sử dụng giải thuật Haar Cascade để xác định lấy dữ liệu khuôn mặt và tiến hành nhận diện khuôn mặt Cụ thể là tệp XML "haarcascade_frontalface_default.xml"
Thuật toán LBPH
-Thuật toán LBPH là một thuật toán phổ biến trong lĩnh vực nhận diện khuôn mặt và phân loại hình ảnh Thuật toán này được sử dụng để trích xuất đặc trưng từ hình ảnh khuôn mặt và xây dựng histogram để biểu diễn các đặc trưng đó.
-Mô hình nhận diện khuôn mặt bằng thuật toán LBPH trong thư viện OpenCV:
Thuật toán LBPH yêu cầu một tập dữ liệu được chuẩn bị trước đó để huấn luyện mô hình Quá trình này bao gồm việc thu thập hình ảnh khuôn mặt của các người dùng và xác định nhãn tương ứng cho từng hình ảnh Nhãn có thể là tên của người dùng hoặc một số định danh duy nhất cho mỗi người.
Hình 2 5 Phát hiện khuôn mặt người và xác định vùng khuôn mặt
Xác định vùng khuôn mặt:
Trước khi áp dụng thuật toán LBPH, chúng ta cần xác định vùng khuôn mặt trong hình ảnh Điều này có thể được thực hiện bằng cách sử dụng các thuật toán phát hiện khuôn mặt như Haar cascades Thuật toán này giúp xác định vị trí và đường viền của khuôn mặt trong hình ảnh.
Chuyển đổi ảnh thành ảnh xám:
Hình ảnh khuôn mặt được chuyển đổi thành ảnh xám để đơn giản hóa quá trình xử lý Điều này cũng giúp giảm số lượng thông tin và làm tăng tốc độ xử lý.
Chia hình ảnh thành các ô nhỏ:
Sau khi xác định được vùng khuôn mặt và chuyển đổi ảnh thành ảnh xám, hình ảnh khuôn mặt được chia thành các ô nhỏ có kích thước cố định, chẳng hạn3x3 pixel Mỗi ô nhỏ đại diện cho một vùng nhỏ trên khuôn mặt.
Hình 2 6 Chia hình ảnh thành ô nhỏ và xác định mẫu nhị phân
Xác định mẫu nhị phân:
Với mỗi ô nhỏ, thuật toán LBPH xác định một mẫu nhị phân bằng cách so sánh giá trị điểm ảnh tại trung tâm ô với các điểm ảnh xung quanh Thuật toán xem xét 8 điểm xung quanh trung tâm ô nhỏ và so sánh giá trị của chúng với giá trị của điểm ảnh trung tâm Nếu giá trị điểm ảnh xung quanh lớn hơn hoặc bằng giá trị điểm ảnh trung tâm, nó được đánh dấu là 1, ngược lại, nó được đánh dấu là 0 Quá trình này tạo ra một chuỗi nhị phân có độ dài 3 để biểu diễn mẫu nhị phân của ô nhỏ.
Hình 2 7 Ảnh đa cấp xám (trái), ảnh LBP (giữa) và biểu đồ (phải) của ảnh LBP
Histograms của các hình ảnh khuôn mặt trong tập dữ liệu huấn luyện được sử dụng để huấn luyện mô hình nhận diện khuôn mặt Mô hình này lưu trữ trạng thái của histogram và nhãn tương ứng ứng với mỗi khuôn mặt.
Khi có histogram cho hình ảnh khuôn mặt đang được nhận diện, thuật toán LBPH so sánh histogram này với các histogram của các hình ảnh đã được lưu trữ trong cơ sở dữ liệu Các phép so sánh thường sử dụng các độ đo như khoảng cách Euclidean Khi tìm thấy histogram tương tự nhất trong cơ sở dữ liệu, thuật toán LBPH sẽ trả về nhãn tương ứng với khuôn mặt được nhận diện. Đó là quá trình tổng quan của thuật toán LBPH trong việc nhận diện khuôn mặt bằng thư viện OpenCV Nó sử dụng mẫu nhị phân và histogram để biểu diễn đặc trưng của khuôn mặt và so sánh chúng với các khuôn mặt đã được lưu trữ để nhận dạng Thuật toán này có thể được sử dụng để xây dựng một hệ thống nhận diện khuôn mặt đơn giản và hiệu quả.
Hình 2 8 Ảnh quá trình sử dụng thuật toán LBPH để trích xuất các đặc trưng của hình ảnh
Thư viện OpenCV
OpenCV là một thư viện mã nguồn mở phát triển chủ yếu cho việc xử lý hình ảnh và thị giác máy tính Nó cung cấp một loạt các chức năng và công cụ để xử lý, phân tích và nhận dạng hình ảnh OpenCV được viết bằng C++ và có giao diện lập trình ứng dụng (API) cho nhiều ngôn ngữ, bao gồm Python. Dưới đây là một số chức năng chính của OpenCV:
Xử lý hình ảnh cơ bản: OpenCV cung cấp các chức năng để đọc, ghi, và xử lý hình ảnh cơ bản như chuyển đổi màu sắc, điều chỉnh độ tương phản, cắt và kết hợp hình ảnh, và thay đổi kích thước.
Phân tích và nhận dạng đối tượng: OpenCV cung cấp các thuật toán và công cụ để phát hiện, nhận dạng và theo dõi đối tượng trong hình ảnh. Điều này bao gồm việc sử dụng các kỹ thuật như phát hiện khuôn mặt, phát hiện vật thể, phát hiện biên, và phát hiện đường viền.
Xử lý video: OpenCV hỗ trợ xử lý video và dữ liệu video realtime Nó cho phép bạn đọc video từ các nguồn đa phương tiện, trích xuất các khung hình, xử lý và phân tích video frame-by-frame, và ghi lại video.
Xử lý thị giác máy tính: OpenCV cung cấp các công cụ để xử lý và phân tích dữ liệu hình ảnh từ các cảm biến như máy ảnh và lidar Điều này bao gồm việc calibrate và rectify camera, phát hiện và phân tích dữ liệu từ cảm biến, và xử lý hình ảnh 3D.
Machine learning: OpenCV tích hợp tính năng học máy, cho phép bạn huấn luyện và triển khai các mô hình học máy trên dữ liệu hình ảnh Các thuật toán như Support Vector Machines (SVM), Random Forests, vàNeural Networks được tích hợp sẵn trong OpenCV.
OpenCV đã trở thành một trong những thư viện quan trọng nhất trong lĩnh vực xử lý hình ảnh và thị giác máy tính Nó được sử dụng rộng rãi trong các ứng dụng như nhận dạng khuôn mặt, phân loại đối tượng, xử lý ảnh y tế, xe tự lái, và nhiều lĩnh vực khác liên quan đến xử lý hình ảnh và thị giác máy tính.
Thư viện sqlite3
Thư viện sqlite3 trong Python cung cấp các công cụ và chức năng để tương tác với cơ sở dữ liệu SQLite từ trong chương trình
Python SQLite là một hệ quản trị cơ sở dữ liệu nhỏ, nhúng và không cần máy chủ, được sử dụng rộng rãi trong các ứng dụng nhỏ và đơn giản.
Thư viện PIL
Thư viện PIL là một thư viện phổ biến trong Python cho việc xử lý và thao tác với hình ảnh Nó cung cấp các chức năng để đọc, ghi, chỉnh sửa và chuyển đổi hình ảnh trong nhiều định dạng khác nhau.
Dưới đây là một số chức năng mà thư viện PIL có thể đáp ứng được
- Đọc và ghi hình ảnh: Để đọc một hình ảnh từ file, có thể sử dụng phương thức open() của đối tượng Image PIL hỗ trợ nhiều định dạng hình ảnh như JPEG, PNG, GIF, BMP, và nhiều hơn nữa.
Ví dụ: image = Image.open("image.jpg") Để lưu một hình ảnh đã chỉnh sửa vào file, có thể sử dụng phương thức save() của đối tượng Image.
Ví dụ: image.save("output.jpg")
PIL cung cấp nhiều phương thức để xử lý hình ảnh như thay đổi kích thước, cắt, xoay, lật, áp dụng bộ lọc, chỉnh sửa màu sắc và độ tương phản, và nhiều hơn nữa.
Hình 2 9 Cấu trúc cơ bản của OpenCV
Ví dụ, để thay đổi kích thước hình ảnh, có thể sử dụng phương thức resize(): resized_image = image.resize((width, height))
- Chuyển đổi định dạng hình ảnh:
Có thể chuyển đổi định dạng hình ảnh từ một định dạng sang định dạng khác bằng cách sử dụng phương thức convert().
Ví dụ, converted_image = image.convert("PNG")
Có thể tạo hình ảnh mới bằng cách sử dụng hàm new() và chỉ định các thông số như chế độ màu sắc, kích thước và màu nền.
Ví dụ: new_image = Image.new("RGB", (width, height), (255, 255, 255))
Thư viên pySerial
Module pySerial là một thư viện Python mạnh mẽ và phổ biến được sử dụng để tạo và quản lý kết nối với các thiết bị ngoại vi qua giao thức Serial (UART).
Nó cung cấp các lớp và phương thức để giao tiếp với các thiết bị như Arduino, Raspberry Pi, máy in, cảm biến, và nhiều thiết bị ngoại vi khác.
- Khởi tạo đối tượng Serial: serial.Serial(port, baudrate, timeout): Tạo đối tượng Serial với các tham số: port: Tên cổng Serial (ví dụ: 'COM1') baudrate: Tốc độ baudrate (ví dụ: 9600, 115200).
- Giao tiếp với thiết bị: serial.write(data): Gửi dữ liệu đến thiết bị qua cổng Serial data có thể là chuỗi ký tự hoặc mảng byte. serial.read(size): Đọc size byte dữ liệu từ cổng Serial và trả về dưới dạng một chuỗi byte.
Thư viện pyttsx3
Module pyttsx3 là một thư viện Python dùng để chuyển đổi văn bản thành giọng nói (Text-to-Speech) Nó cung cấp một giao diện đơn giản để phát âm thanh từ văn bản bằng cách sử dụng các công nghệ
Text-to-Speech khác nhau như Microsoft
Thư viên Time
Thư viện time được import trong đoạn mã trên có chức năng điều khiển thời gian trong Python Cụ thể, nó được sử dụng để tạo ra các đợt trễ giữa các hành động trong quá trình nhận dạng khuôn mặt.
Chức năng được áp dụng của các hàm từ time trong đề tài này: time.sleep(seconds): Hàm này tạm dừng thực thi chương trình trong một số giây được chỉ định bởi tham số seconds Trong đoạn mã, nó được sử dụng để tạo ra đợt trễ 2 giây và 4 giây trước khi gửi dữ liệu qua kết nối Serial.
Tổng quát
Hệ thống nhận diện khuôn mặt mở khóa cửa sử dụng các cơ sở lý thuyết và thư viện: Cascade Classifier, LBPH, pyserial, pyttsx3, time, OpenCV, sqlite3 và PIL để thực hiện các chức năng sau:
-Cascade Classifier: Sử dụng để phát hiện khuôn mặt trong ảnh hoặc video. LBPH (Local Binary Patterns Histograms): Sử dụng để nhận dạng khuôn mặt dựa trên các đặc trưng của khuôn mặt.
-pyserial: Sử dụng để giao tiếp với cổng Serial để điều khiển cơ chế mở khóa cửa.
-pyttsx3: Sử dụng để chuyển đổi văn bản thành giọng nói để thông báo âm thanh khi khuôn mặt được nhận dạng hoặc không nhận dạng.
-time: Sử dụng để tạo ra các đợt trễ giữa các hành động trong quá trình nhận dạng.
-OpenCV: Sử dụng để xử lý ảnh và video, bao gồm việc nhận dạng khuôn mặt và vẽ đường viền xung quanh khuôn mặt.
-sqlite3: Sử dụng để lưu trữ thông tin về khuôn mặt đã được huấn luyện và thực hiện truy vấn cơ sở dữ liệu.
Tổng thể, hệ thống kết hợp các cơ sở lý thuyết và thư viện này để phát hiện,nhận dạng và xử lý khuôn mặt, giao tiếp với cơ chế mở khóa cửa và cung cấp thông báo âm thanh.
XÂY DỰNG CHƯƠNG TRÌNH
Xây dựng mô hình
Mô hình nhận dạng được chia thành 3 bước chính, bao gồm:
Bước 1: Lấy dữ liệu khuôn mặt từ wed cam.
Bước 2: Huấn luyện dữ liệu đưa vào và trích chọn các đặc trưng.
Bước 3: Xác thực khuôn mặt và điều khiển động cơ
Hình 3 1 Sơ đồ quy trình Nhận dạng khuôn mặt
3.1.1 Lấy dữ liệu khuôn mặt từ wedcam
Phần đầu tiên của mô hình Nhận diện khuôn mặt này là Lấy dữ liệu khuôn mặt từ wed cam Sau đây là mô tả cách làm việc của nó theo các đoạn code như sau:
Hình 3 2 Thiết lập một phần thiết lập và cập nhật dữ liệu vào cơ sở dữ liệu SQLite
Dòng conn = sqlite3.connect("FaceBase.db") đang thiết lập kết nối tới cơ sở dữ liệu SQLite có tên "FaceBase.db." sqlite3: Đây là mô-đun thư viện chuẩn Python cung cấp giao diện để tương tác với cơ sở dữ liệu SQLite. connect("FaceBase.db"): Hàm này là một phần của mô-đun sqlite3 và nó tạo kết nối đến tệp cơ sở dữ liệu SQLite.
Vòng lặp for dùng để kiểm tra trong thư mục đã có tồn tại id nào trùng lặp không.
- isRecordExist = 1: Bên trong vòng lặp, dòng này đặt biến isRecordExist thành 1, cho biết rằng đã tìm thấy dữ liệu id này trong cơ sở dữ liệu.
- if isRecordExist == 1: Điều kiện này kiểm tra xem isRecordExist so sánh với 1 có bằng hay không, nghĩa là id có tồn tại trong cơ sở dữ liệu hay không.
Ba dòng cuối được sử dụng để thực thi câu truy vấn, lưu thay đổi và đóng kết nối với cơ sở dữ liệu SQLite.
Hình 3 3 Sử dụng CascadeClassifier và truy cập wedcam
Sử dụng tệp haarcascade_frontalface_default.xml của Mô hình Classifier
Cascade Đối tượng này được sử dụng để phát hiện khuôn mặt trong ảnh.
Tiếp theo, dòng cap = cv2.VideoCapture(0) khởi tạo một đối tượng
VideoCapture từ thiết bị webcam có chỉ số 0 (thiết bị mặc định) Đối tượng này được sử dụng để truy cập và lấy các khung hình từ webcam để xử lý.
Dòng mã id = input('Enter User ID: ') và name = input('Enter Your Name: ') được sử dụng để yêu cầu người dùng nhập ID và tên thông qua giao diện dòng lệnh Ở phần giao diện thì không cần sử dụng tới vì ở phần giao diện việc nhập dữ liệu có thể được thực hiện thông qua các thành phần giao diện như hộp văn bản hoặc biểu mẫu sẽ được thay bằng:
Hình 3 4 Wedcam thu thập dữ liệu hình ảnh, xử lý và lưu vào thư mục while True: Điều này tạo ra một vòng lặp vô hạn, cho biết đoạn mã sau sẽ được thực thi liên tục cho đến khi chương trình bị gián đoạn theo cách thủ công.
Dòng lệnh này sẽ đọc hình ảnh từ wedcam Và sau đó sẽ chuyển đổi hình anh đã chụp sang ảnh xám Thang độ xám thường được sử dụng để nhận diện khuôn mặt nhằm đơn giản hóa quá trình xử lý.
Sử dụng face_cascade được xác định trước đó để phát hiện các khuôn mặt trong khung thang độ xám Các tham số 1.3 và 5 lần lượt là hệ số tỷ lệ và lân cận tối thiểu được sử dụng bởi thuật toán nhận diện khuôn mặt.
- for (x, y, w, h) in faces:: Lặp lại danh sách các khuôn mặt được phát hiện, trong đó
(x, y) là tọa độ của góc trên cùng bên trái của hình chữ nhật khuôn mặt và (w, h) là chiều rộng và chiều cao của hình chữ nhật.
- Số lượng hình ảnh khuôn mặt được thu thập là 100 hình được lưu vào thư mục data_face.
- cv2.imwrite('data_face/face.' + str(id) + '.' + str(sample_number) + '.jpg', img[y:y+h, x:x+w]): Ghi khuôn mặt được phát hiện dưới dạng một tệp hình ảnh riêng biệt với định dạng JPG.
- cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2): Vẽ một hình chữ nhật màu xanh lục xung quanh khuôn mặt được phát hiện trong khung màu gốc img.
Câu lệnh if được sử dụng để xác định nếu hình ảnh khuôn mặt lấy đủ 100 hình Nếu đúng thì wedcam sẽ tự động đóng lại.
3.1.2 Huấn luyện dữ liệu đưa vào và trích chọn các đặc trưng a) Giới thiệu
Mô tả về mục tiêu: Phát triển một mô hình nhận diện khuôn mặt sử dụng thuật toán LBPH của OpenCV.
Import các thư viện cần thiết:
os: Để làm việc với hệ thống tệp và thư mục.
cv2 (OpenCV): Thư viện xử lý ảnh và video.
numpy: Để làm việc với các mảng. b) Khởi tạo Mô hình nhận diện
Sử dụng thư viện OpenCV để tạo một đối tượng nhận diện khuôn mặt sử dụng thuật toán LBPH c) Chuẩn bị dữ liệu đào tạo
Xác định đường dẫn đến thư mục chứa ảnh để đào tạo. d) Huấn luyện mô hình nhận dạng khuôn mặt Đoạn mã trên thực hiện các công việc sau:
- Định nghĩa getImagesWithID để trích xuất ảnh và ID của khuôn mặt từ thư mục dữ liệu.
- Gọi hàm getImagesWithID(path) để lấy danh sách các ID và ảnh khuôn mặt từ thư mục dữ liệu: Ids, faces = getImagesWithID(path).
- Huấn luyện mô hình nhận dạng khuôn mặt bằng cách truyền các ảnh khuôn mặt và danh sách ID vào: recognizer.train(faces, Ids).
- Kiểm tra và tạo thư mục 'trainer' nếu nó chưa tồn tại.
- Lưu mô hình đã huấn luyện vào file 'face-trainner.yml' trong thư mục 'trainer': recognizer.save("trainer/face-trainner.yml").
- Đóng tất cả cửa sổ hiển thị. Đoạn mã này huấn luyện mô hình nhận dạng khuôn mặt bằng cách trích xuất ảnh và ID từ thư mục dữ liệu, sau đó sử dụng các ảnh và ID đó để huấn luyện mô hình Mô hình được lưu trữ trong file 'face-trainner.yml' trong thư mục 'trainer'.
Sau đó 2 dòng code này getImagesWithID(path)" và
"recognizer.train(faces, Ids)" sẽ thực hiện chức năng lấy danh sách các ảnh khuôn mặt và ID tương ứng từ thư mục dữ liệu, sau đó sử dụng chúng để huấn luyện mô hình nhận dạng khuôn mặt. e) Tạo file lưu thông tin huấn luyện Đoạn mã trên kiểm tra xem thư mục có tên "trainer" đã tồn tại hay chưa bằng cách sử dụng hàm os.path.exists('trainer') Nếu thư mục không tồn tại, hàm os.makedirs('trainer') sẽ được gọi để tạo thư mục mới có tên "trainer".
Sau đó, mô hình đã huấn luyện được lưu vào file "face-trainner.yml" trong thư mục "trainer" bằng cách sử dụng phương thức save() của đối tượng
File YAML ("face-trainner.yml") được tạo và lưu trữ trong thư mục "trainer" chứa thông tin đã huấn luyện của mô hình nhận dạng khuôn mặt File này chứa các thông số và trọng số của mô hình, được sử dụng để tái sử dụng mô hình trong các ứng dụng khác hoặc để tiếp tục huấn luyện mô hình trong tương lai mà không cần phải thực hiện quá trình huấn luyện từ đầu.
Mô tả về việc hoàn thành quá trình đào tạo mô hình nhận diện khuôn mặt
Mô hình đã được lưu trữ và sẵn sàng để sử dụng cho phần nhận diện khuôn mặt.
3.1.3 Xác thực khuôn mặt và điều khiển động cơ a) Import các thư viện và module cần thiết
- Dòng import cv2 từ thư viện OpenCV: để làm việc với xử lý ảnh.
- Dòng import numpy: để làm việc với mảng và ma trận số học.
- Dòng import serial: để kết nối và giao tiếp với các thiết bị qua cổng serial.
- Dòng import time: để làm việc với các hàm và tính toán thời gian.
- Dòng import pyttsx3: để tương tác với hệ thống Text-to-Speech (TTS) và phát ra giọng nói từ văn bản. b) Cấu hình phát giọng nói bằng văn bản
Hàm speak(audio) được định nghĩa để phát ra giọng nói từ văn bản sử dụng engine text-to-speech Dưới đây là mục đích của các dòng mã trong hàm:
Hình 3 6 Trong “os” đã có các bộ huấn luyện có sẵn
Hình 3 7 Định nghĩa một hàm phát giọng nói
- engine = pyttsx3.init('sapi5'): Khởi tạo engine text-to-speech sử dụng giao diện SAPI5 trên Windows.
- voices = engine.getProperty('voices'): Lấy danh sách các giọng nói được hỗ trợ bởi engine.
- engine.setProperty("voice", voices[0].id): Thiết lập giọng nói mặc định cho engine.
- engine.setProperty("rate", 140): Thiết lập tốc độ phát giọng nói mặc định.
- engine.setProperty("volume", 1000): Thiết lập âm lượng giọng nói mặc định. c) Nhận dạng khuôn mặt từ video camera và hiển thị kết quả lên màn hình Một vòng lặp vô hạn (while True) được sử dụng để liên tục đọc khung hình từ camera, phát hiện khuôn mặt và thực hiện nhận dạng
Dòng ret, frame = cap.read() đọc khung hình từ video camera.
Dòng image, face = face_detector(frame) sử dụng hàm face_detector để phát hiện khuôn mặt trong khung hình và gán kết quả vào biến image (khung hình gốc) và face (khuôn mặt được phát hiện).
Trong khối try của đoạn mã này, sau khi chuyển đổi khuôn mặt sang ảnh grayscale (face = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)), mô hình (model) được sử dụng để dự đoán kết quả nhận dạng khuôn mặt.
- Dòng result = model.predict(face) dùng để dự đoán nhãn của khuôn mặt bằng cách sử dụng mô hình model đã được huấn luyện trước đó.
Giao diện giao tiếp người dùng
Giao diện thiết kế để giao tiếp với người dùng một cách dễ dàng trọng việc đưa dữ liệu khuôn mặt, huấn luyện nó và sử dụng dữ liệu đã được huấn luyện để nhận diện đúng người để thực hiện chức năng cần thiết Ở phần giao diện này, được tạo ra và áp dụng đầy đủ các tính năng của 3 phần trước Được thiết kế theo thiết kế bằng sử dụng thư viện đồ họa tkinter trong Python Thư viện tkinter cung cấp các công cụ và phương thức để tạo giao diện đồ họa người dùng trong các ứng dụng máy tính.
3.2.1 Gi i thi u th vi n Tkinterới thiệu thư viện Tkinter ệu thư viện Tkinter ư viện Tkinter ệu thư viện Tkinter
Tkinter là một thư viện giao diện người dùng (GUI) phổ biến trong Python Nó dễ sử dụng và đa nền tảng, cho phép bạn tạo các cửa sổ, nút, nhãn và các thành phần giao diện khác trong ứng dụng desktop Tkinter cung cấp các công cụ để tương tác với người dùng và xử lý sự kiện Nó là một lựa chọn phổ biến cho việc phát triển ứng dụng GUI đơn giản trong Python.
3.2.2 Thành ph n c a giao di n ần của giao diện ủa giao diện ệu thư viện Tkinter
tk.Tk() tạo một đối tượng cửa sổ giao diện chính và gán cho biến win.
win.title("FACE ID") đặt tiêu đề của cửa sổ là "FACE ID"
win.geometry('600x400') thiết lập kích thước của cửa sổ là 600 pixel chiều rộng và 400 pixel chiều cao.
- Chèn background cho giao diện:
- Các lớp được chèn vào giao diện:
Các nhãn này được cấu hình với các thuộc tính như văn bản, màu nền,màu văn bản và vị trí trên giao diện. Đoạn mã trên tạo ra các nhãn như sau:
Nhãn label có văn bản "HỆ THỐNG NHẬN DIỆN KHUÔN MẶT", màu nền trắng, màu văn bản đen và kiểu chữ Arial với kích thước 13 và đậm.
Nó được định vị tại cột 1, hàng 0 trên giao diện, với khoảng cách dọc là
Nhãn label1 có văn bản "ID:", màu nền đen, màu văn bản trắng Nó được định vị tại cột 0, hàng 1 trên giao diện, với khoảng cách dọc là 30 pixel. Nhãn label2 tương tự như label1.
Tạo ra hai ô nhập liệu trên giao diện tkinter và cấu hình chúng
- Các nút nhấn trong giao diện:
Ba nút nhấn btlaydulieu, bttrain, btnhandien được tạo bằng lớp ttk.Button() của tkinter.
btlaydulieu có văn bản "Get Data" và liên kết với hàm laydulieu khi được nhấp.
bttrain có văn bản "Training" và liên kết với hàm train khi được nhấp.
btnhandien có văn bản "Recognize" và liên kết với hàm nhandien khi được nhấp.
Các nút được đặt trên giao diện theo các cột và hàng được chỉ định.
Thuộc tính pady thêm khoảng cách dọc 20 pixel giữa các nút.
Các cột trong giao diện được cấu hình với trọng số 1, cho phép chúng tự động điều chỉnh kích thước khi cửa sổ giao diện thay đổi.
3.2.3 K t qu c a giao di nết quả của giao diện ả của giao diện ủa giao diện ệu thư viện Tkinter
Hình 3 9 Giao diện giao tiếp người dùng được hiển thị
Mô hình mô phỏng thực tế
Mô hình có tên là mô hình cửa cuốn mở khóa cửa bằng nhận diện khuôn mặt.
Có để dễ dàng nhận diện và điều khiển cửa đóng mở khi được xác nhận qua khuôn mặt người chủ Do mô hình được thiết kế và làm bằng tay, với độ chính xác chưa cao Vì thế nên sẽ có một số sai sót xuất hiện trong quá trình chạy thử 3.3.1 Gi i thi u thi t b ới thiệu thư viện Tkinter ệu thư viện Tkinter ết quả của giao diện ị
Là một bo mạch phát triển dựa trên nền tảng mã nguồn mở Nó có vi xử lý mạnh mẽ, các chân GPIO để kết nối với các linh kiện và cảm biến, hỗ trợ giao tiếp thông qua các giao thức như UART, I2C và SPI, và có thể
20 được lập trình bằng ngôn ngữ Arduino Arduino Uno là một công cụ linh hoạt và dễ sử dụng cho các dự án điện tử và nhúng.
Mạch cầu H (H-bridge) là một mạch điện tử được sử dụng để điều khiển động cơ hoặc tải điện có hướng quay và chiều điều khiển độc lập Nó cho phép đảo chiều quay của động cơ và điều chỉnh tốc độ quay thông qua điều khiển các tín hiệu tương ứng.
Mạch cầu H thường được sử dụng trong các ứng dụng điện tử, robotica và tự động hóa để điều khiển động cơ DC hoặc động cơ bước.
- Động cơ DC giảm tốc: Động cơ DC giảm tốc là một loại động cơ
DC có khả năng giảm tốc độ quay thông qua hệ thống bánh răng hoặc truyền động khác Nó tạo ra lực xoắn lớn và vận tốc quay thấp, và được sử dụng rộng rãi trong các ứng dụng như robot, tự động hóa và công nghiệp
3.3.2 C u thành mô hìnhấu thành mô hình
- Thành phần chính cấu tạo nên mô hình gồm có: Arduino Uno, mạch cầu H L289N 2A, động cơ DC giảm tốc 2 trục, pin 9V.
- Dựng mô hình bằng bìa formex với tấm cửa cuốn được làm từ bìa carton mỏng nhẹ dễ cuốn Cài đặt thời gian cho thiết bị chạy khi nhận dữ liệu khuôn mặt đúng, không đúng hoặc không có khuôn mặt để phát tín hiệu về arduino sau khi đã thực hiện các bước từ lấy dữ liệu, huấn luyện và nhận diện
- Nguyên lý làm việc của mô hình: Khi cắm jack vào cổng com của máy tính, bắt đầu chạy phần code arduino, sau đó nạp vào arduino Tiếp theo chạy phần giao diện của chương trình lên, thực hiện các bước từ getData đến Recognize. Sau đó wedcam hiện liên và nhận diện khuôn mặt rồi nếu đúng với khuôn mặt đã huấn luyện từ trước, âm thanh sẽ phát ra là “Nhận diện thành công Chào mừng bạn trở lại” và cửa cuốn sẽ tự động được mở sau 0.2s và đóng lại sau 5s khi người chủ đã vào phòng Và ngược lại, nếu không đúng hoặc không thấy khuôn mặt Hệ thống yêu cầu quét lại
- Code Arduino điều khiển động cơ khi nhận tín hiệu từ hệ thống nhận diện:
Hình 3 11 Hình ảnh Mạch cầu H
Hình 3 12 Động cơ DC giảm tốc
Với đoạn code này có 3 phần chính:
Phần 1: Chân 9 được sử dụng để điều khiển tín hiệu PWM cho động cơ, và chân 8 và 7 được sử dụng để điều khiển hướng quay của động cơ. Phần 2: Hàm setup():
Hàm này được gọi một lần khi Arduino khởi động, tốc độ truyền dữ liệu của kết nối Serial được đặt là 9600 bps.
Các chân enA, in1, và in2 được cấu hình là OUTPUT (đầu ra).
Hàm này được thực thi lặp đi lặp lại sau khi hàm setup() được thực thi.
Chương trình kiểm tra xem có dữ liệu có sẵn từ kết nối Serial (Serial.available()) hay không. Nếu có dữ liệu, nó được đọc (Serial.read()) và gán cho biến d.
Nếu giá trị của d là 'a', chương trình tiến hành điều khiển động cơ: Đặt in1 là HIGH và in2 là LOW để quay theo một hướng.
Trong chương trình này, động cơ được chạy với tốc độ là 150, chạy trong 0.74s Các thông số này là tùy chỉnh theo mô hình được làm ra Cuối cùng, biến d được gán giá trị '\0' hoặc 0 để xóa giá trị của nó.
Mô hình sau khi được lắp ráp và chạy thử thành công.
Hình 3 13 Hình ảnh về cấu tạo mô hình cửa cuốn
Hình 3 14 Bên ngoài , bên trong mô hình