Tải bản đầy đủ (.docx) (28 trang)

Phát hiện khuôn mặt với thuật toán ADABOOST

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (409.84 KB, 28 trang )

ĐỒ ÁN
MÔN
HỌC I
PHÁT HIỆN KHUÔN MẶT
VỚI THUẬT TOÁN
ADABOOST

Lớp: DD12BK02 - ĐTVT
Giáo viên hướng dẫn: TS. Chế Viết Nhật Anh

MỞ ĐẦU
Với sự phát triển vượt bậc về công nghệ máy móc hiện nay được ứng dụng
rộng rãi trong nhiều lĩnh vực đời sống, một hệ thống máy tính cho phép chúng ta
có thể làm được rất nhiều việc, tiết kiệm thời gian và công sức. Điển hình như việc
nhận dạng khuôn mặt người. Nhiều năm về trước, việc nhận dạng một nghi phạm
tại sân bay, siêu thị, khu công cộng thường gặp nhiều khó khăn vì nhân viên an
1


ninh phải tìm kiếm trên từng màn hình camera theo dõi. Ngày nay, công việc này
đã được thực hiện tự động nhờ hệ thống nhận diện mặt người. Phát hiện mặt người
trong ảnh là một phần quan trọng của hệ thống nhận dạng mặt người đó, giải quyết
tốt việc phát hiện mặt người sẽ giúp tiết kiệm thời gian và nâng cao chính xác của
việc nhận dạng khuôn mặt.
Trong nhận diện khuôn mặt, đầu tiên ta phải lấy khuôn mặt ra một cách thủ
công, rồi đem đi nhận dạng xem đó là ai. Để việc nhận dạng khuôn mặt một cách
tự động, tức là đưa vào một bức ảnh phải xác định xem trong ảnh có những ai, rõ
ràng điều kiện cần thực hiện trước đó là phát hiện mặt người.
Việc phát hiện khuôn mặt còn được ứng dụng trong đếm số người. Bao
nhiêu khuôn mặt là có bấy nhiêu người. Việc đếm số người có vai trò quan trong
giao thông (đếm số lưu lượng người tham gia giao thông hằng ngày), trong


thương mại ( đếm số khách hàng ra vào siêu thị ) hay trong giáo dục ( thầy giáo
điểm danh số sinh viên trong lớp học ). Chính vì thế mà việc phát hiện khuôn mặt
người là hết sức cần thiết.
Phát hiện mặt người là một bài toán đơn giản, hệ thống chỉ cần phân loại đối
tượng đưa vào có phải mặt người hay không phải mặt người. Ở mức độ cao hơn,
các khuôn mặt sau khi phát hiện được sẽ đem đi so sánh với các khuôn mặt có
trong dữ liệu để nhận dạng xem khuôn mặt đấy là của ai ( thường nhận dạng tội
phạm ).
Với mục tiêu chính là tìm hiểu thuật toán Adaboost (Adaptive Boost), các
đặc trưng haar-like, mô hình Cascade of Classifiers, áp dụng đồng thời vào bài
toán phát hiện khuôn mặt người trong ảnh, đồ án được trình bày trong các chương
cụ thể như sau:
Chương I: Cơ sở lý thuyết: tìm hiểu thuật toán Adaboost. Giới thiệu các đặc
trưng về haar-like và cách tính thông số đặc trưng. Sử dụng mô hình Cascade of
classifiers và cách áp dụng vào bài toán đã đề ra.
Chương II: Ứng dụng thực nghiệm: Dựa vào cơ sở thư viện mã nguồn mở
OpenCV, xây dựng chương trình phát hiện khuôn mặt người trong ảnh và trên
video kết hợp với phân tích chương trình đó.
Chương III: Tổng kết và hướng phát triển: đánh giá kết quả và hướng nghiên
cứu phát triển.
Chương IV: Tài liệu tham khảo
2


Chương I: CƠ SỞ LÝ THUYẾT

1.

Mở đầu về phương pháp phát hiện khuôn mặt Haar-like và Adapboost:


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 phương pháp Haar-like- Adapboost (HA) của hai tác giả Paul
Viola và Micheal J.Jones xác định mặt người dựa theo hướng tiếp cận trên diện
mạo. 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.
Hướng tiếp cận trên diện mạo tức là hệ thống nhận dạng khuôn mặt sẽ được học
các mẫu của khuôn mặt từ một tập ảnh mẫu. Sau khi quá trình học hay quá trình
huấn luyện này (training) thực hiện xong, hệ thống sẽ rút ra được những tham
số để phục vụ cho quá trình nhận dạng.Vì vậy tiếp cận trên diện mạo còn được
biết đến với tên gọi tiếp cận theo phương pháp học máy. Bài báo cáo tập trung
chủ yếu vào quá trình nhận dạng (sau khi đã thực hiện quá trình học).
Về tổng quan, phương pháp HA được xây dựng dựa trên sự kết hợp, lắp ghép
của 4 thành phần, đó là:
- Các đặc trưng Haar-like: các đặc trưng được đặt vào các vùng ảnh để tính
toán các giá trị của đặc trưng, từ những giá trị đặc trưng này đưa vào bộ phân
loại Adaboost ta sẽ xác định được ảnh có khuôn mặt hay không.
- Ảnh tích hợp (Integral Image): thực ra đây là một công cụ giúp việc tính
toán các giá trị đặc trưng Haar-like diễn ra nhanh hơn.
- Adaboost (Adaptive Boost): bộ phân loại (bộ lọc) hoạt động dựa trên nguyên
tắc kết hợp các bộ phân loại yếu để tạo lên bộ phân loại mạnh. Adaboost sử
dụng giá trị đặc trưng Haar-like đã tính được để phân loại ảnh là mặt hay không
phải mặt.
- Cascade of Classifiers: bộ phân loại tầng với mỗi tầng là một bộ phân loại
Adaboost, có tác dụng tăng tốc độ phân loại.
3



