50
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

BaoCaoThucTapTotNghiep Opencv

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 | 6

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 | 38

Hình 20: kết quả chương trình

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