Lần sau khi bạn nhìn thấy Kirill hoặc nhìn thấy một hình ảnh của khuôn mặt của Kirill, tâm trí của bạn sẽ làm theo quá trình này chính xác: 1. Nhận diện khuôn mặt: Nhìn vào bức tranh và tìm một khuôn mặt trong đó. 2. Thu thập dữ liệu: Trích xuất các đặc tính độc đáo của khuôn mặt Kirill mà nó có thể sử dụng để phân biệt anh ta với người khác, như mắt, miệng, mũi, v.v. 3. So sánh dữ liệu: Mặc dù có các biến thể về ánh sáng hoặc biểu thức, nó sẽ so sánh các tính năng độc đáo đó với tất cả các tính năng của tất cả những người bạn biết. 4. Nhận diện khuôn mặt: Nó sẽ xác định "Hey, đó là cậu bé của tôi Kirill!"
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Sinh viên:
TP.HCM, tháng 3 năm 2018
Trang 21 GIỚI THIỆU
Khi bạn nhìn vào quả táo, tâm trí bạn ngay lập tức nói với bạn: đó là quả táo. Quá trình
này được công nhận một cách đơn giản nhất. Vậy, nhận diện khuôn mặt là gì? Tương tự,
nhưng đối với khuôn mặt, rõ ràng
Nhưng, câu hỏi thực sự là:
Làm thế nào một máy tính có thể nhận ra khuôn mặt?
Lấy ví dụ thực tế về cuộc sống:
Khi bạn gặp ai đó lần đầu tiên, bạn không biết người đó là ai, đúng không? Trong khi anh
ấy đang nói chuyện với bạn hoặc lắc tay, bạn đang nhìn vào mặt anh ấy: mắt, mũi, miệng, tông màu da… Quá trình này là tâm trí bạn thu thập dữ liệu và đào tạo để nhận diện khuônmặt
Tiếp theo, người đó nói với bạn rằng tên của anh ấy là Kirill ( vâng, Người hướng dẫn khoa học dữ liệu toàn sao của chúng tôi ). Vì vậy, bộ não của bạn đã nhận được dữ liệu
khuôn mặt, và bây giờ nó đã học được rằng dữ liệu này thuộc về Kirill
Lần sau khi bạn nhìn thấy Kirill hoặc nhìn thấy một hình ảnh của khuôn mặt của Kirill, tâm trí của bạn sẽ làm theo quá trình này chính xác:
1 Nhận diện khuôn mặt: Nhìn vào bức tranh và tìm một khuôn mặt trong đó.
2 Thu thập dữ liệu: Trích xuất các đặc tính độc đáo của khuôn mặt Kirill mà nó có
thể sử dụng để phân biệt anh ta với người khác, như mắt, miệng, mũi, v.v
3 So sánh dữ liệu: Mặc dù có các biến thể về ánh sáng hoặc biểu thức, nó sẽ so
sánh các tính năng độc đáo đó với tất cả các tính năng của tất cả những người bạn biết
4 Nhận diện khuôn mặt: Nó sẽ xác định "Hey, đó là cậu bé của tôi Kirill!"
Trang 3Hinh 1: Hình mẫu
Quy trình nhận diện khuôn mặt của tâm chúng ta
Sau đó, càng có nhiều lần bạn gặp Kirill, càng có nhiều dữ liệu bạn sẽ thu thập về anh ta,
và tâm trí của bạn nhanh hơn sẽ có thể nhận ra anh ta
Bộ não con người của chúng ta có đầy đủ thứ để làm tất cả những điều này tự động. Trongthực tế, chúng ta rất giỏi phát hiện khuôn mặt hầu như ở khắp mọi nơi:
Ví dụ: Gặp gỡ đồng nghiệp trên công ty hằng ngày Máy tính không thể làm việc này tuy
nhiên, để làm điều này tự động, vì thế ta cần phải dạy máy tính làm thế nào để làm điều đó
từng bước
II Phương pháp phát hiện khuôn mặt dựa vào đặc trưng haar-like
Nói đơn giản là: nó sẽ chèn đặc trưng Haarlike lên toàn bộ bức hình của bạn Khu vực nàogiống thì nó sẽ nhận diện ở đó là mặt của bạn Cho nên có rất nhiều khu vực trong hình nó
Trang 4sẽ nhận là mặt của bạn Sau đó nó sẽ dùng các ảnh ko giống để loại trừ các vùng này Cho nên trong quá trình training một bộ nhận dạng của Adaboost, số lượng ảnh sai luôn phải tuơng đối nhiều để nó loại trừ.
Hình 2: Các đặc trưng mở rộng của các đặc trưng Haar-like cơ sở
III LÝ THUYẾT CÔNG NHẬN KHUÔN MẶT OPENCV
Nhờ OpenCV, mã hóa nhận dạng khuôn mặt giờ đây dễ dàng hơn bao giờ hết. Có ba bước
dễ dàng để mã hóa máy tính nhận dạng khuôn mặt, tương tự như các bước mà bộ não của chúng ta sử dụng để nhận dạng khuôn mặt. Các bước này là:
Thu thập dữ liệu: Thu thập dữ liệu khuôn mặt (hình ảnh khuôn mặt trong trường
hợp này) của những người bạn muốn xác định
Đào tạo Trình nhận dạng: Nguồn cấp dữ liệu đối mặt với dữ liệu và tên tương
ứng của mỗi khuôn mặt cho trình nhận dạng để nó có thể tìm hiểu
Trang 5 Công nhận: Nạp khuôn mặt mới của người đó và xem liệu trình nhận diện khuôn
mặt ta vừa đào tạo có nhận ra được không
Và đây là cách Trình nhận diện khuôn mặt của chúng ta sẽ xem xét khi chúng ta hoàn tất
mã hóa:
Hình 3: Kết quả nhận diện
OpenCV có ba trình nhận dạng khuôn mặt tích hợp và nhờ mã hóa rõ ràng, ta có thể sử dụng bất kỳ mã nào trong số chúng chỉ bằng cách thay đổi một dòng mã. Dưới đây là tên của những người nhận diện khuôn mặt và cuộc gọi có trên OpenCV:
EigenFaces - cv2.face.createEigenFaceRecognizer ()
FisherFaces - cv2.face.createFisherFaceRecognizer ()
Biểu đồ mô hình nhị phân cục bộ (LBPH) - cv2.face.createLBPHFaceRecognizer ()
1 EIGENFACES NHẬN DIỆN KHUÔN MẶT
Thuật toán này xem xét thực tế là không phải tất cả các phần của khuôn mặt đều quan
trọng không kém hoặc hữu ích cho nhận dạng khuôn mặt . Thật vậy, khi bạn nhìn vào
Trang 6ai đó, bạn nhận ra người đó bằng những đặc điểm riêng biệt của mình, như mắt, mũi, má hoặc trán; và cách họ thay đổi sự tôn trọng lẫn nhau.
Theo nghĩa đó, bạn đang tập trung vào các vùng thay đổi tối đa . Ví dụ, từ mắt đến mũi có
một thay đổi đáng kể, và áp dụng tương tự từ mũi vào miệng. Khi bạn nhìn vào nhiều khuôn mặt, bạn so sánh chúng bằng cách nhìn vào các khu vực này, bởi vì bằng cách bắt
sự thay đổi tối đa giữa các khuôn mặt, chúng giúp bạn phân biệt một khuôn mặt với khuônmặt kia
Theo cách này, cách trình nhận dạng EigenFaces hoạt động như thế nào. Nó xem xét tất cả
các hình ảnh đào tạo của tất cả mọi người nói chung và cố gắng trích xuất các thành phần
có liên quan và hữu ích và loại bỏ phần còn lại. Những tính năng quan trọng này được gọi
là các thành phần chính .
Lưu ý: Chúng ta sẽ sử dụng các thuật ngữ: thành phần chính s, phương sai , các khu vực
có thay đổi cao và các tính năng hữu ích không rõ ràng vì tất cả chúng đều giống nhau.
Dưới đây là hình ảnh hiển thị phương sai được trích xuất từ danh sách các khuôn mặt
Hình 4: Các thành phần chính của bộ nhận dạng khuôn mặt Eigen Faces
Nguồn: docs.opencv.org
Bạn có thể thấy rằng các tính năng hữu ích đại diện cho các khuôn mặt nhận được tên của
các khuôn mặt Eigen . Vì vậy, bộ nhận dạng EigenFaces tự đào tạo bằng cách trích xuất
các thành phần chính, nhưng nó cũng giữ một bản ghi về những thành phần nào thuộc về
Trang 7người nào. Vì vậy, bất cứ khi nào bạn giới thiệu một hình ảnh mới cho thuật toán, nó lặp lại quá trình tương tự như sau:
1 Trích xuất các thành phần chính từ hình ảnh mới
2 So sánh các tính năng đó với danh sách các phần tử được lưu trữ trong quá trình đào tạo
3 Tìm những người có kết quả phù hợp nhất
4 Trả lại nhãn 'người' được liên kết với thành phần phù hợp nhất đó
Tuy nhiên, một điều cần lưu ý trong hình ảnh trên là thuật toán EigenFaces cũng coi
chiếu sáng là một tính năng quan trọng . Kết quả là, ánh sáng và bóng tối được chọn
bởi EigenFaces, nó phân loại chúng như là một “khuôn mặt”
Nhận diện khuôn mặt chọn lên trên con người, bị chi phối bởi hình dạng và độ tối: hai mắt, mũi, miệng
2 CÔNG CỤ NHẬN DIỆN KHUÔN MẶT FISHERFACES
Thuật toán này là phiên bản cải tiến của phiên bản cuối cùng. Như chúng ta vừa
thấy, EigenFaces xem xét tất cả các khuôn mặt đào tạo của tất cả mọi người cùng một lúc
và tìm thấy các thành phần chính từ tất cả chúng kết hợp. Bằng cách đó, nó không tập trung vào các tính năng phân biệt một cá nhân với người khác. Thay vào đó, nó tập trung vào những cái đại diện cho tất cả các khuôn mặt của tất cả mọi người trong dữ liệu huấn
luyện, nói chung .Nhưng đây là kicker:
Xem xét các thay đổi ánh sáng trong các hình ảnh sau:
Trang 8Hình 5: Các mức độ xáng của một hình Nguồn: docs.opencv.org
Vì EigenFaces cũng tìm thấy sự chiếu sáng như một thành phần hữu ích, nó sẽ tìm thấy biến thể này rất phù hợp cho nhận dạng khuôn mặt và có thể loại bỏ các đặc tính của khuôn mặt của người khác, xem chúng ít hữu ích hơn. Cuối cùng, phương sai mà
EigenFaces đã trích xuất chỉ đại diện cho các đặc điểm khuôn mặt của một cá nhân .
LÀM THẾ NÀO ĐỂ GIẢI QUYẾT VẤN ĐỀ NÀY?
Chúng ta có thể làm điều đó bằng cách điều chỉnh các EigenFaces sao cho nó trích xuất các tính năng hữu ích từ các khuôn mặt của mỗi người một cách riêng biệt thay vì trích xuất chúng từ tất cả các khuôn mặt được kết hợp. Bằng cách này, ngay cả khi một người
có thay đổi ánh sáng cao, nó sẽ không ảnh hưởng đến quá trình khai thác tính năng của người khác
Chính xác, FisherFaces đối mặt với thuật toán nhận dạng trích xuất các thành phần chính
phân biệt một người với những người khác. Theo nghĩa đó, các thành phần của một cá nhân không thống trị (trở nên hữu dụng hơn) so với các thành phần khác
Dưới đây là hình ảnh các thành phần chính sử dụng thuật toán FisherFaces
Trang 9Hình 6: FisherFaces Face Recognizer Các thành phần chính. Nguồn: docs.opencv.org
Bạn có thể thấy rằng các tính năng đại diện cho các khuôn mặt nhận được tên của khuôn mặt Fisher .Một điều cần lưu ý ở đây là FisherFaces chỉ ngăn các tính năng của một người
trở thành duy nhất, nhưng nó vẫn xem xét những thay đổi chiếu sáng như một tính năng hữu ích.Chúng ta biết rằng biến thể ánh sáng không phải là một tính năng hữu ích để trích xuất vì nó không phải là một phần của khuôn mặt thực tế
3 BIỂU ĐỒ NHẬN DẠNG KHUÔN MẪU NHỊ PHÂN CỤC BỘ (LBPH)
Chúng ta biết rằng Eigenfaces và Fisherfaces đều bị ảnh hưởng bởi ánh sáng và chúng ta không thể đảm bảo điều kiện ánh sáng hoàn hảo. Nhận diện khuôn mặt LBPH là một cải tiến để khắc phục nhược điểm này .
Ý tưởng với LBPH không phải là nhìn toàn bộ hình ảnh, mà thay vào đó, hãy cố gắng tìm
cấu trúc cục bộ của nó bằng cách so sánh từng pixel với các pixel lân cận
Trang 10Sau khi bạn đọc các giá trị 0/1 này trong cửa sổ 3 × 3 theo thứ tự chiều kim đồng hồ, bạn
sẽ có một mẫu nhị phân như 11100011 là cục bộ cho một khu vực cụ thể của hình ảnh
Khi bạn hoàn thành việc này trên toàn bộ hình ảnh, bạn sẽ có một danh sách các mẫu nhị
phân cục bộ .
Hình 7: Chuyển đổi LBP thành nhị phân. Nguồn: López & Ruiz;
Các mẫu nhị phân cục bộ được áp dụng cho Nhận diện khuôn mặt và Nhận dạng Bây giờ,sau khi bạn nhận được danh sách các mẫu nhị phân cục bộ, bạn chuyển đổi từng mẫu
thành số thập phân bằng cách sử dụng nhị phân sang chuyển đổi thập phân (như trong hình trên) và sau đó bạn tạo biểu đồ của tất cả các giá trị thập phân đó. Một biểu đồ mẫu
giống như sau:
Cuối cùng, bạn sẽ có một biểu đồ cho mỗi khuôn mặt trong tập dữ liệu huấn luyện.Điều
đó có nghĩa rằng nếu có 100 hình ảnh trong tập dữ liệu huấn luyện thì LBPH sẽ trích xuất
Trang 11100 biểu đồ sau khi đào tạo và lưu trữ chúng để nhận dạng sau này Sau đó trong quá trìnhnhận dạng, quá trình này như sau:
1) Đưa hình ảnh mới vào trình nhận dạng để nhận diện khuôn mặt
2) Trình nhận dạng tạo ra một biểu đồ cho hình ảnh mới đó
3) Sau đó nó so sánh biểu đồ đó với các biểu đồ mà nó đã có
4) Cuối cùng, nó tìm thấy kết quả phù hợp nhất và trả về nhãn người được liên kếtvới kết quả phù hợp nhất đó
Dưới đây là một nhóm các khuôn mặt và hình ảnh mẫu nhị phân cục bộ tương ứng của
chúng. Bạn có thể thấy rằng các mặt LBP không bị ảnh hưởng bởi các thay đổi trong
điều kiện ánh sáng :
Hình 4: Các thành phần chính của bộ nhận dạng khuôn mặt LBPH
Nguồn: docs.opencv.org
Trang 12IV Chương trình
-Tiến hành viết chương trình theo 3 bước:
1) Prepare Tranning Data:Đọc các ảnh dùng để trainning cho mỗi person với gương mặt được phát hiện sẽ dược gán một label tương ứng với người liên quan
2) Train Face Recognize: Sử dụng thư viện OpenCV’s LBPH recognizer để huấn luyện
dữ liệu đã chuẩn bị ở bước 1
3) Prediction:Đưa một vài ảnh bên ngoài để test máy có dự đoán đúng không
1 Prepare Tranning Data
-Dữ liệu trainning bao gồm 2 người mỗi người 12 ảnh Và tất cả được đặt trong thư mục Trainning-data
-Trong folder Tranning-data sẽ chứa các foder con, được đặt tên là s1,s2,… tương ứng vớimỗi person Trong từng folder con sẽ có khoảng 12 ảnh.Cấu trúc thư mục như hình sau:
Trang 13-Folder test-data sẽ chứa
các ảnh dùng để nhận diện và test thử khả năng nhận diện của máy sau khi đã train thành công
Data freparation for face recognizer
Vâng, để biết khuôn mặt nào thuộc về người nào, trình nhận diện khuôn mặt OpenCV chấp nhận thông tin theo một định dạng cụ thể. Trong thực tế, nó nhận được hai vectơ:
Một là khuôn mặt của tất cả mọi người
Thứ hai là các nhãn số nguyên cho mỗi khuôn mặt
Ví dụ: nếu chúng ta có hai cá nhân và hai hình ảnh cho mỗi cá nhân:
Sau đó, bước chuẩn bị dữ liệu sẽ tạo ra các vectơ mặt và nhãn sau:
Cụ thể, chúng tôi có thể chia nhỏ bước này thành các bước phụ sau đây:
Trang 141) Đọc tất cả các tên thư mục con được cung cấp trong thư mụctraining-data.Trong hướngdẫn này;chúng tôi có tên thư mục:s1, s2.
2) Trích xuất số nhãn.Hãy nhớ rằng tất cả các thư mục con chứa hình ảnh của một người theo định dạng:sLabeltrong đó Label là một số nguyên đại diện cho mỗi người.Ví dụ: tên thư mục:s1có nghĩa là người đó có nhãn 1,s2 có nghĩa là nhãn của người đó là 2, v.v.Chúng tôi sẽ chỉ định số nguyên được trích xuất trong bước này cho mọi khuôn mặt được phát hiện trong phần tiếp theo
3) Đọc tất cả các hình ảnh của người đó và áp dụng phát hiện khuôn mặt cho từng
Trang 15 Dòng 12, phương thức cv2.CascadeClassifier của lớp detectMultiScale để phát hiện tất cả các khuôn mặt trong ảnh.
Dòng 20, trong những gương mặt trả về chỉ chọn gương mặt đầu tiên Face[0] (Nếu trong hình có nhiều gương mặt sẽ bị sai)
Khuôn mặt được trả về là hình chữ nhật(x,y,chiều rộng, chiều cao) và không phải là hình ảnh khuôn mặt thực tế Vì vậy dòng 23 là đoạn code trích khuôn mặt từ hình ảnh xám và trả về cả vùng hình ảnh khuôn mặt và hình chữ nhật khuôn mặt
Hàm trích xuất và gán nhãn gương mặt cho data có sẵn:
Trang 16 Trong dòng 8, hàm đọc tên tất cả các thư mục được lưu trên đường dẫn
Dòng 10-13, tạo mảng lưu trữ khuôn mặt và nhãn
Dòng 27, lấy nhãn của đối tượng thông qua tên thư mục
Dòng 31, lấy đường dẫn thư mục chứa ảnh
Dòng 34, lấy tên tất cả các file ảnh trong thư mục
Dòng 47, lấy đường dẫn ảnh
Dòng 50- 72, Đọc ảnh, phát hiện gương mặt, gán nhãn và trả về kết quả
2.Train Face Recognize
-Trong OpenCV có trang bị 3 bộ nhận dạng khuôn mặt
1) EigenFaces: cv2.face.createEigenFaceRecognizer()
2) FisherFace: cv2.face.createFisherFaceRecognizer()
3) LBPHFisherFace:cv2.face.LBPHFisherFaceRecognizer()
Trang 17-Xét về tính chính xác và ổn định lựa chọn LBPHFisherFace sẽ có kết quả tốt hơn 2 bộ còn lại.
Chương trình:
Tạo bô nhận dạng khuôn mặt bằng hàm cv2.face.createLBPHFaceRecognizer()
Tiến hành tranning bằng hàm face_recognize với 2 đối số là 2 mảng numpy (faces và np.array(labels))
3 Prediction
Chương trình:
Hàm đầu tiên draw_rectangle vẽ một hình chữ nhật trên hình ảnh dựa trên các tọa độ đã cho.Nó sử dụng chức năng dựng sẵn của OpenCV cv2.rectangle(img, topLeftPoint, bottomRightPoint, rgbColor, lineWidth) để làm như vậy
Hàm thứ hai draw_text sử dụng hàm dựng sẵn của OpenCV cv2.putText(img, text, startPoint, font, fontSize, rgbColor, lineWidth) để vẽ văn bản trên hình ảnh
Trang 18Hàm nhận diện khuôn mặt:
line-6 đọc hình ảnh thử nghiệm.
Line-7 phát hiện khuôn mặt từ hình ảnh thử nghiệm
line-11 nhận diện khuôn mặt bằng cách gọi phương thức của trình nhận diện khuôn
mặt.Phương thức này sẽ trả về nhãn. predict(face)
line-12 lấy tên được liên kết với thẻ.
Line-16 vẽ hình chữ nhật xung quanh khuôn mặt được phát hiện.
Line-18 vẽ tên của cá nhân được dự đoán ở trên hình chữ nhật khuôn mặt.
4.Áp dụng các hàm đã xây dựng cho chương trình chính xử lí video
Do Video bản chất là tập hợp nhiều frame ảnh, cho nên việc xử lí video thực chất là quá trình xử lí trên từng frame
Trang 19dụng khối try except để xử lí ngoại lệ cho trường hợp những frame không có gương mặt
để video liền mạch và không lỗi
V Kết Quả
Đối với video có 1 người:
Trang 20Đối với video có 2 người trở lên:
Trang 21Trường hợp nhận diện sai:
Trang 22VI)Nhận xét
Đối với video chỉ có 1 người,máy nhận diện đúng và không sai
Đối với video có 2 người trở lên, máy có trường hợp bỏ sót khuôn mặt và 1 vài trường hợpnhận diện sai