Hệ Thống Phát Hiện Cảm Xúc Thời Gian Thực Dựa Trên Các Điểm Đặc Trưng Khuôn Mặt
Trong lĩnh vực thị giác máy tính, công nghệ nhận diện cảm xúc khuôn mặt đã đạt được những tiến bộ đáng kể. Công nghệ này không chỉ có thể được áp dụng trong các giải trí (như tạo sticker động) mà còn đóng vai trò quan trọng trong lĩnh vực theo dõi sức khỏe tinh thần, an ninh thông minh và tương tác giữa người và máy. Trong bài viết này, tôi sẽ chia sẻ một hệ thống phát hiện đa cảm xúc thời gian thực dựa trên các điểm đặc trưng khuôn mặt, có khả năng nhận dạng các cảm xúc như cười, cười lớn, khóc và tức giận qua camera.
1. Bối cảnh và Động lực dự án
Cảm xúc khuôn mặt là biểu hiện bên ngoài quan trọng của cảm xúc con người. Bằng cách phân tích biểu cảm khuôn mặt, chúng ta có thể hiểu rõ hơn về trạng thái cảm xúc của người khác. Các phương pháp nhận diện cảm xúc truyền thống chủ yếu dựa vào mô hình học sâu, những mô hình này tuy có độ chính xác cao nhưng độ phức tạp tính toán lớn, khó có thể triển khai phát hiện thời gian thực trên các thiết bị có nguồn lực hạn chế. Ngược lại, phương pháp dựa trên các điểm đặc trưng khuôn mặt nhẹ nhàng hơn, có thể suy luận trạng thái cảm xúc bằng cách phân tích mối quan hệ vị trí giữa các điểm đặc trưng, phù hợp để áp dụng trong các hệ thống thời gian thực.
Mục tiêu của dự án này là phát triển một hệ thống thời gian thực, có thể chụp ảnh khuôn mặt qua camera và xác định trạng thái cảm xúc hiện tại dựa trên mối quan hệ vị trí của các điểm đặc trưng khuôn mặt. Chúng ta sẽ tập trung vào việc phát hiện bốn cảm xúc phổ biến: cười, cười lớn, khóc và tức giận.
2. Công nghệ và Công cụ sử dụng
Để thực hiện dự án này, chúng tôi sử dụng các công nghệ và công cụ sau:
- Python: Ngôn ngữ phát triển chính, Python cung cấp nhiều thư viện hỗ trợ, thuận tiện cho việc phát triển và gỡ lỗi nhanh chóng.
- OpenCV: Được sử dụng để xử lý hình ảnh và thao tác luồng video, có thể đọc dữ liệu camera hiệu quả và vẽ hình ảnh.
- dlib: Cung cấp tính năng mạnh mẽ trong phát hiện khuôn mặt và định vị điểm đặc trưng, là công cụ cốt lõi để trích xuất điểm đặc trưng khuôn mặt.
- scikit-learn: Được sử dụng để tính toán khoảng cách Euclid, giúp chúng tôi phân tích mối quan hệ không gian giữa các điểm đặc trưng.
- Pillow: Được sử dụng để vẽ văn bản tiếng Trung trên hình ảnh, thuận tiện để hiển thị kết quả nhận diện trong video thời gian thực.
3. Triển khai Công nghệ Chính
3.1 Phát hiện Khuôn mặt và Trích xuất Điểm Đặc Trưng
Phát hiện khuôn mặt là bước đầu tiên trong nhận diện cảm xúc. Chúng tôi sử dụng phương thức get_frontal_face_detector do dlib cung cấp để phát hiện vùng khuôn mặt trong hình ảnh. Một khi đã phát hiện khuôn mặt, chúng tôi lại sử dụng mô hình shape_predictor để trích xuất 68 điểm đặc trưng khuôn mặt. Các điểm đặc trưng này bao gồm các điểm đặc trưng của mắt, lông mày, mũi, miệng và các bộ phận khác, cung cấp dữ liệu cơ sở cho phân tích cảm xúc tiếp theo.
# Khởi tạo bộ phát hiện vị trí khuôn mặt
bloc_phat_hien = dlib.get_frontal_face_detector()
# Đọc mô hình định vị điểm đặc trưng khuôn mặt
du_doan_diem = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# Phát hiện khuôn mặt
khuon_mat = bloc_phat_hien(khung_hinh, 0)
# Lặp qua từng khuôn mặt
for mat in khuon_mat:
# Lấy các điểm đặc trưng
diem_dac_trung = du_doan_diem(khung_hinh, mat)
# Chuyển đổi các điểm đặc trưng thành tọa độ (x, y)
diem_dac_trung = np.array([[p.x, p.y] for p in diem_dac_trung.parts()])
3.2 Tính toán Đặc trưng Cảm xúc
Để xác định các cảm xúc khác nhau, chúng tôi xác định nhiều chỉ số đặc trưng, bao gồm tỷ lệ chiều rộng miệng (TĐR), tỷ lệ chiều cao miệng (TĐC) và tỷ lệ chiều rộng mắt (TCRM) v.v.
- Tỷ lệ chiều cao miệng (TĐC): Tính toán tỷ lệ giữa chiều cao trung bình và chiều rộng của miệng. Chiều cao miệng được tính bằng khoảng cách giữa các điểm 50, 51, 52 và 58, 57, 56, trong khi chiều rộng miệng được tính bằng khoảng cách giữa các điểm 48 và 54. Khi TĐC vượt qua ngưỡng nhất định, có thể biểu thị cười lớn.
- Tỷ lệ chiều rộng miệng (TĐR): Tính toán tỷ lệ giữa chiều rộng miệng và chiều rộng hàm dưới. Chiều rộng miệng được tính bằng khoảng cách giữa các điểm 48 và 54, trong khi chiều rộng hàm dưới được tính bằng khoảng cách giữa các điểm 3 và 13. Khi TĐR vượt qua ngưỡng nhất định, có thể biểu thị cười.
- Tỷ lệ chiều rộng mắt (TCRM): Tính toán tỷ lệ chiều rộng và chiều cao của mắt, dùng để phát hiện mức độ mắt nhắm. Khi TCRM nhỏ hơn ngưỡng nhất định, có thể biểu thị mắt nhắm, từ đó suy ra cảm xúc như khóc.
def TAM(diem_dac_trung):
A = euclidean_distances(diem_dac_trung[50].reshape(1, 2), diem_dac_trung[58].reshape(1