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

Báo cáo thực tập tốt nghiệp tìm HIỂU kĩ THUẬT và ỨNG DỤNG

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 (361 KB, 41 trang )

HỌC VIỆN KĨ THUẬT QUÂN SỰ
KHOA CÔNG NGHỆ THÔNG TIN
----------oOo----------

LÊ QUÝ ĐA
KHÓA: 8
HỆ: KỸ SƯ TIN HỌC

BÁO CÁO

THỰC TẬP TỐT NGHIỆP
NGÀNH CÔNG NGHỆ THÔNG TIN
MÃ SỐ: 01.01

ĐỀ TÀI: TÌM HIỂU KĨ THUẬT VÀ ỨNG DỤNG
OPENCV TRONG BÀI TOÁN PHÁT HIỆN, THEO DÕI KHUÔN MẶT

Cán bộ hướng dẫn:
Ts. Vũ Tất Thắng

Hà Nội, 2013


Báo cáo thực tập tốt nghiệp Trang |2

Lời cảm ơn
Đầu tiên, em xin được gửi lời cảm ơn chân thành đến các thầy cô trong khoa Công
nghệ Thông tin và nhà trường đã giúp đỡ và giới thiệu em đến thực tập lại Công ty phần
mềm iSolar. Để hoàn thành được khóa thực tập này, đó là sự giúp đỡ nhiệt tình và hết sức
tạo điều kiện của các thầy cô và nhà trường, giúp em củng cố được những kiến thức còn
thiếu sót cũng như các kĩ năng làm việc thực tế, cách giải quyết vấn đề…


Đồng thời, em cũng xin gửi lời cám ơn đến thầy Nguyễn Việt Hùng đã giúp đỡ em
không chỉ về mặt kiến thức, kĩ năng lập trình mà còn là người truyền động lực cho em,
giúp em hoàn thành tốt giai đoạn thực tập tốt nghiệp trong suốt thời gian qua.
Em xin gửi lời cám ơn sâu sắc đến Công ty phần mềm iSolar đã tạo mọi điều kiện
thuận lợi giúp em cũng như các sinh viên khác hoàn thành tốt giai đoạn thực tập tốt
nghiệp tại đây. Đồng thời em cũng xin gửi lời cám ơn chân thành tới TS. Vũ Tất Thắng
và anh Nguyễn Hoàng Anh – những người đã nhiệt tình giúp đỡ em củng cố kiến thức
cũng như giải đáp những khúc mắc cũng như cung cấp cho chúng em các thiết bị cần
thiết và một môi trường làm việc năng động, đó là những nguồn động lực lớn nhất giúp
em có thể có thêm động lực để hoàn thành tốt khóa thực tập này cũng như các nhiệm vụ
được giao.
Em xin cảm ơn Nhà Trường và đặc biệt các thầy cô trong khoa Công nghệ Thông
tin, những người mà hàng ngày vẫn tạo điều kiện giúp đỡ chúng em học tập và bảo ban
chúng em.
Sinh viên thực hiện
Lê Quý Đa


Báo cáo thực tập tốt nghiệp Trang |3

Contents


Báo cáo thực tập tốt nghiệp Trang |4

