MẪU ĐỒ ÁN -KHOÁ LUẬN TỐT NGHIỆP



ĐẠI HỌC ĐÀ NẴNG

ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG VIỆT HÀN

ĐỒ ÁN CƠ SỞ 4

Đề tài: Xây dựng ứng dụng nhận diện khuôn mặt sử dụng Deep Learning

Đà Nẵng, ngày 30 tháng 12 năm 2020

MỞ ĐẦU

LỜI CẢM ƠN

NHẬN XÉT

CỦA GIÁO VIÊN HƯỚNG DẪN

........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

....................................................................................................................................

....................................................................................................................................

....................................................................................................................................

....................................................................................................................................

....................................................................................................................................

....................................................................................................................................

....................................................................................................................................

....................................................................................................................................

........................................................

Đà Nẵng, ngày 30 tháng 12 năm 2020

Giảng viên hướng dẫn

HÀ THỊ MINH PHƯƠNG

MỤC LỤC

Chương 1: 9

GIỚI THIỆU 9

1.1 Giới thiệu đề tài 9

1.2 Phương pháp thực hiện 10

1.3 Mục đích nghiên cứu 10

1.4 Giới hạn của đề tài 11

1.5 Cấu trúc đồ án: 11

Chương 2: 12

CƠ SỞ LÝ THUYẾT 12

2.1 Các phương pháp nhận diện khuôn mặt 12

2.1.1 Nhận dạng khuôn mặt người dùng thuật toán PCA 13

2.1.2 Nhận dạng khuôn mặt người dựa trên phương pháp LBP [5] 14

2.1.3 Nhận dạng khuôn mặt dựa trên phương pháp haar like và thuật toán Adaboost. 15

2.2 Mạng nơ-ron tích chập (Convolutional Neural Network) 19

2.2.1 Định nghĩa 19

2.2.2 Cấu trúc đơn giản của CNN [8] 20

2.3 Tìm hiểu về Face Detector - MTCNN: 24

2.4 Tìm hiểu Pre-trained model - FaceNet 28

2.4.1 Pre-trained model 28

2.4.2 FaceNet 28

2.4.3 Thuật toán Triplet loss trong FaceNet: 29

2.5 Kỹ thuật căn chỉnh khuôn mặt (Face alignment) 32

Hình 21. Căn chỉnh khuôn mặt 33

2.6 Ngôn ngữ Python 33

2.6.1 Giới thiệu sơ lược về ngôn ngữ Python 33

2.6.2 Các đặc điểm của ngôn ngữ Python 34

2.6.3 Ứng dụng của Python 37

2.7 Một số thư viện quan trọng 37

2.7.1 Opencv 37

2.7.2 Numpy 39

2.7.3 Keras 39

2.7.4 TensorFlow 40

2.7.5 Dlib 40

Chương 3: 41

PHÂN TÍCH VÀ XÂY DỰNG HỆ THỐNG 41

3.1 Phân tích – thiết kế hệ thống phát hiện mặt người 41

3.1.1 Phân tích 41

3.1.2 Thiết kế hệ thống: 42

3.1.4 Trích chọn đặc trưng và gán nhãn 43

3.1.5 Phát hiện khuôn mặt trong ảnh đầu vào: 46

3.1.6 Căn chỉnh khuôn mặt trước khi nhận dạng: 46

3.1.7 Trích rút đặc trưng khuôn mặt từ ảnh đầu vào: 46

3.1.8 Nhận diện khuôn mặt 47

3.1.9 Xác định các khuôn mặt “unknown” 48

3.2 Kết quả thử nghiệm hệ thống 48

3.2.1 Giao diện chương trình: 48

KẾT LUẬN 51

1.Kết quả đạt được 51

2.Hướng phát triển: 51

DANH MỤC TÀI LIỆU THAM KHẢO 52

MỤC LỤC HÌNH ẢNH

Hình 1: Mô tả tính toán với bán kính 1 điểm ảnh và lấy mẫu 8 điểm lân cận 13

Hình 2: Đặc trưng theo cạnh 14

Hình 3: Đặc trưng theo đường 14

Hình 4: Đặc trưng theo xung quanh tâm 14

Hình 5: Đặc trưng theo đường chéo 14

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

Hình 7: Cách tính tổng giá trị pixel vùng cần tính 15

Hình 8: Hệ thống phát hiện khuôn mặt 16

Hình 9: : Cấu trúc của mạng nơ-ron tích chập 19

Hình 10: Minh họa chập với kernel 3x3 19

Hình 11: Phép toán sử dụng phép gộp 20

Hình 12: Một số hàm phi tuyến. 21

Hình 13: Kiến trúc mạng MTCNN 23

Hình 14: Mạng neural P-Net 23

Hình 15: Mạng neural R-Net 24

Hình 16: Mạng neural O-Net 25

Hình 17: FaceNet lấy hình ảnh khuôn mặt làm đầu vào và xuất ra vector embedding 26

Hình 18: Triplet loss trên hai positive faces-mặt tích cực và một negative face-mặt tiêu cực. 28

Hình 19: Triplet loss 29

Hình 20: Triplet loss trước và sau khi đào tạo 30

Hình 21: Căn chỉnh khuôn mặt 31

Hình 22: Biểu đồ ngữ cảnh của hệ thống 39

Hình 23: Sơ đồ thực hiện 40

Hình 24: Sơ đồ hệ thống 40

Hình 25: T Phát hiện khuôn mặt với Haar cascade 42

Hình 26: Phát hiện khuôn mặt với MTCNN 43

Hình 27: Trước và sau khi căn chỉnh khuôn mặt 44

Hình 28: Cosine similarity 45

Hình 29: Giao diện tạo mới người dùng 47

Hình 30: File hình ảnh 48

Hình 31: Giao diện training 48

Hình 32: Giao diện nhận diện 48

Chương 1:

GIỚI THIỆU

1.1 Giới thiệu đề tài

Ngày nay, trong kỷ nguyên số, máy tính là một phần không thể thiếu trong nghiên cứu khoa học cũng như trong đời sống hàng ngày. Tuy nhiên, do hệ thống máy tính dựa trên lý thuyết cổ điển (tập hợp, logic nhị phân), nên dù có khả năng tính toán lớn và độ chính xác cao, thì máy tính cũng chỉ có thể làm việc theo một chương trình gồm các thuật toán được viết sẵn do lập trình viên chứ chưa thể tự lập luận hay sáng tạo.

Học máy (Machine learning) là một phương pháp phân tích dữ liệu có thể tự động hóa phân tích dữ liệu và tìm ra các trích xuất đặc trưng của bộ dữ liệu. Học máy sử dụng các thuật toán trừu tượng để tự học từ dữ liệu, cho phép máy tính tìm thấy những thông 2 tin có giá trị ẩn ở rất sâu mà không thể lập trình được bằng cách thông thường. Khi tiếp xúc với dữ liệu mới, học máy có thể thích ứng rất nhanh và độc lập.

Học sâu (Deep Learning) là một ngành đặc biệt của học máy. Học sâu sử dụng mạng nơ ron nhân tạo (Artificial Neural Networks) để giải quyết các bài toán mà tính toán cứng chưa thể xử lý được như dữ liệu trừu tượng, dữ liệu mờ, dữ liệu không rõ ràng,... Với tính chất như vậy, học sâu thường được ứng dụng trong nhận diện hình ảnh, nhận diện giọng nói, xử lý ngôn ngữ tự nhiên hoặc dự đoán, dự báo.

Mạng nơ ron nhân tạo (Artificial Neural Networks) là một mô hình xử lý thông tin, cấu thành từ các lớp nơ ron, được ra đời trên cơ sở mô phỏng hoạt động não bộ của sinh vật. Mạng nơ ron nhân tạo gắn kết nhiều nơ ron theo một mô hình nhất định, được trải qua huấn luyện để rút ra được kinh nghiệm, và sử dụng các kinh nghiệm đã có để xử lý các thông tin mới. Mạng nơ ron nhân tạo thường áp dụng vào giải các bài toán nhận dạng mẫu, hoặc dự đoán.

Mạng nơ ron Tích chập (Convolutional Neural Network) là một trong những mô hình học sâu hiện đại nhất hiện nay. Mạng nơ ron Tích chập hiện nay thường được sử dụng nhiều trong các hệ thống thông minh do ưu điểm của mạng là có độ chính xác cao, tuy nhiên tốc độ tính toán lại rất nhanh. Vì lý do đó, mạng nơ ron tích chập rất mạnh trong xử lý hình ảnh, và được ứng dụng rất nhiều trong ngành thị giác máy tính trong các bài toán liên quan đến nhận dạng đối tượng.

Ngày nay, với sự phát triển của công nghệ bán dẫn, máy tính ngày càng nhỏ đi, năng lượng tiêu thụ ngày càng thấp xuống, trong khi sức mạnh lại ngày càng tăng lên. Với những ưu điểm như vậy, chúng ta có thể thấy rất nhiều thiết bị thông minh đã và đang hiện diện mọi nơi trong đời sống, với camera nhiều điểm ảnh, bộ nhớ trong lớn và vi xử lý mạnh như: điện thoại thông minh, máy ảnh kỹ thuật số, camera hành trình,… Ngoài ra, với sự bùng nổ của xu hướng mạng vạn vật IOT, người ta có thể sẽ còn thấy rất nhiều thiết bị thông minh mới xuất hiện: xe ô tô tự lái, thiết bị bay không người lái tự giao hàng,... Có thể thấy, việc sử dụng trí thông minh nhân tạo để khai thác dữ liệu hình ảnh trong các thiết bị thông minh trong tương lai đã và đang trở thành xu hướng. Từ nhận định trên và sự gợi ý của giảng viên hướng dẫn, nhóm em quyết định chọn nội dung “Xây dựng ứng dụng nhận diện sử dụng deep learning” để làm đề tài nghiên cứu thực hiện đồ án cơ sở của mình.

