Phát hiện khuôn mặt trong ảnh

Một phần của tài liệu Nhận dạng khuôn mặt người sử dụng OpenCV trong CSharp (Trang 42 - 46)

1. 2 Tổng quan kiến trúc của một hệ thống nhận dạng mặt người

5.2.2.Phát hiện khuôn mặt trong ảnh

Sau khi nhận được ảnh đầu vào, hệ thống sẽ thực hiện chức năng phát hiện khuôn mặt có trong ảnh. Như đã nói trong phần Giới Thiệu, bài toán phát hiện mặt người trong ảnh là một bài toán khó, nên ta không đi sâu tìm hiểu cách giải quyết bài toán này.

Ở đây, ta sử dụng phương pháp tiếp cận dựa trên diện mạo (appearance-based) được thực hiện nhanh bằng thuật toán adaboost thông qua hàm cvHaarObjects() của bộ thư viện OpenCV. Hàm này thực hiện việc phát hiện đối tượng dựa trên các đặc trưng haar-like, cụ thể là nhờ vào một bộ Cascade được truyền vào cho hàm. Bộ Cascade được xây dựng theo dạng cây (tree-node) và đã được huấn luyện từ trước.

Việc huấn luyện bộ Cascade có thể thực hiện từ những dữ liệu thu thập được để phục vụ cho quá trình nhận dạng. Ví dụ, muốn nhận dạng một người A, ta thu thập các ảnh khuôn mặt của người A với nhiều tư thế, góc chụp và điều kiện chụp khác nhau, sau đó cho bộ nhận dạng học theo thuật toán Cascade training. Kết quả thu được là ta sẽ có một mô hình nhận diện, được sử dụng để nhận dạng các đối tượng.

 Code thực hiện chức năng:

private HaarCascade haarface; private CascadeClassifier haar; private int WindowSize = 25;

private Double ScaleIncreaseRate = 1.1; private int MinNeighbors = 3;

// Control Timer