Như vậy bài toán xác định mặt người trong ảnh cũng chính là bài toán phân loại
ảnh thành hai lớp: có mặt hoặc không phải mặt.
2) Tiền xử lí:
Phương pháp HA được thực hiện trên ảnh xám (gray image) . Mỗi điểm ảnh
(pixel) có giá trị từ 0-255 (không gian màu 8 bit). Ảnh màu sẽ được chuyển về
ảnh xám để nhận dạng, việc chuyển đổi này khá đơn giản, được thực hiện bằng
một hàm chuyển đổi và sử dụng với chỉ một câu lệnh trong OpenCV.
Sau khi chuyển thành ảnh xám, ảnh lại tiếp tục được chuyển thành “ảnh tích
hợp” (sẽ trình bày ở phần sau) và trong bước đầu tiên của quá trình nhận dạng,
các đặc trưng Haar-like sẽ làm việc trực tiếp trên ảnh tích hợp.
3) Đặc trưng Haar-like:
a)

Đối tượng nhận dạng:

Đặc
trưng
Haar-like.
1.
Đối
Trên
tượng
ảnh,
nhậnvùng
dạng.
khuôn mặt là tập hợp các điểm ảnh có những mối quan hệ
khác biệt so với các vùng ảnh khác, những mối quan hệ này tạo lên các đặc trưng
riêng của khuôn mặt. Tất cả khuôn mặt người đều có chung những đặc điểm sau
khi đã chuyển qua ảnh xám, ví dụ như:
- Vùng hai mắt sẽ tối hơn vùng má và vùng chán, tức mức xám của vùng này cao

hơn vượt trội so với hai vùng còn lại.
- Vùng giữa sống mũi cũng tối hơn vùng hai bên mũi.
-…
Và còn rất nhiều những đặc điểm khác của khuôn mặt và các đặc trưng Haar
like dựa vào các đặc điểm này để nhận dạng.
Về tổng quát, các đặc trưng Haar like không chỉ được sử dụng để nhận dạng
khuôn mặt mà có thể dùng để nhận dạng bất kì một đối tượng nào trên ảnh ( thân
người, tay, chân, ô tô, đồ vật,….). Bởi vì cũng giống như khuôn mặt, mỗi đối
tượng có những đặc điểm riêng biệt đặc trưng bởi các vùng điểm ảnh, công việc
của đặc trưng Haar-like là tính toán các giá trị tương quan giữa các vùng ảnh đó.
Đây chỉ là bước ban đầu về cách áp dụng đặc trưng để phân loại cửa sổ con, chi tiết
cách phân loại của bộ Adaboost và Cascade of Classifiers sẽ trình bày ở mục sau.

4


b)

Các đặc trưng Haar-like:

Mỗi đặc trưng Haar-like là một miền hình chữ nhật được chia thành 2,3 hoặc 4
hình chữ nhật nhỏ phân biệt quy ước bằng màu trắng và đen

Như hình vẽ trên là 3 loại đặc trưng Haar-like cơ bản gồm 2,3 và 4 hình chữ nhật
hợp thành . Từ những đặc trưng cơ bản mở rộng ra thành tập các đặc trưng:
+ Đặc trưng cạnh:

+ Đặc trưng đường:

+ Đặc trưng xung quanh tâm (centured-surrounded features)


Để tính giá trị các đặc trưng haar-like, ta tính sự chênh lệch giữa tổng của các pixel
của các vùng đen và các vùng trắng như trong công thức sau:

f(x) = Tổngvùng đen(pixel) - Tổngvùng trắng(pixel)
5


Vậy khi được đặt lên một vùng ảnh, đặc trưng Haar-like sẽ tính toán và đưa ra giá
trị đặc trưng h(x) của vùng ảnh đó.
c)

Cách áp dụng đặc trưng haar-like để phát hiện khuôn mặt trong ảnh:

3.
Cách
áp dụng
đặc
trưng
hiện
khuôn
Haar-like
mặt để
trong
phát
ảnh.

Để phát hiện khuôn mặt, hệ thống sẽ cho một cửa sổ con (sub-window) có kích
thước cố định quét lên toàn bộ ảnh đầu vào. Như vậy sẽ có rất nhiều ảnh con ứng
với từng cửa sổ con, các đặc trưng Haar-like sẽ được đặt lên các cửa sổ con này để

từ đó tính ra giá trị của đặc trưng. Sau đó các giá trị này được bộ phân loại xác
nhận xem khung hình đó có phải khuôn mặt hay không.
Hình dưới là một ví dụ: khung màu xanh là cửa sổ con, một đặc trưng Haar-like
với kích thước và vị trí đặt như trong hình sau:

Ứng với mỗi một đặc trưng như trên, một bộ phân lớp yếu (weak classifier)
được định nghĩa như sau:

Trong đó:
X : cửa sổ con cần xét
: ngưỡng
: giá trị của đặc trưng Haar-like
: hệ số quyết định chiều của bất phương trình