1.2 Phương pháp thực hiện

- Trước tiên ta phải nêu bài toán, phân tích và thiết kế hệ thống nhận dạng.

- Xây dựng hệ thống deep learning sử dụng ngôn ngữ Python và mạng nơ ron Tích chập (CNN). Hệ thống lấy mẫu khuôn mặt bằng camera, sau đó hệ thống trích xuất, phân tích khuôn mặt từ hình ảnh hoặc các mẫu được lấy trước đó để so sánh và hệ thống đưa ra kết luận rằng có phải đối tượng được cho phép hay không. Sử dụng công cụ IDLE Python để lập trình

- Sau đó xây dựng cơ sở dữ liệu SQLite để thống kê, hiển thị dữ liệu, sử dụng một số công cụ để lập trình như Sublime Text, PHPStorm, Pycharm …

1.3 Mục đích nghiên cứu

• Tìm hiểu về các thuật toán nhận diện khuôn mặt người.

• Tìm hiểu về mạng nơ-ron tích chập (CNN).

• Nâng cao kỹ năng thiết kế và lập trình bằng ngôn ngữ Python.

• Rèn luyện kỹ năng nghiên cứu và tìm hiểu tài liệu.

• Xây dựng mô hình có thể nhận diện được cảm xúc khuôn mặt người và đếm được số người ra vào.

1.4 Giới hạn của đề tài

Với thời gian có hạn nên nhóm chỉ thực hiện nghiên cứu các vấn đề cơ bản trong phạm vi nhất định:

- Sử dụng thư viện mở có sẵn.

- Sử dụng video quay trực tiếp từ webcam và ảnh có sẵn làm đầu vào.

- Chỉ hoạt động trong điều kiện có ánh sáng và góc quay phù hợp.

1.5 Cấu trúc đồ án:

- Nghiên cứu tổng quan.

- Phân tích và thiết kế hệ thống.

- Triển khai xây dựng.

- Kết luận và hướng phát triển.

Chương 2:

CƠ SỞ LÝ THUYẾT

2.1 Các phương pháp nhận diện khuôn mặt

Hiện nay các phương pháp nhận dạng mặt được chia thành nhiều hướng theo các tiêu chí khác nhau: nhận dạng với dữ liệu đầu vào là ảnh tĩnh 2D là phổ biến nhất, tuy nhiên tương lai có lẽ sẽ là 3D (vì việc bố trí nhiều camera 2D sẽ cho dữ liệu 3D và đem lại kết quả tốt hơn, đáng tin cậy hơn), cũng có thể chia thành 2 hướng là: làm với dữ liệu ảnh và làm với dữ liệu video. Trên thực tế người ta hay chia các phương pháp nhận dạng mặt ra làm 3 loại: phương pháp tiếp cận toàn cục (Global) như Eigenfaces - PCA, Fisherfaces - LDA; phương pháp tiếp cận dựa trên các đặc điểm cục bộ (Local Feature Based) như LBP, Gabor Wavelets và phương pháp lai (là sự kết hợp của phương pháp toàn cục và phương pháp cục bộ). [1]

Phương pháp nhận dạng khuôn mặt dựa trên các đặc điểm cục bộ: Đây là phương pháp nhận dạng khuôn mặt dựa trên việc xác định các đặc trưng hình học của các chi tiết trên một khuôn mặt (như vị trí, diện tích, hình dạng của mắt, mũi, miệng,…), và mối quan hệ giữa chúng (như khoảng cách của hai mắt, khoảng cách của hai lông mày,…). [2]

Phương pháp nhận dạng khuôn mặt dựa trên xét toàn diện khuôn mặt: Nhận dạng dựa trên toàn diện khuôn mặt, có nghĩa là sẽ không đi xét đến từng thành phần đặc trưng trên khuôn mặt nữa mà sẽ xem khuôn mặt là một không gian cụ thể và sẽ tìm những đặc trưng, những đặc điểm chính trên không gian đó. [2]

Phương pháp dựa trên các đặc điểm cục bộ đã được chứng minh là ưu việt hơn khi làm việc trong các điều kiện không có kiểm soát và có thể nói rằng lịch sử phát triển của nhận dạng mặt là sự phát triển của các phương pháp trích chọn đặc trưng (Feature Extractrion Methods) được sử dụng trong các hệ thống dựa trên feature based. Các ứng dụng cụ thể của nhận dạng mặt dựa trên 2 mô hình nhận dạng: identification (xác định danh tính, bài toán 1-N), và verification (xác thực danh tính, bài toán 1-1). Trong bài toán identification, ta cần xác định danh tính của ảnh kiểm tra, còn trong bài toán verification ta cần xác định 2 ảnh có cùng thuộc về một người hay không. [1]

2.1.1 Nhận dạng khuôn mặt người dùng thuật toán PCA

Kohonen đã đưa ra phương pháp dùng vector riêng để nhận dạng khuôn mặt, ông dùng một mạng neural đơn giản để chứng tỏ khả năng của phương pháp này trên các ảnh đã được chuẩn hóa. Mạng neural tính một mô tả của khuôn mặt bằng cách xấp xỉ các vector riêng của ma trận tương quan của ảnh. Các vector riêng sau này được biết đến với cái tên Eigenface [3] . Kirby và Sirovich chứng tỏ các ảnh có khuôn mặt có thể được mã hóa tuyến tính bằng một số lượng vừa phải các ảnh cơ sở. Tính chất này dựa trên biến đổi Karhunen-Lòeve, mà còn được gọi dưới một cái tên khác là PCA và biến đổi Hotelling. Ý tưởng này được xem là của Pearson trình bày đầu tiên vào năm 1901 và sau đó là Hotelling vào năm 1933. Cho một tập các ảnh huấn luyện có kích thước n x m được mô tả bởi các vector có kích thước m x m, các vector cở sở cho một không gian con tối ưu được xác định thông qua lỗi bình phương trung bình khi chiếu các ảnh huấn luyện vào không gian con này. Các tác giả gọi tập các vector cơ sở tối ưu này là ảnh riêng sau đó gọi cho đơn giản là vector riêng của ma trận hiệp phương sai được tính từ các ảnh khuôn mặt đã vector hóa trong tập huấn luyện. Nếu cho 100 ảnh, mà mỗi khuôn mặt có kích thước 91x50 thì có thể chỉ dùng 50 ảnh riêng, trong khi vẫn duy trì được một khả năng giống nhau hợp lý (giữ được 95% tính chất). [4]

Turk và Pentland áp dụng PCA để xác định và nhận dạng khuôn mặt. Tương tự, dùng PCA trên tập huấn luyện ảnh các khuôn mặt để sinh các ảnh riêng (còn gọi là Eigenface) để tìm một không gian con (không gian khuôn mặt) trong không gian ảnh. Các ảnh khuôn mặt được chiếu vào không gian con này và được gom nhóm lại. Tương tự các ảnh không có khuôn mặt dùng để huấn luyện cũng được chiếu vào cùng không gian con và gom nhóm lại. Các ảnh khi chiếu vào không gian khuôn mặt thì không bị thay đổi tính chất cơ bản, trong khi chiếu các ảnh không có khuôn mặt thì xuất hiện sự khác nhau cũng không ít. Xác định sự có mặt của một khuôn mặt trong ảnh thông qua tất cả khoảng cách giữa các vị trí trong ảnh và không gian ảnh. Khoảng cách này dùng để xem xét có hay không có khuôn mặt người, kết quả khi tính toán các khoảng cách sẽ cho ta một bản đồ về khuôn mặt. Có nhiều nghiên cứu về xác định khuôn mặt, nhận dạng, và trích đặc trưng từ ý tưởng vector riêng, phân rã, và gom nhóm. Sau đó Kim phát triển cho ảnh màu, bằng cách phân đoạn ảnh để không gian tìm kiếm giảm xuống. [4]

2.1.2 Nhận dạng khuôn mặt người dựa trên phương pháp LBP [5]

Mẫu nhị phân cục bộ (Local Binary Pattern - LBP) là phương pháp trích chọn kết cấu của ảnh thành vector đặc trưng gọi là đặc trưng LBP. Ý tưởng ban đầu của phương pháp này được tác giả Ojala và các đồng nghiệp giới thiệu, ban đầu xử lý trên ảnh xám. Ví dụ với một điểm ảnh xét 8 điểm lân cận và sử dụng chính giá trị của điểm ảnh tại trung tâm để phân ngưỡng 8 giá trị lân cận. Kết quả tìm được một chuỗi bit nhị phân có chiều dài bằng 8 tương ứng với 8 điểm lân cận được định nghĩa theo thứ tự nhất định. Chuỗi bit sẽ được chuyển sang hệ thập phân và giá trị thập phân này thay thế giá trị ban đầu của điểm ảnh đang xét. Số điểm lân cận có thể được thay đổi bằng đại lượng bán kính. Hình 2.1 mô tả quá trình tính toán LBP cho bài toán nhận dạng mặt người.

[pic]

Hình 1: Mô tả tính toán với bán kính 1 điểm ảnh và lấy mẫu 8 điểm lân cận

Ưu điểm của phương pháp LBP là có chi phí tính toán thấp, ổn định khi cường độ thay đổi đơn điệu và dễ mở rộng lên không gian nhiều chiều như ảnh màu trong hệ RGB. Tuy nhiên, nhược điểm của đặc trưng dựa trên gradient là:

- Đầu tiên, gradient phác họa cường độ phân phối xung quanh điểm ảnh một cách khá thô do chỉ biểu thị bởi hai giá trị 0 và 1. Hai mức gradient giống nhau có thể thuộc hai đối tượng cục bộ khác nhau, do đó không rõ ràng.

