CƠ SỞ LÝ THUYET

Một phần của tài liệu Khóa luận tốt nghiệp Hệ thống nhúng và robotic: Phát hiện và loại bỏ mắt kính trên ảnh khuôn mặt người (Trang 32 - 59)

4.1. Thư viện xử lý ảnh OpenCV

OpenCV là một thư viện mã nguồn mở hang đầu cho thị giác máy tính — Computer Vision, xử lý ảnh và máy học, và các tính năng tăng tốc GPU trong hoạt động thời gian thực. OpenCV được phát hành theo giấy phép BSD, do đó nó hoàn toàn miễn

phí cho cả học thuật và thương mại.

OpenCV hỗ trợ nhiều ngôn ngữ lập trình khác nhau như C++, C, Python, Java trên nhiều nền tảng hệ điều hành như Windows, Linux, Mac OS, iOS và Android. OpenCV được thiết kế để tính toán hiệu quả và đặc biệt hỗ trợ phát triển các ứng dụng thời gian thực. Được thiết kế tối ưu cho ngôn ngữ C/C++, thư viện xử lý ảnh OpenCV có thê hoạt động hiệu quả trên các hệ thông đa lõi, đa đơn vị xử lý.

Các ứng dụng phô biến của OpenCV:

" Hình ảnh street view

"Kiểm tra và giám sát tự động

=" Robot và xe hơi tự lái

= Phân tích hình ảnh y tế

= Tìm kiếm và phục hồi hình ảnh/video

= Phim - cau trúc 3D từ chuyển động

= Nghệ thuật sắp đặt tương tác

Chức năng chính của OpenCV:

= Image/video I/O, xử lý, hiển thị (core, imgproc, highgui)

=ằ Phỏt hiện cỏc vật thộ (objdetect, features2d, nonfree)

" Geometry-based monocular or stereo computer vision (calib3d,

stitching, videostab)

= Computational photography (photo, video, superres)

=" Machine learning & clustering (ml, flann) 16

=" CUDA acceleration (gpu)

21

Ngôn ngữ lập trình C++ với thư viện OpenCV:

Ngôn ngữ lập trình C++ là một ngôn ngữ lập trình cấp trung được phát triển trên nền tang của ngôn ngữ lập trình C. Do đó, C++ có song song cả 2 phong cách lập trình hướng cấu trúc giống C và có thêm phong cách hướng đối tượng. Ngôn ngữ C++ phù hợp cho mọi đối

tượng đặc biệt là những người mới học lập trình. Bên cạnh đó ngôn

ngữ lập trình C++ phù hợp với bài toán yêu cầu hiệu năng cao, tiết kiệm bộ nhớ, dễ dàng trong việc bảo trì và năng cấp.

Ngôn ngữ lập trình C++ cho phép triển khai các ứng dụng đòi hỏi yếu

tố thời gian thực. Chăng hạn như các ứng dụng mô phỏng 3D, xử lý hình ảnh hiệu năng cao hay các ứng dụng cảm biến trên thiết bị di

động. Ngoài ra nó còn hiệu quả với các ứng dụng xử lý, mô phỏng

3D, hiệu ứng và hoạt ảnh.

Là một phần không thê thiếu trong nhiều hệ điều hành, tương thích mạnh với nền tảng MS Windows và Apple OSX. Có thê tích hợp nhiều phần mềm xử lý khác và hỗ trợ nhiều thư viện có sẵn.

Với hiệu năng cao và tốc độ xử lý nhanh, ngôn ngữ C++ thường được

sử dụng trong các ứng dụng lớn của các doanh nghiệp, nơi mà yếu tố hiệu năng và tốc độ luôn được đặt lên hàng đầu.

Ứng dụng thực tế của C++ có rất nhiều, đặc biệt phải nói tới 3 ứng dụng phô biến nhất là:

> Ngôn ngữ C++ gần với phần cứng: tạo ra hầu hết các hệ thông

nhúng xung quanh: đồng hồ thông minh, máy y tế, cảm biến

IoT,...

> C++ đóng vai trò trong phát triển các ứng dụng như may chủ

và chương trình vi điều khiến.

> Là ngôn ngữ hàng đầu cho 3D, nhiều người chơi hoặc các loại

phát triển trò chơi khác. C++ đủ mạnh dé tao ra các trò chơi

phức tạp như: CounterStrike, Doom, Red Dead Redemption,...

22

Đầu tiên nhóm dự kiến sử dụng ngôn ngữ lập trình Python dé xây dựng hệ thống tự động nhận dạng khuôn mặt người có mắt kính và thực hiện loại bỏ mắt kính. Nhưng trong quá trình thực hiện, thời gian và kiến thức của chúng em còn giới hạn nên