6


Ta hiểu công thức trên đơn giản như sau: khi giá trị của đặc trưng Haar-like k : tại
cửa sổ con x vượt qua một ngưỡng thì bộ phân lớp sẽ kết luận cửa sổ con x là
khuôn mặt (=1), còn không vượt qua ngưỡng đó thì không là khuôn mặt.
Ngưỡng là giá trị đã rút ra sau qua trình huấn luyện bộ phân lớp, sẽ trình bày sau.
Như trong phần đối tượng nhận dạng, ta thấy đặc trưng Haar-like k có kích thước
và vị trí đặt trong cửa sổ con x trên hình sẽ có giá trị rất lớn (vì mức xám ở vùng
mắt lớn hơn rất nhiều vùng má ). Giá trị này lớn hơn nhiều với hầu hết các giá trị
khác khi ta di chuyển cửa sổ con x sang các vị trí khác (quét trên toàn ảnh đầu
vào), và với ngưỡng phù hợp, kết quả bộ phân lớp ) sẽ cho cửa sổ con ở vị trí như
trên là khuôn mặt còn ở vị trí khác thì không.
Đương nhiên sẽ có những vị trí khác trên ảnh đầu vào vô tình cho ra vượt ngưỡng
và bộ phân lớp yếu) kết luận đấy là khuôn mặt, nhưng ta không chỉ dùng một đặc
trưng Haar-like mà dùng rất nhiều đặc trưng ở những vị trí và kích thước khác

nhau trong cửa sổ con làm giảm đi sự trùng hợp ngẫu nhiên.
Như vậy ta có thể thấy rằng, để tính các giá trị của đặc trưng Haar-like, ta phải tính
tổng của các vùng pixel trên ảnh. Nhưng để tính toán các giá trị của các đặc trưng
Haar-like cho tất cả các vị trí trên ảnh đòi hỏi chi phí tính toán khá lớn, không đáp
ứng được cho các ứng dụng đòi hỏi tính run-time ( theo như 2 tác giả là Viola và
Jones đã tính toán thì với mỗi cửa sổ con ở kích thước 24 x 24 pixel thì số lượng
đầy đủ các đặc trưng haar-like là hơn 160000) . Do đó Viola và Jones đưa ra một
khái niệm gọi là Integral Image trong mục tiếp theo để tính toán nhanh cho khác
feature cơ bản.
4) Intergral Image: (Ảnh tích hợp)
Viola và Jones đưa ra một khái niệm gọi là Integral Image để tính toán
nhanh cho khác feature cơ bản. Sau này, Lienhart kế thừa gọi Integral Image là
SAT – Summed Area Table và đưa ra thêm khái niệm RSAT – Rotated Summed
Area Table dùng để tính toán nhanh cho các đặc trưng xoay 1 góc 45 o. Integral
Image là một mảng 2 chiều với kích thước bằng với kích của ảnh cần tính các đặc
trưng Haar-like, với mỗi phần tử của mảng này được tính bằng cách tính tổng của
điểm ảnh phía trên (dòng-1) và bên trái (cột-1) của nó. Bắt đầu từ vị trí trên, bên
trái đến vị trí dưới, phải của ảnh, việc tính toán này đơn thuần chỉ đựa trên phép
cộng số nguyên đơn giản, do đó tốc độ thực hiện rất nhanh.

7


P(x,y)

Hình 1: Cách tính Integral Image của ảnh
Sau khi đã tính được Integral Image, việc tính tổng điểm ảnh của một vùng
bất kỳ nào đó trên ảnh thực hiện rất đơn giản theo cách sau: (Giả sử ta cần tính
tổng điểm ảnh của vùng D như trong hình 2):
D = A + B + C + D – (A+B) – (A+C) + A

Với A + B + C + D chính là giá trị tại điểm P4 trên Integral Image, tương tự
như vậy A+B là giá trị tại điểm P2, A+C là giá trị tại điểm P3, và A là giá trị tại
điểm P1. Vậy ta có thể viết lại biểu thức tính D ở trên như sau:

A

P1

C

B

P2

D
P4

P3

Hình 2: Ví dụ cách tính nhanh tổng các điểm ảnh của vùng D trên ảnh
B
2

RSAT(x,y)

A
D

1


C
3

4

(b)

(a)

Hình 3: Ví dụ cách tính nhanh tổng điểm ảnh của vùng D trên ảnh
với các đặc trưng xoay 45o

8


Với các đặc trưng Haar-like xoay 45o Integral Image tại một điểm (x, y) được
tính theo công thức:

Tổng pixel của một vùng bất kỳ trên ảnh vẫn được tính theo cách sau:
D = A + B + C + D – (A+B) – (A+C) + A
Như vậy tổng các điểm ảnh trong một hình chữ nhật (kể cả trường hợp xoay
45º) bất kì đều có thể được tính nhanh dựa trên integral image tại 4 đỉnh của nó :
Sum (D ) = 4 - 2 – 3 + 1

5) Thuật toán Adaboost:
a) Khái quát về Adaboost:
Kỹ thuật Boosting: nguyên tắc cơ bản của Boosting là kết hợp các bộ phân lớn yếu
( hay các bộ phân lớp cơ sở ) để tạo nên bộ phân lớp mạnh. Các bộ phân lớp yếu
này thậm chỉ chỉ cần nhỉnh hơn phương pháp random một chút . Bằng cách này, ta
nói bộ phân lớp đã được “boost”.