- Thứ hai, thông tin về gradient không đủ biểu diễn cho các đối tượng trong trường hợp gặp môi trường phức tạp gây ra nhiễu.

2.1.3 Nhận dạng khuôn mặt dựa trên phương pháp haar like và thuật toán Adaboost.

2.1.3.1 Đặc trưng Haar-like [6]

Đặc trưng Haar-like được sử dụng trong việc nhận dạng đối tượng trong ảnh số được phát biểu bởi Viola và Jones gồm 4 đặc trưng cơ bản để xác định một đối tượng trong ảnh. Mỗi đặc trưng Haar-like là sự kết hợp gồm 2 hoặc 3 khối chữ nhật mang giá trị “đen” hoặc “trắng”. Những khối chữ nhật này thể hiện sự liên hệ tương quan giữa các bộ phận trong ảnh mà bản thân từng giá trị pixel không thể diễn đạt được.

[pic]

Hình 2: Đặc trưng theo cạnh

[pic]

Hình 3: Đặc trưng theo đường

[pic]

Hình 4: Đặc trưng theo xung quanh tâm

[pic]

Hình 5: Đặc trưng theo đường chéo

Dựa theo các đặc trưng trên, giá trị của đặc trưng Haar-like được xây dựng bởi độ chênh lệch giữa tổng các pixel của các vùng đen so với tổng các pixel của các vùng trắng.

Dưới đây là công thức tính giá trị đặc trưng Haar-like:

f(x)=[pic]) (2.1)

Như vậy để tính giá trị đặc trưng Haar-like cần phải thực hiện tính toán tổng các vùng pixel trên ảnh. Điều này làm cho chi phí bài toán lớn không thể đáp ứng các tính năng yêu cầu thời gian thực. Do vậy Viola và Jones [3] đã đề xuất ra khái niệm “Integral Image” để giảm thiểu chi phí cho bài toán tính giá trị của đặc trưng Haar-like để bài toán có thể xử lý với thời gian thực. Tính “Integral Image” bằng cách sử dụng mảng 2 chiều với kích thước bằng kích thước của ảnh cần tính giá trị đặc trưng Haar-like. Ảnh chia nhỏ ở vị trí (x, y) được tính bằng tổng các giá trị pixel của vùng từ vị trí (0,0) đến vị trí (x-1, y-1). Việc tính toán đơn giản là thực hiện phép cộng số nguyên nên tốc độ thực hiện được tối ưu hóa.

[pic]

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

P(x, y) =[pic] (2.2)

Kết quả có được sau khi tính Integral Image, việc tính tổng giá trị pixel trong vùng cần tính thực hiện như sau:

Gọi vùng cần tính tổng các giá trị pixel là vùng “A4”.

P1(x1, y1) = A1 (2.3)

P2(x2, y2) = A1 + A2 (2.4)

P3(x3, y3) = A1 + A3 (2.5)

P4(x4, y4) = A1 + A2 + A3 + A4 (2.6)

Ta được: A4 = P4 + P1 – P2 – P3 (2.7)

[pic]

Hình 7: Cách tính tổng giá trị pixel vùng cần tính

Hình 8: Hệ thống phát hiện khuôn mặt

Từ ảnh gốc ban đầu, hệ thống sẽ chia ảnh thành nhiều tỉ lệ rất nhỏ để tính các đặc trưng qua các hàm đặc trưng cơ bản Haar-like. Sau khi tính toán được các hàm đặc trưng, ta nhận được một số lượng rất lớn các đặc trưng. Để lựa chọn và xác định có thể là khuôn mặt, ta dùng giải thuật Adaboost để lựa chọn và kết hợp các vùng trọng số yếu thành trọng số mạnh. Cuối cùng, các vùng đã được lựa chọn sẽ được đưa vào bộ phân loại “Cascade of classifier” để loại bỏ các vùng không phải khuôn mặt và xác định vùng nào là khuôn mặt. Và đưa ra kết quả cuối cùng.

2.1.3.2 Thuật toán Adaboost [6]

Adaboost là một cách trong hướng tiếp cận dựa trên diện mạo, Viola và Jones dùng AdaBoost kết hợp cascade để xác định khuôn mặt người với các đặc trưng dạng Haar wavelet-like. Tốc độ xử lý khá nhanh và tỷ lệ chính xác hơn 80% trên ảnh xám. Adaboost là một bộ phân loại mạnh phi tuyến phức dựa trên tiếp cận boosting được Freund và Schapire đưa ra vào năm 1995. Adaboost cũng hoạt động dựa trên nguyên tắc kết hợp tuyến tính các “weak classifiers” để hình thành một “strong classifier”. Là một cải tiến của của tiếp cận boosting. Adaboost sử dụng thêm khái niệm 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 classifiers” đượ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” kế tiếp: 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 các “weak classifier” vừa xây dựng. Bằng cách này “weak classifier” sau có thể tập trung vào các mẫu mà các “weak classifier” trước nó làm chưa 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 “strong classifier”.

2.1.3.3 Khái quát Cascade of classifier [7]

Ta sẽ có một chuỗi các bộ phân lớp, trong đó mỗi bộ phân lớp được xây dựng bằng thuật toán Adaboost. Bây giờ, ta đưa tất cả các cửa sổ con đi qua chuỗi các bộ phân lớp này:

• Bộ phân lớp đầu tiên sẽ loại bỏ phần lớn các cửa sổ không phải khuôn mặt (nagative sub window) và cho đi qua các cửa sổ được cho là khuôn mặt (positive sub window). Ở đây, bộ phân lớp này rất đơn giản và do đó, độ phức tạp tính toán cũng rất thấp. Tất nhiên, vì rằng nó đơn giản nên trong số các cửa sổ được nhận dạng là khuôn mặt sẽ có một số lượng lớn cửa sổ bị nhận dạng sai (không phải là khuôn mặt).

• Những cửa sổ được cho đi qua bởi bộ phân lớp đầu sẽ được xem xét bởi bộ phân lớp sau đó: nếu bộ phân lớp cho rằng đó không phải là khuôn mặt thì ta loại bỏ; nếu bộ phân lớp cho rằng đó là khuôn mặt thì ta lại cho đi qua và chuyển đến bộ phân lớp phía sau.

• Những bộ phân lớp càng về sau thì càng phức tạp hơn, đòi hỏi sự tính toán nhiều hơn. Người ta gọi những cửa sổ con (mẫu) mà bộ phân lớp không loại bỏ được là những mẫu khó nhận dạng. Những mẫu này càng đi sâu vào trong chuỗi các bộ phân lớp thì càng khó nhận dạng. Chỉ những cửa sổ đi qua được tất cả các bộ phân lớp thì ta mới quyết định đó là khuôn mặt.

Tóm lại, chuỗi các bộ phân lớp sẽ xử lý các mẫu (cửa sổ con) đi vào theo nguyên tắc sau: nếu một bộ phân lớp nào đó cho rằng đó không phải là mặt người thì ta loại bỏ ngay; còn nếu bộ phân lớp cho rằng đó là khuôn mặt thì ta chuyển đến bộ phân lớp sau. Nếu một mẫu trót lọt hết tất cả các bộ phân lớp thì ta mới quyết định đó là khuôn mặt.

Đây là một phương pháp cơ bản phù hợp cho những ai mới tham gia nghiên cứu lĩnh vực nhận dạng khuôn mặt, đặc trưng Haar-like kết hợp với Adaboot được cài sẵn trong bộ thư viện Opencv giúp chúng ta dễ dàng phát hiện khuôn mặt, tốc độ phát hiện nhanh và hoạt động ổn định trong điều kiện đầy đủ sáng.

2.2 Mạng nơ-ron tích chập (Convolutional Neural Network)

2.2.1 Định nghĩa

Mạng nơ-ron tích chập là một trong những mô hình mạng học sâu phổ biến nhất hiện nay, có khả năng nhận dạng và phân loại hình ảnh với độ chính xác rất cao (khoảng 98%). Mô hình này đã và đang được phát triển, ứng dụng vào các hệ thống xử lý ảnh lớn của Facebook, Google hay Amazon… cho các mục đích khác nhau như các thuật toán gắn thẻ tự động, tìm kiếm ảnh hoặc drone giao hàng tự động.

Sự ra đời của mạng nơ-ron tích chập là dựa trên ý tưởng cải tiến cách thức các mạng nơ-ron nhân tạo truyền thống học thông tin trong ảnh. Do sử dụng các liên kết đầy đủ giữa các điểm ảnh vào nút, các mạng nơ-ron nhân tạo truyền thẳng bị hạn chế rất nhiều bởi kích thước của ảnh, ảnh càng lớn thì số lượng liên kết càng tăng nhanh và kéo theo sự bùng nổ khối lượng tính toán. Ngoài ra sự liên kết đầy đủ này cũng là sự dư thừa khi với mỗi bức ảnh, các thông tin chủ yếu thể hiện qua sự phụ thuộc giữa các điểm ảnh với những điểm xung quanh nó mà không quan tâm nhiều đến các điểm ảnh ở cách xa nhau. Mạng nơ-ron tích chập ra đời với kiến trúc thay đổi, có khả năng xây dựng liên kết chỉ sử dụng một phần cục bộ trong ảnh kết nối đến nút trong lớp tiếp theo thay vì toàn bộ ảnh như trong mạng nơ-ron truyền thẳng.

Trong luận văn này, nhóm thực hiện sẽ trình bày về tích chập cũng như ý tưởng của mô hình CNN áp dụng trong bài toán nhận diện cảm xúc trên khuôn mặt.

2.2.2 Cấu trúc đơn giản của CNN [8]