Mở đầu
Công nghệ thông tin đang được ứng dụng trong mọi lĩnh vực của cuộc sống. Với
một hệ thống máy tính, chúng ta có thể làm được rất nhiều việc, tiết kiện thời gian và
công sức. Điển hình như công việc nhận dạng mặt người. Ngày xưa, muốn tìm kiếm một
kẻ tình nghi trong siêu thị hay sân bay, các nhân viên an 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 đấy đã được làm tự động nhờ các hệ
thống nhận dạng 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.
Phát hiện mặt người cũng là một bài toán nhận dạng đơ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,
sau khi đã phát hiện được khuôn mặt, các khuôn mặt đó sẽ được 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 áp dụng trong
nhận dạng khuôn mặt của người nổi tiếng hoặc của tội phạm đang bị truy nã).
Bài toán phá hiện mặt người được bắt đầu nghiên cứu từ những năm 1990s, và đã có
rất nhiều công trình nghiên cứu về phát hiện khuôn mặt trong ảnh, tuy nhiên cho đến nay,
các nhà khoa học vẫn không ngừng tìm các hướng tiếp cận mới, các thuật toán mới nhằm
nâng cao hiệu suất của việc phát hiện khuôn mặt cũng như việc nhận dạng mặt người.
Với mục tiêu chính là tìm hiểu giải thuật adaboost, các đặc trưng haar-like, mô hình
Cascade of Classifiers, đồng thời áp dụng vào bài toán phát hiện mặt người trong ảnh,
khóa luân được trình bầy trong bốn chương với bố cục như sau:
Chương 1: Tổng quan về các phương pháp xác định mặt người : Giới thiệu tổng
quan về bài toán xác định mặt người trong ảnh, các ứng dụng và những khó khăn của bài
toán, đồng thời xác định phạm vi của đề tài.
Chương 2: Cơ sở lý thuyết : Giới thiệu về các đặc trưng haar-like của khuôn mặt,
cách tính các đặc trưng haar-like. Tiếp theo là giới thiệu về OpenCV.
Chương 3: Xây dựng ứng dụng : Xây dựng một chương trình demo về phát hiện mặt
người trong ảnh, theo dõi đối tượng từ camera laptop. Nêu lên các phân tích – thiết kế về
chương trình.
Cuối cùng là kết luận và hướng phát triển: Tóm tắt những kết quả đạt được, những
hạn chế và nêu lên các hướng phát triển trong tương lai.


Báo cáo thực tập tốt nghiệp Trang |5



Báo cáo thực tập tốt nghiệp Trang |6

A. Giới

thiệu đơn vị thực tập

1. Địa chỉ cơ quan thực tập


Công ty TNHH giải pháp sáng tạo và nghiên cứu tiên tiến Nhất Thái Dương



(iSolar).
Địa chỉ:
o Phòng 307 Nhà 2B, Viện khoa học Việt Nam 18 Hoàng Quốc Việt, Cầu
Giấy, Hà Nội
Điện thoại: 0437918026

Khu công nghệ cao Hòa Lạc, Hà Nội, Việt Nam
Điện thoại: 04 3791 8026
 Email:
 Website:
o

2. Giới thiệu về cơ quan thực tập
Công ty phần mềm Isolar hay công ty TNHH giải pháp sáng tạo và nghiên cứu tiên
tiến Nhất Thái Dương được thành lập ngày 4 tháng 5 năm 2011. Là một trong những
công ty luôn đi đầu về các giải pháp công nghệ với mục tiêu đáp ứng các nhu cầu của

cuộc sống. Từng bước phấn đấu trở thành một trong những doanh nghiệp hàng đầu Việt
Nam và tiến dần ra Thế giới.Các lĩnh vực hoạt động chính của Isolar:
 Speech Processing: Isolar đã nhiều năm làm việc trong lĩnh vực nhận dạng, tổng

hợp, nâng cao chất lượng… tiếng nói, nghiên cứu triển khai hệ thống Speech
translation, server TTS, hệ thống chuyển báo viết thành báo nói…
 Meeting: Cung cấp các giải pháp truyền thông đa phương tiện thế hệ mới, với chi

phí thấp, sở hữu chuẩn nén hình ảnh độc quyền mới nhất với khả năng nén gấp 4
lần chuẩn khác và giảm tới 10 lần băng thông.
 Education: Đi đầu trong việc xây dựng các giải pháp giáo dục tiên tiến, triển khai
nhiều dự án tin học để nâng cao chất lượng đào tạo. Điểm hình như hệ thống học
máy, hệ thống e – learning, e – contact, thi trắc nghiệm trực tuyến… và nhiều các
dự án trọng điểm khác.
 Security: Isolar cung cấp các giải pháp, ứng cứu và chống lại các mối đe dọa bảo

mật của các doanh nghiệp.


Báo cáo thực tập tốt nghiệp Trang |7

B. Nội

dung

