Phát hiện cử động khuôn mặt bằng Facemesh

Thư viện Mediapipe cung cấp tính năng Facemesh detection rất nhanh & chính xác. Hôm nay mình sẽ giới thiệu về khả năng, cách dùng & source code để detect facemesh.

Theo lý thuyết Mediapipe detect được 468 điểm trên khuôn mặt theo như hình bên dưới. Click vào ảnh để xem full size (4096 x 4096px) và index của các điểm.

Dựa vào các điểm đó các bạn có thể biết được 1 số thứ như:

  • Mắt nhắm hay mở: dùng cho phát hiện người buồn ngủ
  • Miệng đóng hay mở: đang cười hoặc nói
  • Xoay trái hoặc xoay phải

Ứng dụng FaceComp sử dụng mediapipe để phát hiện khi khuôn mặt nhìn trực diện thì mới nhận diện

Cài đặt thư viện

Sử dụng Python 3.6 trở lên trên Windows 10 hoặc Ubuntu 18.04 (OS khác chưa test)
pip install mediapipe

Bước 1: tìm landmarks

Landmark là tập hợp các điểm trên khuôn mặt trong tọa độ 3D (x, y, z), tìm landmarks (có s, số nhiều) là tìm nhiều khuôn mặt trong ảnh nếu có.

Thuật toán sẽ map tọa độ theo hệ trục 3D có nghĩa là bạn sẽ có thêm trục Z, dùng để tính được khoảng cách xa gần. Sau khi tìm được landmarks chúng ta vẽ tọa độ bằng function có sẵn của mediapipe.

Bước 2: convert landmark to points để tính toán

Trong bài nảy mình sẽ làm ví dụ mẫu về tính toán góc xoay trái phải của khuôn mặt. Tương tự các bạn có thể xác định mở mắt hay nhắm mắt, mở miệng hay không.

Để xác định xoay hướng nào cần xác định 2 nửa khuôn mặt trái và phải tính từ mũi (center)

Tra cứu theo coordinate ta có điểm trung tâm (lỗ mũi) là 5, má trái là 234 và má phải là 454.

So sánh giá trị trái phải, lấy giá trị lớn hơn chia cho giá trị nhỏ hơn ta được tỷ lệ. Tùy theo nhu cầu sử dụng các bạn có thể set ngưỡng cho phù hợp từ 2.0 -> 3.0 (hoặc tùy ý)

Một số ví dụ

Full source code

Kết luận

Mediapipe detect facemesh rất nhanh & chính xác, các bạn có thể an tâm sử dụng trong nhiều bài toán. Dựa vào cách làm ở trên các bạn có thể detect mặt nghiêng góc bao nhiêu độ,… Chúc các bạn thành công