Các lớp cơ bản trong một mạng nơ-ron tích chập bao gồm: lớp chập, lớp gộp và lớp kết nối đầy đủ, được thay đổi về số lượng và cách sắp xếp để tạo ra các mô hình huấn luyện phù hợp cho từng bài toán khác nhau.

[pic]

Hình 9: Cấu trúc của mạng nơ-ron tích chập

- Lớp chập

Là lớp quan trọng nhất trong cấu trúc của mạng nơ-ron tích chập. Chập dựa trên lý thuyết xử lý tín hiệu số, việc chập sẽ giúp trích xuất được những thông tin quan trọng từ dữ liệu. Để dễ hình dung, có thể xem tích chập như một cửa sổ trượt áp đặt lên một ma trận. Cơ chế của tích chập được minh họa qua Hình 2.10 bên dưới.

[pic]

Hình 10: Minh họa chập với kernel 3x3

Từ Hình 2.10, ma trận bên trái là một bức ảnh đen trắng. Mỗi giá trị của ma trận tương đương với một điểm ảnh, 0 là màu đen, 1 là màu trắng (nếu là ảnh xám thì giá trị biến thiên từ 0 đến 255).

Cửa sổ trượt còn có tên gọi là kernel hay filter. Ở đây, ta dùng một ma trận

kernel 3×3 nhân từng thành phần tương ứng với ma trận ảnh bên trái. Giá trị đầu ra do tích của các thành phần này cộng lại. Kết quả của tích chập là một ma trận sinh ra từ việc trượt ma trận kernel và thực hiện tích chập cùng lúc lên toàn bộ ma

trận ảnh bên trái.

- Lớp gộp

Bản đồ đặc trưng được tạo ra thông qua việc tính toán của lớp chập, tuy nhiên kích thước của nó so với kích thước đầu vào giảm không đáng kể. Nếu kích thước không thay đổi, sẽ tạo nên một số lượng tính toán lớn và việc học tập cũng trở nên rất khó khăn. Lớp gộp này sẽ giải quyết vấn đề về làm giảm kích thước và số lượng tính toán của bản đồ đặc trưng.

Có nhiều toán tử gộp như Sum-Pooling, Max-Pooling, L_2-Pooling nhưng Max-Pooling thường được sử dụng. Về mặt ý nghĩa thì Max-Pooling xác định vị trí cho tín hiệu mạnh nhất khi áp dụng một loại kernel. Điều này cũng tương tự như là một bộ lọc phát hiện vị trí đối tượng bằng kernel trong bài toán phát hiện đối tượng trong ảnh.

Về mặt lý thuyết với ma trận đầu vào có kích thước a*b*c và thực hiện toán tử

gộp trên ma trận con của ma trận đầu vào có kích thước f*f với bước nhảy pixel s

thì ta được ma trận đầu ra a’*b’*c’ trong đó:

[pic](2.4)

[pic]

Hình 11: Phép toán sử dụng phép gộp

Hình 2.11 là ví dụ về sử dụng toán tử gộp. Trong đó miêu tả cách thức lớp gộp xử

lý đối với một đầu vào, kích thước của đầu vào là [224*224*64] được thực hiện

với các thông số f = 2 và s = 2 thì đầu ra có kích thước [112*112*64] được thể

hiện ở phía trái của Hình 2.11. Phía phải mô tả chi tiết cách thức hoạt động của

max-pooling trong đó f = 2 và s = 2 kết quả đầu ra ma trận tương ứng.

- Lớp ReLU

Chập là một phép biển đổi tuyến tính. Nếu tất cả các nơ-ron được tổng hợp bởi các phép biến đổi tuyến tính thì một mạng nơ-ron đều có thể đưa về dưới dạng một hàm tuyến tính. Do đó tại mỗi nơ-ron cần có một hàm truyền dưới dạng phi tuyến.

Có nhiều dạng hàm phi tuyến được sử dụng trong quá trình này như sau:

[pic]

Hình 12: Một số hàm phi tuyến.

Các nghiên cứu gần đây chứng minh được việc sử dụng hàm ReLU cho kết quả tốt hơn ở các khía cạnh: tính toán đơn giản, tạo ra tính thưa ở các nơ-ron ẩn (ví dụ như sau bước khởi tạo ngẫu nhiên các trọng số, khoảng 50% các nơ-ron ẩn được kích hoạt) và quá trình huấn luyện nhanh hơn ngay cả khi không phải trải qua bước tiền huấn luyện.

- Lớp kết nối đủ

Cách kết nối các nơ-ron ở hai tầng với nhau trong đó tầng sau kết nối đẩy đủ với các nơ-ron ở tầng trước nó. Đây cũng là dạng kết nối thường thấy ở mạng nơ-ron nhân tạo, trong mạng nơ-ron tích chập tầng này thường được sử dụng ở phía cuối của kiến trúc mạng.

Hiện nay có một số cấu trúc CNN đạt được kết quả khả quan như:

• LeNet: Đây là mô hình CNN thành công đầu tiên, đặc biệt là trong việc nhận dạng chữ số, kí tự trong văn bản. Được phát triển bởi Yann Lecun vào cuối những năm 90.

• AlexNet: Được phát triển bởi Alex Krizhevsky, Ilya Sutskever và Geoff Hinton. Làn đầu được giới thiệu vào năm 2012 với cấu trúc khá tương tự như LeNet nhưng với số lượng neuron, filter và layer lớn hơn. Được coi là mạng neural đầu tiên phổ biến rộng rãi khả năng của CNNs.

• ZF Net: Là mạng CNNs tốt nhất năm 2013 được phát triển bởi Matthew Zeiler và Rob Fergus (ZF là viết tắt của Zeiler và Fergus). Mạng neural này được phát triển từ AlexNet với việc tinh chỉnh các hyperparameter (filter size, stride, ...). Với những layer gần input layer, filter size và stride nhỏ hơn.

• GoogLeNet: Là mạng CNNs tốt nhất năm 2014 được phát triển bởi Szegedy từ Google. Với một số thay đổi như giảm thiểu số lượng tham số trong AlexNet từ 60 triệu xuống 4 triệu, sử dụng Average Pooling thay cho FC-Layer.

• VGGNet: Là mạng CNNs tốt nhất năm 2015 được phát triển bởi Karen Simonyan và Andrew Ziserman. Sử dụng filter 3x3 và pooling 2x2 từ đầu tới cuối mạng. Và vẫn còn được tiếp tục phát triển cho đến nay.

2.3 Tìm hiểu về Face Detector - MTCNN:

MTCNN là viết tắt của Multi-task Cascaded Convolutional Networks (Mạng đa năng xếp tầng đa tác vụ). Nó là bao gồm 3 mạng CNN xếp chồng và đồng thời hoạt động khi detect khuôn mặt. Mỗi mạng có cấu trúc khác nhau và đảm nhiệm vai trò khác nhau trong task. Đầu ra của MTCNN là vị trí khuôn mặt và các điểm trên mặt: mắt, mũi, miệng…

MTCNN hoạt động theo 3 bước, mỗi bước có một mạng neural riêng lần lượt là: P-Net, R-Net và O-net

[pic]

Hình 13. Kiến trúc mạng MTCNN

Với mỗi bức ảnh đầu vào, nó sẽ tạo ra nhiều bản sao của hình ảnh đó với các kích thước khác nhau.

Tại P-Net, thuật toán sử dụng 1 kernel 12x12 chạy qua mỗi bức hình để tìm kiếm khuôn mặt.

[pic]

Hình 14. Mạng neural P-Net

Sau lớp convolution thứ 3, mạng chia thành 2 lớp. Convolution 4-1 đưa ra xác suất của một khuôn mặt nằm trong mỗi bounding boxes, và Convolution 4-2 cung cấp tọa độ của các bounding boxes.

R-Net có cấu trúc tương tự vói P-Net. Tuy nhiên sử dụng nhiều layer hơn. Tại đây, network sẽ sử dụng các bounding boxes được cung cấp từ P-Net và tinh chỉnh là tọa độ.

[pic]

Hình 15. Mạng neural R-Net

Tương tự R-Net chia ra làm 2 layers ở bước cuối, cung cấp 2 đầu ra đó là tọa độ mới của các bounding boxes, cùng độ tin tưởng của nó.

O-Net lấy các bounding boxes từ R-Net làm đầu vào và đánh dấu các tọa độ của các mốc trên khuôn mặt.

[pic]

Hình 16. Mạng neural O-Net

Ở bước này, thuật toán đưa ra 3 kết quả đầu ra khác nhau bao gồm: xác suất của khuôn mặt nằm trong bounding box, tọa độ của bounding box và tọa độ của các mốc trên khuôn mặt (vị trí mắt, mũi, miệng)

2.4 Tìm hiểu Pre-trained model - FaceNet

2.4.1 Pre-trained model

Pre-trained model là một mô hình được đào tạo bởi một người khác để giải quyết một vấn đề tương tự. Thay vì xây dựng một mô hình từ đầu để giải quyết một vấn đề tương tự, ta sử dụng mô hình được đào tạo về vấn đề khác làm điểm khởi đầu. Một mô hình được đào tạo trước có thể không chính xác 100%, nhưng nó giúp tiết kiệm thời gian và công sức.

2.4.2 FaceNet

FaceNet là một mạng lưới thần kinh sâu được sử dụng để trích xuất các tính năng từ hình ảnh của một người mặt. Nó được xuất bản vào năm 2015 bởi các nhà nghiên cứu của Google.

[pic]

Hình 17. FaceNet lấy hình ảnh khuôn mặt làm đầu vào và xuất ra vector embedding