nhóm đã quyết định sử dụng ngôn ngữ C++ để thực hiện đề tài và tập trung vào

hướng nhận diện, phục hồi ảnh khuôn mặt người đeo kính. Kết quả thực nghiệm

cho thấy việc sử dụng ngôn ngữ lập trình C++ dé thực hiện đề tai dem lại kết quả tương đối khả quan.

4.2. Những thuật toán xử lý ảnh liên quan đề tài

4.2.1. Module Haar Cascade

Module Haar Cascade được hỗ trợ bởi thư viện OpenCV dùng dé đánh giá các đặc điểm khuôn mặt, từ đó xác định được vị trí khuôn mặt trên ảnh. Về cơ bản, thuật toán Haar Cascade sử dụng các đặc trưng loại Haar sau đó sử dụng thật nhiều đặc trưng đó qua nhiều lượt (cascade) dé tạo thành một cỗ máy nhận diện hoàn chỉnh.

Đặc trưng Haar: gồm những bộ lọc hình chữ nhật được minh hoạ như Hình 4.2-.

_ (a) Edge Features

II —. (b) Line Features

(c) Four-rectangle features

Hình 4.2-1 Vi dụ bộ lọc áp dung trong Haar Cascade

Với thuật toán Haar Cascade, bộ lọc sé chỉ chiếm một phần trong cửa số trượt, được

minh hoạ như Hình 4.2-2.

23

Hình 4.2-2 Ví dụ bộ lọc Haar trên ảnh

Hình 4.2-1 và Hình 4.2-2 được tham khảo tại Viblo.asia hỗ trợ mô tả kỹ thuật

chuyên dùng dé nhận biết các khuôn mặt trong ảnh.

Dựa vào các đặc trưng của khuôn mặt người chúng ta sẽ có vùng mắt luôn tối hơn

so với vùng má, hay vùng mũi thì sáng hơn so với vùng mắt,... Chúng ta có thê thấy bộ lọc đầu trong đó đang tìm một “cạnh” phân cách giữa mắt/lông mày với mũi, vì tại đoạn đọc đó có sự chênh lệch về màu đáng kể. Tại các bộ lọc sau, mô hình đang tìm đường sống mũi, tại vị trí này sẽ có màu sáng hơn so với 2 bên. Tương tự, bộ lọc Haar chỉ nhìn cụ thé vào một vùng trong cửa số để xác định khuôn

mặt.

4.2.2. Phuong pháp Grayscale Convert

Tiền xử ly ảnh trước khi xử lý nhận dang, biến đổi từ Anh mau (color image) về Ảnh xám (grayscale image). Trong xử lý ảnh, việc chuyển đổi ảnh màu sang ảnh

xám là công việc vô cùng phô biên và cân thiệt.

24

Hình 4.2-3 Ví dụ chuyển đối ảnh màu về ảnh xám Theo lý thuyết, ảnh màu thực chất là tập hợp của những ma trận số có cùng kích thước. Khi muốn xử lý thông tin trên ảnh, sẽ dé dang hơn nếu chúng ta chỉ xử lý dit liệu trên một ma trận số thay vì nhiều ma trận số. Việc biến đổi ảnh màu về ảnh xám thực chất là biến đổi những ma trận sỐ này thành một ma trận số hai chiều duy nhất khiến cho việc xử lý dữ liệu trên ảnh đơn giản hơn.

25

Giả sử, hình ảnh được lưu trữ dưới dạng RGB, có nghĩa là có ba ma trận xám tương

ứng cho ba mau Red, Green và Blue. Chúng ta cần tổ hợp ba ma trận này thành một

ma trận duy nhất. Một trong số các công thức phô biến để thực hiện việc đó là:

Y = 0.2126R + 0.7152G + 0.0722B (Công thức 4.2-1)

Trong đó:

"_ Y: ma trận xám cần tìm

= R: ma trận xám đỏ của ảnh

=" Œ: ma trận xám lục của anh

=" B:ma trận xám lam của anh

Trong thư viện OpenCV, có hai phương pháp phổ biến để thực hiện việc chuyển đổi:

- _ Đọc trực tiếp ảnh dưới dang ảnh xám

Câu lệnh thực hiện việc chuyển đổi anh sang dạng xám ngay từ lúc đọc ảnh vào bang cách truyền thêm tham số CV_LOAD_IMAGE_GRAYSCALE, thực chất CV_LOAD_IMAGE_GRAYSCALE là số 0. Ngoài ra, nếu muốn giữ nguyên việc đọc ảnh đầu vào là ảnh màu, chúng ta có thể sử dụng tham số CV_LOAD_IMAGE_COLOR hay số 1.

