Bài P1: face detection và P2: face recognition đã nói về cách phát hiện & nhận diện khuôn mặt. Bài này sẽ nói về những cách giúp tối ưu hoá việc phát hiện. Trong thực tế tình trạng nhận diện sai xảy ra khá nhiều, để khắc phục có một vài cách như sau:
- Thay đổi file cascade và tối ưu các tham số
- Tìm đôi mắt trong khuôn mặt đã nhận được
- Kiểm tra màu da
Thay đổi file cascade và tối ưu các tham số
Theo như lý thuyết thì độ chính xác phát hiện khuôn mặt phụ thuộc rất nhiều vào file cascade và các tham số. Những file cascade được cung cấp sẵn theo lib OpenCV để phát hiện khuôn mặt có sự khác biệt nhau. Mình thử với ảnh 80 ảnh chứa 77 khuôn mặt thì phát hiện được số lượng khuôn mặt như sau (các tham số của hàm detectMultiScale để default):
haarcascade_frontalface_alt.xml 86 khuôn mặt/80 ảnh
haarcascade_frontalface_alt2.xml 95 khuôn mặt/80 ảnh
haarcascade_frontalface_alt_tree.xml 74 khuôn mặt/80 ảnh
haarcascade_frontalface_default.xml 155 khuôn mặt/80 ảnh
Như vậy, có thể dùng haarcascade_frontalface_alt.xml hoặc haarcascade_frontalface_alt_tree.xml để đạt kết quả tốt nhất. Tuy nhiên vẫn còn tuỳ thuộc tập dữ liệu và tham số truyền vào. Do đó cần test cẩn thận bộ dữ liệu sẽ sử dụng.
Tuy nhiên dung lượng các file Haar tương đối lớn, các bạn có thể sử dụng các model LBP thay thế. Tốc độ phát hiện của LBP nhanh hơn mà độ chính xác cũng tương đương: https://github.com/opencv/opencv/tree/master/data/lbpcascades
Hoặc bạn có thể huấn luyện phát hiện khuôn mặt lại.
Tìm đôi mắt trong khuôn mặt đã nhận được
Trong khuôn mặt đã phát hiện được có thể dùng cascade để tìm đôi mắt để tăng độ chính xác. Hơn nữa, biết được vị trí của đôi mắt có thể xoay khuôn mặt về đúng góc độ để dùng nhận diện khuôn mặt sẽ tốt hơn.
Trong thư viện OpenCV có đi kèm các file cascade sau có thể giúp detect được đôi mắt
haarcascade_eye.xml
haarcascade_eye_tree_eyeglasses.xml
Kiểm tra màu da
Có thể dùng màu HSV để kiểm tra đó có phải là da người không. Điểm yếu của cách này là chỉ nhận được màu da vàng, còn da quá trắng hoặc quá đen sẽ khó mà nhận biết:
- Crop khuôn mặt
- Chuyển ảnh khuôn mặt thành HSV rồi giới hạn trong khoảng (0, 48, 80) và (20, 255, 255)
- Lấy giá trị trung bình của kênh màu H, nếu giá trị trung bình lớn hơn 100 thì đó là khuôn mặt
Có lẽ những người đọc blog này đều là người Việt Nam, cho nên giá trị màu da như vậy có lẽ là hợp lý 😀
Các model nhận diện có thể download online không cần tải toàn bộ lib OpenCV: https://github.com/opencv/opencv/tree/master/data
Có lẽ những người đọc blog này đều là người Việt Nam, cho nên giá trị màu da như vậy có lẽ là hợp lý
kkk…anh nói chuẩn