Chương 1. Tổng quan về phương pháp xác định mặt người
1. Giới thiệu bài toán xác định mặt người trong ảnh
Trong nhiều năm qua, có rất nhiều công trình nghiên cứu về bài toán nhận dạng
mặt người. Các nghiên cứu đi từ bài toán đơn giản, từ việc nhận dạng một mặt người
trong ảnh đen trắng cho đến mở rộng cho ảnh mầu và có nhiều mặt người trong ảnh. Đến

nay các bài toán xác định mặt người đã mở rộng với nhiều miền nghiên cứu như nhận
dạng khuôn mặt, định vị khuôn mặt, theo dõi mặt người hay nhận dạng cảm xúc mặt
người…
Phát hiện mặt người trong ảnh là phần đầu tiên của một hệ thống nhận dạng mặt
người. Các hệ thống nhận dạng khuôn mặt được bắt đầu xây dựng từ những năm 1970,
tuy nhiên do còn hạn chế về các luật xác định mặt người nên chỉ được áp dụng trong một
số ứng dụng như nhận dạng thẻ căn cước. Nó chỉ được phát triển mạnh mẽ từ những năm
1990 khi có những tiến bộ trong công nghệ video và ngày nay thì các ứng dụng của xác
định mặt người đã trở nên phổ biến trong cuộc sống.

2. Định nghĩa bài toán xác định mặt người
Xác định khuôn mặt người là một kỹ thuật máy tính để xác định các vị trí và kích
thước của các khuôn mặt người trong các ảnh bất kì. Kỹ thuật này nhận biết các đặc trưng
của khuôn mặt và bỏ qua những thứ khác như: tòa nhà, cây cối, cơ thể …

3. Những khó khăn và thách thức đối với bài toán xác định mặt người
Việc xác định khuôn mặt người có những khó khăn nhất định như:


Hướng (pose) của khuôn mặt đối với máy ảnh, như: nhìn thẳng, nhìn nghiêng

hay nhìn từ trên xuống. Cùng trong một ảnh có thể có nhiều khuôn mặt ở
những tư thế khác nhau.
• Sự có mặt của các chi tiết không phải là đặc trưng riêng của khuôn mặt người,
như: râu quai nón, mắt kính, ….
• Các nét mặt (facial expression) khác nhau trên khuôn mặt, như: vui, buồn, ngạc
nhiên, ….
• Mặt người bị che khuất bởi các đối tượng khác có trong ảnh.



Báo cáo thực tập tốt nghiệp Trang |8


Sự biểu cảm của khuôn mặt : sự biểu cảm có thể làm thay đổi đáng kể các đặc
trưng và thông số của khuôn mặt, ví dụ như khuôn mặt của cùng một người sẽ
rất khác khi người đấy cười, tức giận hay sợ hãi …

4. Các ứng dụng của xác định mặt người
Xác định mặt người thường là một phần của một hệ thống (facial recognition
system). Nó thường được dùng trong giám sát video, giao tiếp người máy và quản lý cơ
sở dữ liệu ảnh… Các ứng cơ bản của xác định mặt người có thể kể đến là:
Xác minh tội phạm.
Dựa vào ảnh của một người, nhận dạng xem người đấy có phải là tội phạm hay
không bằng cách so sách với các ảnh tội phạm đang được lưu trữ. Hoặc có thể sử dụng
camera để phát hiện tội phạm trong đám đông. Ứng dụng này giúp cơ quan an ninh quản
lý con người tốt hơn.
Camera chống trộm.
Các hệ thống camera sẽ xác định đâu là con người và theo dõi xem con người đó có
làm gì phạm pháp không, ví dụ như lấy trộm đồ, xâm nhập bất hợp pháp vào một khu vực
nào đó.
Bảo mật.
Các ứng dụng về bảo mật rất đa dạng, một trong số đó là công nghệ nhận dạng mặt
người của laptop, công nghệ này cho phép chủ nhân của máy tính chỉ cần ngồi trước máy
là có thể đăng nhập được. Để sử dụng công nghệ này, người dùng phải sử dụng một
webcam để chụp ảnh khuôn mặt của mình và cho máy “học” thuộc các đặc điểm của
khuôn mặt giúp cho quá trình đăng nhập sau này.
Lưu trữ khuôn mặt
Xác định mặt người có thể được ứng dụng trong các trạm rút tiền tự động (ATM) để
lưu trữ khuôn mặt của người rút tiền. Hiện nay có những người bị người khác lấy trộm
thẻ ATM và mã PIN, và bị rút tiền trộm, hoặc có những chủ tài khoản đi rút tiền nhưng lại