- Sw dụng lệnh cvtColor

Câu lệnh cvtColor sẽ thực hiện chuyên đôi img anh source can chuyén đôi va lưu

ảnh xám vào dest, sử dụng độ chuyển mau mode là CV_BGR2GRAY.

4.2.3. Region Of Interest - ROI

ROI (Region Of Interest) — Vùng quan tâm là vùng anh chúng ta sẽ áp dung các xử

lý hay thực hiện các phép biến đổi trên đó và bỏ qua các vùng còn lại. Việc khoanh

vùng ROI trên anh xử lý giúp tiết kiệm thời gian, chi phí tính toán và giúp cải thiện

hiệu suất.

ROI có thể ở bat kì hình dang nào (vuông, tròn, chữ nhật,...) được hiểu như một

“mặt nạ” mà trên đó pixel quan tâm có giá trị 1 (màu trắng) và pixel không quan

26

tâm (màu đen) có giá trị 0. Vùng không quan tâm được xem như vùng ảnh nền

(background).

Đối với đề tài này, ROI là viền mắt kính trên ảnh khuôn mặt người. Xây dụng bộ dữ liệu ảnh với ROI khoanh vùng được khu vực mắt kính GCR trên ảnh khuôn mặt

người trực diện.

Các bước xử lý ảnh xác định ROI:

- _ Bước 1: Resize ROI bang với kích thước ảnh cần xử lý

- Bước 2: Biến déi ROI về ảnh nhị phân (0, 1) bang cách loc theo ngưỡng có

giá trị 128 (>= 128 thi pixel có giá tri 1, <128 thi pixel có giá trị 0)

- Bước 3: Ap dụng ROI lên anh bằng phép nhân từng phan tử (element — wise)

4.2.4. 2D Convolution

Trong OpenCV, dé áp dụng bộ lọc (hay kernel) lên anh chúng ta sử dụng phép Tích chap — Convolution giữa kernel và ảnh. Vì anh chỉ có 2 chiều nên phép toán này

còn được gọi là 2D Convolution.

Một kernel là một ma trận (mang 2 chiều) có kích thước cố định. Phép tích chập giữa kernel và hình ảnh được thực hiện bằng cách duyệt kernel lần lượt qua từng điểm ảnh. Tại mỗi điểm ảnh, xác định một cửa số có tâm tại điểm ảnh đó và kích thước bằng với kích thước kernel. Lần lượt nhân các điểm trên cửa số với vị trí

tương ứng trên kernel rôi cộng tông ta được giá tri mới của diém ảnh ở ảnh dau ra.

27

Source pixel

(-1x3) + (0x0) + (1 x 1) + (-2 x 2) + (Ox 6) + (2x 2) + (-1x 2)+(0x4)+(1x 1) =-3

EEe.ar ôal Bos%w Jel

\s ls le is \ ye

Convolution filter (Sobel Gx)

Destination pixel LAA AA ANSPEREREEED' LEaBEEEER'LELERLEaEEE ELERE' CEESELEL

Hinh 4.2-5 Vi du minh hoa phép todn 2D Convolution

Hình 4.2-5 được tham khảo từ ezcodin về vi dụ minh hoa phép tích chập 2D

Convolution.

4.2.5. Lam mờ ảnh

Lam mo ảnh — Image Blurring hay Image Smoothing là việc thực hiện phép tích

chập giữa một bức ảnh và một Bộ lọc Thông thấp — LPF (Low Pass Filter) . Goi là

Bộ lọc Thông thấp vì nó sẽ loại bỏ các thành phần tần số cao như nhiễu (noise) hay cạnh viền (edge) dẫn tới bức ảnh đầu ra sẽ bị mờ. Ngoài ra còn có Bộ lọc Thông cao

— HPF (Hight Pass Filter). OpenCV hỗ trợ 4 bộ loc dé thực hiện Image Blurring:

- Averaging Filtering

Bộ lọc Trung bình - Averaging Filter tương đương với việc lấy trung bình giá tri của các điểm ảnh trong một cửa số. Thay vì phải định nghĩa kernel trước sau đó mới

thực hiện phép chập giữa kernel và bức ảnh, thư viện OpenCV hỗ trợ chúng ta sử

dụng trực tiép và truyện vào kích thước của cửa sô. Ngoài ra, thư viện OpenCV còn

28

hỗ trợ chúng truyền nào tham số normaliza = True dé lay tông các giá trị trong cửa

sô không cần tính giá trị trung bình.

- Gaussian Filtering