FaceNet lấy hình ảnh của mặt người làm đầu vào và xuất ra một vector 128 chiều, đại diện cho các tính năng quan trọng nhất của khuôn mặt. Trong học máy, vector này được gọi là nhúng (embeddings). Tại sao phải nhúng? Bởi vì tất cả các thông tin quan trọng từ một hình ảnh được nhúng vào vector này. Về cơ bản, FaceNet lấy một mặt người và nén nó thành một vector gồm 128 số. Khuôn mặt cần định danh cũng có nhúng tương tự.

Facenet chính là một dạng siam network có tác dụng biểu diễn các bức ảnh trong một không gian eucledean n chiều (thường là 128) sao cho khoảng cách giữa các vector embedding càng nhỏ, mức độ tương đồng giữa chúng càng lớn.

Hầu hết các thuật toán nhận diện khuôn mặt trước facenet đều tìm cách biểu diễn khuôn mặt bằng một vector nhúng (embedding) thông qua một layer bottle neck có tác dụng giảm chiều dữ liệu:

• Tuy nhiên hạn chế của các thuật toán này đó là số lượng chiều embedding tương đối lớn (thường >= 1000) và ảnh hưởng tới tốc độ của thuật toán. Thường chúng ta phải áp dụng thêm thuật toán PCA để giảm chiều dữ liệu để giảm tốc độ tính toán.

• Hàm loss function chỉ đo lường khoảng cách giữa 2 bức ảnh. Như vậy trong một đầu vào huấn luyện chỉ học được một trong hai khả năng là sự giống nhau nếu chúng cùng 1 class hoặc sự khác nhau nếu chúng khác class mà không học được cùng lúc sự giống nhau và khác nhau trên cùng một lượt huấn luyện.

Facenet đã giải quyết cả 2 vấn đề trên bằng các hiệu chỉnh nhỏ nhưng mang lại hiệu quả lớn:

• Base network áp dụng một mạng convolutional neural network và giảm chiều dữ liệu xuống chỉ còn 128 chiều. Do đó quá trình suy diễn và dự báo nhanh hơn và đồng thời độ chính xác vẫn được đảm bảo.

• Sử dụng loss function là hàm triplet loss có khả năng học được đồng thời sự giống nhau giữa 2 bức ảnh cùng nhóm và phân biệt các bức ảnh không cùng nhóm. Do đó hiệu quả hơn rất nhiều so với các phương pháp trước đây.

2.4.3 Thuật toán Triplet loss trong FaceNet:

Trong facenet, quá trình encoding của mạng convolutional neural network (CNN) đã giúp ta mã hóa bức ảnh về 128 chiều. Sau đó những vector này sẽ làm đầu vào cho hàm triplet loss đánh giá khoảng cách giữa các vector.

[pic]

Hình 18. Triplet loss trên hai positive faces-mặt tích cực và một negative face-mặt tiêu cực

Mục tiêu của triplet loss là đảm bảo rằng:

• Hai ví dụ có cùng nhãn có các phần nhúng của chúng gần nhau trong không gian nhúng.

• Hai ví dụ với các nhãn khác nhau có các nhúng của chúng ở xa.

Để áp dụng triple loss, chúng ta cần lấy ra 3 bức ảnh trong đó có một bức ảnh là anchor. Trong 3 ảnh thì ảnh anchor được cố định trước. Chúng ta sẽ lựa chọn 2 ảnh còn lại sao cho một ảnh là negative (của một người khác với anchor) và một ảnh là positive (cùng một người với anchor).

[pic]

Hình 19. Triplet loss

[pic]

[pic]

Loss function:

[pic]

Mục tiêu của hàm triplet loss là tối thiểu hóa khoảng cách giữa 2 ảnh khi chúng là negative và tối đa hóa khoảng cách khi chúng là positive. Như vậy chúng ta cần lựa chọn các bộ 3 ảnh sao cho:

• Ảnh Anchor và Positive khác nhau nhất: cần lựa chọn để khoảng cách d(A,P) lớn. Điều này cũng tương tự như bạn lựa chọn một ảnh của mình hồi nhỏ so với hiện tại để thuật toán học khó hơn. Nhưng nếu nhận biết được thì nó sẽ thông minh hơn.

• Ảnh Anchor và Negative giống nhau nhất: cần lựa chọn để khoảng cách d(A,N) d(A,N) nhỏ. Điều này tương tự như việc thuật toán phân biệt được ảnh của một người anh em giống bạn.

Triplet loss function luôn lấy 3 bức ảnh làm đầu vào và trong mọi trường hợp ta kì vọng:

d(A,P) < d(A,N) (1)

Để làm cho khoảng cách giữa vế trái và vế phải lớn hơn, chúng ta sẽ cộng thêm vào vế trái một hệ số α không âm rất nhỏ. Khi đó (1) trở thành:

d(A,P) + α ≤ d(A,N)

[pic]

[pic]

Như vậy hàm loss function sẽ là:

[pic]

Khi huấn luyện mô hình siam network với triplet loss ta luôn phải xác định trước cặp ảnh (A,P) thuộc về cùng một người. Ảnh N sẽ được lựa chọn ngẫu nhiên từ các bức ảnh thuộc các nhãn còn lại.

Như vậy khi áp dụng triplet loss vào các mô hình convolutional neural network chúng ta có thể tạo ra các biểu diễn vector tốt nhất cho mỗi một bức ảnh. Những biểu diễn vector này sẽ phân biệt tốt các ảnh Negative rất giống ảnh Positive. Và đồng thời các bức ảnh thuộc cùng một label sẽ trở nên gần nhau hơn trong không gian chiếu euclidean.

[pic]

Hình 20. Triplet loss trước và sau khi đào tạo

2.5 Kỹ thuật căn chỉnh khuôn mặt (Face alignment)

Căn chỉnh khuôn mặt là nhiệm vụ xác định cấu trúc hình học của khuôn mặt trong hình ảnh kỹ thuật số và cố gắng có được sự căn chỉnh chính xác của khuôn mặt dựa trên sự biến dạng, tỷ lệ và xoay.

Có nhiều hình thức căn chỉnh khuôn mặt, một số phương pháp cố gắng áp đặt mô hình 3D (được xác định trước) sau đó áp dụng biến đổi cho hình ảnh đầu vào sao cho các mốc trên mặt đầu vào khớp với các mốc trên mô hình 3D.

Các phương pháp khác đơn giản hơn, chỉ dựa vào chính các mốc trên khuôn mặt (đặc biệt là vùng mắt) để thực hiện xoay, dịch chuyển và điều chỉnh tỷ lệ của khuôn mặt về cùng một kích thước.

Sau khi phát hiện các khuôn mặt có trên ảnh, các khuôn mặt có thể ở các trạng thái khác nhau, các góc độ khác nhau, có những khuôn mặt bị chéo và cũng có thể bị lệch do bước phát hiện chưa chính xác trong việc lấy ra khung hình chuẩn của mặt. Thì việc áp dụng căn chỉnh khuôn mặt ở đây là cần thiết, nó có thể hiểu như một hình thức của chuẩn hóa dữ liệu, giúp tiêu chuẩn hoá lại dữ liệu trước khi đưa vào mô hình dự đoán. Điều này giúp cải thiện độ chính xác của mô hình nhận diện khuôn mặt.

[pic]

Hình 21. Căn chỉnh khuôn mặt

2.6 Ngôn ngữ Python

2.6.1 Giới thiệu sơ lược về ngôn ngữ Python

Python là một ngôn ngữ lập trình hướng đối tượng và rất thông dụng. Có cấu trúc rõ ràng, rất thuận tiện cho người mới học lập trình và làm cho việc thử nghiệm các tính năng của ngôn ngữ trở nên dễ dàng. Được tạo ra bởi Guido van Rossum tại Amsterdam vào năm 1990. Python hoàn toàn tạo kiểu động và dùng cơ chế cấp phát bộ nhớ tự động. Python được phát triển trong một dự án mã mở, do tổ chức phi lợi nhuận Python Software Foundation quản lý. Python là một ngôn ngữ lập trình mạnh và dễ học. Python có tính hiệu quả rất cao với các cấu trúc dữ liệu và đơn giản nhưng lại rất hữu dụng với ngôn ngữ lập trình hướng đối tượng. Cú pháp Python gọn gàng và có tính năng gõ động, cùng với tính diễn dịch tự nhiên làm Python là một ngôn ngữ lý tưởng dành cho việc xây dựng và phát triển ứng dụng nhanh chóng trong nhiều lĩnh vực trên nhiều nền tảng khác nhau. [14]

2.6.2 Các đặc điểm của ngôn ngữ Python

Dễ học, dễ đọc: Python được thiết kế để trở thành một ngôn ngữ dễ học, mã nguồn dễ đọc, bố cục rõ ràng, dễ hiểu.

Từ khóa: Python tăng cường sử dụng từ khóa tiếng Anh, hạn chế các kí hiệu và cấu trúc, cú pháp so với các ngôn ngữ khác. Python là một ngôn ngữ phân biệt kiểu chữ hoa, chữ thường.

Khối lệnh: Trong các ngôn ngữ khác, khối lệnh thường được đánh dấu bằng cặp kí hiệu hoặc từ khóa. Ví dụ, trong C/C++, cặp ngoặc nhọn {} được dùng để bao bọc một khối lệnh. Ngược lại, Python có một cách rất đặc biệt để tạo khối lệnh, đó là thụt các câu lệnh trong khối vào sâu hơn (về bên phải) so với các câu lệnh của khối lệnh cha chứa nó. Ta có thể dùng dấu Tab để thụt các khối lệnh vào để dễ dàng viết lệnh hơn.

