Tiếp tục về nhận dạng khuân mặt dựa trên các đặc trưng haar like

Đăng lúc: Thứ năm - 27/10/2016 10:12 - Người đăng bài viết: SuperG
Nhận dạng khuân mặt dựa trên các đặc trưng haar like

Nhận dạng khuân mặt dựa trên các đặc trưng haar like

Chúng ta thường nghe nói tới thuật ngữ thị giác máy tính hay Computer Vision, vậy bản chất của chúng là gì? và chúng được ứng dụng thực tế ra sao, bài này tôi sẽ khái quát qua về hệ thống thị giác máy tính phần nhận dạng khuân mặt bằng thị giác máy tính.

Thị giác máy tính (Computer Vision), đúng như tên gọi mà người ta gắn cho chúng, giống như thị giác con người vậy. Nếu như bằng cặp mắt của mình, con người có thể thu nhận hình ảnh từ môi trường xung quanh, biết được màu sắc của vật, hình dáng của vật và vô số thông tin khác để có những phản ứng, hành động trong môi trường sống thì thị giác máy tính cũng vậy, chỉ có điều cặp mắt của máy tính giờ đây được thay bằng những thiết bị điện tử khác như camera, sensor hồng ngoại chẳng hạn... Bằng hệ thống cảm biến này, máy sẽ thu thập thế giới đa chiều và lưu trữ những gì thu tập được dưới dạng ảnh số. Những ảnh này sau đó được xử lý, phân tích và trích chọn ra những thông tin cần thiết giúp máy hiểu được nó đang nhìn thấy gì, cần phải làm gì ...

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
Chi tiết về các đặc trưng Haar Like các bạn có thể tham khảo tại http://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:
Đầ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 file haarcascade_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 faces;
    c.detectMultiScale(src, faces, 1.1 , 2, CV_HAAR_SCALE_IMAGE, cv::Size(30, 30));
    for(std::vector::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.

Đánh giá bài viết
Tổng số điểm của bài viết là: 0 trong 0 đánh giá
Click để đánh giá bài viết
 

Đào tạo, hướng dẫn học làm Robot

Đặt vấn đề: Công nghệ robot – môn học giúp làm giàu trí óc trẻ    Ngày nay, ở Mỹ và các nước đang phát triển, tương lai của ngành công nghệ chế tạo robot ngày càng hứa hẹn những chuyển biến vượt bậc. Đồng thời, ghi nhận sức mạnh trí tuệ của lớp trẻ ngày nay, các nước không ngừng cải...

Thăm dò ý kiến

Bạn có muốn sở hữu một Robot trong nhà không?

Cần một Robot để dọn dẹp

Cần một Robot trông nhà

Cần một Robot để giải trí

Bạn cần một Robot theo cách khác

Bạn đã có rồi

Bạn không cần

Liên kết