báo với ngân hàng là bị mất thẻ và bị rút tiền trộm. Nếu lưu trữ được khuôn mặt của
người rút tiền, ngân hàng có thể đối chứng và xử lý dễ dàng hơn.
Các ứng dụng khác


Điều khiển vào ra: văn phòng, công ty, trụ sở, máy tính, Palm, …. Kết hợp thêm
vân tay và mống mắt. Cho phép nhân viên được ra vào nơi cần thiết.


Báo cáo thực tập tốt nghiệp Trang |9

An ninh sân bay, xuất nhập cảnh (hiện nay cơ quan xuất nhập cảnh Mỹ đã áp dụng



). Dùng camera quan sát để xác thực người nhập cảnh và kiểm tra xem người đấy
có phải là tội phạm hay phần tử khủng bố không.
• Tìm kiếm và tổ chức dữ liệu liên quan đến con người thông qua khuôn mặt người
trên nhiều hệ cơ sở dữ liệu lưu trữ thật lớn, như internet, các hãng truyền hình, ….
Ví dụ: tìm các đoạn video có tổng thống Bush phát biểu, tìm các phim có diễn viên
Lý Liên Kiệt đóng, tìm các trận đá bóng có Ronaldo đá, …
• Kiểm tra trạng thái người lái xe có ngủ gật, mất tập trung hay không, và hỗ trợ
thông báo khi cần thiết.
Tương lai sẽ phát triển các loại thẻ thông minh có tích hợp sẵn đặc trưng của



người dùng trên đó, khi bất cứ người dùng khác dùng để truy cập hay xử lý tại các
hệ thống sẽ được yêu cầu kiểm tra các đặc trưng khuôn mặt so với thẻ để biết nay
có phải là chủ thẻ hay không.

• Hãng máy chụp hình Canon đã ứng dụng bài toán xác định khuôn mặt người vào
máy chụp hình thế hệ mới để cho kết quả hình ảnh đẹp hơn, nhất là khuôn mặt
người.
Các phương pháp chính để xác định mặt người
Dựa vào tính chất của các phương pháp xác định mặt người trên ảnh, các phương
pháp này được chia thành bốn loại chính, tương ứng với bốn hướng tiếp cận khác nhau.
Ngoài ra cũng có rất nhiều nghiên cứu mà phương pháp xác định mặt người không chỉ
dựa vào một hướng mà có liên quan đến nhiều hướng.


Hướng tiếp cận dựa trên tri thức: Dựa vào các thuật toán, mã hóa các đặc trưng
và quan hệ giữa các đặc trưng của khuôn mặt thành các luật. Đây là hướng tiếp
cận theo kiểu top-down.



Hướng tiếp cận dựa trên đặc trưng không thay đổi: Xây dựng các thuật toán để
tìm các đặc trưng của khuôn mặt mà các đặc trưng này không thay đổi khi tư thế
khuôn mặt hay vị trí đặt camera thay đổi.



Hướng tiếp cận dựa trên so sánh khớp mẫu: Dùng các mẫu chuẩn của khuôn mặt
(các mẫu này đã được chọn và lưu trữ) để mô tả các khuôn mặt hay các đặc trưng
của khuôn mặt (các mẫu này được chọn tách biệt theo tiêu chuẩn đã được các tác
giả đề ra để so sánh). Phương pháp này có thể dùng để xác định vị trí hay dò tìm
khuôn mặt trên ảnh.




Hướng tiếp cận dựa trên diện mạo: Trái ngược với hướng tiếp cận dựa trên khuôn
mẫu, các mô hình (hay các mẫu) sẽ được học từ một tập ảnh huấn luyện mà thể
hiện tính chất tiêu biểu của sự xuất hiện của mặt người trong ảnh. Sau đó hệ


B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 10

