Top Ad unit 728 × 90


OpenCV Nhận Dạng khuôn mặt Thuật toán và phương thức







[OpenCV] Phát hiện khuôn mặt


       Khi bắt đầu với lĩnh vực nhận dạng mặt (Face Recognition-FR, không phải Face detetion-phát hiện khuôn mặt người trong ảnh), tôi đã mất khá nhiều thời gian cho các thuật toán cơ bản của nhận dạng mặt: PCA, WPCA, LDA, 2DPCA, KPCA, LBP … hay các câu hỏi đại loại như: dùng ngôn ngữ và công cụ gì để cài đặt thuật toán, Matlab, Python, C++ hay C#? Cuối cùng thấy rằng việc chọn Matlab là thích hợp nhất (cho việc nghiên cứu thôi, tất nhiên) và việc hiểu được cặn kẽ các thuật toán cơ bản như PCA là rất quan trọng cho những ai bắt đầu, vì vậy hy vọng bài viết này sẽ có ích cho ai muốn tìm hiểu về nhận dạng mặt người.
        Nhận dạng mặt người (Face recognition) là một lĩnh vực nghiên cứu của ngành Computer Vision, và cũng được xem là một lĩnh vực nghiên cứu của ngành Biometrics (tương tự như nhận dạng vân tay – Fingerprint recognition, hay nhận dạng mống mắt – Iris recognition). Xét về nguyên tắc chung, nhận dạng mặt có sự tương đồng rất lớn với nhận dạng vân tay và nhận dạng mống mắt, tuy nhiên sự khác biệt nằm ở bước trích chọn đặt trưng (feature extraction) của mỗi lĩnh vực. Trong khi nhận dạng vân tay và mống mắt đã đạt tới độ chín, tức là có thể áp dụng trên thực tế một cách rộng rãi thì nhận dạng mặt người vẫn còn nhiều thách thức và vẫn là một lĩnh vực nghiên cứu thú vị với nhiều người. So với nhận dạng vân tay và mống mắt, nhận dạng mặt có nguồn dữ liệu phong phú hơn (bạn có thể nhìn thấy mặt người ở bất cứ tấm ảnh, video clip nào liên quan tới con người trên mạng) và ít đòi hỏi sự tương tác có kiểm soát hơn (để thực hiện nhận dạng vân tay hay mống mắt, dữ liệu input lấy từ con người đòi hỏi có sự hợp tác trong môi trường có kiểm soát). Hiện nay các phương pháp nhận dạng mặt được chia thành nhiều hướng theo các tiêu chí khác nhau: nhận dạng với dữ liệu đầu vào là ảnh tĩnh 2D(still image based FR) là phổ biến nhất, tuy nhiên tương lai có lẽ sẽ là 3D FR (vì việc bố trí nhiều camera 2D sẽ cho dữ liệu 3D và đem lại kết quả tốt hơn, đáng tin cậy hơn), cũng có thể chia thành 2 hướng là: làm với dữ liệu ảnh và làm với dữ liệu video. Trên thực tế người ta hay chia các phương pháp nhận dạng mặt ra làm 3 loại: phương pháp tiếp cận toàn cục (global, như Eigenfaces-PCA, Fisherfaces-LDA), phương pháp tiếp cận dựa trên các đặc điểm cục bộ (local feature based, như LBP, Gabor wavelets) và phương pháp lai (hybrid, là sự kết hợp của hai phương pháp toàn cục và local feature). Phương pháp dựa trên các đặc điểm cục bộ đã được chứng minh là ưu việt hơn khi làm việc trong các điều kiện không có kiểm soát và có thể nói rằng lịch sử phát triển của nhận dạng mặt (A never ending story) là sự phát triển của các phương pháp trích chọn đặc trưng (feature extractrion methods) được sử dụng trong các hệ thống dựa trên feature based. Các ứng dụng cụ thể của nhận dạng mặt dựa trên 2 mô hình nhận dạng: identification (xác định danh tính, bài toán 1-N), và verification (xác thực danh tính, bài toán 1-1). Trong bài toán identification, ta cần xác định danh tính của ảnh kiểm tra, còn trong bài toán verification ta cần xác định 2 ảnh có cùng thuộc về một người hay không.
         Các pha trong một hệ thống nhận dạng mặt: để xây dựng một hệ thống nhận dạng mặt, cũng không hề đơn giản, bước đầu tiên cần thực hiện là face detection, tức là phát hiện phần ảnh mặt trong dữ liệu input (CSDL ảnh, video …) và cắt lấy phần ảnh mặt để thực hiện nhận dạng (face cropping), bước thứ hai là tiền xử lý ảnh (preprocessing) bao gồm các bước căn chỉnh ảnh (face image alignment) và chuẩn hóa ánh sáng (illumination normalization) (ở đây tôi đang nói tới các ảnh có góc nhìn thẳng – frontal view face image), tiếp đến là bước trích chọn đặc điểm (feature extraction), ở bước này một phương pháp trích chọn đặc điểm nào đó (mẫu nhị phân cục bộ – Local Binary Pattern – LBP, Gabor wavelets, …) sẽ được sử dụng với ảnh mặt để trích xuất các thông tin đặc trưng cho ảnh, kết quả là mỗi ảnh sẽ được biểu diễn dưới dạng một vector đặc điểm (feature vector), bước tiếp theo là bước nhận dạng (recognition) hay phân lớp (classification), tức là xác định danh tính (identity) hay nhãn (label) của ảnh – đó là ảnh của ai. Ở bước classification, thường thì phương pháp k-láng giềng gần nhất (k-nearest neighbor:kNN) sẽ được sử dụng, thực tế cho thấy việc dùng SVM (Support Vector Machine) không mang lại hiệu quả cao hơn mà còn chậm hơn. Dữ liệu cho một hệ thống nhận dạng mặt được chia làm 3 tập: tập huấn luyện (training set), tập tham chiếu (reference set hay gallery set) và tập để nhận dạng (probe set hay query set, đôi khi còn gọi là test set). Trong nhiều hệ thống, tập training trùng với tập reference. Tập training gồm các ảnh được dùng để huấn luyện (hay học-learning), thông thường tập này được dùng để sinh ra một không gian con (projection subspace) là một ma trận và phương pháp hay được sử dụng là PCA (Principal Component Analysis), WPCA (Whitened PCA), LDA (Linear Discriminant Analysis), KPCA (Kernel PCA). Tập reference gồm các ảnh đã biết danh tính được chiếu (projected) vào không gian con ở bước training. Bước training nhằm 2 mục đích: giảm số chiều (dimension reduction) của các vector đặc điểm (feature vector) vì các vector này thường có độ dài khá lớn (vài nghìn tới vài trăm nghìn) nên nếu để nguyên thì việc tính toán sẽ rất rất lâu, thứ hai là làm tăng tính phân biệt (discriminative) giữa các ảnh khác lớp (định danh khác nhau), ngoài ra có thể làm giảm tính phân biệt giữa các ảnh thuộc về một lớp (tùy theo phương pháp, ví dụ như Linear Discriminant Analysis LDA- còn gọi là Fisher Linear Discriminant Analysis-Fisherface là một phương pháp làm việc với tập training mà mỗi đối tượng có nhiều ảnh mặt ở các điều kiện khác nhau). Sau khi thực hiện chiếu tập reference vào không gian con, hệ thống lưu lại kết quả là một ma trận với mỗi cột của ma trận là một vector tương ứng với ảnh (định danh đã biết) để thực hiện nhận dạng (hay phân lớp). Nhận dạng (hay phân lớp) được thực hiện với tập các ảnh probe, sau khi tiền xử lý xong, mỗi ảnh sẽ được áp dụng phương pháp trích chọn đặc điểm (như với các ảnh thuộc tập training và reference) và được chiếu vào không gian con. Tiếp đến việc phân lớp sẽ dựa trên phương pháp k-NN, định danh của một ảnh cần xác định sẽ được gán là định danh của ảnh có khoảng cách (distance) gần với nó nhất. Ở đây cần lưu ý là mỗi ảnh là một vector nên có thể dùng khái niệm hàm khoảng cách giữa hai vector để đo sự khác biệt giữa các ảnh.