Khả năng mở rộng: Python có thể được mở rộng. Nếu ta biết sử dụng C, ta có thể dễ dàng viết và tích hợp vào Python nhiều hàm tùy theo nhu cầu. Các hàm này sẽ trở thành hàm xây dựng sẵn (built-in) của Python. Ta cũng có thể mở rộng chức năng của trình thông dịch, hoặc liên kết các chương trình Python với các thư viện chỉ ở dạng nhị phân (như các thư viện đồ họa do nhà sản xuất thiết bị cung cấp). Hơn thế nữa, ta cũng có thể liên kết trình thông dịch của Python với các ứng dụng viết từ C và sử dụng nó như là một mở rộng hoặc một ngôn ngữ dòng lệnh hỗ trợ cho ứng dụng đó.

Trình thông dịch: Python là một ngôn ngữ lập trình dạng thông dịch, vì vậy nên Python tiết kiệm được thời gian phát triển ứng dụng vì không cần phải thực hiện biên dịch và liên kết. Trình thông dịch có thể được sử dụng để chạy file script, hoặc cũng có thể được sử dụng theo cách tương tác. Ở chế độ tương tác, trình thông dịch Python tương tự shell của các hệ điều hành họ Unix. Tại đó, ta có thể nhập vào từng biểu thức rồi gõ Enter, và kết quả thực thi sẽ được hiển thị ngay lập tức. Đặc điểm này rất hữu ích cho người mới học, giúp họ nghiên cứu tính năng của ngôn ngữ; hoặc để các lập trình viên chạy thử mã lệnh trong suốt quá trình phát triển phần mềm. Ngoài ra, cũng có thể tận dụng đặc điểm này để thực hiện các phép tính như với máy tính bỏ túi.

Lệnh và cấu trúc điều khiển: Mỗi câu lệnh trong Python nằm trên một dòng mã nguồn. Ta không cần phải kết thúc câu lệnh bằng bất kì kí tự gì. Như các ngôn ngữ khác, Python cũng có các cấu trúc điều khiển.

Chúng bao gồm:

• Cấu trúc rẽ nhánh: Cấu trúc if (có thể sử dụng thêm elif hoặc else), dùng để thực thi có điều kiện một khối mã cụ thể.

• Lệnh while: Thực thi lặp đi lặp lại các lệnh hoặc phần thân của vòng lặp miễn là điều kiện đã cho là true. Khi điều kiện là false, thì điều khiển sẽ thoát ra khỏi vòng lặp.

• Vòng lặp for: Lặp qua từng phần tử của một dãy, mỗi phần tử sẽ được đưa vào biến cục bộ để sử dụng với khối mã trong vòng lặp.

Python cũng có từ khóa class dùng để khai báo lớp (sử dụng trong lập trình hướng đối tượng) và lệnh def dùng để định nghĩa hàm.

Hệ thống kiểu dữ liệu: Python sử dụng hệ thống kiểu duck typing, còn gọi là latent typing (tự động xác định kiểu). Có nghĩa là, Python không kiểm tra các ràng buộc về kiểu dữ liệu tại thời điểm dịch, mà là tại thời điểm thực thi. Khi thực thi, nếu một thao tác trên một đối tượng bị thất bại, thì có nghĩa là đối tượng đó không sử dụng một kiểu thích hợp. Python cũng là một ngôn ngữ định kiểu mạnh. Nó cấm mọi thao tác không hợp lệ. Ở Python, ta không cần phải khai báo biến. Biến được xem là đã khai báo nếu nó được gán một giá trị lần đầu tiên. Căn cứ vào mỗi lần gán, Python sẽ tự động xác định kiểu dữ liệu của biến.

Module: Python cho phép chia chương trình thành các module để có thể sử dụng lại trong các chương trình khác. Python cũng cung cấp sẵn một tập hợp các modules chuẩn mà lập trình viên có thể sử dụng lại trong chương trình của họ. Các module này cung cấp nhiều chức năng hữu ích, như các hàm truy xuất tập tin, các lời gọi hệ thống, trợ giúp lập trình mạng.

Đa năng: Python là một ngôn ngữ lập trình đơn giản nhưng rất hiệu quả.

- So với Unix shell, Python hỗ trợ các chương trình lớn hơn và cung cấp nhiều cấu trúc hơn.

- So với C, Python cung cấp nhiều cơ chế kiểm tra lỗi hơn. Nó cũng có sẵn nhiều kiểu dữ liệu cấp cao, ví dụ như các mảng (array) linh hoạt và từ điển (dictionary) mà ta sẽ phải mất nhiều thời gian nếu viết bằng C. Python là một ngôn ngữ lập trình cấp cao có thể đáp ứng phần lớn yêu cầu của lập trình viên:

• Python thích hợp với các chương trình lớn hơn cả AWK và Perl.

• Python được sử dụng để lập trình Web. Nó có thể được sử dụng như một ngôn ngữ kịch bản.

• Python được tích hợp sẵn nhiều công cụ và có một thư viện chuẩn phong phú, Python cho phép người dùng dễ dàng tạo ra các dịch vụ Web, sử dụng các thành phần COM hay CORBA, hỗ trợ các loại định dạng dữ liệu Internet như email, HTML, XML và các ngôn ngữ đánh dấu khác. Python cũng được cung cấp các thư viện xử lý các giao thức Internet thông dụng như HTTP, FTP, …

• Python có khả năng giao tiếp đến hầu hết các loại cơ sở dữ liệu, có khả năng xử lí văn bản, tài liệu hiệu quả, và có thể làm việc tốt với các công nghệ Web khác.

• Python đặc biệt hiệu quả trong lập trình tính toán khoa học nhờ các công cụ Python Imaging Library, pyVTK, MayaVi 3D Visualization Toolkits, Numeric Python, ScientificPython, …

• Python có thể được sử dụng để phát triển các ứng dụng desktop. Lập trình viên có thể dùng wxPython, PyQt, PyGtk để phát triển các ứng dụng giao diện đồ họa (GUI) chất lượng cao. Python còn hỗ trợ các nền tảng phát triển phần mềm khác như MFC, Carbon, Delphi, X11, Motif, Tk, Fox, FLTK, …

• Python cũng có sẵn một unit testing framework để tạo ra các các bộ test (test suites).

Multiple paradigms (đa biến hóa): Python là một ngôn ngữ đa biến hóa (multiple paradigms). Có nghĩa là, thay vì ép buộc mọi người phải sử dụng duy nhất một phương pháp lập trình, Python lại cho phép sử dụng nhiều phương pháp lập trình khác nhau: hướng đối tượng, có cấu trúc, chức năng, hoặc chỉ hướng đến một khía cạnh. Python kiểu kiểu động và sử dụng bộ thu gom rác để quản lí bộ nhớ. Một đặc điểm quan trọng nữa của Python là giải pháp tên động, kết nối tên biến và tên phương thức lại với nhau trong suốt thực thi của chương trình.

2.6.3 Ứng dụng của Python

Python được ứng dụng trong nhiều lĩnh vực khác nhau:

- Xây dựng các tiện ích nhỏ để tự động hóa các công việc nào đó như: tự động tìm kiếm, phân loại tập tin theo tiêu chí riêng, tự động cập nhật các tập tin văn bản theo yêu cầu nào đó…

- Xây dựng ứng dụng web: Python cung cấp nhiều framework để ta có thể lựa chọn để phát triển ứng dụng web tùy theo mô hình của ứng dụng như: Django, Pyramid, Flask, …

- Lập trình các tính toán khoa học, số liệu nhờ các công cụ và lớp thư viện được xây dựng sẵn như: SciPy, IPython, …

- Lập trình ứng dụng desktop (wxWidgets), lập trình màn hình tương tác (Kivy), …

Bên cạnh đó, Python còn là ngôn ngữ lập trình được lựa chọn để giảng dạy về lập trình các khóa học nhập môn lập trình ở các trường Đại học lớn trên thế giới.

2.7 Một số thư viện quan trọng

2.7.1 Opencv

OpenCV (OpenSource Computer Vision) là một thư viện mã nguồn mở. OpenCV được phát hành theo giấy phép BSD, do đó nó hoàn toàn miễn phí cho cả học thuật và thương mại. Nó có các interface C++, C, Python, Java và hỗ trợ Windows, Linux, Mac OS, iOS và Android. OpenCV được thiết kế để tính toán hiệu quả và với sự tập trung nhiều vào các ứng dụng thời gian thực. Được viết bằng tối ưu hóa C/C++, thư viện có thể tận dụng lợi thế của xử lý đa lõi. Được sử dụng trên khắp thế giới, OpenCV có cộng đồng hơn 47 nghìn người dùng và số lượng download vượt quá 6 triệu lần. Phạm vi sử dụng từ nghệ thuật tương tác, cho đến lĩnh vực khai thác mỏ, bản đồ trên web hoặc công nghệ robot. [13]

Một số module mà chúng ta có thể làm việc thường xuyên nếu chúng ta sử dụng thư viện này:

- Core: Đây là module chứa các cấu trúc, class cơ bản mà OpenCV sẽ sử dụng trong việc lưu trữ và xử lý hình ảnh như Mat, Scale, Point, Vec… và các phương thức cơ bản sử dụng cho các module khác.

- Imgproc: Đây là một module xử lý hình ảnh của OpenCV bao gồm các bộ lọc (filter) linear và non-linear và các phép biến đổi hình học (tranformation) như resize hoặc các phép biến đổi affine, chuyển đổi hệ máy và các thuật toán liên quan đến histogram (biểu đồ) của hình ảnh.

- Highgui: Đây là một module cho phép tương tác với người dùng trên UI (User Interface) như hiển thị hình ảnh, video capturing.

- Features2d: Module tìm các đặc trưng (feature) của hình ảnh. Trong module có implement các thuật toán rút trích đặc trưng như PCA…

- Calib3d: Hiệu chuẩn máy ảnh và xây dựng lại 3D.