Adaboost là 1 thuật toán sử dụng kỹ thuật Boosting được đưa ra bởi Freund và
Schapire vào 1996. Thuật toán này được sử dụng rất phổ biến cho bài toán kỹ thuật
phát hiện khuôn mặt.
b) Thuật toán:
Điểm cải tiếng của Adaboost là ta sẽ gán mỗi mẫu 1 trọng số. Ý nghĩa của nó như
sau:

9


1. Cho một tập gồm n mẫu có đánh dấu (x 1,y1), (x2,y2),… (xn,yn) với xk ∈

(xk1, xk2, … , xkm) là vector đặc trưng và yk ∈ (-1, 1) là nhãn của mẫu (1
ứng với object, -1 ứng với background).
2. Khởi tạo trọng số ban đầu cho tất cả các mẫu: với m là số mẫu đúng

(ứng với object và y = 1) và l là số mẫu sai (ứng với background và y =
-1).
3. Xây dựng T weak classifiers

Lặp t = 1, …, T
• Với mỗi đặc trưng trong vector đặc trưng, xây dựng một weak
classifier hj với ngưỡng θj và lỗi εj.


Chọn ra hj với εj nhỏ nhất, ta được ht:



Cập nhật lại trọng số:




Trong đó:
: Hệ số dùng để đưa về đoạn [0,1] (normalization factor)

4. Strong classifier được xây dựng :

c)Sơ đồ khối:

10


Tập các mẫu

Tập các mẫu và trọng số

Bắt đầu huấn luyện
Khởi tạo tập đặc trưng ban

Mẫusai
đúng
Mẫu

trưng
Xác định các đặc trưng trong từng mẫu, xây dựng các bộĐặc
phân
loạihaar-lik
yếu tư


Tính toán giá trị lỗi cho mỗi đặc trưng (false alarm)

Cập nhật lại trọng số

Sai

Xác định ngưỡng

Kết thúc, strong classifier đuợc xây dựng
Đúng

weak
classifier đượ
Chọn weak classifier có giá trịLưu
lỗi bé
nhất
False alarm ≤ max false alarm

Quá trình huấn luyện bộ phân loại được thực hiện bằng một vòng lặp mà ở
mỗi bước lặp, thuật toán sẽ chọn ra weak classifier ht thực hiện việc phân loại với
lỗi εt nhỏ nhất (do đó sẽ là bộ phân loại tốt nhất) để bổ sung vào strong classifier.
Mỗi khi chọn được 1 bộ phân loại ht, Adaboost sẽ tính giá trị αt theo công thức ở
trên. αt cũng được chọn trên nguyên tắc làm giảm thiểu giá trị lỗi εt .
Hệ số αt nói lên mức độ quan trọng của ht:


Trong công thức của bộ phân loại H(x):
11





Ta thấy tất cả các bộ phân loại ht đều có đóng góp vào kết quả của bộ
phân loại H(x), và mức độ đóng góp của chúng phụ thuộc vào giá trị αt
tương ứng: ht với αt càng lớn thì nó càng có vài trò quan trọng trong H(x).
Trong công thức tính αt:
Dễ thấy giá trị αt tỉ lệ nghịch với εt. Bởi vì ht được chọn với tiêu chí đạt εt
nhỏ nhất, do đó nó sẽ đảm bảo giá trị αt lớn nhất.

Sau khi tính được giá trị αt, Adaboost tiến hành cập nhật lại trọng số của các
mẫu: tăng trọng số các mẫu mà ht phân loại sai, giảm trọng số các mẫu mà ht phân
loại đúng. Bằng cách này, trọng số của mẫu phản ánh được mức độ khó nhận dạng
của mẫu đó và ht+1 sẽ ưu tiên học cách phân loại những mẫu này.
Vòng lặp xây dựng strong classifier sẽ dừng lại sau T lần lặp. Trong thực tế
cài đặt, người ta ít sử dụng giá trị T vì không có công thức nào đảm bảo tính được
giá trị T tối ưu cho quá trình huấn luyện. Thay vào đó, người ta sử dụng giá trị max
false positive hay max false alarm (tỉ lệ nhận dạng sai tối đa các mẫu background).
Tỉ lệ này của bộ phân loại cần xây dựng không được phép vượt quá giá trị này. Khi
đó, qua các lần lặp, false alarm của strong classifier Ht(x) xây dựng được (tại lần
lặp thứ t) sẽ giảm dần, và vòng lặp kết thúc khi tỉ lệ này thấp hơn max false alarm.

6) Mô hình Cascade of classifier:
a) Khái quát:
Ta thấy quá trình huấn luyện, bộ phân loại phải duyệt qua tất cả các đặc trưng
của các mẫu trong tập training. Việc này tốn rất nhiều thời gian. Tuy nhiên, trong
các mẫu đưa vào, không phải mẫu nào cũng thuộc loại khó nhận dạng, có những
mẫu background rất dễ nhận ra (ta gọi đây là những mẫu background đơn giản).
Đối với những mẫu này, ta chỉ cần xét một hay vài đặc trưng đơn giản là có thể
nhận diện được chứ không cần xét tất cả các đặc trưng. Nhưng đối với các bộ phân
loại thông thường thì cho dù mẫu cần nhận dạng là dễ hay khó thì nó vẫn sẽ xét tất


12