Gaussian Filtering — Bộ loc Gauss là bộ lọc rat hiéu qua dé loại bỏ các nhiễu. Kernel của bộ loc Gauss được gọi là Guassian Kernel. Y tưởng của bộ lọc này là giá trị của mỗi điểm ảnh sẽ phụ thuộc nhiều vào các điểm ảnh ở gần hơn là các điểm ảnh ở xa. Các trọng số của sự phụ thuộc được xác định bởi Gaussian Kernel.

Hình 4.2 — 6 tham khảo từ ezcodin minh họa cách xác định các trọng sé của

Gaussian Kernel.

0.4

0.3

Kernel Weight 0.2

0.1

0.0

-5.0 -2.5 0.0 25 5.0

Pixel

Hình 4.2-6 Minh hoạ cách xác định trọng số cua Gaussian kernel Giả sử ảnh là một chiêu, diém ảnh ở trung tâm sẽ có trọng sô lớn nhât. Cac điêm ảnh ở càng xa trung tâm sẽ có trọng sô giảm dân khi khoảng cách từ chúng tới diém trung tâm tăng lên.

Lưu ý: kích thước kernel (ksize) phải là số lẻ (1, 3, 5, ...). Hệ số sigma quyết định

đên tôc độ giảm ảnh hưởng của các điêm tính từ trung tâm. Nêu sigma lớn thì tôc độ

29

giảm ảnh hưởng sẽ chậm, ngược lại nêu sigma nhỏ thì tôc độ giảm ảnh hưởng sẽ

nhanh. Nếu sigma bang 0 nó sẽ được tự động tính toán từ kích thước cua kernel.

- Median Filtering

Median Filter — Bộ loc Trung vi là bộ lọc tính toán trung vi của tat cả điểm anh nằm trong cửa số và thay thế giá trị này cho điểm ảnh trung tâm. Với trung vị của một tập hợp là một phần tử thuộc tập hợp đó sao cho một nửa tập hợp nhỏ hơn nó

và một nửa còn lại lớn hơn nó.

Bộ lọc Trung vị rất phù hợp dé loại bỏ nhiễu muối tiêu — salt and pepper noise. Từ tính chất của trung vị ta có thể thấy giá trị mới của điểm ảnh luôn là một giá trị thuộc bức ảnh góc. Tính chất này giúp loại bỏ nhiễu một các hiệu quả.

Lưu ý: Kích thước của kernel phải là số lẻ. Kết quả thu được:

Hình 4.2-7 Kết quả thực nghiệm bộ lọc Median

- Bilateral Filtering

30

Bilateral Filter — Bộ lọc hai chiều là một bộ lọc có hiệu quả cao trong việc loại bỏ nhiễu mà vẫn giữ lại được các đường viên (cạnh) trong anh.

Trong khi bộ lọc Gauss xác định giá trị một điểm ảnh bằng cách lấy trung bình theo hàm Gauss các giá trị điểm ảnh xung quanh, hàm trọng số Gauss chỉ phụ thuộc vào khoảng cách trong không gian so với điểm ảnh trung tâm, không quan tâm đến sự tương quan giữa mức xám của điểm trung tâm với các điểm xung quanh đó. Nó cũng không quan tâm răng điềm ảnh trung tâm có nằm tại một đường biên trong ảnh không, vì thế làm nhòe luôn các đường biên trong ảnh.

Bộ lọc hai chiều cũng sử dụng một bộ lọc Gauss theo yếu tố khoảng cách đến điểm trung tâm, đảm bảo chỉ có các điểm ở gần tham gia vào vị trí của điểm ảnh trung tâm. Tuy vậy nó sử dụng thêm một hàm Gauss cho yếu tố mức xám, đảm bảo chỉ các điểm ảnh có mức xám tương đồng với điểm ảnh trung tâm tham gia vào quá

trình làm mịn.

Vì thế bộ lọc hai chiều bảo toàn được các đường biên trong ảnh bởi vì điểm ảnh ở biên có sự thay đổi về mức xám rất rõ ràng. Hơn nữa, thay vì hoạt động trên các

kênh màu một cách riêng rẽ như bộ lọc trung bình hay bộ lọc Gauss, bộ lọc

Bilateral thi hành việc đo đạc màu sắc có chủ đích trong không gian mau CIE —

Lab, làm mượt màu và bảo toan các biên theo hướng phù hợp hơn với nhận thức COn người.

Tuy vậy, bộ lọc hai chiêu cũng có nhược điêm là chậm hơn các bộ lọc khác.

