Upload
thoi-ke-no-di
View
602
Download
4
Embed Size (px)
DESCRIPTION
Bao cao thuc tap tot nghiep ve opencv
Citation preview
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 t h ự c t ậ p t ố t n g h i ệ p T r a n g | 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 t h ự c t ậ p t ố t n g h i ệ p T r a n g | 3
ContentsLời cảm ơn..................................................................................................................................................2
Mở đầu........................................................................................................................................................4
A. Giới thiệu đơn vị thực tập....................................................................................................................5
1. Địa chỉ cơ quan thực tập..................................................................................................................5
2. Giới thiệu về cơ quan thực tập.........................................................................................................5
B. Nội dung..............................................................................................................................................7
Chương 1. Tổng quan về phương pháp xác định mặt người........................................................................7
1. Giới thiệu bài toán xác định mặt người trong ảnh............................................................................7
2. Định nghĩa bài toán xác định mặt người..........................................................................................7
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...............................................7
4. Các ứng dụng của xác định mặt người.............................................................................................8
Xác minh tội phạm..............................................................................................................................8
Camera chống trộm.............................................................................................................................8
Bảo mật...............................................................................................................................................8
Lưu trữ khuôn mặt...............................................................................................................................8
Các ứng dụng khác..............................................................................................................................8
Các phương pháp chính để xác định mặt người...................................................................................9
5. Xác định phạm vi báo cáo..............................................................................................................10
Chương 2. Cơ sở lý thuyết.........................................................................................................................11
1. Tổng quan về Adaboost.................................................................................................................11
1.1. Tiếp cận Bootsting.................................................................................................................11
1.2. Adaboost................................................................................................................................12
1.3. Cascade of Classifiers............................................................................................................16
1.4. Cascade of boosting Classifiers.............................................................................................17
1.5. Đặc trưng Haar-Like..............................................................................................................18
2. Sơ lược về OpenCV.......................................................................................................................21
2.1. Tổng quan OpenCV...............................................................................................................21
2.2. Một vài cấu trúc kiểu dữ liệu cơ bản OpenCV.......................................................................22
Chương 3. Xây dựng ứng dụng.................................................................................................................33
1. Tổng quan về hệ thống phát hiện mặt người trong ảnh..................................................................33
2. Phân tích........................................................................................................................................33
2.1. Thiết kế hệ thống...................................................................................................................34
2.2. Xử lý đầu vào:.......................................................................................................................34
2.3. Phát hiện khuôn mặt..............................................................................................................35
2.4. Xử lý đầu ra...........................................................................................................................35
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 4
2.5. Thiết kế cơ sở dữ liệu............................................................................................................36
2.6. Thiết kế chương trình.............................................................................................................37
Kết luận và hướng phát triển.....................................................................................................................39
1. Kết luận.........................................................................................................................................39
2. Hướng phát triển............................................................................................................................39
Tài liệu tham khảo...........................................................................................................................40
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 5
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 t h ự c t ậ p t ố t n g h i ệ p T r a n g | 7
A. Giới thiệu đơn vị thực tập1. Đị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
o Khu công nghệ cao Hòa Lạc, Hà Nội, Việt Nam
Điện thoại: 04 3791 8026
Email: [email protected]
Website: http://isolar.vn
2. Giới thiệu về cơ quan thực tậpCô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.
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 8
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 t h ự c t ậ p t ố t n g h i ệ p T r a n g | 9
B. Nội dung
Chương 1. Tổng quan về phương pháp xác định mặt người1. 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 t h ự c t ậ p t ố t n g h i ệ p T r a n g | 10
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 t h ự c t ậ p t ố t n g h i ệ p T r a n g | 11
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ườiDự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 | 12
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 | 13
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<n) để tạo tập D1. Sau
đó, 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 | 14
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:
hk (x)={1n ế u pk f k ( x )< pk θk
0 n ế ung ư ợ c l ạ i
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 | 15
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 | 16
1. Cho một tập gồm n mẫu có đánh dấu (x1,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 classifiersLặ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 :
Sơ đồ khối:
Bắt đầu huấn luyện
Khởi tạo tập đặc trưng ban đầu
Xác định các đặc trưng trong từng
mẫu, xây dựng các bộ phân loại yếu
tương ứng
Đặc trưng haar-like
Tính toán giá trị lỗi cho mỗi đặc trưng
(false alarm)
Xác định ngưỡng
Chọn weak classifier có giá trị lỗi bé nhất
Lưu weak classifier
được chọn
False alarm ≤ max false alarm
Tập các mẫu và trọng số
Tập các mẫu
Mẫu sai
Mẫu đúng
Cập nhật lại trọng số
Sai
Kết thúc, strong
classifier đuợc xây
dựngĐúng
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 17
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):
H ( x )=d ấ u (∑t=1
T
∝t ht (x))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:
∝t=12
ln (1−ε j
ε j
)
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 | 18
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à 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à 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
(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:
h h h
1-f 1-f 1-f 1-f
stage 1 2 N-1 N……
hitrate = hN
falsealarms = fN
Input pattern classified as a non-object
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 19
1.
Minh họa thuật toán Cascade training:
Hình 2: cascade of classifiers
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.
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.03. 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 }
I Y Y Y
N N N N
CLASS
NON-CLASS
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 20
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
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:
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 21
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):
Đặ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 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. 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 45o.
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
P(x,y)
A
C
B
D
P1 P2
P3 P4
RSAT(x,y)
B AC
2
4
1
3D
(a) (b)
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 22
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 )= ∑x '≤ x , y ' ≤ y
i(x ' , y ' )
Hình 5: 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 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:
D=( x4 , y 4 )−( x2 , y2 )−( x3 , y3 )+ ( x1 , y1 )
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
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:
P ( x , y )= ∑x ≤x , x ≤ x−¿ y− y∨¿ I(x ' , y ')¿
¿
CVCác hàm về xử lý
ảnh và giải thuật về thị giác máy tính
CXCORECác cấu trúc dữ liệu cơ bản, cấu trúc XML, các hàm về đồ
họa …
MLLCác thuật toán học
máy, bao gồm các bộ phân cụm, phân loại
thống kê
HighGUICác hàm và thủ tục
làm việc với file ảnh và file video
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 23
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
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.
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 …).
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 24
2.2. Một vài cấu trúc kiểu dữ liệu cơ bản OpenCVOpenCV 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.
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. 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ố double-precision 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 width, height
Size of image
CvRect int x, y, width, height
Portion of image
CvScalar double val[4] 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 đó.
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 25
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.
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;
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 26
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 {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 structuretypedef struct _IplImage {
int nSize;int ID;int nChannels;int alphaChannel;int depth;char colorModel[4];char channelSeq[4];
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 27
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.
Macro Image pixel type
IPL_DEPTH_8U Unsigned 8-bit integer (8u)
IPL_DEPTH_8S Signed 8-bit integer (8s)
IPL_DEPTH_16S Signed 16-bit integer (16s)
IPL_DEPTH_32S Signed 32-bit integer (32s)
IPL_DEPTH_32F 32-bit fl oating-point single-precision (32f)
IPL_DEPTH_64F 64-bit fl oating-point double-precision (64f)
Matrix và Image Operators
Bảng bên dưới thống kê một lượng các routine để thao tác matrix, hầu hết mà làm việc tốt cho images. Chúng làm tất cả những việc “bình thường”, chẳng hạn diagonalizing hay transposing một matrix, cũng như vài tác vụ phức tạp hơn, chẳng hạn tính thống kê image.
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 28
1.
Function Mô tả
cvAbs Trị tuyệt đối tất cả elements trong array
cvAbsDiff Trị tuyệt đối các khác biệt giữa hai arrays
cvAbsDiffS Trị tuyệt đối các khác biệt giữa array và scalar
cvAdd Cộng elementwise của hai array
cvAddS Elementwise addition of an array và a scalar
cvAddWeighted Elementwise weighted addition of hai arrays (alpha blending)
cvAvg Average value of tất cả elements in an array
cvAvgSdv Absolute value và standard deviation of tất cả elements in an array
cvCalcCovarMatrix Compute covariance of a set of n-dimensional vectors
cvCmp Apply selected comparison operator to tất cả elements in hai arrays
cvCmpS Apply selected comparison operator to an array relative to a scalar
cvConvertScale Convert array type with optional rescaling of the value
cvConvertScaleAbs Convert array type sau khi absolute value with optional rescaling
cvCopy Copy elements of one array to another
cvCountNonZero Count nonzero elements in an array
cvCrossProduct Compute cross product of hai three-dimensional vectors
cvCvtColor Convert channels of an array from one color space to another
cvDet Compute determinant of a square matrix
cvDiv Elementwise division of one array by another
cvDotProduct Compute dot product of hai vectors
cvEigenVV Compute eigenvalues và eigenvectors of a square matrix
cvFlip Flip an array about a selected axis
cvGEMM Generalized matrix multiplication
cvGetCol Copy elements from column slice of an array
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 29
cvCvtColor
void cvCvtColor(const CvArr* src,CvArr* dst,int code);
cvCvtColor() chuyển từ một color space (number of channels) thành một cái khác. Tác vụ chuyển đổi chính xác được làm được chỉ định bởi argument code, mà các giá trị có thể được kê trong bảng sau:
Các biến tham số và ý nghĩa của nó
Conversion code Meaning
CV_BGR2RGB
CV_RGB2BGR
CV_RGBA2BGRA
CV_BGRA2RGBA
Chuyển giữa RGB và BGR color spaces (có hay không có alpha channel)
CV_RGB2RGBA
CV_BGR2BGRA
Thêm alpha channel vào RGB hay BGR image
CV_RGBA2RGB
CV_BGRA2BGR
Xóa alpha channel khỏi RGB hay BGR image
CV_RGB2BGRA
CV_RGBA2BGR
CV_BGRA2RGB
CV_BGR2RGBA
Chuyển RGB thành BGR color spaces trong khi thêm hay xóa alpha channel
CV_RGB2GRAY
CV_BGR2GRAY
Chuyển RGB hay BGR color spaces thành grayscale
CV_GRAY2RGB
CV_GRAY2BGR
Chuyển grayscale thành RGB hay BGR color spaces (tùy chọn xóa alpha channel trong xử lý)
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 30
CV_RGBA2GRAY
CV_BGRA2GRAY
CV_GRAY2RGBA
CV_GRAY2BGRA
Convert grayscale to RGB hay BGR color spaces và add alpha channel
CV_RGB2BGR565
CV_BGR2BGR565
CV_BGR5652RGB
CV_BGR5652BGR
CV_RGBA2BGR565
CV_BGRA2BGR565
CV_BGR5652RGBA
CV_BGR5652BGRA
Convert from RGB hay BGR color space to BGR565 color representation with optional addition hay removal of alpha channel (16-bit images)
CV_GRAY2BGR565
CV_BGR5652GRAY
Convert grayscale to BGR565 color representation hay vice versa (16-bit images)
CV_RGB2BGR555
CV_BGR2BGR555
CV_BGR5552RGB
CV_BGR5552BGR
CV_RGBA2BGR555
CV_BGRA2BGR555
CV_BGR5552RGBA
CV_BGR5552BGRA
Convert from RGB hay BGR color space to BGR555 color representation with optional addition hay removal of alpha channel (16-bit images)
CV_GRAY2BGR555
CV_BGR5552GRAY
Convert grayscale to BGR555 color representation hay vice versa (16-bit images)
CV_RGB2XYZ Convert RGB hay BGR image to CIE XYZ representation hay vice versa (Rec 709 with D65 white point)
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 31
CV_BGR2XYZ
CV_XYZ2RGB
CV_XYZ2BGR
CV_RGB2YCrCb
CV_BGR2YCrCb
CV_YCrCb2RGB
CV_YCrCb2BGR
Convert RGB hay BGR image to luma-chroma (aka YCC) color representation
CV_RGB2HSV
CV_BGR2HSV
CV_HSV2RGB
CV_HSV2BGR
Convert RGB hay BGR image to HSV (hue saturation value) color representation or vice versa
CV_RGB2HLS
CV_BGR2HLS
CV_HLS2RGB
CV_HLS2BGR
Convert RGB hay BGR image to HLS (hue lightness saturation) color representation or vice versa
CV_RGB2Lab
CV_BGR2Lab
CV_Lab2RGB
CV_Lab2BGR
Convert RGB hay BGR image to CIE Lab color representation hay vice versa
CV_RGB2Luv
CV_BGR2Luv
CV_Luv2RGB
CV_Luv2BGR
Convert RGB hay BGR image to CIE Luv color representation
CV_BayerBG2RGB
CV_BayerGB2RGB
CV_BayerRG2RGB
Convert from Bayer pattern (single-channel) to RGB hay BGR image
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 32
CV_BayerGR2RGB
CV_BayerBG2BGR
CV_BayerGB2BGR
CV_BayerRG2BGR
CV_BayerGR2BGR
Ảnh gốc
Tính các đặc trưng nhanh từ nhiều tỉ lệ
Integral ImageCác hàm Haar cơ bản
Ước lượng các đặc trưng
Điều chỉnh thông số Adaboost
Chọn đặc trưngSố lượng lớn các đặc trưng
Cấu trúc phân tầng (Cascade of classifier)
Một tập nhỏ các đặc trưng
Quyết định kết quả
C1 C2 CnI Y Y
N N N
CLASS
NON-CLASS
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 33
Chương 3. Xây dựng ứng dụng
Phát hiện mặt người trong ảnh có nhiều ứng dụng trong cuộc sống, tuy nhiên, trong
khóa luận này, tác giả chỉ xây dựng một chương trình nhỏ để minh họa cho các lý thuyết
ở trên. Cụ thể đấy là một chương trình phát hiện mặt người trong ảnh được viết trên nền
visual c ++ của Microsoft, sử dụng thư viện mã nguồn mở OpenCV của Intel.
1. Tổng quan về hệ thống phát hiện mặt người trong ảnh
Hình 9: Tổng quan về hệ thống phát hiện mặt người trong ảnh
Về cơ bản, từ ảnh gốc ban đầu, hệ thống sẽ chia ảnh thành vô số vùng nhỏ để tính
các đặc trưng, sau đấy đưa các đặc trưng. Tiếp theo, chương trình sẽ xác định các vùng
khả quan (các ứng viên) có thể là khuôn mặt, cuối cùng các ứng viên này sẽ được đưa
vào một bộ phân loại để tiến hành xác định ứng viên nào là mặt người.
2. Phân tích
Nhiệm vụ chính của chương trình là dò tìm khuôn mặt từ một bức ảnh, một file
video hoặc từ webcam, sau đấy lưu khuôn mặt vào csdl để phục vụ cho các mục đích
khác (sẽ được phát triển sau).
0HỆ THỐNG PHÁT HIỆN MẶT NGƯỜI TRONG ẢNH
NGƯỜI DÙNG
Capture ảnh
Đầu vào (ảnh, video hoặc webcam)
Phát hiện nhanh khuôn mặt bằng Adaboost
Lưu khuôn mặt vào CSDL
Có khuôn mặt
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 34
Hình 10: Biểu đồ ngữ cảnh của hệ thống
Như vậy các chức năng chương trình bao gồm:
Kết nối đến webcam, đọc các file ảnh và video.
Phát hiện các nhiều khuôn mặt có trong bức ảnh, video, webcam ...
Lưu ảnh khuôn mặt được phát hiện vào csdl.
2.1. Thiết kế hệ thống
Với các chức năng ở trên, chương trình được chia thành thành 3 phần chính: Phần
xử lý đầu vào, phần phát hiện khuôn mặt và phần xử lý đầu ra.
2.2. Xử lý đầu vào:
Chương trình nhận đầu vào là file ảnh, video hoặc webcam, tuy nhiên, việc phát
hiện khuôn mặt được thực hiện trên các bức ảnh, do đó, với đầu vào là webcam hay file
video, ta phải chuyển thành các ảnh tĩnh và xử lý trên từng ảnh tĩnh. Sau khi đã có ảnh
Khuôn mặt đã được phát hiện
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 35
đầu vào rồi thì sẽ chuyển ảnh cho giai đoạn xử lý tiếp theo, đó là phát hiện các khuôn mặt
có trong ảnh.
2.3. Phát hiện khuôn mặt
Phần này xử lý chính nghiệp vụ của hệ thống. Sau khi có ảnh truyền vào, hệ thống
sẽ thực hiện chức năng phát hiện khuôn mặt có trong ảnh.
Việc phát hiện khuôn mặt được thực hiện nhanh bằng thuật toán adaboost thông qua
hàm cvHaarDetectObjects() của OpenCV. Hàm này thực hiện việc phát hiện đối tượng
dựa trên các đặc trưng haar-like, cụ thể là nhờ vào một bộ Cascade được truyền vào cho
hàm. Bộ Cascade được xây dựng theo dạng cây (tree-node) và đã được huấn luyện từ
trước.
Việc huấn luyện bộ Cascade có thể thực hiện từ những dữ liệu thu thập được để
phục vụ cho quá trình nhận dạng. Ví dụ, muốn nhận dạng một người A, ta thu thập các
ảnh khuôn mặt của người A với nhiều tư thế, góc chụp và điều kiện chụp khác nhau, sau
đấy cho bộ nhận dạng học theo thuật toán Cascade training. Tuy nhiên việc nhận dạng
khuôn mặt là một công việc khó và tốn nhiều thời gian, do đó, tác giả không thực hiện nó
trong khóa luận của mình.
2.4. Xử lý đầu ra.
Khuôn mặt sau khi được phát hiện sẽ được tách ra khỏi bức ảnh và lưu dưới dạng
ảnh bitmap với phần mở rộng là *.jpg.
Đối với đầu vào là các file ảnh, dữ liệu đầu ra cũng là file ảnh đấy nhưng có lưu vị
trí khuôn mặt đã được phát hiện trên bức ảnh, đồng thời tách các riêng khuôn mặt và lưu
vào cơ sở dữ liệu.
Đối với đầu vào là các file video hoặc webcam. Các khuôn mặt sẽ được tách ra và
lưu lại thành các file ảnh riêng rẽ, và được đánh số thứ tự theo tên file video. Ví dụ như
file video test.avi thì ảnh các khuôn mặt phát hiện được sẽ được đánh số theo thứ tự như
sau: test.avi_1.jpg, test.avi_2.jpg …
3.2.Lưu ảnh vào CSDL
2.Phát hiện nhanh khuôn mặt bằng
Adaboost
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 36
Hình 11: Biểu đồ phân rã chức năng.
2.5. Thiết kế cơ sở dữ liệu
Lưu trữ cơ sở dữ liệu là một phần quan trọng của ứng dụng. Việc xây dựng, tổ chức
cơ sở dữ liệu ảnh hướng lớn đến tốc độ của chương trình. Tuy hiện tại, chương trình chỉ
dừng lại ở mức phát hiện khuôn mặt trong ảnh, nhưng việc xây dựng một cơ sở dữ liệu
tốt sẽ là tiền đề để có thể phát triển chương trình thành các ứng dụng lớn hơn sau này.
Hệ thống cần lưu trữ các dữ liệu: Ảnh khuôn mặt sau khi đã được phát hiện.
Đối với đầu vào là file ảnh:
Lưu ảnh đầu vào cùng vị trí khuôn mặt đã được phát hiện trên bức ảnh
Lưu từng khuôn mặt được phát hiện.
Đối với đầu vào là file video, hoặc webcam:
Lưu các khuôn mặt được phát hiện
Như vậy các thông tin trong cơ sở dữ liệu bao gồm 2 thực thể sau:
ẢNH GỐC ( IMAGES ): Ảnh đầu vào.
Các thuộc tính bao gồm:
- ID: Mã ảnh, kiểu Integer, là khóa chính và có ràng buộc là tự tăng.
- Name: Tên của bức ảnh, kiểu dữ liệu varchar2(200). Trong trường hợp
đầu vào là video thì tên sẽ được lấy theo tên của file video, còn nếu đầu
vào là webcam thì sẽ đặt là webcam_ID (thêm ID ở trên vào tên).
- Image: Lưu mã nhị phân của bức ảnh.
- URL: lưu đường dẫn đến bức ảnh, kiểu giữ liệu varchar2(1000)
Lưu ý: Trong trường hợp file đầu vào là video hoặc webcam thì các trường
Image, và URL sẽ nhận giá trị null.
1.Xử lý đầu vào
1.1. Capture ảnh
3. Xử lý đầu ra
HỆ THỐNG PHÁT HIỆN MẶT NGƯỜI TRONG ẢNH
3.1. Lưu ảnh vào thư mục thích hợp trên máy
IMAGESID
Name Image
URL
FACESID
Name Image
URL
Image_ID
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 37
KHUÔN MẶT ( FACES ): Các khuôn mặt phát hiện được.
Các thuộc tính bao gồm:
- ID: Mã ảnh, kiểu Integer, là khóa chính và có ràng buộc là tự tăng.
- IMAGE_ID: ID của ảnh gốc, kiểu dữ liệu Interger, là khóa ngoại tham
chiếu đến bảng ẢNH GỐC.
- Name: Tên của khuôn mặt, được đặt theo tên ảnh gốc, đồng thời thêm
số thứ tự để nhận biết các khuôn mặt của cùng ảnh gốc.
- Image: Lưu mã nhị phân của ảnh khuôn mặt.
- URL: lưu đường dẫn đến ảnh khuôn mặt, kiểu giữ liệu varchar2(1000).
Hình 19: Sơ đồ thực thể quan hệ ( ERM ).
2.6. Thiết kế chương trình
Giao diện của chương trình được thiết kế thân thiện và đơn giản. Tập trung vào
chức năng chính phát hiện khuôn mặt trong ảnh. Bố cục trên giao diện được thực hiện
hoàn toàn bằng câu lệnh console trong C++. Kết quả thực hiện phát hiện khuôn mặt trong
ảnh như bên dưới.
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 39
Kết luận và hướng phát triển
1. Kết luận
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. Tác giả đã á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. Tuy kết quả đạt được chưa cao, nhưng đây là bước đầu để phát triển bài toán nhận
dạng mặt (face recognition) người sau này. Bên cạnh đó, trong quá trình xây dựng
chương trình demo, tác giả đã tìm hiểu về thư viện mã nguồn mở OpenCV, qua đó biết
cách sử dụng các hàm trong thư viện OpenCV. Trong quá trình thực tập này tác giả mới
phát hiện được khuôn mặt trong ảnh tĩnh, ảnh chụp từ camera laptop, theo dõi đối tượng
từ camera laptop.
Về chương trình demo, sau khi thử nghiệm với tập ảnh và webcam. Chương trình
đạt kết quả tốt, thời gian phát hiện nhanh đối với các ảnh mặt người chụp thẳng, chất
lượng ảnh tốt tuy nhiên đối với các ảnh chụp nghiêng hay ảnh có mầu sắc quá tối thì
chương trình gần như không thể phát hiện được khuôn mặt trong bức ảnh đấy.
Đối với webcam, thì hiệu xuất của chương trình còn tùy theo chất lượng của loại
webcam được sử dụng, tuy nhiên cũng tương tự như với phát hiện khuôn mặt trong ảnh,
chương trình sẽ không thể phát hiện mặt người trong điều kiện độ sáng quá yếu và góc
quay nghiêng quá 20o.
Phần thiết kế CSDL lưu trữ hình ảnh tác giả vẫn chưa thực hiện được, đó là mục
tiêu tiếp theo để tác giả tiếp tục nghiên cứu, tìm hiểu tiếp theo.
2. Hướng phát triển
Có nhiều hướng phát triển cho chương trình này, có thể phát triển cả về mặt ứng
dụng và mặt thuật toán (để cải thiện hiệu quả phát hiện mặt người). Có thể xây dựng một
ứng dụng chỉ cần đến phát hiện mặt người mà không cần nhận dạng. Ví dụ như một hệ
thống ghép hình, ghép khuôn mặt phát hiện được vào trong một bức ảnh khác (chẳng hạn
như ghép khuôn mặt của người sử dụng cho khuôn mặt của người nổi tiếng).
Ngoài ra có thể phát triển chương trình theo hướng nhận dạng khuôn mặt, xây dựng
một hệ thống để học các đặc trưng của những người cần nhận dạng. Khi thực hiện, đầu
tiên ta đưa qua bức ảnh qua chương trình phát hiện mặt người để phát hiện nhanh các
khuôn mặt có trong ảnh, sau đấy so sách các khuôn mặt đó với các khuôn mặt mà chương
trình đã được “học” từ trước, so sánh các đặc trưng của hai khuôn mặt, nếu trùng thì đưa
ra thông tin về khuôn mặt được nhận dạng. Đây là mục tiêu hướng tới của tác giả để tiếp
tục hoàn thành cho đề tài kháo luận của mình tiếp theo.
B á o c á o t h ự c t ậ p t ố t n g h i ệ p T r a n g | 40
Tài liệu tham khảoTrong quá trình thực tập tác giả đã tham khảo các tài liệu trên internet, sách, báo
tiếng việt và tiếng anh.
Các trang web:
http://docs.opencv.org/
http://hxr99.blogspot.com/2011/12/opencv-examples-showing-image.html
http://www.comvisap.com/2012/01/ktcb2.html
sách tham khảo
Learning OpenCV Computer Vision with the OpenCV Library
opencv reference manual 2.1
Ung dung xu ly anh trong thuc te voi thu vien OpenCV