cả các đặc trưng mà nó rút ra được trong quá trình học. Do đó, chúng tốn thời gian
xử lý một cách không cần thiết.
Cascade of Classifiers được xây dựng chính là nhằm rút ngắn thời gian xử lý,
giảm thiểu false alarm cho bộ phân loại. Cascade tree gồm nhiều stage (hay còn
gọi là layer), mỗi stage của cây sẽ là một stage classifier. Một mẫu để được phân
loại là đối tượng thì nó cần phải đi qua hết tất cả các stages của cây. Các stage
classifiers ở stage sau được huấn luyện bằng những mẫu negative mà stage
classifier trước nó nhận dạng sai, tức là nó sẽ tập trung học từ các mẫu background
khó hơn, do đó sự kết hợp các stage classifiers này lại sẽ giúp bộ phân loại có false
alarm thấp. Với cấu trúc này, những mẫu background dễ nhận diện sẽ bị loại ngay
từ những stages đầu tiên, giúp đáp ứng tốt nhất đối với độ phức tạp gia tăng của
các mẫu đưa vào, đồng thời giúp rút ngắn thời gian xử lý.

b) Thuật toán:

13


1. Gọi:

F là giá trị false alarm và d là độ chính xác của weak classifier ở mỗi stage
Ftarget: Giá trị max false alarm.
P, N là số lượng mẫu positive và negative.
Pi, Ni là tập positive và negative cho bộ phân lớp ở tầng thứ i.
Fi, Di: Giá trị false alarm và độ chính xác của cascade trước khi đến tầng thứ
i.

2. Khởi tạo i=0; F0=1.0; D0 = 1.0
3. Lặp: while Fi>Ftarget
• i = i+1;
• Huấn luyện bộ phân loại hi từ tập Pi và Ni với detection rate d và max
false alarm f. Thêm hi vào cây phân lớp.
• Dùng cây phân lớp hiện có để tính Fi: Duyệt qua N mẫu negative cho đến
khi nào tìm đủ n mẫu mà cây phân lớp hiện có phân loại sai. (
• N :=
• Nếu Fi >Ftarget
N = { số mẫu sai ở stage hiện tại phân loại sai }.
P = { số mẫu positive mà stage hiện tại phân loại dúng }

Minh họa thuật toán Cascade training:
stage 1

……

2

futher processing

T
F

N

N-1
T
F


F

T

F

Reject Sub-window

Hình 4: cascade of classifiers
Hình 4 minh họa sự huấn luyện của một cascade gồm N stages.
14


c)

Cascade of boosting classifiers:
Là mô hình cascade of classifiers với mỗi classifier được xây dựng bằng
Adaboost sử dụng haar-like.

NON-CLASS
N

N

Y
N

Y

N


C
L
A
S
S

Y
I

Hình 5: Cascade of boosting classifiers
Viola và Jones đã sử dụng rất thành công cascade of boosting classifiers cho
bài toán nhận dạng mặt người. Với tập huấn luyện gồm 4196 hình mặt người được
đưa về ảnh grayscale kích thước 24 x 24 và 9500 hình background, hai ông đã xây
dựng cấu trúc cascade tree gồm 38 stage với tổng cộng 6060 đặc trưng haar-like.
Thực nghiệm đã cho thấy classifier ở stage đầu tiên sử dụng 2 đặc trưng và loại
được khoảng 50% mẫu background (không phải mặt người) và có độ chính xác là
d = 100%. Classifier ở stage thứ 2 sử dụng 10 đặc trưng loại được 80% mẫu
background với độ chính xác vẫn là d= 100%. Hệ thống này được so sánh với hệ
thống của Rowley-Baluja-Kanade (sử dụng mạng neural), Schneiderman-Kanade
(sử dụng phương pháp thống kê), và cho thấy tỉ lệ nhận dạng là ngang nhau, trong

15


khi hệ thống của Viola và Jones chạy nhanh hơn đến 15 lần so với hệ thống của
Rowley-Baluja-Kanade và nhanh hơn 600 lần hệ thống của Schneiderman-Kanade.
Lý do mà cấu trúc cascade đạt tốc độ nhận dạng nhanh chính là nhờ nó sớm
loại bỏ được các mẫu background đơn giản (thường có số lượng lớn hơn nhiều so
với các mẫu chứa object – các mẫu chưa khuôn mặt cần tiến hành nhận dạng). Bên

cạnh đó, hệ thống của Viola và Jones cũng đạt được độ chính xác khá cao nhờ vào
thuật toán cascade training, các bộ nhận dạng được huấn luyện bằng AdaBoost với
đặc trưng Haar-like mô tả tốt thông tin đối tượng, cùng với cách Integral Image
tính nhanh các đặc trưng, không làm giảm tốc độ nhận dạng của hệ thống. Như
vậy, mô hình Cascade of Boosted Classifiers thật sự là một cách tiếp cận tốt cả về
tốc độ lẫn khả năng nhận dạng, rất phù hợp với bài nhận dạng mặt người.

Chương II: ỨNG DỤNG THỰC NGHIỆM

1.