Kết quả thu được được thể hiện như Hình 4.2-8. Chúng ta thấy so với áp dụng bộ lọc Gauss các cạnh viền bị mờ đi một chút, bộ lọc hai chiều vẫn giữ được rõ nét các

cạnh viên.

31

Bilateral

Hình 4.2-8 So sánh kết quả bộ loc Gauss và bộ lọc Bilateral Hình ảnh tham khảo từ ezcodin về mô tả bộ lọc hai chiều.

4.2.6. Bộ lọc Laplacian

Bộ lọc Laplacian — Laplacian của Gaussian là thước do dang hướng 2D của gradient ảnh. Laplacian của một hình ảnh làm nỗi bật các vùng có cường độ thay đổi nhanh chóng và thường được sử dụng dé phát hiện cạnh — edge.

Bộ lọc Laplacian được áp dụng cho hình ảnh sau khi được làm mịn băng Bộ lọc

Gaussian để giảm độ nhạy của nó với nhiễu. Quá trình thực hiện bộ lọc Laplacian

được hiêu đơn giản là lây một ảnh xám đâu vào và tạo một ảnh xám khác ở đâu ra.

Công thức của bộ lọc Laplacian L(x, y) có giá tri cường độ pixel là I(x, y) như sau:

821 831 . ;

L(x,y) = 2x2 + 22y2 (Công thức 4.2-2)

Công thức 4.2-2 được tham khảo từ homepages.inf.ed.ac.uk. Công thức tính bộ loc

Laplacian L(x,y) có thể được tính bằng cách sử dụng Bộ lọc Tích chập - 2D Convolution Filter nên được gọi là công thức Tích chập Tiêu chuẩn.

Vì hình anh đầu vào được biểu diễn dưới dạng một tổ hợp các pixel rời rac, chúng

ta phải tìm một kernel rời rạc có thê gân đúng với các gradient ảnh.

Hai kernel thường được sử dụng được mô tả như Hình 4.2-9:

32

Hình 4.2-9 Hai kernel pho biến trong bộ loc Laplacian Khi sử dụng một trong hai kernel này, bộ lọc Laplacian có thể được tính toán bởi công thức Tích chập tiêu chuẩn. Vì các kernel này xấp xỉ với phép do gradient anh

nên chúng rât nhạy cảm với nhiều.

Dé hạn chế điều này, thông thường chúng ta sẽ làm mịn hình ảnh bằng bộ lọc Gaussian trước khi áp dụng bộ lọc Laplacian. Bước tiền xử lý này làm giảm các thành phần nhiễu tần số cao trước bước phân biệt.

Phương pháp này có hai ưu điềm:

“ Vì cả hai kernel Gaussian va Laplacian thường nhỏ hơn nhiều so với

hình ảnh nên giảm bot thời gian tính.

“_ Kernel LoG — Laplacian of Gaussian có thé được tính toán trước vì

vậy chỉ cần thực hiện phép tích chập một lần trong suốt thời gian chạy

trên hình ảnh.

Công thức LoG(x, y) tham khảo từ homepages.inf.ed.ac.uk với tâm độ lệch chuan

Gaussian ứ cú dạng:

x2+y2

X21 1T — vra ,Je 222 (Công thức 4.2-3)

1

LoG(x,y) = [1 —Trơ2

202

Biểu diễn của công thức LoG(x, y) trên mặt phang I(x, y) có dang như Hình 4.2-10:

33

Hình 4.2-10 Biểu diễn của công thức LoG trên mặt phẳng (x, y)

Toán tử LoG giúp tính toán gradient ảnh. Có nghĩa là ở những vùng mà hình ảnh có

cường độ không đổi (nơi có gradient cường độ bằng 0), phản hồi LoG sẽ bằng 0. Tuy nhiên, ở vùng lân cận của sự thay đổi cường độ, phan ứng LoG sẽ tích cực ở phía tối hơn và tiêu cực ở phía sáng hơn. Nghĩa là ở một cạnh sắc nét hợp lý giữa hai vùng có cường độ đồng đều nhưng khác nhau, phản ứng của LoG sẽ được biểu

diễn như sau:

7 0 ở một khoảng cách xa từ mép

" Tích cực chỉ ở một phía của cạnh

b Tiêu cực ở phía bên kia của cạnh

7 0 tại một số điểm ở giữa, trên chính cạnh

Hình 4.2 — 11 minh họa phản ứng của LoG với một bước cạnh:

34

Một phần của tài liệu Khóa luận tốt nghiệp Hệ thống nhúng và robotic: Phát hiện và loại bỏ mắt kính trên ảnh khuôn mặt người (Trang 32 - 59)

Tải bản đầy đủ (PDF)

(70 trang)