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

BÀI TẬP LỚN - XỬ LÝ ẢNH - NHẬN DIỆN KHUÔN MẶT QUA VIDEO

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.33 MB, 22 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCMKHOA ĐIỆN-ĐIỆN TỬ</b>

<b>BỘ MÔN VIỄN THÔNG---</b>

<b>XỬ LÝ ẢNHBÀI TẬP LỚN </b>

<b>Nhận diện khuôn mặt qua video</b>

<b>Sinh viên: </b>

<i>TP.HCM, tháng 3 năm 2018</i>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>1. GIỚI THIỆU</b>

<b>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. Q trình </b>

<b>này được công nhận một cách đơn giản nhất. Vậy, nhận diện khn mặt là gì? Tương tự, </b>

nhưng đối với khn mặt, rõ ràng.Nhưng, câu hỏi thực sự là:

<i>Làm thế nào một máy tính có thể nhận ra khn mặt?</i>

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… Q trình này là tâm trí bạn thu thập dữ liệu và đào tạo để nhận diện khnmặt.

<i>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 tồn sao của chúng tơi ). Vì vậy, bộ não của bạn đã nhận được dữ liệu </i>

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 khn 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. <b>Nhận diện khn mặt: Nhìn vào bức tranh và tìm một khn mặt trong đó.</b>

2. <b>Thu thập dữ liệu: Trích xuất các đặc tính độc đáo của khn mặt Kirill mà nó có </b>

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. <b>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 </b>

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. <b>Nhận diện khn mặt: Nó sẽ xác định "Hey, đó là cậu bé của tơi Kirill!"</b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

Hinh 1: Hình mẫu

Quy trình nhận diện khn 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 khn 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

<i>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 đó</i>

từng bước.

<b>II. Phương pháp phát hiện khn mặt dựa vào đặc trưng haar-like</b>

Nói đơn giản là: nó sẽ chèn đặc trưng Haarlike lên tồ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ó

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

sẽ 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ừ.

<small>Hình 2: Các đặc trưng mở rộng của các đặc trưng Haar-like cơ sở</small>III. <b>LÝ THUYẾT CÔNG NHẬN KHUÔN MẶT OPENCV</b>

Nhờ OpenCV, mã hóa nhận dạng khn mặt giờ đây dễ dàng hơn bao giờ hết. Có ba bướcdễ dàng để mã hóa máy tính nhận dạng khn 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à:

 <b>Thu thập dữ liệu: Thu thập dữ liệu khn mặt (hình ảnh khn mặt trong trường </b>

hợp này) của những người bạn muốn xác định.

 <b>Đà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 </b>

ứng của mỗi khuôn mặt cho trình nhận dạng để nó có thể tìm hiểu.

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

 <b>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 khn </b>

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 khn 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 khn 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:

 <b>EigenFaces - cv2.face.createEigenFaceRecognizer ()</b>

 <b>FisherFaces - cv2.face.createFisherFaceRecognizer ()</b>

 <b>Biểu đồ mơ hình nhị phân cục bộ (LBPH) - cv2.face.createLBPHFaceRecognizer ()</b>

<b>1.EIGENFACES NHẬN DIỆN KHN MẶT</b>

<b>Thuật tố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 </b>

<b>trọng khơng kém hoặc hữu ích cho nhận dạng khn mặt . Thật vậy, khi bạn nhìn vào </b>

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

ai đó, 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.

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

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 khn 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ả

<i>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 </i>

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

<b>là các thành phần chính .</b>

<i><b>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 </b></i>

<i>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.</i>

Dưới đây là hình ảnh hiển thị phương sai được trích xuất từ danh sách các khn mặt.

<i>Hình 4: Các thành phần chính của bộ nhận dạng khn mặt Eigen Faces. </i>

Bạn có thể thấy rằng các tính năng hữu ích đại diện cho các khn mặt nhận được tên của

<i>các khn mặt Eigen . Vì vậy, bộ nhận dạng EigenFaces tự đào tạo bằng cách trích xuất </i>

<b>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ề </b>

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

ngườ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 tốn, nó lặp lại q 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 q 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 đó.

<b>Tuy nhiên, một điều cần lưu ý trong hình ảnh trên là thuật tốn EigenFaces cũng coi </b>

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

bởi EigenFaces, nó phân loại chúng như là một “khn 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.

<b>2. CƠNG CỤ NHẬN DIỆN KHN MẶT FISHERFACES</b>

Thuật tố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

<b>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 </b>

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

<i>luyện, nói chung .Nhưng đây là kicker:</i>