Sử dụng Opencv và chương trình đơn giản phát hiện khuôn mặt bằng
python
a) Phương pháp Haar like-Adaboost trong OpenCv:
Phương pháp nhận diện khuôn mặt dựa vào đặc trưng Haar like kết hợp
Adaboost được cài sẵn trong bộ thư viện Opencv. Để sử dụng phương
pháp này trong Opencv ta sử dụng hàm detect MultiScale.
Phát hiện khuôn mặt trong một bức ảnh, cách thức là chương trình sẽ tạo
một khung cửa sổ có kích thước xác định chứa một phần của bức ảnh, khung
cửa sổ này chính là “ảnh đầu vào” mà phương pháp Haar like dùng để tính
toán. Khi quét khung cửa sổ này trên toàn bộ bức ảnh ta sẽ nhận được vô số
“ảnh đầu vào”, với mỗi ảnh đầu vào chương trình sẽ xác nhận xem đó có
phải là mặt người hay không với những bước như trong phần I. Bằng cách
thay đổi tỉ lệ và vị trí của khung cửa sổ này chúng ta có thể phát hiện được
tất cả các khuôn mặt có trong bức ảnh ( tất nhiên còn phụ thuộc vào độ chính
xác của phương pháp).
Chi tiết cách thức này được trình bày trong mục sau.

16



b)

Chương trình đơn giản phát hiện khuôn mặt bằng python:

*Đây là một chương trình phát hiện khuôn mặt đơn giản với đối tượng là
một ảnh ABC.jpg:
1. import numpy as np
2. import cv2
3.face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_
default.xml')
4. eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
5. img = cv2.imread('ABC.jpg')
6. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
7. faces = face_cascade.detectMultiScale(gray, 1.3, 5)
8. for (x,y,w,h) in faces:
9. img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
10. roi_gray = gray[y:y+h, x:x+w]
11. roi_color = img[y:y+h, x:x+w]
12. eyes = eye_cascade.detectMultiScale(roi_gray, 1.3, 5)
13. for (ex,ey,ew,eh) in eyes:
14. cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
15. cv2.imshow('ABC',img)
16. cv2.waitKey(0)
17. cv2.destroyAllWindows()
Trước khi phân tích chương trình ta tìm hiểu hàm detectMultiScale là phần tìm
kiếm khuôn mặt, hàm (hay phương thức) này thuộc lớp CascadeClassifier (lớp
phục vụ tìm kiếm đối tượng của Opencv), hàm có nguyên mẫu với những tham số
như sau:
cvHaarDetectObjects ( const CvArr* image,

CvHaarClassifierCascade* cascade,
CvMemStorage* storage, double scale_factor
CV_DEFAULT(1.1),
int min_neighbors CV_DEFAULT(3), int flags
17


CV_DEFAULT(0),
CvSize min_size CV_DEFAULT(cvSize (0,0)));
Tham số cascade chính bộ phân lớp đề cập trong phần I, bộ phân lớp này được
lưu vào các file .xml được xây dựng sẵn trên các bộ cơ sở dữ liệu chuẩn. Dưới đây
là một số bộ phân loại trong thư viện Opencv:

Tên

Xây
Kích
dựng
cỡ ảnh
cho bộ sử
phận
dụng

haarcascade-eye.xml

Mắt

25x15

haarcascade_frontalface_default.xm

l
frontalEyes35x16.xml

Mặt

20x20

Mắt

35x16

ojol.xml
ojoD.xml

Mắt
Mắt

18x12
18x12

Mouth.xml

Miệng

25x15

Nariz.xml

Mũi


25x15

Xây
Thông
dựng trên tin khác
lượng
positive
sample
Trực
diện
Trực
diện
Trực
diện
7000
Mắt trái
7000
Mắt
phải
7000
Trực
diện
7000
Trực
diện

Như trong bảng khi cần phát hiện các đối tượng khác nhau ta sẽ sử dụng các bộ
phân lớp khác nhau, tức là load các file .xml tương ứng vào chương trình. Opencv
cũng hỗ trợ chúng ta tự xây dựng một bộ phân lớp riêng cho các đối tượng khác
bằng hàm cvCreateHidHaarClassifierCascade, chúng ta có thể xây dưng các bộ

phân loại để phát hiện các đối tượng khác như ôtô, chó, mèo….

18


Quay lại hàm detectMultiScale, tham số tiếp theo là image chính là bức ảnh
cần phát hiện khuôn mặt.
scale_factor là tỉ lệ tăng kích thước của khung cửa sổ tìm kiếm. Ví dụ nếu
scale_factor=1.1 thì sau khi quét hết bức ảnh 1 lần, khung cửa sổ sẽ tăng kích
thước lên 10% và thực hiện lần quét tiếp theo. Tham số này ảnh hưởng đến tốc độ
xử lý và độ tin cậy của chương trình. Nếu để nó quá lớn thì tốc độ chương trình sẽ
tăng lên do số lần quét giảm đi, tuy nhiên có thể chương trình có thể bỏ qua không
phát hiện được một số khuôn mặt có kích thước nằm giữa 2 khung cửa sổ liên tiếp
do độ tăng kích thước của khung là quá lớn. Nếu để nó quá thấp thì ta có thể không
bỏ sót bất kì khuôn mặt nào nhưng chương trình sẽ tốn thời gian hơn vì tăng số lần
quét lên.
min_neighbors giá trị tối thiểu số hình chữ nhật lân cận được gộp lại sau khi
quá trình quét đã xong.
Trong quá trình tìm kiếm khuôn mặt chương trình sẽ tìm được nhiều những
khung hình chữ nhật chứa khuôn mặt cho dù đó chỉ là một khuôn mặt và có những
trường hợp nhận diện nhầm.
Nếu ta để tham số min_neighbors=0 cho hàm tìm khuôn mặt tức là để nguyên
những gì tìm được sau khi quét thì sẽ được kết quả:

