Biểu đồ tần suất các mẫu nhị phân cục bộ (LBP)

Một phần của tài liệu Xây dựng trung tâm xử lý cho tòa nhà thông minh trên hệ thống nhúng linux (Trang 59)

Eigenfaces và Fisherfaces cho ta tiếp cận toàn diện phần nào để nhận dạng khuôn mặt. Khi tiến hành xử lý dữ liệu như một vector nào đó trong một không gian hình ảnh có độ phân giải cao (high-dimensionality). Chúng ta đều biết điều này là không tốt, do đó, cần đưa ra một không gian con có ít chiều hơn (độ phân giải thấp hơn), trong đó (có thể là) thông tin hữu ích sẽ được bảo tồn. Phương pháp Eigenfaces tối đa hóa sự phân tán tổng thể, có

Trang 52

thể gây ra vấn đề nếu phương sai được tạo ra bởi nguồn bên ngoài, vì các thành phần với phương sai tối đa trên tất cả các lớp không nghĩa là có ích trong việc phân loại. Vì vậy, để bảo tồn một số thông tin phân biệt, ta áp dụng phương pháp phân tích biệt số tuyến tính và tối ưu hóa như trình bày trong phương pháp Fisherfaces.

Hình 2.27. Biểu đồ đánh giá về tỉ lệ nhận dạng của phương pháp Eigenfaces và phương pháp Fisherfaces trên cơ sở dữ liệu AT & T Facedatabase

Thực tế không lúc nào là hoàn hảo. Ta không thể đảm bảo thiết lập ánh sáng hoàn hảo trong tất cả các hình ảnh của mình hoặc trong 10 hình khác nhau của một người. Vì vậy, chuyện gì sẽ xảy ra nếu chỉ có một ảnh cho mỗi người? Khi đó ước tính phương sai của ta cho các không gian con có thể sai khủng khiếp, và cũng tương tự như vậy đối với việc nhận dạng. Nhớ rằng các phương pháp Eigenfaces có tỷ lệ nhận dạng lên tới 96% đối với dữ liệu khuôn mặt AT&T? Như vậy, ta cần có bao nhiêu hình để có được ước tính hữu ích như vậy? Hình 2.27 là biểu đồ đánh giá về tỉ lệ nhận dạng

Trang 53

của phương pháp Eigenfaces và phương pháp Fisherfaces trên cơ sở dữ liệu khuôn mặt AT&T, đây là cơ sở dữ liệu tương đối đơn giản:

Để có được tỉ lệ nhận dạng tốt ta sẽ cần ít nhất là 8 (1) hình cho mỗi người và khi đó phương pháp Fisherfaces lúc này là không còn thực sự có ích nữa [26]. Vì vậy, một số nghiên cứu đã tập trung vào việc trích xuất các đặc trưng cục bộ từ các hình ảnh. Ý tưởng là để không coi toàn bộ ảnh như là một vector nhiều chiều, nhưng chỉ mô tả đặc trưng cục bộ của một đối tượng. Các đặc trưng mà ta trích xuất theo cách này sẽ hoàn toàn có chiều ít hơn. Ý tưởng là tốt, nhưng ta sẽ sớm thấy được rằng các biểu diễn hình ảnh mà chúng ta có được không chỉ bị ảnh hưởng bởi sự chiếu sáng. Nếu xem xét đến như thay đổi tỉ lệ ảnh (phóng to, thu nhỏ), chuyển đổi hoặc xoay ảnh – thì các đặc tả cục bộ của ta phải được ít nhất có một chút mạnh mẽ chống lại điều đó.

Hình 2.28. Mô tả toán tử LBP

Cũng giống như SIFT, phương pháp các mẫu nhị phân cục bộ (Local Binary Pattern) có nguồn gốc từ phân tích kết cấu 2D. Ý tưởng cơ bản của mẫu nhị phân địa phương cục bộ là để tổng quát hóa các cấu trúc cục bộ trong ảnh bằng cách so sánh từng điểm ảnh với các vùng lân cận. Lấy một điểm ảnh ở giữa và ngưỡng của nó sẽ là các điểm lân cận. Nếu cường độ của các điểm ảnh giữa lớn hơn hay bằng điểm ảnh lân cận thì khi đó nó được biểu thị là 1 và là 0 nếu ngược lại. Khi đó, ta sẽ có một chuỗi nhị phân chẳng hạn như 1001111. Do đó, với 8 điểm ảnh xung quanh ta sẽ có

