QUI TRÌNH THỰC HIỆN Hiện nay có rất nhiều kỹ thuật để thực hiện việc nhận dạng khuôn mặt, tuy nhiên điểm chung của các kỹ thuật này là đều sẽ phải thực hiện qua 4 bước: ● Xác định và lấy
Trang 1Đại Học Quốc Gia TP.HCM Trường Đại Học Bách Khoa
BÀI TẬP LỚN XỬ LÝ ẢNH
ĐỀ TÀI:
NHẬN DẠNG KHUÔN MẶT (FACIAL RECOGNITION)
Giảng viên hướng dẫn:
Thành viên: Phan Ngọc Lưu 1813018
Trần Đức Lam 1812754Nguyễn Quang Huy 1812398Phan Đình Đạt 1811890
Trang 2MỤC LỤC
MỤC LỤC 1
LỜI NÓI ĐẦU 2
I GIỚI THIỆU ĐỀ TÀI 3
II QUI TRÌNH THỰC HIỆN 3
1 Tìm và xác định khuôn mặt 4
1.1 HOG (histogram of oriented gradients) 4
1.2 Face_recognition 8
2 Chỉnh hướng khuôn mặt 9
2.1 Facial landmark 9
2.2 Multi_face_landmarks 10
3 Mã hóa khuôn mặt 11
3.1 Convolutional Neural Network 11
3.2 Face_encodings 15
4 Xác thực tên người từ đoạn mã hóa 16
4.1 SVM Classifier 16
4.2 Compare_faces và Face_distance 17
5 Thực hành và kết quả 18
5.1 Code 18
5.2 Giải thích các hàm 20
5.3 Kết quả 24
III KẾT LUẬN 26
Tài liệu tham khảo: 26
Trang 3LỜI NÓI ĐẦU
Trong khoảng mười năm gần lại đây, với sự phát triển nhanh chóng của công nghệ, dẫntới sự ra đời của hang loạt thiết bị với khả năng xử lí, tốc độ tính toán vượt bậc Cùng lúc
đó, việc thu nhận và xử lý thông tin với khối lượng ngày càng lớn, chính vì thế nhữngphần mềm thủ công không còn hiệu quả nữa “Xử lý ảnh” ra đời mang lại sự chính xácnhanh chóng và có nhiều ứng dụng trong cuộc sống Không những đây là một môn họcquan trọng đòi hỏi kiến thức về toán và xác suất, mà còn hữu ích trong việc giải quyếtnhiều bài toán, vấn đề thực tiễn
Với mục tiêu áp dụng kiến thức đã học cũng như có thêm hiểu biết về lĩnh vực xử lý ảnh,
nhóm đã chọn đề tài “Nhận dạng khuôn mặt (Facial Recognition)” Trong quá trình
tìm hiểu tài liệu, do hạn chế về tầm hiểu biết nên bài báo cáo còn một số khuyết điểm.Kính mong nhận được ý kiến góp ý để nhóm hoàn thiện hơn
Trang 4I GIỚI THIỆU ĐỀ TÀI
Vào thời điểm mình viết bài viết này, chắc hẳn cụm từ Nhận dạng khuôn mặt (Facial
Recognition) đã không còn là một khái niệm quá xa lạ đối với bất kỳ một ai Đây là một
kỹ thuật nhằm xác định một người từ một hình ảnh hoặc một khung hình trong video lấy được Công nghệ nhận diện khuôn mặt giờ đã trở nên rất quen thuộc, và được áp dụng phổ biến trong các hệ thống an ninh ở nhiều nơi trên thế giới, trong đó có cả Việt Nam
Ưu điểm của công nghệ này so với các công nghệ nhận dạng khác (nhận dạng vân tay,
nhận dạng giọng nói, nhận dạng mống mắt) chính là việc nó không đòi hỏi sự hợp tác
đến từ người dùng.
Thông qua bài tập lớn lần này, nhóm chúng em sẽ xây dựng một hệ thống cho việc nhận dạng khuôn mặt dựa vào thư viện Dlib của OpenCV
II QUI TRÌNH THỰC HIỆN
Hiện nay có rất nhiều kỹ thuật để thực hiện việc nhận dạng khuôn mặt, tuy nhiên điểm chung của các kỹ thuật này là đều sẽ phải thực hiện qua 4 bước:
● Xác định và lấy ra (các) khuôn mặt có trong hình ảnh, video, camera từ thời gian thực
Trang 5● Từ các khuôn mặt lấy ra từ bước 1, thực hiện việc phân tích chỉnh hướng khuôn mặt, xác định tọa độ các điểm mắt mũi miệng và hướng của khuôn mặt theo dữ liệu gốc.
● Mã hóa khuôn mặt dùng encode từ thư viện face_recognition thành ảnh 128 vecto
● Từ các thông tin có được sau khi phân tích, kết luận và xác minh danh tính người dùng
1 Tìm và xác định khuôn mặt
1.1 HOG (histogram of oriented gradients)
HOG(histogram of oriented gradients) là một feature descriptor được sử dụng trong computer vision và xử lý ảnh, dùng để detec một đối tượng Mục đích của “feature descriptor” là trừu tượng hóa đối tượng bằng cách trích xuất ra những đặc trưng của đối tượng đó và bỏ đi những thông tin không hữu ích Vì vậy, HOG được sử dụng chủ yếu để
mô tả hình dạng và sự xuất hiện của một đối tượng trong ảnh
Các bước cơ bản việc tính một vector HOG cho một ảnh: Tính gradient, tính vector đặc trưng cho từng ô (cells), chuẩn hóa khối (blocks), tính toán vector đặc trưng HOG
- Tính gradient: Thường được thực hiện hai phép nhân chập ảnh gốc với 2 chiều, tương
ứng với các toán tử lấy đạo hàm theo hai hướng Ox và Oy Trong đó, 2 hướng tương ứng đó:
Nếu ảnh input I, 2 ảnh đạo hàm riêng theo 2 hướng đó được tính theo công thức:
Gradient bao gồm hai thành phần cường độ(Gradient Magnitude) và hướng(Gradient Derection) theo công thức:
Trang 6Kết quả phép lấy đạo hàm:
- Tính vector đặc trưng cho từng ô (cells): Sau khi tính đạo hàm, ta có thành phần
hướng ở các điểm ảnh trong mỗi cell của ảnh input Các giá trị hướng này được chia thành các vùng hướng đều nhau trong khoảng từ 0 tới 360° Các giá trị hướng nằm trong khoảng [0, 360/9) sẽ được gán bằng 1 (coi là như nhau), các giá trị hướng trong khoảng [360/9, 2*360/9) sẽ được gán bằng 2… Sau đó histogram của mỗi cell sẽ được tính độc lập
Để đáp ứng tốt hơn với các thay đổi về điều kiện ánh sáng và độ tương phản, các giá trị gradient cần phải được chuẩn hóa cục bộ, điều này đòi hỏi việc nhóm các cell thành các vùng liên kết không gian với nhau gọi là các khối Vector HOG do đó sẽ là tổng hợp các histogram của các cell đã được chuẩn hóa từ tất cả các khối Các khối sẽ được chia và không tách biệt nhau, nói cách khác mỗi cell sẽ đóng góp thông tin về các hướng (tại các điểm ảnh của nó) nhiều hơn 1 lần
Trang 7Như trong hình ảnh trên, đầu tiên là pixel có bao quanh màu xanh lam Nó có hướng 80 độ
và cường độ là 2, vì vậy thêm 2 vào bin thứ 5 (hướng 80 độ) Tiếp theo là pixel có bao quanh màu đỏ Nó có hướng 10 độ và cường độ 4 Vì không có bin 10 độ, nên vote cho bin 0 độ và 20 độ, mỗi bin thêm 2 đơn vị Sau khi vote hết các pixel trong một cell kích thước 8x8 vào 9 bin, ta có thể thu được kết quả như sau:
Trang 8- Chuẩn hóa khối (blocks): Có nhiều phương pháp có thể được dùng cho việc chuẩn hóa
khối Gọi v là vector cần chuẩn hóa chứa tất cả các histogram của một khối, ||vk|| là giá trịchuẩn của nó theo các chuẩn k=1, 2 và e là một hằng số nhỏ, khi đó các giá trị chuẩn hóa
có thể tính bằng 1 trong các công thức sau:
- Tính toán vector đặc trưng HOG:
Với mỗi hình ảnh kích thước 64x128, chia thành các block 16x16 chồng nhau, sẽ
có 7 block ngang và 15 block dọc, nên sẽ có 7x15 = 105 blocks
Mỗi block gồm 4 cell Khi áp dụng biểu đồ 9-bin cho mỗi cell, mỗi block sẽ được đại diện bởi một vector có kích thước 36x1
Vì vậy, khi nối tất cả các vector trong một block lại với nhau, ta sẽ thu được vectorđặc trưng HOG của ảnh có kích thước 105x36x1 = 3780x1
Trang 9Ví dụ minh họa thuật toán HOG:
1.2 Face_recognition
Định vị và trả về các tọa độ của faces trong ảnh Đầu tiên sẽ lấy các vị trí khuôn mặt, sau
đó sẽ cần chúng để vẽ các hộp thông qua hàm face_locations (dựa trên thuật toán HOG) của thư viện face_recognition
Tọa độ và xác định vị trí của khuôn mặt
Trang 102 Chỉnh hướng khuôn mặt
Sau khi đã tách được mặt ra rồi Nhưng giờ phải đối mặt với vấn đề khác: khuôn mặt với góc chụp khác nhau là hoàn toàn khác nhau với máy tính Để giải quyết vấn đề này, chúng ta cố gắng biến đổi bức ảnh sao cho mắt và môi luôn luôn ở cùng một vị trí đối vớiảnh đã học Điều này cũng khiến việc so sánh khuôn mặt ở bước kế tiếp dễ hơn
2.1 Facial landmark
Việc xác định facial landmark gồm có hai bước:
Bước 1: Xác định được vị trí khuôn mặt trong bức ảnh
Bước 2: Xác định được các điểm tạo nên cấu trúc của khuôn mặt
Việc xác định vị trí khuôn mặt có thể được thực hiện bằng nhiều cách từ đơn giản nhưthuật toán Haar cascades đến phức tạp như các thuật toán dựa trên deep-learning Tuynhiên dù sử dụng thuật toán nào, mục đích cuối cùng là thu được một vùng (thường làhình vuông) được xác định bởi tọa độ (x,y) bao quanh khuôn mặt trong bức ảnh
Sau khi xác định được khuôn mặt trong bức ảnh, chúng ta sẽ xác định cấu trúc của khuônmặt Facial landmark sẽ xác định các vị trí như miệng, lông mày, mắt phải, mắt trái, mũi,hàm
Ví dụ bộ xác định facial landmark của dlib là cài đặt của thuật toán được mô tả trong bàibáo One Millisecond Face Alignment with an Ensemble of Regression Trees của Kazemi
và Sullivan (2014), được xác định bởi 68 landmarks theo tọa độ (x,y):
Trang 112.2 Multi_face_landmarks
Hàm multi_face_landmarks thu thập các khuôn mặt đã được dò hoặc nhận diện, mỗi khuôn mặt là 1 list gồm 468 landmarks, mỗi landmark bao gồm x,y,z được chuẩn hóa 0-
>1 và đại diện cho chiều chiều rộng, chiều cao, độ sâu
Chuẩn hóa mặt người bằng cách tìm các điểm mốc chính trên khuôn mặt, rồi biến đổi ảnh để mắt và môi nằm ở chính giữa khung ảnh
Kết quả
Trang 123 Mã hóa khuôn mặt
Xử lý hình ảnh dựa trên Convolutional Neural Network cần thu thập một số lượng hình ảnh cho máy tính để học Sau khi thu thập được các hình ảnh cần học đã cắt các phần không liên quan của khuôn mặt, các hình ảnh này đã được cắt và thay đổi kích thước (bước 1 và bước 2) Sau đó, tất cả các hình ảnh được ghép lại và được kết hợp trong bộ
dữ liệu khuôn mặt olivettifaces, sau đó nhận được xử lý mức độ xám trong cơ sở dữ liệu khuôn mặt Truyền khuôn mặt đã tìm được vào một mạng nơron để tách lọc ra vector 128chiều Mạng nơron dùng để tách lọc là mạng nơron tích chập (Convolutional Neural Network)
3.1 Convolutional Neural Network
Convolutional Neural Network là một trong những mô hình của Deep Learning – tập hợpcác thuật toán để có mô hình dữ liệu trừu tượng hóa ở mức cao bằng cách sử dụng nhiều lớp xử lý cấu trúc phức tạp và được sử dụng rộng rãi trong việc nhận dạng hình ảnh, khuôn mặt cực kỳ thông minh, linh hoạt Một mô hình Convolutional Neural Network gồm những lớp cơ bản sau: Convolutional Layer, Pooling Layer, Relu Layer, Fully Connected Layer
- Convolutional Layer: được xem là lớp có vai trò quan trọng nhất Một ma trận 3 chiều
sẽ được Stride (dịch chuyển) theo pixel và dựa vào giá trị từ trái sang phải
Trang 13- Pooling layer: thường được dùng giữa các convolutional layer, để giảm kích thước dữ
liệu nhưng vẫn giữ được các thuộc tính quan trọng Kích thước dữ liệu giảm giúp giảm việc tính toán trong model
Có 2 loại pooling layer phổ biến là: max pooling và average pooling
Trang 14- Relu: là một hàm kích hoạt trong Neural Network Hiện nay, hàm Relu đang được sử dụng khá phổ biến và thông dụng Đặc biệt, Relu sở hữu những ưu điểm nổi bật như: hỗ trợ tính toán nhanh nên rất được ưa chuộng sử dụng trong việc huấn luyện các mạng Neuron Công thức: f(x) = max(0, x)
- Fully connected layer: Sau khi ảnh được truyền qua nhiều convolutional layer và
pooling layer thì model đã học được tương đối các đặc điểm của ảnh (ví dụ mắt, mũi, khung mặt,…) thì ma trận của output của layer cuối cùng, kích thước H*W*D, sẽ được chuyển về 1 vector kích thước (H*W*D)
Áp dụng vào bài toán Mã hóa khuôn mặ, truyền khuôn mặt đã tìm được vào một mạng nơron để tách lọc ra vector 128 chiều
Trang 15Kết quả:
Trang 163.2 Face_encodings
Encode ảnh về vector 128 chiều Vector này sẽ đại diện cho bức ảnh, và khi mô hình
được huấn luyện tốt, 128 thuộc tính này có thể coi như là 128 thuộc tính đặc trưng của
khuôn mặt đó Cũng vì đó, bước huấn luyện mô hình từ khuôn mặt sang vector còn gọi là
bước TRÍCH CHỌN ĐẶC TRƯNG.
Hàm face_encodings của thư viện face_recognition encode ảnh về vector 128 chiều.Kết quả
Trang 174 Xác thực tên người từ đoạn mã hóa
4.1 SVM Classifier
Máy vectơ hỗ trợ (SVM - viết tắt tên tiếng Anh support vector machine) là một khái niệmtrong thống kê và khoa học máy tính cho một tập hợp các phương pháp học có giám sát liên quan đến nhau để phân loại và phân tích hồi quy SVM là một công cụ đắc lực cho các bài toán về xử lý ảnh, hiểu đơn giản là với những bài toán phân nhóm, sẽ tồn tại một đường thằng phân chia các nhóm
Ý tưởng của SVM là tìm một siêu phẳng (hyper lane) để phân tách các điểm dữ liệu Siêuphẳng này sẽ chia không gian thành các miền khác nhau và mỗi miền sẽ chứa một loại giữ liệu
Đối với bài toán với không gian 2 chiều, ta thấy có thể tìm được rất nhiều các đường thẳng để
phân chia 2 bộ điểm xanh, đỏ Trong SVM sử dụng thuật ngữ Margin, là khoảng cách giữa
siêu phẳng (trong trường hợp không gian 2 chiều là đường thẳng) đến 2 điểm dữ liệu gần nhấttương ứng với 2 phân lớp SVM cố gắng tối ưu thuật toán bằng các tìm cách maximize giá trị margin này, từ đó tìm ra siêu phẳng đẹp nhất để phân 2 lớp dữ liệu
Trang 18Giả sử đường thẳng phân chia cần tìm có phương trình là: w1x1+w2x2+b=0
Margin giữa 2 đường thẳng được tính bằng công thức: margin =
Với không gian nhiều chiều, cần tìm phương trình siêu phẳng có phương trình: w T x+b=0
Margin sẽ được tính bằng công thức: margin = ‖w2‖
Áp dụng thuật toán SVM vào bài tập này để xác định người trong cơ sở dữ liệu có đo lường gần nhất với ảnh đầu vào
4.2 Compare_faces và Face_distance
Dùng các hàm compare_faces và face_distance để tìm tên người từ đoạn mã hóa
Face_recognition.compare_faces trả về một danh sách chứa True hoặc false Nếu khuôn mặt được khớp với hình ảnh được đào tạo thì nó sẽ trả về true ở vị trí của tên lớp được phát hiện
Trang 19Face_recognition.face_distance trả về một danh sách chứa khoảng cách giữa khuôn mặt hiện tại và các điểm chính của khuôn mặt huấn luyện Khoảng cách thấp hơn có nghĩa là phù hợp hơn
Trang 20def findEncodings (images):
encodeList = []
for img in images:
img = cv2.cvtColor(img , cv2.COLOR_BGR2RGB)
encode = face_recognition.face_encodings(img)[ 0 ]
encodeList.append(encode)
return encodeList
def markAttendance (name):
with open( 'Attendance.csv' , 'r+' ) as f:
faceMesh = mpFaceMesh.FaceMesh( max_num_faces = )
drawSpec = mpDraw.DrawingSpec( thickness = , circle_radius = )
while True :
success , img = cap.read()
imgS = cv2.resize(img , ( 0 0 ) , None, 0.25, 0.25 )
imgS = cv2.cvtColor(imgS , cv2.COLOR_BGR2RGB)
imgRGB = cv2.cvtColor(img , cv2.COLOR_BGR2RGB)
results = faceMesh.process(imgRGB)
facesCurFrame = face_recognition.face_locations(imgS)
encodesCurFrame = face_recognition.face_encodings(imgS , facesCurFrame)
if results.multi_face_landmarks:
for faceLms in results.multi_face_landmarks:
mpDraw.draw_landmarks(img , faceLms , mpFaceMesh.FACEMESH_CONTOURS , drawSpec , drawSpec) for id , lm in enumerate(faceLms.landmark):
Trang 21cv2.putText(img , f'FPS: { int(fps) } ' , ( 20, 70 ) , cv2.FONT_HERSHEY_PLAIN , , ( 255, , ) , )
for encodeFace , faceLoc in zip(encodesCurFrame , facesCurFrame):
matches = face_recognition.compare_faces(encodeListKnown , encodeFace)
faceDis = face_recognition.face_distance(encodeListKnown , encodeFace)
cv2.rectangle(img , (x1 , y1) , (x2 , y2) , ( 0 255, ) , )
cv2.rectangle(img , (x1 , y2 - 35 ) , (x2 , y2) , ( 0 255, ) , cv2.FILLED)
cv2.putText(img , name , (x1 + 6 y2 - 6 ) , cv2.FONT_HERSHEY_COMPLEX , 0.7, ( 255, 255, 255 ) , )
cv2.imshow( 'webcam' , img)
Trang 22Encode ảnh về vector 128 chiều Vector này sẽ đại diện cho bức ảnh, và khi mô hình đượchuấn luyện tốt, 128 thuộc tính này có thể coi như là 128 thuộc tính đặc trưng của khuôn mặt đó Cũng vì đó, bước huấn luyện mô hình từ khuôn mặt sang vector còn gọi là
Trang 23Ghi lại tên + thời gian phát hiện được trong file Attendance.csv
success, img = cap.read()
Đoạn mã này bắt đầu một vòng lặp vô hạn (sẽ được phá vỡ sau đó bằng một câu lệnh break), trong đó chúng ta có ret và frame được định nghĩa là cap.read () Về cơ bản, ret là một boolean liên quan đến việc có hay không có trả về, tại khung là mỗi khung được trả
về Nếu không có khung, bạn sẽ không gặp lỗi, bạn sẽ nhận được Không có
imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25)
imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)
Resize hình ảnh xuống 1/4 để quá trình nhận dạng mặt nhanh hơn
scale = 0.25