19


Như vậy tham số này sẽ gộp lại những hình chữ nhật chứa cùng một khuôn mặt
để chỉ cho ra một hình chữ nhật cho 1 khuôn mặt. Đồng thời nó sẽ loại bỏ bớt đi
những kết quả sai vì những kết quả sai chỉ cho ra 1 khung hình chữ nhật còn kết

quả đúng thì có nhiều khung hình lân cận bao lấy. Ví dụ như những hình chữ nhật
nhỏ trên tường như trong hình trên.
Việc phát hiện khuôn mặt trên video hay camera cũng tương tự như trên một
bức ảnh, vì video là chuỗi liên tiếp những hình ảnh được hiển thị (frame hình).
Ta làm một vòng lặp để thực hiện phát hiện khuôn mặt trên những frame hình liên
tiếp và cũng đưa kết quả ra liên tiếp.
min_size là kích thước nhỏ nhất của khung cửa sổ phát hiện khuôn mặt, khung
sẽ bắt đầu quét từ kích thước này, mọi khuôn mặt có diện tích vượt qua kích
thướckhung này đều không được phát hiện.
Những tham số trên là những tham số quan trọng của hàm.
*Phân tích chương trình:
Dòng 1,2 là phần khai báo chương trình sẽ sử dụng 2 bộ thư viện là Numpy và
Opencv bản 2.x
20


Dòng 3,4 ta tạo ra 2 đối tượng thuộc lớp CascadeClassifier là face_cascade và
eye_cascade để tìm kiếm mặt và mắt, đồng thời load 2 file .xml cho 2 đối tượng
này.
Dòng 5 đọc ảnh cần tìm khuôn mặt vào biến img.
Dòng 6 tạo một biến ảnh gray là ảnh vào chuyển sang dạng xám để thực hiện
tìm kiếm.
Dòng 7 sử dụng hàm detectMultiScale để tìm kiếm các khuôn mặt trong ảnh
xám gray với các tham số scale_factor=1.3 và min_neighbors=5 bằng bộ phân
lớp của face_cascade.
Dòng 8,9 hàm detectMultiScale sau khi tìm kiếm xong sẽ trả về bộ giá trị gồm
tọa độ gốc của khung chứa khuôn mặt x,y ; chiều dài, rộng của khung w,h. Các giá
trị này nằm trong mảng faces. Cấu trúc for….in sẽ duyệt qua toàn bộ các bộ giá trị
này, với mỗi bộ giá trị ta dùng hàm rectangle để vẽ một hình chữ nhật lên ảnh ban
đầu img với tọa độ 2 điểm trái trên và phải dưới: (x,y),(x+w,y+h). (0,255,0) là màu

sẽ vẽ hình chữ nhật.


Chúng ta đã xác định xong các khuôn mặt có trong ảnh.

Dòng 10,11 ta tạo ra roi_gray = gray[y:y+h, x:x+w] và roi_color = img[y:y+h,
x:x+w] là 2 biến ảnh màu và ảnh xám các khuôn mặt đã tìm thấy. Và việc tìm kiếm
mắt được thực hiện trên các khuôn mặt đã tìm thấy chứ không phải quét toàn bộ
ảnh ban đầu như tìm kiếm mặt.
Dòng 12,13,14 tương tự là tìm kiếm và vẽ khung hình chữ nhật chứa mắt với
một màu khác.
Dòng 15 dùng hàm hiển thị ảnh đã vẽ xong lên một cửa sổ window có tên
ABC.
Dòng 16,17 đợi ấn nút bất kì để thoát chương trình, xóa cửa sổ hiển thị.
Kết quả hiển thị:

21


*Dưới đây là một chương trình phát hiện khuôn mặt lấy đối tượng là hình
ảnh từ camera máy tính và hiển thị:
import numpy as np
import cv2
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
video_capture = cv2.VideoCapture(0)
while True:
ret, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
22