private void timer_getImage_Tick(object sender, EventArgs e) {

MinNeighbors = int.Parse(comboBoxMinNeigh.Text); WindowSize = int.Parse(textBoxWinSiz.Text);

ScaleIncreaseRate = Double.Parse(comboBoxScIncRte.Text); using (Image<Bgr, byte> ImageFrame = capture.QueryFrame()) {

if (ImageFrame != null) {

//STEP1. COnvert the image to Gray scale

Image<Gray, byte> grayframe = ImageFrame.Convert<Gray, byte>(); //STEP2. Detectfaces from the gray-scale image and store into an array of type 'var', i.e 'MCvAvgComp[]'

var faces = grayframe.DetectHaarCascade(haarface, ScaleIncreaseRate,

MinNeighbors,

HAAR_DETECTION_TYPE.DO_CANNY_PRU

NING,

new Size(ImageFrame.Width / 8, ImageFrame.Height / 8))[0];

//STEP3. Draw a green rectangle on each detected face in image

foreach (var face in faces) {

ImageFrame.Draw(face.rect, new Bgr(Color.Gray), 3); }

}

CamImageBox.Image = ImageFrame; }

 Hàm thực hiện chức năng phát hiện mặt người trong dòng hình ảnh của camera. Trong đó:

1. The HaarCascade (haarface): Một đối tượng thuộc lớp Mô hình nhận diện: HaarCascade. Đây là tham số đầu tiên trong lời gọi DetectHaarCascade(). Thực chất, đây là một file XML, từ đó, chuỗi dữ liệu được nạp cho bộ phân loại Haar. Có một số thác phát hiện khuôn mặt có trước trong OpenCV (và EmguCV). Các khuôn mặt trong ảnh sẽ được phát hiện nhờ mô hình nhận diện này. OpenCV cung cấp khá nhiều mô hình nhận diện khuôn mặt, không có bộ phân loại nào là tốt nhất, tùy từng trường hợp mà mô hình nhận dạng này cho kết quả tốt hơn mô hình kia. Chúng ta có thể thay đổi mô hình nhận dạng trong phần mềm một cách dễ dàng, chỉ cần thay đổi tên tệp tin XML. Ngoài mô hình nhận diện khuôn mặt, OpenCV còn cung cấp cho chúng ta nhiều mô hình nhận diện khác, như: tròng mắt, mắt, mũi, tay…

Ở đây, ta dùng một mô hình nhận diện khuôn mặt, với: - haarface = “đường dẫn tới mô hình nhận diện”.

- mô hình nhận diện: haarcascade_frontalface_alt_tree.xml.

2. ScaleIncreaseRate: Tham số thứ hai trong lời gọi đến DetectHaarCascade() là tỷ lệ co giãn, sử dụng trong thuật toán lặp-quét ảnh để tìm đối tượng (ở đây là mặt người). Thiết lập này cao hơn làm tăng tốc độ phát hiện khuôn mặt (giảm thời gian tìm kiếm, phát hiện khuôn mặt trong ảnh) bằng cách chạy đường chuyền ít hơn, nhưng nếu nó quá cao, bạn có thể nhảy quá nhanh giữa các phạm vi và phát hiện thiếu các khuôn mặt. Mặc định trong OpenCV là 1.1, nói cách khác, tăng quy mô với hệ số 1.1 (10%) mỗi cái.

Thông số này có thể có một trong các giá trị: 1.1, 1.2, 1.3 hoặc 1.4.

Trong phần mềm, mặc định giá trị của thông số ScaleIncreaseRate là cao nhất tức 1.4. Có nghĩa là nó sẽ chạy số lượng lặp ít nhất, do đó sẽ phát hiện nhanh chóng các khuôn mặt, nhưng cũng có thể bỏ qua một số khuôn mặt. Nếu thiết lập giá trị thấp hơn, việc kiểm tra, phát hiện đối tượng: khuôn mặt hoàn hảo hơn, nhưng sẽ mất nhiều thời gian hơn. Tùy từng bức ảnh đầu vào mà điều chỉnh thông số này để có thể đạt kết quả mong muốn. 3. Minimum Neighbors Threshold (MinNeighbors) : Tham số thứ ba trong lời gọi đến

DetectHaarCascade() là “Ngưỡng hàng xóm tối thiểu”, thiết lập mức độ cắt cho việc loại bỏ hoặc giữ nhóm hình chữ nhật để xây dựng bộ phân loại mạnh từ các bộ phân loại yếu. Giả sử, với 5 hình chữ nhật, ta xác định được một khuôn mặt-bộ phân loại mạnh. Còn bộ phân loại yếu là tập các hình chữ nhật thuộc một bộ phận của khuôn mặt, bộ phân loại yếu ở đây sẽ nhỏ hơn 5. (adsbygoogle = window.adsbygoogle || []).push({});

Nếu số lượng khuôn mặt nhận dạng được ít hơn thực tế thì hãy hạ thấp giá trị của tham số này (Dao động từ 0-4).

4. Canny Pruning Flag: Tham số thứ tư là một biến cờ. Hiện chỉ có hai lựa chọn: 0 hoặc DO-CANNY-PRUNING.

Nếu lựa chọn Canny Pruning được chọn, bộ dò sẽ bỏ qua các vùng mà không có khả năng có chứa một khuôn mặt, giảm chi phí tính toán và có thể loại bỏ một số phát hiện sai. Các

vùng bỏ qua được xác định bằng cách chạy một máy dò cạnh (máy dò cạnh Canny) trên ảnh trước khi chạy máy phát hiện khuôn mặt.

5. Minimum Detection Scale (WindowSize): Quy mô phát hiện tối thiểu.

Tham số thứ 5 trong các lời gọi đến DetectHaarCascade () là kích thước của khuôn mặt nhỏ nhất để tìm kiếm. Quy mô tối thiểu mặc định trong file XML là 24x24. Tuy nhiên, trong phần mềm, chúng ta để mặc định là 25x25.

Một phần của tài liệu Nhận dạng khuôn mặt người sử dụng OpenCV trong CSharp (Trang 42 - 46)