Giới thiệu InsightFace
InsightFace là một dự án mã nguồn mở mạnh mẽ dành cho các tác vụ liên quan đến nhận diện khuôn mặt (Face Recognition), phát hiện khuôn mặt (Face Detection) và căn chỉnh khuôn mặt (Face Alignment). Dự án này được phát triển dựa trên các mô hình học sâu tối ưu, đặc biệt là ArcFace – một trong những phương pháp tiên tiến nhất trong nhận diện khuôn mặt.
Lý do chọn InsightFace:
- Được đánh giá cao bởi người dùng trên GitHub (hiện là 24k star)
- Độ chính xác cao
- Hỗ trợ phát hiện và căn chỉnh khuôn mặt mạnh mẽ
- Khả năng mở rộng và dễ triển khai
Giới thiệu Pose trong InsightFace
Trong InsightFace, thuộc tính .pose được sử dụng để xác định góc xoay của đầu trong không gian 3D. Nó giúp chúng ta biết hướng đầu của một người theo ba trục Yaw, Pitch, Roll.
Sau khi nhận diện khuôn mặt bằng InsightFace, mỗi đối tượng face (đại diện cho một khuôn mặt được phát hiện) có thuộc tính .pose, chứa một danh sách gồm ba giá trị số thực:
- Yaw: Xoay đầu trái/phải (quay ngang). Nếu giá trị dương thì đầu đang xoay sang phải, ngược lại thì xoay sang trái.
- Pitch: Ngẩng đầu lên/xuống (quay dọc). Nếu giá trị dương thì đầu đang ngẩng lên, ngược lại thì cúi xuống.
- Roll: Nghiêng đầu trái/phải (lật ngang). Nếu giá trị dương thì đầu đang nghiêng sang trái, ngược lại thì nghiêng sang phải.
Cách lấy pose trong InsightFace
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import insightface import cv2 # Load the face detection model detector = insightface.app.FaceAnalysis(name='buffalo_l', providers=['CPUExecutionProvider']) detector.prepare(ctx_id=0) # Load an image img = cv2.imread("face.jpg") # Detect faces faces = detector.get(img) # Loop through detected faces for face in faces: yaw, pitch, roll = face.pose print(f"Yaw: {yaw:.2f}°, Pitch: {pitch:.2f}°, Roll: {roll:.2f}°") |
Demo dùng webcam để phát hiện hướng nhìn
Mô tả thuật toán
- Nhận diện khuôn mặt: Dùng InsightFace để tìm khuôn mặt trong khung hình.
- Truy xuất dữ liệu hướng nhìn: Trích xuất giá trị yaw, pitch, roll.
- Phân loại hướng nhìn: So sánh các giá trị với ngưỡng tính trước.
- Hiển thị thông tin: Vẽ hộp khuôn mặt, hiển thị dữ liệu góc nghiêng và kết quả dự đoán.
Chuẩn bị
Sử dụng Python 3.6 trở lên trên Windows 10 hoặc Ubuntu 18.04 (OS khác chưa test).
Trước khi chạy demo, hãy đảm bảo đã cài đặt các thư viện cần thiết:
1 |
pip install insightface opencv-python numpy |
Code demo
Phân loại hướng nhìn dựa trên góc yaw, pitch, roll.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import insightface import cv2 def classify_head_pose(yaw, pitch, roll, YAW_THRESHOLD=20, PITCH_THRESHOLD=20, ROLL_THRESHOLD=20): if yaw < -YAW_THRESHOLD: return "Looking Down" elif yaw > YAW_THRESHOLD: return "Looking Up" if pitch > PITCH_THRESHOLD: return "Looking Left" elif pitch < -PITCH_THRESHOLD: return "Looking Right" if roll > ROLL_THRESHOLD: return "Tilting Left" elif roll < -ROLL_THRESHOLD: return "Tilting Right" return "Straight" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
def test_with_camera(): cap = cv2.VideoCapture(0) detector = insightface.app.FaceAnalysis(name='buffalo_l', providers=['CPUExecutionProvider']) detector.prepare(ctx_id=0) while True: ret, frame = cap.read() if not ret: break rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) faces = detector.get(rgb_frame) if faces: face = max(faces, key=lambda f: f.bbox[2] - f.bbox[0]) yaw, pitch, roll = face.pose predicted_class = classify_head_pose(yaw, pitch, roll) x1, y1, x2, y2 = map(int, face.bbox) cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(frame, f"Yaw: {yaw:.2f}, Pitch: {pitch:.2f}, Roll: {roll:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2) cv2.putText(frame, f"Pose: {predicted_class}", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 2) cv2.imshow('Real-time Head Pose Classification', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() test_with_camera() |
Ứng dụng
- Giao tiếp giữa người và máy: Xác định người dùng đang nhìn vào đâu.
- Máy chụp hình thông minh: Tự động chụp khi người nhìn thẳng vào camera.
- Hệ thống an ninh: Giám sát hành vi của người trong khu vực quan trọng.