Làm thế nào để xử lý trước ảnh mặt để nhận diện khuôn mặt:
        Bây giờ bạn đã phát hiện một khuôn mặt, bạn có thể sử dụng hình ảnh khuôn mặt cho nhận diện khuôn mặt. Tuy nhiên, nếu bạn đã cố gắng để đơn giản là thực hiện nhận dạng khuôn mặt trực tiếp trên một hình ảnh hình ảnh bình thường, có thể bạn sẽ nhận được ít hơn độ chính xác 10%! Nó là vô cùng quan trọng để áp dụng các kỹ thuật hình ảnh trước khi chế biến khác nhau để tiêu chuẩn hóa các hình ảnh mà bạn cung cấp cho một nhận dạng khuôn mặt hệ thống. Hầu hết các thuật toán nhận dạng khuôn mặt cực kỳ nhạy cảm với điều kiện ánh sáng, do đó nếu nó được huấn luyện để nhận ra một người khi họ đang ở trong một căn phòng tối, thì có lẽ nó wont nhận ra họ trong một căn phòng sáng, vv Vấn đề này được gọi là "lumination phụ thuộc ", và cũng có nhiều vấn đề khác, chẳng hạn như mặt cũng phải ở trong một vị trí rất phù hợp trong những hình ảnh (như mắt là trong cùng một điểm ảnh tọa độ), kích thước phù hợp, góc quay, tóc và trang điểm, cảm xúc ( mỉm cười, giận dữ, vv), vị trí của đèn (bên trái hoặc bên trên, vv). Đây là lý do tại sao nó là rất quan trọng để sử dụng một bộ lọc hình ảnh tốt tiền xử lý trước khi áp dụng nhận dạng khuôn mặt. Bạn cũng nên làm những việc như loại bỏ các điểm ảnh xung quanh khuôn mặt mà không được sử dụng, chẳng hạn như với một mặt nạ hình elip để chỉ hiển thị các khu vực mặt bên trong, không phải là tóc và hình nền, kể từ khi họ thay đổi nhiều so với khuôn mặt không. Để đơn giản , hệ thống nhận diện khuôn mặt tôi sẽ cho bạn thấy là Eigenfaces sử dụng hình ảnh thang độ xám. Vì vậy, tôi sẽ cho bạn thấy làm thế nào để dễ dàng chuyển đổi hình ảnh màu xám (còn được gọi là "màu xám"), và sau đó dễ dàng áp dụng Histogram Equalization là một phương pháp rất đơn giản của tự động tiêu chuẩn hóa độ sáng và độ tương phản của hình ảnh gương mặt của bạn. Để có kết quả tốt hơn, bạn có thể sử dụng màu sắc nhận diện khuôn mặt (lý tưởng với phụ kiện màu sắc biểu đồ trong HSV hoặc một không gian màu thay vì RGB), hoặc áp dụng nhiều công đoạn chế biến như tăng cường cạnh, phát hiện đường viền, phát hiện chuyển động, vv Ngoài ra, mã này là thay đổi kích thước hình ảnh đến một kích thước tiêu chuẩn, nhưng điều này có thể thay đổi tỷ lệ khía cạnh của khuôn mặt.



        Bài toán phát hiện mặt người là bài toán được rất nhiều kỹ sư công nghệ, các nhà toán học quan tâm từ nhiều năm nay. Hiện nay người ta đã xây dựng được nhiều chương trình phát hiện khuôn mặt khách nhau. Trên thế giới, có nhiều phương pháp được đưa ra như sử dụng template matching, neuron network, haar like… Tuy nhiên, phương pháp nhận dạng dựa trên các đặc trưng haarlike được sử dụng nhiều nhất. 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%.
       Trong bài này mình xin giới thiệu sơ lược về phương pháp nhận dạng dựa vào đặc trưng haar-like và chương trình để phát hiện mặt người sử dụng java.
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 :
haarlike

         Để nhận dạng khuôn mặt bằng đặc trưng haar like thì đầu tiên ta phải đưa ảnh về xám hóa, sau đó cho các đặc trưng haarlike chạy khắp bức ảnh, những khu vực so sánh được cho là giống với nhiều đặc chưng haar like nhất sẽ được đánh dấu lại. Đây chính là phương pháp cơ bản để nhận dạng khuôn mặt.
         Dưới đây là một câu bình luận của bạn dkv123 diễn đàn dientuvietnam.net nói về cách nhận dạng.