Trang 54

2^8 tổ hợp có thể, và nó được gọi là mẫu nhị phân cục bộ hoặc được gọi là mã LBP (Hình 2.28).

Mô tả thuật toán

Mô tả toán học của LBP có thể được biểu diễn bằng công thức sau:

  1   0 , P 2P c c p c p LBP x ys i i    (2.41)

Trong đó, x yc, clà điểm ảnh giữa với cường độ là icinlà cường độ của các điểm ảnh lân cận, s là hàm dấu được định nghĩa bằng cộng thức:

  10 neu x 0 s x nguoc lai      (2.42)

Một điểm lân cận cố định không thể mã hóa chi tiết thông tin khác nhau về tỉ lệ. Vì vậy, toán tử trên đã được mở rộng để sử dụng được cho các biến lân cận [24]. Ý tưởng đó là sắp xếp một số bất kỳ các điểm lân cận trên một vòng tròn với bán kính thay đổi, điều này cho phép chụp được vùng lân cận như sau:

Hình 2.29. Toán tử LBP mở rộng (ELBP)

Cho một điểm x yc, cđiểm lân cận là x yp, p,p P có thể được tính như sau:

Trang 55 2 cos 2 sin p c p c p x x R p p y y R p                   (2.43)

Trong đó Rlà bán kính của vòng tròn và Plà số các điểm mẫu.

Biểu thức trên là mở rộng của mã LBP ban đầu, do đó nó còn được gọi là LBP mở rộng (hay còn có tên là LBP vòng). Nếu tọa độ các điểm trên vòng tròn không tương ứng với tọa độ của ảnh, thì có thể lấy điểm theo nội suy:

 , 1    0,0   0,1 1 1,0 1,1 f f y f x y x x f f y               (2.44)

Theo định nghĩa thì toán tử LBP là mạnh mẽ, nó có thể chống lại biến đổi đơn điệu của gam màu xám. Chúng ta có thể dễ dàng xác minh điều này bằng cách xem hình LBP từ một hình biến đổi nhân tạo (do đó ta thấy những gì một hình ảnh trông giống như LBP):

Hình 2.30. Biểu diễn khuôn mặt với thuật toán LBP

Vì vậy, những gì còn lại để làm là làm thế nào để kết hợp các thông tin không gian trong mô hình nhận dạng khuôn mặt. Đề xuất của Ahonen et. al

Trang 56

[24] là phân chia hình ảnh LBP thành m các vùng cục bộ và tiến hành trích lọc biểu đồ histogram của mỗi vùng đó. Các vector đặc trưng không gian nâng cao sau đó thu được bằng cách ghép các biểu đồ histograms cục bộ (không trộn chúng lại với nhau). Các biểu đồ này được gọi là biểu đồ mẫu nhị phân cục bộ.

Trang 57

CHƯƠNG 3 (adsbygoogle = window.adsbygoogle || []).push({});

THIẾT KẾ HỆ THỐNG ĐIỀU KHIỂN VÀO RA TRÊN HỆ THỐNG NHÚNG LINUX

Trong chương này, tôi sẽ trình bày cách việc xây dựng chương trình nhận dạng khuôn mặt để điều khiển vào ra trên hệ thống nhúng linux (trên Raspberry Pi – gọi tắt là Raspi) bằng cách sử dụng ngôn ngữ lập trình C++, BashScript, thư viện Opencv v2.4.8, sau đó tiến hành xây dựng máy chủ web thời gian thực để tương tác với người dùng với NodeJS.

3.1 Nhận dạng khuôn mặt 3.1.1 Phân tích giải thuật 3.1.1 Phân tích giải thuật

