Phát hiện mặt người dựa trên các đặc trưng Haar-like
02:00 Computer Vision and Application
Phát hiện mặt người là bài toán cơ bản được xây dựng từ nhiều năm nay, có nhiều phương pháp được đưa ra như sử dụng template matching, neuron network ...Cho tới nay bài toán này hầu như được giải quyết dựa trên phương pháp sử dụng các đặc trưng haar like. Phương pháp này được cho là đơn giản và kết quả phát hiện là tương đối cao, lên tới trên 98%, Các hãng sản xuất máy ảnh như Canon, Samsung ... cũng đã tích hợp nó vào trong các sản phẩm của mình. Trong bài này tôi giới thiệu sơ qua về phương pháp này và chương trình để phát hiện mặt người.
Các đặc trưng Haar-Like(Haar-Like feature) là những hình chữ nhật được phân thành các vùng khác nhau như hình sau :
Các đặc trưng Haar-Like(Haar-Like feature) là những hình chữ nhật được phân thành các vùng khác nhau như hình sau :
Các đặc trưng Haar Like
Chi tiết về các đặc trưng Haar Like các bạn có thể tham khảo tạihttp://en.wikipedia.org/wiki/Haar-like_features hoặc trên rất nhiều trang web khác nhau.
Vậy làm sao dựa vào các đặc trưng này để phát hiện ra mặt người? Câu trả lời như sau:
Vậy làm sao dựa vào các đặc trưng này để phát hiện ra mặt người? Câu trả lời như sau:
Đầu tiên, ta phải huấn luyện dựa vào các đặc trưng haar like sau đó dựa vào tập huấn luyện này để phát hiện khuôn mặt. Để làm như được vậy, ảnh đầu vào trước hết phải được xám hóa, sau đó cho một hoặc nhiều hình chữ nhật chứa đặc trưng haar-like chạy khắp bức ảnh, những chỗ khác biệt sẽ được lưu trữ lại. Tập hợp hàng nghìn điểm khác biệt của hàng trăm khuôn mặt khác nhau sẽ cho ta một tập dữ liệu dùng cho việc phat hiện mặt người ... Hơi khó hiểu phải không nào :D, các bạn hãy xem hình sau:
Đặc trưng haar-like trên vùng mắt
Trên hình là một đặc trưng haar-like trên vùng mắt, bây giờ nếu có hàng trăm đặc trưng như vậy trên hàng trăm bức ảnh huấn luyện thì sao? ta sẽ được một phân lớp, tập hợp của rất nhiều phân lớp này sẽ cho ta xác định vùng chứa khuôn mặt.
Các bạn có thể xem bài hướng dẫn cách huấn luyện các đặc trưng haar-like cho việc nhận dạng đối tượng để biết thêm thông tin, giả sử ở đây ta đã huấn luyện thành công và có file kết quả huấn luyện *.xml. Ta sẽ tiến hành phát hiện mặt người ngay sau đây:
Trên là những kiến thức cơ bản, trong Opencv người ta đã có bộ huấn luyện cho việc phát hiện mặt người, kết quả này lấy từ hàng nghìn mẫu của những khuân mặt khác nhau và phân loại dựa trên mô hình phân loại cascade.Sau khi cài đặt xong Opencv các bạn hãy vào mục C:\opencv\data\haarcascades để lấy ra filehaarcascade_frontalface_alt.xml file này sẽ được đặt cùng với file chạy exe của chương trình sau:
Chương trình phát hiện mặt người:
Tạo một project cho nó hoạt động được vơi thư viện opencv. Chương trình phát hiện mặt người như sau:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
int main() {
cout << "Face detection written by CVA" << endl;
cv::Mat src = cv::imread("D:\\faces.jpg");
cv::CascadeClassifier c;
c.load("haarcascade_frontalface_alt.xml");
std::vector<cv::Rect> faces;
c.detectMultiScale(src, faces, 1.1 , 2, CV_HAAR_SCALE_IMAGE, cv::Size(30, 30));
for(std::vector<cv::Rect>::const_iterator r = faces.begin(); r < faces.end(); r++)
{
cv::Point center;
center.x = r->x + (int)r->width/2;
center.y = r->y + (int)r->height/2;
cv::circle(src, center, 35, CV_RGB(255, 0, 0),2, 8, 0 );
}
cvNamedWindow("FaceDetection CVA", 1);
cv::imshow("FaceDetection CVA", src);
cvWaitKey(0);
return 0;
}
Kết quả như sau:
Chương trình với giao diện đầy đủ, cơ sở lý thuyết và xử lý trên video các bạn có thể tham khảo tại đây.
Chương trình phát hiện mặt người:
Tạo một project cho nó hoạt động được vơi thư viện opencv. Chương trình phát hiện mặt người như sau:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
int main() {
cout << "Face detection written by CVA" << endl;
cv::Mat src = cv::imread("D:\\faces.jpg");
cv::CascadeClassifier c;
c.load("haarcascade_frontalface_alt.xml");
std::vector<cv::Rect> faces;
c.detectMultiScale(src, faces, 1.1 , 2, CV_HAAR_SCALE_IMAGE, cv::Size(30, 30));
for(std::vector<cv::Rect>::const_iterator r = faces.begin(); r < faces.end(); r++)
{
cv::Point center;
center.x = r->x + (int)r->width/2;
center.y = r->y + (int)r->height/2;
cv::circle(src, center, 35, CV_RGB(255, 0, 0),2, 8, 0 );
}
cvNamedWindow("FaceDetection CVA", 1);
cv::imshow("FaceDetection CVA", src);
cvWaitKey(0);
return 0;
}
Kết quả như sau:
Phát hiện mặt người trong ảnh
Trong chương trình trên có sử dụng giao diện của C++ khác với dao diện C thông thường. Trong hàm detectMultiScale, Tham số cuối cùng cv::Size(width, height) chính là kích thước đầu vào của các đặc trưng Haar-Like, các các ảnh gần các bạn chỉnh tham số này lớn lên, và với những ảnh kích thước bé, khuôn mặt trong ảnh bé các bạn nên chỉnh kích thước này nhỏ lại.Chương trình với giao diện đầy đủ, cơ sở lý thuyết và xử lý trên video các bạn có thể tham khảo tại đây.