“-Nói đơn giản là: nó sẽ chèn đặc trưng Haarlike lên toàn bộ bức hình của bạn. Khu vực nào giống thì nó sẽ nhận diện ở đó là mặt của bạn. Cho nên có rất nhiều khu vực trong hình nó sẽ nhận là mặt của bạn. Sau đó nó sẽ dùng các ảnh ko giống để loại trừ các vùng này. Cho nên trong quá trình training một bộ nhận dạng của Adaboost, số lượng ảnh sai luôn phải tuơng đối nhiều để nó loại trừ.
-Mean shift là thuật toán tracking. Tức là sau khi nó phát hiện được đối tượng nằm đâu nó chỉ theo dõi chuyển động của đối tượng đó. Ở đây là khuôn mặt, sau khi xác đinh khuôn mặt, nếu khuôn mặt có lắc lư thì nó cũng sẽ theo dõi, chứ ko phải dùng lại thuật toán để nhận dạng.”
        Để huấn huyện các đặc trưng haar like các bạn có thể tham khảo ở trang sau http://en.wikipedia.org/wiki/Haar-like_features
Các đặc trưng haar like sau khi huấn luyện sẽ được lưu vào file xml. Thư viện OpenCV đã có sẵn bộ huấn luyện nhận dạng khuôn mặt vì thế chúng ta không cần phải xây dựng thêm nữa.
Dưới đây là chương trình demo
Để chạy được chương trình này các bạn cần copy file haarcascade_frontalface_alt.xml vào cùng thư mục với file thực thi. Các bạn có thể tải file này theo link dưới:
https://code.google.com/p/warai/downloads/detail?name=haarcascade_frontalface_alt.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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;

}


Video hướng dẫn:


OpenCV Nhận Dạng khuôn mặt Thuật toán và phương thức Reviewed by Jacky on tháng 10 27, 2017 Rating: 5

Không có nhận xét nào:

All Rights Reserved by Cộng Đồng OpenCV © 2017
Edit bởi: Jacky Le | Youtube Channel: JACKY LE

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.