thống (mô hình) sẽ xác định mặt người. Phương pháp này còn được biết đến với
tên gọi tiếp cận theo các phương pháp học máy.

5. Xác định phạm vi báo cáo
Trong đề tài này, tác giả tập trung vào việc xác định khuôn mặt trong ảnh, video
hoặc webcam. Từ đấy lưu khuôn mặt tìm được vào CSDL để phục vụ cho các mục đích
khác ( chẳng hạn như nhận dạng mặt người hoặc ghép khuôn mặt vào bức ảnh khác … ).



B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 11

Chương 2. Cơ sở lý thuyết
1. Tổng quan về Adaboost
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 [17] 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.
Thuật toán học máy Adaboost được phát triển thuật toán boosting, do đó tác giả sẽ
trình bầy một chút về thuật toán boosting trước khi trình bầy về adaboost.
1.1.

Tiếp cận Bootsting


Về lịch sử, boosting bắt nguồn từ câu hỏi nổi tiếng được đưa ra bời Kearns vào
năm 1989 : “Liệu có thể tạo ra một strong classifier từ một tập các bộ phân loại yếu?”.
Năm 1990, Robert Schapire đưa ra thuật toán boosting đầu tiên, tiếp đến năm 1993 thì nó
được Drucker, Schapire và Simard kiểm nghiệm trong trong các chương trình nhận dạng
( OCR application ). Freund đã tiếp tục các nghiên cứu của Schaprire, và đến năm 1995
thì ông cùng với Schapire phát triển boosting thành adaboost.
Như vậy, nguyên lý cơ bản của boosting là sự kết hợp các weak classifiers thành một
strong classifier. Trong đó, weak classifier là các bộ phân loại đơn giản chỉ cần có độ
chính xác trên 50%. Bằng cách này, chúng ta nói bộ phân loại đã được “boost”.
Để hiểu cách hoạt động của thuật toán boosting, ta xét một bài toán phân loại 2 lớp
(mẫu cần nhận dạng chỉ thuộc một trong hai lớp) với D là tập huấn luyện gồm có n mẫu.
Trước tiên, chúng ta sẽ chọn ngẫu nhiên ra n1 mẫu từ tập D (n1đó, chúng ta sẽ xây dựng weak classifier đầu tiên C1 từ tập D1. Tiếp theo, chúng ta xây
dựng tập D2 để huấn luyện bộ phân loại C2. D2 sẽ được xây dựng sao cho một nửa số
mẫu của nó được phân loại đúng bởi C1 và nửa còn lại bị phân loại sai bởi C1. Bằng cách
này, D2 chứa đựng những thông tin bổ sung cho C1. Bây giờ chúng ta sẽ xây huấn luyện
C2 từ D2.
Tiếp theo, chúng ta sẽ xây dựng tập D3 từ những mẫu không được phân loại tốt bởi sự
kết hợp giữa C1 và C2: những mẫu còn lại trong D mà C1 và C2 cho kết quả khác nhau.
Như vậy, D3 sẽ gồm những mẫu mà C1 và C2 hoạt động không hiệu quả. Sau cùng,
chúng ta sẽ huấn luyện bộ phân loại C3 từ D3.
Bây giờ chúng ta đã có một strong classifier: sự kết hợp C1, C2 và C3. Khi tiến hành
nhận dạng một mẫu X, kết quả sẽ được quyết định bởi sự thỏa thuận của 3 bộ C1, C2 và
C3: Nếu cả C1 và C2 đều phân X vào cùng một lớp thì lớp này chính là kết quả phân loại


B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 12

của X; ngược lại, nếu C1 và C2 phân X vào 2 lớp khác nhau, C3 sẽ quyết định X thuộc về

lớp nào

Hình 1: Boosting
1.2.

Adaboost

Như đã biết, AdaBoost ( Adaptive Boost ) là một bộ phân loại mạnh phi tuyến
phức dựa trên hướng tiếp cận boosting được Freund và Schapire đưa ra vào năm 1995.
Adaboost hoạt động trên nguyên tắc kết hợp tuyến tính các weak classifier dựa trên các
đặc trưng Haar- Line để hình thành một strong classifier.
Để có thể kết hợp các bộ phân loại yếu, adaboost sử dụng một trọng số (weight) để
đánh dấu các mẫu khó nhận dạng. Trong quá trình huấn luyện, cứ mỗi weak classifier
được xây dựng, thuật toán sẽ tiến hành cập nhật lại trọng số để chuẩn bị cho việc xây
dựng weak classifier tiếp theo: tăng trọng số của các mẫu bị nhận dạng sai và giảm trọng
số của các mẫu được nhận dạng đúng bởi weak classifier vừa xây dựng. Bằng cách này,
các weak classifier sau có thể tập trung vào các mẫu mà các weak classifier trước đó chưa
thực hiện tốt. Sau cùng các weak classifier sẽ được kết hợp tùy theo mức độ ‘tốt’ của
chúng để tạo nên một strong classifier.
Các weak classifiers hk(x) là các bộ phân loại yếu, được biểu diễn như sau:
Trong đó:
X : mẫu hay cửa sổ con cần xét ( X = (x1,x2,…,xn) là vector đặc trưng của mẫu)


B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 13

Ok: ngưỡng (O = teta)
fk: giá trị của đặc trưng Haar-like
pk: hệ số quyết định chiều của bất phương trình
Công thức trên có thể diễn giải như sau: Nếu giá trị đặc trưng của mẫu cho bởi hàm

đánh giá của bộ phân loại vượt qua một ngưỡng cho trước thì mẫu đấy là khuôn mặt ( gọi
là object : đối tượng cần nhận dạng ), ngược lại thì mẫu là background ( không phải là
đối tượng ).
Thuật toán AdaBoost:


B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 14

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
factor)
4. Strong classifier được xây dựng :