Xem xét các thay đổi ánh sáng trong các hình ảnh sau:

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<i><b>Hình 5: Các mức độ xáng của một hình. Nguồn: docs.opencv.org</b></i>

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 khn mặt và có thể loại bỏ các đặc tính của khn 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à

<i>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 .</i>

<b>LÀM THẾ NÀO ĐỂ GIẢI QUYẾT VẤN ĐỀ NÀY?</b>

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 q trình khai thác tính năng của người khác.

<b>Chính xác, FisherFaces đối mặt với thuật tốn nhận dạng trích xuất các thành phần chính </b>

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 tốn FisherFaces.

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<i><b>Hình 6: FisherFaces Face Recognizer Các thành phần chính. Nguồn: docs.opencv.org</b></i>

<i>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</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ế.

<b>3. BIỂU ĐỒ NHẬN DẠNG KHUÔN MẪU NHỊ PHÂN CỤC BỘ (LBPH)</b>

<i>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 .</i>

<b>Ý tưởng với LBPH khơng phải là nhìn tồn bộ hình ảnh, mà thay vào đó, hãy cố gắng tìm </b>

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.

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

Sau 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

<i>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. </i>

<b>Khi bạn hoàn thành việc này trên tồn bộ hình ảnh, bạn sẽ có một danh sách các mẫu nhị </b>

<b>phân cục bộ .</b>

<i>Hình 7: Chuyển đổi LBP thành nhị phân. Nguồn: López & Ruiz; </i>

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

<b>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 </b>

giống như sau:

Cuối cùng, bạn sẽ có một biểu đồ cho mỗi khn 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

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

100 biểu đồ sau khi đào tạo và lưu trữ chúng để nhận dạng sau này. Sau đó trong q trìnhnhận dạng, q 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 khn 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 khn mặt và hình ảnh mẫu nhị phân cục bộ tương ứng của

<b>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 </b>

<b>điều kiện ánh sáng :</b>

<i>Hình 4: Các thành phần chính của bộ nhận dạng khn mặt LBPH. </i>

<i><b>Nguồn: docs.opencv.org</b></i>

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<b>IV. Chương trình</b>

-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ệndữ liệu đã chuẩn bị ở bước 1.

3) Prediction:Đưa một vài ảnh bên ngồi để test máy có dự đốn đúng khơng.-Các cơng cụ sử dụng

1) OpenCV 3.2.02) Python v3.53) Numpy

<b>1. Prepare Tranning Data</b>

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

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="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.

<i><b>Data freparation for face recognizer</b></i>

Vâng, để biết khuôn mặt nào thuộc về người nào, trình nhận diện khn 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ố ngun cho mỗi khn 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:

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

1) Đọ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ố ngun được trích xuất trong bước này cho mọi khn mặt được phát hiện trong phần tiếp theo.

3) <b>Đọ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 </b>

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

<small></small> Dòng 12, phương thức cv2.CascadeClassifier của lớp detectMultiScale để phát hiện tất cả các khn mặt trong ảnh.

<small></small> 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)

<small></small> Khn 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 khn mặt thực tế. Vì vậy dịng 23 là đoạn code trích khn mặt từ hình ảnh xám và trả về cả vùng hình ảnh khn mặt và hình chữ nhật khn mặt.

<i><b>Hàm trích xuất và gán nhãn gương mặt cho data có sẵn:</b></i>

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="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ữ khn 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ả

<b>2.Train Face Recognize</b>

-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()

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="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 khn 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))

<b>3. Prediction</b>

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.

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

Hàm nhận diện khn mặt:

<small></small> <b>line-6 đọc hình ảnh thử nghiệm.</b>

<small></small> <b>Line-7 phát hiện khn mặt từ hình ảnh thử nghiệm</b>

<small></small> <b>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 khn </b>

mặt.Phương thức này sẽ trả về nhãn. predict(face) <small></small> <b>line-12 lấy tên được liên kết với thẻ.</b>

<small></small> <b>Line-16 vẽ hình chữ nhật xung quanh khn mặt được phát hiện.</b>

<small></small> <b>Line-18 vẽ tên của cá nhân được dự đốn ở trên hình chữ nhật khn mặt.</b>

<b>4.Áp dụng các hàm đã xây dựng cho chương trình chính xử lí video</b>

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à q trình xử lí trên từng frame

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<b>dụ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 </b>

để video liền mạch và khơng lỗi.

<b>V. Kết Quả</b>

Đối với video có 1 người:

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

Đối với video có 2 người trở lên:

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

Trường hợp nhận diện sai:

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

VI)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 khn mặt và 1 vài trường hợpnhận diện sai

</div>

×