Nhận dạng khuôn mặt là quá trình gán nhãn cho một khuôn mặt đã được biết đến. Cũng giống như con người học để nhận ra gia đình, bạn bè và những người nổi tiếng của họ chỉ bằng cách nhìn khuôn mặt của những người đó.

Có nhiều kỹ thuật cho máy tính để học cách nhận ra một khuôn mặt đã biết trước đó. Để nhận dạng khuôn mặt thì có thể thông qua 4 bước chính:

 Phát hiện khuôn mặt: Đây là quá trình định vị vùng xuất hiện mặt trong một ảnh. Bước này không quan tâm người đó là ai, chỉ là bức ảnh đó có xuất hiện khuôn mặt con người.

 Tiền xử lý khuôn mặt: Đây là quá trình xử lý hình ảnh khuôn mặt sao cho nhìn rõ ràng hơn và cân chỉnh sao cho cùng kích thước với các khuôn mặt khác.

Trang 58

 Thu thập và học khuôn mặt: Đây là quá trình lưu các gương mặt đã xử lý ở bước trên (đối với mỗi người cần được nhận dạng), sau đó học cách nhận dạng ra chúng.

 Nhận dạng khuôn mặt: Đây là quá trình để kiểm tra xem người được chụp hình giống với khuôn mặt nào đã được học trước đó.

Hình 3.1. Thuật toán thực hiện của chương trình nhận dạng trên Raspi

Qua thực nghiệm, Raspi có cấu hình không đáp ứng được khả năng nhận dạng và huấn luyện theo thời gian thực trên giao diện đồ họa (GUI). Do đó, tôi sẽ thực hiện huấn luyện trên máy tính PC (với cấu hình Intel Core i7, 2.0 GHz, Ram 4G, hệ điều hành Ubuntu) để được cơ sở dữ liệu khuôn mặt, sau đó cơ sở dữ liệu này sẽ được nạp vào Raspi (CPU ARM 700MHz, Ram 512M, ổ lưu trữ SD 8G) để thực hiện công việc nhận dạng (trên giao diện console) sau đó xuất ra giao diện web.

3.1.2 Phát hiện khuôn mặt

Qua thực nghiệm và tìm hiểu đánh giá, việc phát hiện ra khuôn mặt trong ảnh ngoài thuật toán sử dụng, nó còn phụ thuộc vào nhiều yếu tố khác khi chụp hình như phụ thuộc vào loại ánh sáng, hướng ánh sáng, bóng tối, biểu

Trang 59

hiện của khuôn mặt, hướng của khuôn mặt và tâm trạng hiện tại của người đó và cần phát hiện bao nhiêu khuôn mặt. Nếu như ta biết được mục đích của ứng dụng là gì thì khi đó ta sẽ quyết định được những tình huống có khả năng xảy ra khi thực phát hiện khuôn mặt. Như trong đề tài này, tôi tiến hành thực hiện phát hiện và nhận dạng cho hệ thống điều khiển vào ra đặt trong nhà, tức là điều kiện ánh sáng tại nơi đó ta đã biết, và chỉ muốn nhận dạng khuôn mặt một người nhìn thẳng đứng trước hệ thống.

Với Opencv, ta có thể thực hiện phát hiện khuôn mặt với thuật toán Haar hay LBP. Để tiến hành, đầu tiên ta phải thực hiện nạp bộ phân loại Haar hay LBP. Do thuật toán LBP dùng trong phát hiện khuôn mặt nhanh hơn nhiều so với Haar và hệ thống Raspi của ta có tốc độ xử lý còn thấp, nên tôi quyết định sử dụng thuật toán LBP để phát hiện khuôn mặt (dùng lớp thư viện CascadeClassifier để khai báo).