Sơ đồ khối:

về đoạn [0,1] (normalization


B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 15

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ư

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ạih

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

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

Sai

Xác định ngưỡng

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

weak
classifi
Chọn weak classifier có giá trịLưu
lỗi bé
nhất

Đúng

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 h t 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):

Ta thấy tất cả các bộ phân loại h t đề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.


B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 16

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à h t phân loại sai, giảm trọng số các mẫu mà h t 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à h t+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
(thư viện OpenCV của Intel), 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.
1.3.

Cascade of Classifiers

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 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ý.
Thuật toán Cascade training:


B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 17
1.

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

N

N-1

hitrate = hN
h
1-f


h
1-f

1-f

h

1-f

Input pattern classified as a non-object
Hình 2: cascade of classifiers

falsealarms = fN


B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 18

Hình 2 minh họa sự huấn luyện của một cascade gồm N stages. Ở mỗi stage, weak
classifier tương ứng sẽ được huấn luyện sao cho độ chính xác của nó là h và false alarm
bằng f.
1.4.

Cascade of boosting Classifiers

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 14: 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 24x24 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


B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 19

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à
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 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.
1.5.

Đặc trưng Haar-Like

Viola và Jones dùng 4 đặc trưng cơ bản [20] để xác định khuôn mặt người. Mỗi đặc
trưng Haar–like là sự kết hợp của hai hay ba hình chữ nhật "trắng" hay "đen" như trong
hình sau:

Hình 3: 4 đặt trưng Haar-like cơ bản
Để áp dụng các đặt trưng này vào việc bài toán xác định mặt người, 4 đặt trưng
Haar-like cơ bản được mở rộng ra, và được chia làm 3 tập đặc trưng như sau:
1. Đặc trưng cạnh (edge features):

2. Đặc trưng đường (line features):



B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 20

Đặc trưng xung quanh tâm (center-surround features):

Hình 4: Các đặc trưng mở rộng của các đặc trưng Haar-like cơ sở

Lợi ích của các đặc trưng Haar-like là nó diễn đạt được tri thức về các đối tượng
trong ảnh (bởi vì nó biểu diễn mối liên hệ giữa các bộ phận của đối tượng), điều mà bản
thân từng điểm ảnh không diễn đạt được. Để 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)
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 Haarlike 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. Do đó 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.

P(x,y)

Hình 5: Cách tính Integral Image của ảnh



B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 21

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 11):
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
P3

P4

Hình 6: 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)

A
D

1

C
3

