Nhận diện khuôn mặt – P1: face detection

Phát hiện khuôn mặt (detect) là bước đầu tiên của bài toán nhận diện khuôn mặt (recognize). Về nguyên lý thì phát hiện khuôn mặt giống như phát hiện bất kỳ đối tượng nào trong ảnh. Do vấn đề này đã được nghiên cứu và ứng dụng quá nhiều nên chúng ta không nên huấn luyện lại mà nên sử dụng file xml đã được huấn luyện sẵn.

Nếu bạn muốn tự tay huấn luyện lại mô hình phát hiện khuôn mặt thì đọc bài: Retrain face cascade model. Các file xml khuôn mặt được cung cấp sẵn trong OpenCV được huấn luyện từ hình ảnh khuôn mặt người phương Tây, nếu bạn thấy không nhận diện đúng khuôn mặt của người Việt Nam thì các bạn có thể huấn luyện lại. Riêng bản thân tôi thấy các file xml đã làm tốt việc phát hiện khuôn mặt người Việt Nam.

Bài này giới thiệu chương trình chỉ phát hiện khuôn mặt, tức là xác định vị trí khuôn mặt trong ảnh. Phần nhận diện khuôn mặt sẽ giới thiệu trong 1 bài khác sau khi đã hiểu rõ về phát hiện.

Chương trình này load data xml khuôn mặt, sau đó detect trên ảnh/video/camera. Viết bằng Visual C++ 11 sử dụng thư viện Opencv.

Lý thuyết

Cũng như các ứng dụng thị giác máy tính khác, nhận diện khuôn mặt cũng có 3 bước
– 1. Tiền xử lý ảnh: trích xuất ảnh từ video, webcam. Sau đó biến đổi thành ảnh xám (gray)
– 2. Tìm khuôn mặt trong ảnh xem có khuôn mặt trong ảnh không? Nếu có thì có bao nhiêu khuôn mặt? Sau đó crop để qua bước 3
– 3. Nhận diện khuôn mặt và trả về kết quả. Có thể vẽ hình vuông bao lấy khuôn mặt hoặc vẽ text tên người

Bài viết này chỉ tập trung vào bước 1-2, bước 3 có thể đọc bài

Giới thiệu về Cascade model

Đặc trưng haar-like là tập hợp những đặc trưng đường ngang, đường dọc, đường chéo,… của một đối tượng. Các đặc trưng này được lưu trong 1 file xml, dựa vào file này mà có thể biết được ảnh có chứa đối tượng cần tìm hay không.

Ngoài HAAR ra thì có đặc trung LBP và HOG cũng được áp dụng cho nhận diện hình ảnh.

OpenCV cung cấp sẵn các model như lbpcascade_frontalface.xml để phát hiện khuôn mặt. Các bạn tải file này về rồi dùng tool Cascade analytics để thử.

Các bước của chương trình

Đầu tiên chương trình load các file cascade model được chỉ định file config.ini. Nếu load cascade thành công thì load file video cũng được chỉ định trong config.ini.

Sau đó tiến hành tách ra từng frame rồi detect khuôn mặt, nếu có khuôn mặt thì vẽ hình vuông lên trên khuôn mặt.

Source code

Không gì hiệu quả bằng ví dụ mẫu, bên dưới là source code Face detection viết bằng C++. Compile bằng Visual Studio 2015 Community, các tham số nằm trong file bin\config.ini

Tuy nhiên trong repo có nhiều project khác nhau, các bạn chỉ cần build FaceDetection_VS2015.sln để tìm hiểu. Trong source code đã có kèm 1 video để demo, chỉ cần build xong là chương trình có thể demo lập tức.

FaceDetection (Github)

11 thoughts on “Nhận diện khuôn mặt – P1: face detection

  1. Chào bạn, mình chạy chương trình thì bị lỗi.Và khi mình chạy demo có sẵn của opencv về nhận diện khuôn mặt nó cũng bị lỗi và mình đã tìm kiếm và không biết lỗi này là gì.Bạn có thể giúp mình được không

    1. vì các file dll của opencv build sẵn yêu cầu C++ 2013, bạn dùng opencv 3.2 sẽ không bị lỗi đó

  2. Ad cho minh hỏi, báo lỗi error: ..\..\..\..\opencv\modules\imgproc\src\color.cpp:3739: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor thì phải giải quyết như thế nào??? cảm ơn bạn

    1. bạn xem lại đường dẫn đến ảnh, thay bằng đường dẫn tuyệt đối thử xem. Nếu không hết thì comment đoạn code lên mình xem cho

  3. em không debug được chương trình này của anh ạ, em bị lỗi “……..is not a valid Win32 application”. em sử dụng Visual 2017 và OpenCV 3.4.1 ạ. em mới bắt đầu mong anh chỉ giúp ạ
    nếu viết một project mới dùng code của anh thì add các thư viện ntn ạ? vì em thấy rất nhiều tệp thư viện với tên TGMT ạ

Leave a Reply