Như trình bày ở trên việc phát hiện khuôn mặt còn phụ thuộc vào một số điều kiện khác. Do đó, công việc trước hết là ta phải tiến hành tiền xử lý ảnh chụp từ máy theo trình tự các bước như sau:

 Chuyển đổi sang ảnh xám: Việc nhận dạng khuôn mặt chỉ hoạt động trên ảnh xám. Vì vậy, chúng ta nên chuyển đổi khung hình của máy ảnh từ ảnh màu sang ảnh xám nếu máy chụp của ta là máy màu.

 Thu nhỏ ảnh chụp lại: Do tốc độ nhận dạng khuôn mặt phụ thuộc vào kích thước của ảnh đầu vào (ảnh lớn thì cậm và ảnh nhỏ thì ngược lại), khi ảnh có độ phân giải thấp việc phát hiện vẫn còn đáng tin cậy. Vì vậy, chúng ta nên thu nhỏ ảnh xuống một kích thước hợp lý hơn.

 Cân bằng histogram: việc nhận dạng khuôn mặt không đáng tin cậy trong điều kiện ánh sáng yếu. Vì vậy, chúng ta nên thực hiện cân bằng histogram để cải thiện độ tương phản và độ sáng của ảnh.

Trang 60

3.1.2.1 Chuyển đổi sang ảnh xám:

Chúng ta có thể dễ dàng chuyển đổi một ảnh màu RGB sang ảnh xám (gray) bằng cách sử dụng hàm cvtColor(). Nhưng ta chỉ nên làm điều này

nếu ta biết nó là ảnh màu (có nghĩa là, máy ảnh không phải là máy ảnh đen trắng) và vì vậy ta phải xác định các định dạng của ảnh đầu vào (thường đối với máy tính để bàn thì ảnh có 3 kênh BGR còn trên điện thoại di động thì ảnh có 4 kênh BGRA). Với hệ thống chụp hình của Raspi thì đây là máy màu, nên do đó ta phải khuyển ảnh chụp sang ảnh xám. Ta có thể thực hiện chuyển sang ảnh xám như sau:

3.1.2.2 Thay đổi kích thước ảnh

Chúng ta có thể sử dụng hàm thay đổi kích cỡ ảnh resize() để thu nhỏ một

ảnh đến một kích thước nhất định hoặc theo tỷ lệ. Việc nhận dạng khuôn mặt thường hoạt động khá tốt đối với bất kỳ ảnh có kích thước lớn hơn 240 x 240 pixel (trừ khi ta cần phát hiện khuôn mặt ở xa máy ảnh), do nó sẽ tìm bất kỳ khuôn mặt lớn hơn giá trị nhỏ nhất (thường là 20x20 pixel). Vì vậy, ta nên thu nhỏ ảnh thành ảnh có kích thước 320 điểm ảnh, điều này là không quan trọng do hệ thống chụp của raspi có độ phân giải là 5M. Và điều quan trọng là ta phải phóng lớn lại các kết quả phát hiện được, bởi vì nếu việc phát hiện khuôn mặt trong một ảnh bị thu hẹp thì khi đó kết quả

Trang 61

cũng sẽ bị thu hẹp. Ta cũng phải đảm bảo ảnh không trở nên rộng hơn hoặc hẹp hơn so với bình thường. (adsbygoogle = window.adsbygoogle || []).push({});

3.1.2.3 Cân bằng histogram

Ta có thể dễ dàng thực hiện cân bằng histogram để cải thiện độ tương phản và độ sáng của ảnh, bằng cách sử dụng hàm equalizeHist(). Đôi khi việc

cân bằng này sẽ làm cho ảnh đầu ra trông rất lạ, nhưng nói chung nó sẽ cải thiện độ sáng và độ tương phản và giúp nhận dạng khuôn mặt được tốt hơn. Hàm equalizeHist() có thể được sử dụng như sau:

3.1.2.4 Phát hiện khuôn mặt

Bây giờ ta đã chuyển đổi ảnh sang ảnh xám, thu nhỏ ảnh, và cân bằng biểu đồ histogram, và sẵn sàng để phát hiện những khuôn mặt bằng cách sử dụng hàm CascadeClassifier::detectMultiScale(). Có rất nhiều thông số

mà chúng ta cần đưa vào hàm này:

 minFeatureSize: Tham số này xác định kích thước khuôn mặt tối thiểu mà ta quan tâm, thông thường là 20 x 20 hoặc 30 x 30 pixel nhưng điều này phụ thuộc vào trường hợp và kích thước ảnh. Do ta thực hiện để