4

(b)

Hình 7: 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
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


B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 22

2. Sơ lược về OpenCV
2.1. Tổng quan OpenCV

Open VC là thư viện mã nguồn mở của intel về thị giác máy tính. Nó cung cấp
một bộ mã nguồn bao gồm hàng trăm hàm, lớp dựa trên các thuật toán về xử lý ảnh cũng
như Computer vision dùng ngôn ngữ C/C++. Open CV thể hiện sự đa dạng của trí tuệ
nhân tạo. Được ứng dụng nhiều trong các bài toán nhận dạng mặt, dò tìm mặt, phát hiện
mặt, lọc Kalman, …
Cấu trúc tổng quan của OpenCV bao gồm 5 phần chính. 4 trong 5 phần đó được
chỉ ra trong hình vẽ dưới.

CV
MLL
HighGUI
Các hàm về xử lý ảnh
Cácvà
thuật
giải toán
thuậthọc
về thị
máy,
giác
bao
máy
gồm
tính
các
Các
bộhàm
phân
vàcụm,
thủ tục
phân

làmloại
việc
thống
với file
kê ảnh và file vid

CXCORE
Các cấu trúc dữ liệu cơ bản, cấu trúc XML, các hàm về đồ họa …

Hình 15 : Cấu trúc cơ bản của OpenCV
Phần CV bao gồm các thư viện cơ bản về xử lý ảnh và các giải thuật về thị giác máy
tính. ML là bộ thư viện về các thuật toán học máy, bao gồm rất nhiều bộ phân cụm và
phân loại thống kê. HighGUI chứa đựng những thủ tục vào ra, các chức năng về lưu trữ
cũng như đọc các file ảnh và video. Phần thứ 4, Cxcore chứa đựng các cấu trúc dữ liệu cơ
bản ( ví dụ như cấu trúc XML, các cây dữ liệu …). Phần cuối cùng là CvAux, phần này
bao gồm các thư viện cho việc phát hiện, theo dõi và nhận dạng đối tượng (khuôn mặt,
mắt …).
Một vài cấu trúc kiểu dữ liệu cơ bản OpenCV
OpenCV có vài data type cơ sở. Đơn giản nhất của những types này là CvPoint.
CvPoint là structure đơn giản với hai integer members, x và y. CvPoint có hai anh em:
CvPoint2D32f và CvPoint3D32f.
2.2.

CvSize giống anh họ của CvPoint. Các phần tử của nó là width và height, mà cả
hai là integer. Nếu muốn các số floating-point, dùng CvSize2D32f cousin của CvSize.
CvRect một con khác của CvPoint và CvSize; nó chứa bốn member: x, y, width, và
height. Cuối cùng nhưng không kém là CvScalar, mà là một tập bốn số double-precision.


B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 23


Khi memory không là vấn đề, CvScalar thường được dùng để biểu diễn một, hai, hay ba
số thực (trong những trường hợp này, các thành phần không cần đơn giản được bỏ qua).
CvScalar có một member val, mà là một pointer đến một array chứa bốn số doubleprecision floating-point.
cvRectangle(
myImg,
cvPoint(5,10),
cvPoint(20,30),
cvScalar(255,255,255)
);
Structure

chứa

Represents

CvPoint

int x, y

Point in image

CvPoint2D32f

float x, y

Points in ℜ2

CvPoint3D32f


float x, y, z

Points in ℜ3

CvSize

int
height

CvRect

int x, y, width, Portion of image
height

CvScalar

double val[4]

width, Size of image

RGBA value

cvScalar() là trường hợp đặc biệt: nó có ba constructor. Đầu tiên, gọi là cvScalar(), lấy
một, hai, ba, hay bốn argument và gán những argument này cho các phần tử tương ứng
của val[]. Constructor thứ hai là cvRealScalar(); nó lấy một argument, mà nó gán vào
val[0] trong khi setting các entry khác thành 0. Variant cuối cùng là cvScalarAll(), mà lấy
một argument đơn nhưng đặt tất cả bốn phần tử của val[] thành cùng argument đó.
Matrix và Image Types
IplImage là structure cơ sở được dùng để encode cái ta nhìn chung gọi là “các
image”. Những image này có thể là grayscale, color, four-channel (RGB+alpha), và mỗi