- Objdetect: Module cho việc phát hiện các đối tượng như khuôn mặt, đôi mắt, cốc, người, xe hơi, … trong hình ảnh. Các thuật toán được sử dụng trong module này là Haar‐like Features.

- ml: Module này chứa các thuật toán về Machine Learning phục vụ cho các bài toàn phân lớp (Classfitication) và bài toán gom cụm (Clustering). Ví dụ như thuật toán SVM (Support Vector Machine), ANN…

- Video: Module phân tích video gồm ước lượng chuyển động, trừ nền, và các thuật toán theo dõi đối tượng (object tracking).

OpenCV đang được sử dụng rộng rãi trong các ứng dụng bao gồm:

• Nhận diện hình ảnh

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

• Robot và xe hơi tự lái

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

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

• Phim - cấu trúc 3D từ chuyển động

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

Đối với sinh viên ngành điện tử viễn thông việc ứng dụng thư viện mã nguồn mở OpenCV có thể thực hiện được rất nhiều các bài toán lý thú trên các bo mạch phát triển sẵn như Raspberry pi hay Adruino.

2.7.2 Numpy

NumPy là một từ viết tắt của "Numeric Python" hoặc "Numerical Python". Nó là một mô-đun mở rộng mã nguồn mở cho Python, cung cấp các chức năng biên dịch nhanh cho các thao tác toán học và số. Hơn nữa, NumPy làm phong phú ngôn ngữ lập trình Python với các cấu trúc dữ liệu mạnh mẽ để tính toán hiệu quả các mảng và ma trận đa chiều. Việc thực hiện thậm chí là nhằm vào ma trận và mảng khổng lồ. Bên cạnh đó các mô-đun cung cấp một thư viện lớn các chức năng toán học cấp cao để hoạt động trên các ma trận và mảng.

2.7.3 Keras

Keras là một thư viện được phát triển vào năm 2015 bởi François Chollet, là một kỹ sư nghiên cứu deep learning tại Google. Nó là một mã nguồn mở cho mạng nơ-ron được viết bởi ngôn ngữ Python. Keras là một API bậc cao có thể sử dụng chung với các thư viện deep learning nổi tiếng như Tensorflow (được phát triển bởi Google), CNTK (được phát triển bởi microsoft), Theano (người phát triển chính Yoshua Bengio). Keras có một số ưu điểm như:

• Dễ sử dụng, xây dựng model nhanh.

• Có thể chạy trên cả CPU và GPU

• Hỗ trợ xây dựng CNN, RNN và có thể kết hợp cả hai

2.7.4 TensorFlow

Thư viện TensorFlow là thư viện mã nguồn mở dùng cho tính toán số học sử dụng đồ thị luồng dữ liệu.

TensorFlow ban đầu được phát triển bởi các nhà nghiên cứu và kỹ sư làm việc trong nhóm Google Brain trong tổ chức Nghiên cứu trí thông minh máy của Google với mục đích tiến hành học máy và nghiên cứu mạng lưới thần kinh sâu. Hệ thống có thể áp dụng trong nhiều lĩnh vực khác nhau.

Ưu điểm của TensorFlow:

• Tích hợp sẵn rất nhiều các thư viện machine learning.

• Có khả năng tương thích và mở rộng tốt. Được Google phát triển cho machine learning phục vụ nghiên cứu lẫn xây dựng các ứng dụng thực tế.

• Phổ biến.

2.7.5 Dlib

Dlib được tạo ra từ 2002 bởi tác giả Davis King, được viết trên ngôn ngữ lập trình C++. Khác với mục đích của OpenCV là cung cấp hạ tầng thuật toán cho các ứng dụng xử lý ảnh và thị giác máy tính, dlib được thiết kế cho các ứng dụng máy học (machine learning) và trí tuệ nhân tạo với các thư viện con chính như sau:

- Classification: các kỹ thuật phân lớp chủ yếu dựa trên hai phương pháp cơ sở là kNN và SVM.

- Data transformation: các thuật toán biến đổi dữ liệu nhằm giảm số chiều, loại bỏ các dữ liệu dư thừa và tăng cường tính khác biệt (discriminant) của các đặc điểm được giữ lại.

- Clustering: các kỹ thuật phân cụm.

- Regression: các kỹ thuật hồi qui.

- Structure prediction: các thuật toán dự đoán có cấu trúc.

- Markov Random Fields: các thuật toán dựa trên các trường Markov ngẫu nhiên.

Chương 3:

PHÂN TÍCH VÀ XÂY DỰNG HỆ THỐ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, chúng em 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 bằng ngôn ngữ python, sử dụng mạng nơ-ron tích chập (CNN)

3.1 Phân tích – thiết kế hệ thống phát hiện mặt người

3.1.1 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).

[pic]

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

• Thu thập bộ dữ liệu khuôn mặt (dataset)

• Trích chọn đặc trưng từng khuôn mặt và gắn nhãn tương ứng (pre-train)

• Phát hiện khuôn mặt trên ảnh đầu vào (face detection)

• Căn chỉnh khuôn mặt (face alignment)

• Trích xuất các vector đặc trưng của khuôn mặt (extract feature)

• Nhận dạng khuôn mặt (face recognition)

• . Xử lý thông tin khuôn mặt vừa nhận dạng và tiến hành điểm danh

[pic]

Hình 23. Sơ đồ thực hiện

3.1.2 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.

3.1.3 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 đầ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.

3.1.4 Trích chọn đặc trưng và gán nhãn

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.

Trong dự án này, bộ dữ liệu sẽ được trích xuất đặc trưng và huấn luyện bằng pre-trained model Keras FaceNet được đào tạo trước do Hiroki Taniai cung cấp, nó được đào tạo trên bộ dữ liệu MS-Celeb-1M (Microsoft Celeb), với hình ảnh đầu vào là ảnh màu, để làm trắng các giá trị pixel của chúng (được chuẩn hóa trên cả ba kênh) và có hình vuông kích thước 160 × 160 pixel.

MS-Celeb-1M là bộ dữ liệu hơn 10 triệu hình ảnh của gần 100000 người nổi tiếng trên Thế Giới trong đó có Việt Nam, được thu thập trên internet từ năm 2016, hiện nay nó đã bị Microsoft dừng phát hành

3.1.4.1 Phát hiện khuôn mặt

Để trích chọn đặc trưng cho mỗi khuôn mặt, trước tiên ta cần tìm ra vị trí khuôn mặt trong bức hình. Vì bộ dữ liệu sẽ bao gồm nhiều ảnh có điều kiện ánh sáng cũng như các góc độ của khuôn mặt khác nhau, chính vì vậy việc lựa chọn face detector cũng rất quan trọng để đảm hiệu quả cao nhất cho hệ thống.

Đầu tiên, tôi sẽ thử với phương pháp sử dụng haar cascade xml:

[pic]

Hình 25. Phát hiện khuôn mặt với Haar cascade

Kết quả cho ta thấy, haar cascade hiệu quả với các khuôn mặt thẳng và không bị che khuất như mắt kính trong trường hợp của bạn nữ. Hay có các góc nghiêng mạnh như trường hợp bạn nam, haar cascade đã nhận nhầm vùng tai, điều này thật sự không tốt khi sử dụng cho việc pre-train.

Tiếp theo tôi sẽ thử với MTCNN:

[pic]

Hình 26. Phát hiện khuôn mặt với MTCNN

Với MTCNN, tất cả các khuôn mặt có trong hình đều được phát hiện ra, ngay cả khuôn mặt nghiêng hay có vật cản.

Như vậy, trong dự án này tôi sẽ sử dụng MTCNN làm công cụ phát hiện khuôn mặt.

3.1.4.2 Trích chọn đặc trưng và gắn nhãn (pre-train):

Trong dự án này tôi sử dụng pre-trained model có sẵn đó là FaceNet.

Bộ dữ liệu khuôn mặt sẽ được chia theo từng thư mục tương ứng với hình ảnh của từng đối tượng (sinh viên). Hệ thống sẽ tiến hành quét qua toàn bộ ảnh trong các thư mục. Face detector sẽ tìm kiếm khuôn mặt có trong ảnh (mặc định mỗi ảnh sẽ chỉ chưa một khuôn mặt), cắt lấy khuôn mặt và đưa kích thước về 160x160 pixel. Sau đó FaceNet sẽ tiến hành trích rút đặc trưng của từng khuôn mặt, áp dụng mô hình học với thuật toán Triplet Loss và gắn nhãn cho từng khuôn mặt (nhãn sẽ được lấy theo tên thư mục chứa ảnh).

3.1.5 Phát hiện khuôn mặt trong ảnh đầu vào:

Hình ảnh đầu vào có thể chứa nhiều khuôn mặt, các khuôn mặt này có thể không đồng nhất về điều kiện ánh sáng, góc độ, biểu cảm,… Vì vậy tôi vẫn sẽ sử dụng MTCNN làm công cụ phát hiện khuôn mặt vì sự mạnh mẽ của nó.

3.1.6 Căn chỉnh khuôn mặt trước khi nhận dạng:

Căn chỉnh khuôn mặt là khá quan trọng, việc này giúp cải thiện phần nào độ chính xác khi đưa vào nhận dạng.

Trong dự án này, tôi sử dụng phương pháp căn chỉnh 2D, dựa vào các mốc trên khuôn mặt (đặc biệt là vùng mắt) để thực hiện xoay, dịch chuyển và điều chỉnh tỷ lệ của khuôn mặt về cùng một kích thước.

Cụ thể, thuật toán lấy vị trí mắt trái và mắt phải từ MTCNN, tính toán điểm giữa và tiến hành xoay khuôn mặt sao cho hai mắt cùng nằm trên hàng ngang.

