Professional Documents
Culture Documents
Báo Cáo BTL XLA CT
Báo Cáo BTL XLA CT
Đề tài :
THIẾT KẾ MÔ HÌNH NHẬN DIỆN KHUÔN MẶT CỬA
TỰ ĐỘNG VỚI OPENCV PYCHARM & ARDUINO
Đề tài :
THIẾT KẾ MÔ HÌNH NHẬN DIỆN KHUÔN MẶT CỬA
TỰ ĐỘNG VỚI OPENCV PYCHARM & ARDUINO
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
MỤC LỤC
LỜI MỞ ĐẦU........................................................................................................................................i
DANH MỤC KÝ HIỆU, THUẬT NGỮ VIẾT TẮT.........................................................................ii
DANH MỤC HÌNH ẢNH..................................................................................................................iii
CHƯƠNG 1: GIỚI THIỆU VỀ ĐỀ TÀI............................................................................................1
1.1. Tính cấp thiết của đề tài...........................................................................................................1
1.1.1. Lý do chọn đề tài..................................................................................................................1
1.1.2. Ý nghĩa khoa học.................................................................................................................1
1.1.3. Tính cấp thiết.......................................................................................................................1
1.1.4. Tính khả thi..........................................................................................................................1
1.2. Mục tiêu nghiên cứu của đề tài................................................................................................1
1.3. Đối tượng và phạm vi nghiên cứu............................................................................................1
1.4. Phương pháp nghiên cứu..........................................................................................................1
1.5. Kết cấu của đề tài......................................................................................................................1
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT...................................................................................................2
2.1. Mô hình Classifier Cascade......................................................................................................2
2.1.1. Đặc trưng Haar Like (mô tả đối tượng trong hình ảnh).......................................................2
2.1.2. Thuật toán AdaBoost (huấn luyện các bộ phân loại)...........................................................2
2.1.3. Mô hình phân tầng Cascade (loại bỏ các vùng không quan trọng)......................................3
2.1.4. Tổng quát.............................................................................................................................3
2.2. Thuật toán LBPH......................................................................................................................4
2.3. Thư viện OpenCV.....................................................................................................................6
2.4. Thư viện sqlite3.........................................................................................................................7
2.5. Thư viện PIL..............................................................................................................................7
2.6. Thư viên pySerial......................................................................................................................8
2.7. Thư viện pyttsx3........................................................................................................................8
2.8. Thư viên Time...........................................................................................................................8
2.9. Tổng quát...................................................................................................................................8
CHƯƠNG 3: XÂY DỰNG CHƯƠNG TRÌNH.................................................................................9
3.1. Xây dựng lưu đồ thuật toán.....................................................................................................9
3.1.1. Lưu đồ thuật toán lấy dữ liệu khuôn mặt.............................................................................9
3.1.2. Lưu đồ thuật toán huấn luyện dữ liệu..................................................................................9
3.1.3. Lưu đồ thuật toán nhận diện khuôn mặt.............................................................................10
3.2. Xây dựng chương trình..........................................................................................................11
3.2.1. Lấy dữ liệu khuôn mặt từ wedcam.....................................................................................11
3.2.2. Huấn luyện dữ liệu đưa vào và trích chọn các đặc trưng...................................................14
3.2.3. Xác thực khuôn mặt và điều khiển động cơ.......................................................................15
3.3. Giao diện giao tiếp người dùng..............................................................................................19
3.3.1. Giới thiệu thư viện Tkinter................................................................................................19
3.3.2. Thành phần của giao diện..................................................................................................19
3.3.3. Kết quả của giao diện.........................................................................................................21
3.4. Xây dựng mô hình......................................................................................................................21
3.4.1. Giới thiệu thiết bị...............................................................................................................22
3.4.2. Cấu thành mô hình.............................................................................................................22
3.4.3. Hoàn thành mô hình...........................................................................................................23
CHƯƠNG 4: SO SÁNH VỚI KIẾN THỨC ĐÃ HỌC...................................................................25
CHƯƠNG 5: KẾT LUẬN.................................................................................................................27
TÀI LIỆU THAM KHẢO.................................................................................................................28
PHỤ LỤC............................................................................................................................................29
LỜI MỞ ĐẦU
Đầu tiên, chúng em xin gửi lời cảm ơn chân thành đến tập thể quý Thầy Cô
Trường Phân Hiệu Đại học Giao Thông Vận Tải Tp. HCM và quý Thầy Cô
khoa Điện – Điện tử đã giúp cho em có những kiến thức cơ bản làm nên tảng đề
thực hiện đề tài này.
Đặc biệt, em xin gửi lời cảm ơn và lòng biết ơn sâu sắc nhất tới Thầy Mai Văn
Hậu (Giảng viên môn xử lí ảnh trong công nghiệp và giao thông). Thầy đã trực
tiếp hướng dẫn tận tình, sửa chữa và đóng góp nhiều ý kiến quý báu giúp em
hoàn thành tốt bài báo cáo môn học của mình.
Trong thời gian một học kỳ đề thực hiện đề tài, em đã vận dụng những kiến thức
nên tảng đã tích lũy đồng thời kết hợp với việc học hỏi và nghiên cứu những
kiến thức mới. Từ đó, em vận dụng tối đa những gì đã thu thập được để hoàn
thành một báo cáo bài tập lớn tốt nhất. Tuy nhiên, trong quá trình thực hiện, em
không tránh khỏi được những thiếu sót. Chính vì vậy, em rất mong nhận được
những sự góp ý từ phía các Thầy Cô nhằm hoàn thiện những kiến thức mà em
đã học tập và là hành trang để em thực hiện tiếp các đề tài khác trong tương lai.
TTS Text-to-Speech
CV Computer Vision
Hình 2.3 Kết hợp các bộ phân loại yếu thành bộ phân loại...................................3
Hình 2.5 Phát hiện khuôn mặt người và xác định vùng khuôn mặt....................4
Hình 2.6 Chia hình ảnh thành ô nhỏ và xác định mẫu nhị phân.........................5
Hình 2.7 Ảnh đa cấp xám (trái), LBP (giữa) và biểu đồ (phải) của ảnh LBP....5
Hình 2.8 Quá trình thuật toán LBPH trích xuất các đặc trưng của hình ảnh......6
Hình 3.5 Phần thiết lập và cập nhật dữ liệu vào cơ sở dữ liệu SQLite.............12
Hình 3.7 Wedcam thu thập dữ liệu hình ảnh, xử lý và lưu vào thư mục..........13
Hình 3.11 Phát tín hiệu âm thanh khi thực hiện nhận diện khuôn mặt.............18
Hình 3.12 Giao diện giao tiếp người dùng được hiển thị..................................21
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
2.1. 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 đó.
Đâ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 Hình 2.2 Phân loại các đặc trưng Haar-
Like
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
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.
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 tượng trong hình ảnh hoặc video.
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"
2.2. 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:
Chuẩn bị dữ liệu:
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
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
Giải thích:
- Bắt đầu: khởi động pycharm,
chạy code
- Input: nhập các id và tên đầu
vào
- Khởi động WEDCAM: để
lấy dữ liệu khuôn mặt
- Phát hiện khuôn mặt:
+Nếu có khuôn mặt xuất
hiện trong wedcam thì hệ
thống sẽ lấy dữ liệu khuôn
mặt đó bằng cách chụp 100
ảnh vùng quan tâm của
khuôn mặt và sau đó lưu vào
file data_face để tiến hành
huấn luyện dữ liệu.
+Nếu không thấy phát hiện
khuôn mặt thì wedcam vẫn
xuất hiện trên cửa sổ màn
hình chính.
Hình 3.1 Lưu đồ lấy dữ liệu khuôn mặt
3.1.2. Lưu đồ thuật toán huấn luyện dữ liệu
Giải thích:
- Tiếp theo đó, ta chạy file
training dữ liệu lên
- Tiến hành lấy dữ liệu hình
ảnh từ file data_face
- Có hình ảnh trong file:
+Nếu có hình ảnh trong file
thì hệ thống dung thuật toán
LBPH xử lý hính ảnh rồi lưu
file train vào trainer.xml
+Nếu không có hình ảnh
trong file data_face thì hệ
thống sẽ báo lỗi và kết thúc
quá trình train.
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.
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.7 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.
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 đó.
- Nếu giá trị result[1] (khoảng cách từ khuôn mặt đến các mẫu huấn
luyện) nhỏ hơn 500, độ tin cậy (confidence) được tính toán dựa trên
khoảng cách và hiển thị lên khung hình.
- Nếu độ tin cậy (confidence) lớn hơn hoặc bằng 80, hiển thị thông báo
"UNLOCKED" trên khung hình. Ngược lại, hiển thị thông báo
"LOCKED".
Sau đó, khung hình được hiển thị lên màn hình bằng hàm cv2.imshow('face',
image)
Trong trường hợp ngoại lệ (exception) xảy ra, khi không tìm thấy khuôn mặt,
một thông báo "FACE NOT FOUND" sẽ được hiển thị lên khung hình.
Trong khối except của đoạn mã, nếu xảy ra ngoại lệ (exception) trong quá
trình tìm kiếm khuôn mặt, có thể do không tìm thấy khuôn mặt, một thông
báo "FACE NOT FOUND" sẽ được hiển thị lên khung hình.
Sau đó, một số điều kiện kiểm tra được thực hiện để quyết định liệu vòng lặp
nên thoát hay tiếp tục chạy:
Dòng if cv2.waitKey(1) == 13 or x == 10 or c == 30 or d == 20: kiểm tra nếu
nhấn phím Enter (mã ASCII 13) hoặc đã nhận dạng thành công 10 khuôn mặt
(x == 10) hoặc bị từ chối 30 khuôn mặt (c == 30) hoặc gặp 20 lỗi không tìm
thấy khuôn mặt (d == 20), thì vòng lặp sẽ được thoát (break) và chương trình
kết thúc.
Phần nhận diện khuôn mặt đang sử dụng webcam để đọc khuôn mặt và sau đó
so sánh với dữ liệu trong phần huấn luyện của mô hình. Dựa trên kết quả nhận
dạng, các thông báo "UNLOCKED" và "LOCKED" sẽ được hiển thị lên khung
hình.
Cụ thể, có các quy tắc như sau:
Nếu có 10 khuôn mặt được nhận dạng thành công (giá trị của biến x là 10), thì
thông báo "UNLOCKED" sẽ được hiển thị lên khung hình.
Nếu có 30 khuôn mặt bị từ chối (giá trị của biến c là 30), thì thông báo
"LOCKED" sẽ được hiển thị lên khung hình.
Nếu không tìm thấy khuôn mặt trong 20 ảnh (giá trị của biến d là 20), thì thông
báo "LOCKED" sẽ được hiển thị lên khung hình.
Điều này đồng nghĩa với việc khi có đủ số lượng khuôn mặt nhận dạng thành
công, thông báo "UNLOCKED" sẽ được hiển thị. Ngược lại, khi có đủ số lượng
khuôn mặt bị từ chối hoặc không tìm thấy khuôn mặt, thông báo "LOCKED" sẽ
được hiển thị.
Trong đoạn mã trên, có một số điều kiện và hành động được thực hiện:
- Nếu số lượng khuôn mặt nhận dạng
thành công (x) lớn hơn hoặc bằng 5
- Biến m được gán giá trị là 1 (m = 1).
- Kết nối với cổng COM6 thông qua giao
diện Serial (ard = serial.Serial('com6',
9600)).
- Chờ 2 giây (time.sleep(2)).
- Chuẩn bị dữ liệu gửi đi, trong trường
hợp này là gửi ký tự 'a' (var = 'a' và c =
var.encode()).
- Gọi hàm speak("Face recognition
complete. Welcome back") để phát âm Hình 3.11 Phát tín hiệu âm thanh
thanh thông báo "Face recognition khi thực hiện nhận diện khuôn mặt
complete. Welcome back".
- Gửi dữ liệu đến Arduino thông qua cổng Serial (`ard.write(c)`).
- Chờ 4 giây (time.sleep(4)).
- Nếu có 30 khuôn mặt bị từ chối (c == 30):
- Gọi hàm speak("Face is not matching. Please try again") để phát âm thanh
thông báo "Face is not matching. Please try again".
- Nếu không tìm thấy khuôn mặt trong 20 ảnh (d == 20):
- Gọi hàm speak("Face is not found. Please try again") để phát âm thanh
thông báo "Face is not found. Please try again".
Sau đó, nếu m có giá trị là 1 (m == 1), một số hành động được thực hiện:
- Khởi tạo đối tượng cap để thao tác với webcam (`cap =
cv2.VideoCapture(0)`).
- Giải phóng webcam (cap.release()).
- Đóng các cửa sổ hiển thị (cv2.destroyAllWindows()).
Từ đoạn mã trên có thể hiểu rằng, nếu có ít nhất 5 khuôn mặt được nhận dạng
thành công, thông báo "Face recognition complete. Welcome back" sẽ được phát
âm thanh và gửi tín hiệu tới Arduino thông qua cổng Serial. Trong các trường
hợp khác, thông báo tương ứng sẽ được phát âm thanh. Sau đó, nếu `m` có giá
trị 1, webcam sẽ được khởi tạo và sau đó đóng lại.
3.3. 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.3.1. Giớ i thiệ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.3.2. Thà nh phầ n củ a giao diện
- Cửa sổ giao diện:
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:
Hình 3.12 Giao diện giao tiếp người dùng được hiển thị
PHỤ LỤC
Chương trình được chạy bằng ngôn ngữ Python trong môi trường Pycharm với
thư viên chính là OpenCV. Gồm 3 chương trình và 1 giao diện như sau:
+ Lấy dữ liệu khuôn mặt (Get Data):