faces =face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(frame, (x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('video',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
video_capture.release()
cv2.destroyAllWindows()
Trong chương trình này, lớp video_capture = cv2.VideoCapture(0) là lớp xử lý
những frame hình lấy từ webcam mặc định của máy tính.
Trong mỗi một vòng lặp, thực hiện lấy ảnh đầu vào là frame hình từ webcam
bằng hàm frame = video_capture.read() . Sau đó mọi việc phát hiện khuôn mặt trên
frame hình này thực hiện tương tự như trên một ảnh bình thường ở chương trình
đầu tiên. Sau khi kết quả được hiển thị, chương trình tiếp tục nhận frame hình tiếp
theo, phát hiện rồi hiển thị.Vòng lặp được thực hiện liên tục cho ra một video với
khuôn mặt được phát hiện.

Chương III: TỔNG KẾT VÀ HƯỚNG PHÁT TRIỂN

1)

Tổng kết:

*Trên cơ sở nghiên cứu về bài toán phát hiện mặt người trong ảnh. Đặc biệt là
thuật toán Adaboost, các đặc trưng haar-like và mô hình Cascade of Classifier, áp
dụng thành công mô hình Cascade of Classfier vào bài toán phát hiện mặt người
trong ảnh.

23



*Kết quả đạt được chưa cao, trong một khung hình nếu có sự xuất hiện của hai
khuôn mặt trở lên thì sẽ khó khăn trong việc lựa chọn thông số kích thước khung
cửa sổ tăng lên để có thể phát hiện được khuôn mặt một cách chính xác. Hơn nữa,
khi nhận diện khuôn mặt bằng webcam, nếu đối tượng di chuyển, góc nghiêng
khuôn mặt quá 20 độ hoặc trong điều kiện ánh sáng quá yếu thì việc nhận dạng trở
nên khó hơn. Tuy tồn tại những hạn chế trên nhưng đây là từng bước đi đầu tiên để
đi đến xây dựng bài toán “Phát hiện khuôn mặt người” trong tương lai.
*Liện hệ thực tế và so sánh với các phương pháp khác:
Học theo adaboost là một cách trong hướng tiếp cận dựa trên diện mạo, Viola
và Jones dùng AdaBoost kết hợp cascade để xác định khuôn mặt người với các đặc
trưng dạng Haar wavelet-like. Tốc độ xử lý khá nhanh và tỷ lệ chính xác hơn
80% trên ảnh xám. Ngoài ra còn có một số phương pháp khác nhận dạng trong
hướng tiếp cận dựa trên diện mạo như sau:
a)

Mạng Neural:

Về cơ bản mạng Neural là một mạng các phần tử (gọi là neuron) kết nối với
nhau thông qua các liên kết (các liên kết này được gọi là trọng số liên kết) để thực
hiện một công việc cụ thể nào đó. Khả năng xử lý của mạng neuron được hình
thành thông qua quá trình hiệu chỉnh trọng số liên kết giữa các neuron, nói cách
khác là học từ tập hợp các mẫu huấn luyện.
Mạng Neural rất hay được sử dụng trong các bài toán nhận dạng mẫu, nhận
dạng mặt người cũng có thể xem là một bài toán nhận dạng với hai loại mẫu (mặt
người hoặc không phải mặt người) và như vậy có thể sử dụng mạng Neural khá
hiệu quả kể cả khi các mẫu khuôn mặt có độ phức tạp cao. Tuy nhiên, một
điều trở ngại đó là các kiến trúc mạng đều có tính tổng quát cao, do đó, khi áp
dụng ta phải tính toán rõ số lượng tầng, số lượng node, tỷ lệ học … cho từng

trường hợp cụ thể.
b)

Support Vector Machine:

Support Vector Machine ( SVM ) được Vladimir Vapnik đưa ra vào năm 1995
để giải quyết vấn đề nhận dạng mẫu hai lớp sử dụng nguyên tắc cực tiểu hóa rủi ro
cấu trúc (Structural Risk Minimization). Đây là phương pháp tiếp cận phân loại
24


văn bản rất hiệu quả. Ưu điểm của SVM là giải thuật này được xây dựng trên ý
tưởng cực tiểu rủi ro cấu trúc. Nguồn gốc của SVM dựa trên sự chắc chắn về
lỗi chính xác, có thể phân loại ngẫu nhiên các mẫu đối tượng được chọn mà lỗi
được giữ sao cho nhỏ nhất. Vì vậy, giải thuật SVM giúp giảm thiểu biên trên các
lỗi chính xác và làm cho hệ thống tin cậy hơn
Cho trước một tập huấn luyện, các ảnh được biểu diễn dưới dạng vector. Trong
không gian vector, mỗi vertor được biểu diễn bởi một điểm. Phương pháp SVM sẽ
tìm một siêu phẳng quyết định để phân chia không gian vector thành hai lớp
(khuôn mặt và không phải khuôn mặt). Chất lượng của siêu phẳng này phụ thuộc
vào khoảng cách giữa các vector, tức là phụ thuộc vào các đặc trưng của ảnh.
Support Vector Machine đã được Osuna áp dụng đầu tiên (để xác định khuôn mặt
người). SVM được xem như là một kiểu phân loại mới vì trong khi hầu hết các
phương pháp phân loại khác đều dùng tiêu chí tối thiểu lỗi huấn luyện (rủi ro
do kinh nghiệm), trong khi SVM dùng quy nạp (được gọi là tối thiểu rủi ro
cấu trúc). Phân loại SVM là một phân loại tuyến tính, do đó nó cũng dùng một
siêu phẳng để tách dữ liệu. Dựa trên một số kết hợp có các trọng số của một tập
con nhỏ các vector huấn luyện, các vector này được gọi là support vector. Ước
lượng siêu phẳng trong SVM thì tương đương giải một bài toán tuyến tính bậc hai.
Osuna đã phát triển phương pháp SVM một cách hiệu quả cho bài toán xác định

khuôn mặt người. Ông dùng 10,000,000 mẫu có kích thước 19 x19 pixel, hệ thống
của ông có tỷ lệ lỗi ít hơn và nhanh hơn rất nhiều.
c)

Phân loại Bayes:

Bayes là một bộ phân loại tuyến tính dựa trên xác xuất. Tư tưởng của nó là dựa
vào xác xuất của các đặc trưng xuất hiện trong khuôn mặt. Đây là phương pháp
đơn giản, cài đặt không phức tạp, tốc độ nhanh, với tập huấn luyện lớn thì cho
kết quả vẫn tương đối chính xác.
Một nghiên cứu điển hình dùng phân loại Bayes vào xác định mặt người trong
hướng tiếp cận dựa trên diện mạo đó là nghiên cứu của Schneiderman và
Kanade. Hai ông đã mô tả một phân loại Naïve Bayes để ước lượng xác xuất
25


×