channel có thể chứa bất kỳ trong vài type của các số integer hay floatingpoint. Do đó,
kiểu này là chung hơn image three-channel 8-bit RGB .
OpenCV cung cấp lượng lớn các operator hữu ích mà hoạt động trên những
images này, gồm các tool để resize images, trích các channel riêng, tìm thấy các value lớn
nhất hay nhỏ nhất của một channel cụ thể, cộng hai images, threshold một image, và hơn
nữa. In chương này ta sẽ xem xét những kiểu này của các operator cẩn thận.


B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 24

Hình 8: Thứ bậc Matrix trong OpenCV
CvMat Matrix Structure
Trong OpenCV không có kiểu ‘vector” nên khi ta muốn một vector, ta chỉ dùng
một matrix với một cột (hay một hàng, nếu ta muốn một hoán vị hay kết hợp vector).
cvMat* cvCreateMat ( int rows, int cols, int type );
Ở đây type có thể là bất kỳ của một list dài các predefined type theo dạng:
CV_<bit_depth>(S|U|F) C<number_of_channels>. Do đó, matrix có thể gồm các 32-bit
floats (CV_32FC1), của các unsigned integer 8-bit triplets (CV_8UC3), hay vô số các
element khác. Một element của CvMat không cần thiết là một số đơn. Có thể biểu diễn
nhiều giá trị cho một entry đơn trong matrix cho phép ta làm nhiều thứ như biểu diễn
nhiều channel màu trong một RGB image. Cho một image đơn giản chứa các kênh red,
green và blue, hầu hết các image operator sẽ được áp dụng cho mỗi channel riêng (trừ phi
ngược lại được lưu ý). Về bên trong, structure của CvMat tương đối đơn giản. Ví dụ, để
lấy size của một matrix, bạn có thể lấy thông tin bạn muốn một trong bởi gọi
cvGetSize(CvMat*), mà trả về một CvSize structure, hay bởi truy cập height và width
độc lập với các constructs như matrix->height và matrix->width.
CvMat structure: the matrix “header”
typedef struct CvMat {
int type;
int step;

int* refcount; // cho dùng chỉ bên trong
union {
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data;
union {
int rows;
int height;
};
union {


B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 25

int cols;
int width;
};
} CvMat;
Các matrix có thể được tạo theo một trong vài cách. Các hầu hết phổ biến là dùng
cvCreateMat(), mà is thực sự thuận tiện để sự kết hợp của nhiều atomic function
cvCreateMatHeader() và cvCreateData(). cvCreateMatHeader() tạo CvMat structure
không cấp memory cho data, trong khi cvCreateData() handles cấp phát data. Đôi khi chỉ
cvCreateMatHeader() được đòi hỏi, một trong vì bạn đã cấp data cho vài nguyên nhân
khác hay vì bạn chưa thực sự cần cấp nó. Method thứ ba để dùng cvCloneMat(CvMat*),
mà tạo matrix mới từ một cái hiện có. Khi matrix không còn cần nữa, nó có thể được giải
phóng bởi gọi cvReleaseMat(CvMat**).
IplImage Data Structure

Trong object thực chất này là một CvMat nhưng với vài goodies thêm được đặt
trong nó để làm matrix thích hợp cho một image. Structure này ban đầu được định nghĩa
như một phần của Image Processing Library (IPL) của Intel.* Định nghĩa chính xác của
IplImage structure được thấy như sau:
IplImage header structure
typedef struct _IplImage {
int nSize;
int ID;
int nChannels;
int alphaChannel;
int depth;
char colorModel[4];
char channelSeq[4];
int dataOrder;
int origin;
int align;
int width;
int height;
struct _IplROI* roi;
struct _IplImage* maskROI;
void* imageId;
struct _IplTileInfo* tileInfo;
int imageSize;
char* imageData;
int widthStep;
int BorderMode[4];
int BorderConst[4];
char* imageDataOrigin;
} IplImage;
Các tham số để OpenCV thông dịch và làm việc với các image.



×