[pic]

Hình 27. Trước và sau khi căn chỉnh khuôn mặt

3.1.7 Trích rút đặc trưng khuôn mặt từ ảnh đầu vào:

Sau khi phát hiện và căn chỉnh khuôn mặt, hệ thống sẽ tiến hành trích rút đặc trưng khuôn mặt bằng FaceNet. Sau đó các đặc trưng này sẽ được đưa vào “không gian embeddings” để so sánh với bộ dữ liệu các đặc trưng đã có.

3.1.8 Nhận diện khuôn mặt

Trong “không gian embeddings”, các khuôn mặt ở dạng vector 128 chiều sẽ được đối chiếu với bộ dữ liệu để tìm ra khuôn mặt giống nhất và gắn nhãn cho chúng.

Trong dự án này, tôi sử dụng phép đo cosine similarity (độ tương tự cosine) để tiến hành so sánh. Ta sử dụng cosine similarity khi chỉ quan tâm đến góc giữa 2 vector mà không quan tâm đến khoảng cách giữa chúng.

[pic]

Hình 28. Cosine similarity

[pic]

Dựa vào cosine similarity ta có thể tính cosine distance (khoảng cách cosine) bằng công thức:

cosine_distance = 1 – cosine_similarity

Đầu vào của hàm cosine là mảng chứa vector 128 chiều của khuôn mặt trong ảnh chưa khuôn mặt cần nhận dạng mà FaceNet vừa tính toán, và bộ dữ liệu gồm các mảng chứa vector 128 chiều của các khuôn mặt đã được huấn luyện từ trước. Cosine distance sẽ tính lần lượt khoảng cách giữa vector đầu vào với các vector trong bộ dữ liệu để tìm ra vector có giá trị thấp nhất (khoảng cách ngắn nhất), tương ứng với độ tương tự cao nhất.

3.1.9 Xác định các khuôn mặt “unknown”

Với một hệ thống nhận diện khuôn mặt, việc loại trừ các trường hợp có nhiều điểm chung trong khuôn mặt là cực kì cần thiết. Hoặc đơn giản là có một gương mặt lạ xuất hiện trong bức hình cũng bị nhận nhầm là người dùng của hệ thống. Các khuôn mặt lạ này chung quy lại là các khuôn mặt “unknown”.

Các khuôn mặt “unknown” là các khuôn mặt không có trong bộ dữ liệu được huấn luyện từ trước. Khi ảnh xuất hiện các khuôn mặt này, nếu không tiến hành xác định và loại trừ thì khả năng cao hệ thống sẽ nhận nhầm với các khuôn mặt có trong bộ dữ liệu và tiến hành nhận diện sai là rất cao.

Từ cosine distance ta có thể xác định các khuôn mặt “unknown” với một tỉ lệ nhất định dựa trên ngưỡng cho phép (threshold). Không có một quy tắc chuẩn nào cho việc lựa chọn ngưỡng trong nhận dạng khuôn mặt, mà giá trị ngưỡng này được chọn thông qua các lần thử nghiệm mang lại kết quả tốt nhất.

3.2 Kết quả thử nghiệm hệ thống

3.2.1 Giao diện chương trình:

[pic]

Hình 29: Giao diện tạo mới người dùng

[pic]

Hình 30: File hình ảnh được tạo ra

[pic]

Hình 31: Giao diện training

[pic]

Hình 32: Giao diện nhận diện

KẾT LUẬN

1.Kết quả đạt được

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à mô hình nơ-ron tích chập (CNN). Chúng em đã áp dụng thành công mô hình CNN 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, em đã tìm hiểu về deep learning, ngôn ngữ Python, qua đó biết cách lập trình với ngôn ngữ Python và có thêm kiến thức về deep learning

Về chương trình demo, sau khi thử nghiệm với tập ảnh lớn 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 (chụp bằng máy kĩ thuật số), tuy nhiên đối với các ảnh chụp quá 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 suấ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á 200.

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

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.

DANH MỤC TÀI LIỆU THAM KHẢO

[1] G. Yang and T. S. Huang, “Human Face Detection in Complex Background”, Pattern Recognition, vol. 27, no. 1, pp. 53-63, 1994.

[2] A. Lanitis, C.J. Taylor, and T.F. Cootes, “An Automatic Face Identification System Using lexible Appearance Models”, Image and Vision Computing, vol. 13, no. 5, pp. 393-401, 1995.

[3] Andrew King, “A Survey of Methods for Face Detection”, 2003.

[4] A. Yuille, P. Hallinan, and D. Cohen, “Feature Extraction from Faces Using eformable Templates”, Int’l J. Computer Vision, vol. 8, no. 2, pp. 99-111, 1992.

[5] D.G. Kendall, “Shape Manifolds, Procrustean Metrics, and Complex Projective Shapes”, Bull. London Math. Soc., vol. 16, pp. 81-121, 1984.

[6] E. Osuna, R. Freund, and F. Girosi, “Training Support Vector Machines: An Application to Face Detection” Proc. IEEE Conf. Computer Vision and Pattern Recognition, pp. 130-136, 1997.

[7] Fuzhen Huang and Jianbo Su, “Multiple Face Contour Detection Using adaptive Flows”, Sinobiometrics 2004, LNCS 3338, pp. 137-143, Springer-Verlag Berlin eidelberg, 2004.

[8] H.P. Graf, T. Chen, E. Petajan, and E. Cosatto, “Locating Faces and Facial Parts”, Proc. First Int’l Workshop Automatic Face and Gesture Recognition, pp. 41-46, 1995.

[9] J. Canny, “A Computational Approach to Edge Detection”, IEEE Trans. Pattern Analysis and Machine Intelligence, vol. 8, no. 6, pp. 679-698, June 1986. [10] J. Sobottka and I. Pitas, “Segmentation and Tracking of Faces in Color Images”, Proc. Second Int’l Conf. Automatic Face and Gesture Recognition, pp. 236-241, 1996.s

-----------------------

Hiện nay, cùng với sự phát triển của xã hội, vấn đề án ninh bảo mật đang được yêu cầu khắt khe ở mọi nơi trên thế giới. Các hệ thống nhận dạng con người được ra đời với độ tin cậy ngày càng cao. Một trong các bài toán nhận dạng con người rất được quan tâm hiện nay là nhận dạng khuôn mặt. Vì nhận dạng khuôn mặt là cách cơ bản và dễ dàng nhất mà con người dùng để phân biệt nhau. Bên cạnh đó, ngày nay việc thu thập, xử lý thông tin qua ảnh để phân biệt đối tượng đang được quan tâm và ứng dụng rộng rãi. Với phương pháp này, chúng ta có thể thu nhận được nhiều thông từ đối tượng mà không cần tác nhiều đến đối tượng nghiên cứu.

Một trong những bài toán được nhiều người quan tâm nhất của lĩnh vực xử lý ảnh hiện nay đó là nhận dạng khuôn mặt (Face Recognition). Như chúng ta đã biết, khuôn mặt đóng vai trò quan trọng trong quá trình giao tiếp giữa người với người, nó mang một lượng thông tin giàu có, chẳng hạn như từ khuôn mặt chúng ta có thể xác định giới tính, tuổi tác, chủng tộc, trạng thái cảm xúc, đặc biệt là xác định mối quan hệ với đối tượng (có quen biết hay không). Do đó, bài toán nhận dạng khuôn mặt đóng vai trò quan trọng trong nhiều lĩnh vực đời sống hằng ngày của con người như các hệ thống giám sát, quản lý vào ra, tìm kiếm thông tin một người nổi tiếng, …đặc biệt là an ninh, bảo mật. Có rất nhiều phương pháp nhận dạng khuôn mặt để nâng cao hiệu suất tuy nhiên dù ít hay nhiều những phương pháp này đang vấp phải những thử thách về độ sáng, hướng nghiêng, kích thước ảnh, hay ảnh hưởng của tham số môi trường.

Trong khuôn khổ đồ án này, chúng em sẽ tiếp tục giải quyết bài toán nhận dạng offline. Trong đó đối tượng được thu thập thành các file dữ liệu và được chuyển về trung tâm. Tại đó, các số liệu sẽ được phân tích xử lý. Chúng em sẽ lấy đó làm nền tảng để có thể xây dựng các ứng dụng lớn hơn sau này

Để thực hiện và hoàn thành tốt đồ án này, em đã nhận được sự giúp đỡ và hướng dẫn rất tận tình của các thầy cô thuộc Trường Đại học Công nghệ thông tin và Truyền thông Việt Hàn – Đại học Đà Nẵng. Em xin cảm ơn các thầy cô thuộc bộ môn chuyên ngành đã cung cấp cho chúng em các thông tin, kiến thức vô cùng quý báu và cần thiết trong suốt thời gian quá để em có thể thực hiện và hoàn thành đồ án của mình. Đặc biệt em xin chân thành cảm ơn thành cô Hà Thị Minh Phương người đã trực tiếp hướng dẫn chúng em trong thời gian thực hiện đồ án này.

Cuối cùng, xin chân thành cảm ơn các bạn trong ngành công nghệ thông tin đã ủng hộ, giúp đỡ, chia sẻ kiến thức, kinh nghiệm và tài liệu có được giúp chúng tôi trong quá trình nghiên cứu và thực hiện đề tài.

Do giới hạn về mặt thời gian và kiến thức cũng như kinh nghiệm thực tiễn nên đề tài không tránh khỏi những sai sót. Em rất mong nhận được sự thông cảm của quý thầy cô và mong đón nhận những góp ý của thầy cô và các bạn.

Em xin chân thành cảm ơn!

[pic]

[pic]

Lấy các đặc trưng và huấn luyện nhận dạng

Hình 24: Sơ đồ hệ thống

................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download