Trang 62

nhận dạng ở nơi khuôn mặt rất gần với hệ thống chụp ảnh của Raspi, nên ta có thể để giá trị là 80x80 để việc phát hiện nhanh hơn

 searchScaleFactor: Các tham số xác định có bao nhiêu kích thước khuôn mặt khác nhau cần tìm kiếm, thường sẽ là 1.1 để phát hiện tốt hơn, hoặc 1.2 để phát hiện nhanh hơn nhưng cũng có thể là không tìm được khuôn mặt nào.

 minNeighbors: tham số này xác định việc chắc chắn rằng đã phát hiện ra một khuôn mặt, thường giá trị của nó là 3 nhưng ta có thể thiết lập nó cao hơn nếu muốn khuôn mặt phát hiện được là đáng tin cậy hơn, thậm chí ngay cả khi nhiều gương mặt có thể không được phát hiện.

 flags: Tham số này cho phép ta xác định xem là tìm tất cả các khuôn mặt (mặc định) hoặc chỉ tìm kiếm những khuôn mặt lớn nhất (CASCADE_FIND_BIGGEST_OBJECT). Nếu chỉ tìm kiếm các gương mặt lớn nhất, thì nó sẽ thực hiện nhanh hơn. Có một số thông số khác ta có thể thêm để làm cho việc phát hiện nhanh hơn khoảng một phần trăm đến hai phần trăm, chẳng hạn như CASCADE_DO_ROUGH_SEARCH hoặc CASCADE_SCALE_IMAGE.

Đầu ra của hàm detectMultiScale() sẽ là giá trị std::vector của loại đối

tượng cv::Rect. Ví dụ, nếu phát hiện ra hai khuôn mặt thì khi đó nó sẽ lưu một mảng 2 cv::Rect ở đầu ra. Hàm detectMultiScale() được sử dụng như sau:

Chúng ta có thể biết được nếu có khuôn mặt nào đã được phát hiện bằng cách nhìn vào số phần tử được lưu trữ trong vector, bằng cách sử dụng các hàm objects.size()

Trang 63

Như đã đề cập trước đó, nếu chúng ta thu ảnh nhỏ lại để phát hiện khuôn mặt, thì kết quả cũng sẽ được thu hẹp lại, vì vậy ta cần phải phóng to nó nếu muốn biết các vùng của khuôn mặt so với ảnh ban đầu. Ta cũng cần phải chắc chắn rằng khuôn mặt trên biên ảnh hoàn toàn ở trong ảnh:

Bây giờ chúng ta có một khuôn mặt nằm trong hình chữ nhật, ta có thể sử dụng nó với nhiều cách, chẳng hạn như là trích xuất hoặc cắt ảnh chứa khuôn mặt từ ảnh ban đầu. đoạn mã sau đây cho phép ta truy cập vào khuôn mặt đã được phát hiện ra:

Hình 3.2 cho thấy các hình chữ nhật điển hình có được từ bộ phát hiện khuôn mặt:

Trang 64

Hình 3.2. Ô vuông màu đỏ đánh dấu khuôn mặt được phát hiện

3.1.3 Xử lý dữ liệu khuôn mặt

Như đã đề cập ở phần trước, việc nhận dạng khuôn mặt là rất dễ bị ảnh hướng bởi điều kiện ánh sáng, tư thế của khuôn mặt, biểu cảm của khuôn mặt, và vv…, vì thế việc giảm những khác biệt này là rất quan trọng. Nếu không các thuật toán nhận dạng khuôn mặt thường sẽ cho rằng có sự giống nhau giữa khuôn mặt của hai người khác trong cùng điều kiện hơn là giữa hai mặt của cùng một người.

Hình thức đơn giản nhất của tiền xử lý khuôn mặt là áp dụng việc cân bằng

Một phần của tài liệu Xây dựng trung tâm xử lý cho tòa nhà thông minh trên hệ thống nhúng linux (Trang 59)