You are on page 1of 28

Đạ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 1812754
Nguyễn Quang Huy 1812398
Phan Đình Đạt 1811890

TPHCM, 11/2021
MỤ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

1
LỜ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ẫn
tớ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ững
phầ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ác
nhanh 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ọc
quan 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ết
nhiề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.

2
I. 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.

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

Ví dụ:

4
Kế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.

5
Như 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:

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

7
Ví 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

8
2. 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. Tuy
nhiê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ôn
mặ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ài
bá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):

9
2.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ả

10
3. 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 128
chiề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ợp
cá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.

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

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

13
Kết quả:

14
3.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ả

15
4. 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ệm
trong 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êu
phẳ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ất
tươ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.

16
Giả sử đường thẳng phân chia cần tìm có phương trình là: w 1 x 1 +w2 x 2+ 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
2
Margin sẽ được tính bằng công thức: margin =
‖w‖

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

17
Face_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

Kết quả

5. Thực hành và kết quả


5.1. Code
import os
from datetime import datetime
import cv2
import face_recognition
import numpy as np
from PIL import ImageGrab
import mediapipe as mp
import time

pTime = 0
path = "D:\#BK\XLA\BTL\Python BTL\ImageAttendance"
images = []
classNames = []
myList = os.listdir(path)
print(myList)
for cl in myList:
curImg = cv2.imread(f"{path}/{cl}")
images.append(curImg)
classNames.append(os.path.splitext(cl)[0])
print(classNames)

18
def 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:
myDataList = f.readlines()
nameList = []
for line in myDataList:
entry = line.split(',')
nameList.append(entry[0])
if name not in nameList:
now = datetime.now()
dtString = now.strftime('%H:%M:%S')
f.writelines(f'\n{name},{dtString}')

encodeListKnown = findEncodings(images)
print('Encoding Complete')

cap = cv2.VideoCapture(0)

mpDraw = mp.solutions.drawing_utils
mpFaceMesh = mp.solutions.face_mesh
faceMesh = mpFaceMesh.FaceMesh(max_num_faces=2)
drawSpec = mpDraw.DrawingSpec(thickness=1, circle_radius=2)

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

ih, iw, ic = img.shape


x,y = int(lm.x*iw), int(lm.y*ih)
print(id, x, y)

cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime

19
cv2.putText(img, f'FPS: {int(fps)}', (20, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3)

for encodeFace, faceLoc in zip(encodesCurFrame, facesCurFrame):


matches = face_recognition.compare_faces(encodeListKnown, encodeFace)
faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)
print(faceDis)
matchIndex = np.argmin(faceDis)

if faceDis[matchIndex]:
name = classNames[matchIndex].upper()

else:
name = 'Unknown'
markAttendance(name)
print(name)
y1, x2, y2, x1 = faceLoc
y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.rectangle(img, (x1, y2 - 35), (x2, y2), (0, 255, 0), cv2.FILLED)
cv2.putText(img, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 0.7, (255, 255, 255), 2)

cv2.imshow('webcam', img)
cv2.waitKey(200)

cap.release()
cv2.destroyAllWindows()

5.2. Giải thích các hàm

List append()
Dùng để thêm một phần tử vào vị trí cuối cùng của List hiện tại, nó không trả về một List
mới mà thay vào đó sẽ cập nhật List hiện tại.

Print(myList)
In ra list:

[‘Bill_Gates.jpg’, ‘Elon_Musk.jpg’, ‘Jack_Ma.jpg’, …..]

os.path.splitext()
Chia filename thành hai phần tại vị trí dấu chấm . cuối cùng ở bên phải, và lưu giữ kết
quả dưới dạng một tuple.

classNames.append(os.path.splitext(cl)[0]): Lấy name trước dấu “ . “

Print(classNames)

20
In ra list:

[‘Bill_Gates.’, ‘Elon_Musk.’, ‘Jack_Ma.’, …..]

Cv2.cvtColor
Thực hiện chức năng chuyển đổi giữa hệ màu BGR sang RGB (OpenCV đọc màu dưới
dạng BGR (Xanh lục xanh đỏ), trong đó hầu hết các ứng dụng máy tính đọc là RGB
(Xanh lục đỏ xanh lam))

face_recognition.face_encodings(img)[0]
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.

VD: hình Bill-Gates sẽ được biểu diễn như sau

encodeList.append(encode)
Sau khi mã hóa các hình sang vector 128 chiều thì sẽ thêm vào encodeList bằng lệnh:

21
Ghi lại tên + thời gian phát hiện được trong file Attendance.csv

encodeListKnown = findEncodings(images):
các hình sau mã hóa sẽ lưu vào encodeListKnown

cap = cv2.VideoCapture(0)
mở webcam

while True:
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
box_multiplier = 1/scale

facesCurFrame = face_recognition.face_locations(imgS)

22
Định vị và trả về các tọa độ của faces trong ảnh. Lần này, lần đầu tiên chúng tôi lấy các
vị trí khuôn mặt - chúng tôi sẽ cần chúng để vẽ các hộp

encodesCurFrame = face_recognition.face_encodings(imgS, facesCurFrame)


Bây giờ vì chúng tôi biết vị trí, chúng tôi có thể chuyển chúng đến face_encodings như
đối số thứ hai

Nếu không có điều đó, nó sẽ tìm kiếm khuôn mặt một lần nữa làm chậm toàn bộ quá trình

for encodeFace, faceLoc in zip(encodesCurFrame, facesCurFrame):


Ví dụ công dụng của hàm zip():

matches = face_recognition.compare_faces(encodeListKnown, encodeFace)


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.

faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)


Face_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

matchIndex = np.argmin(faceDis)
Np.argmin trả về chỉ số của điểm có khoảng cách thấp nhất và lưu nó trong biến
matchIndex.

y1, x2, y2, x1 = faceLoc


23
y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4
scale = 0.25
box_multiplier = 1/scale
y1,x2,y2,x1=faceLocation

y1,x2,y2,x1=int(y1*box_multiplier),int(x2*box_multiplier),int(y2*box_multiplier),int(x1
*box_multiplier)

cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)


cv2.rectangle(img, (x1, y2 - 35), (x2, y2), (0, 255, 0), cv2.FILLED)
Cv2.rectangle: Vẽ hình chữ nhật xung quanh khuôn mặt được phát hiện

cv2.putText(img, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 0.7,


(255, 255, 255), 2)
Cv2.putText vẽ văn bản trong một khung.

cap.release()
cv2.destroyAllWindows()
Thao tác này sẽ giải phóng webcam, sau đó đóng tất cả các cửa sổ imshow ().

5.3. Kết quả


Bước 1:

24
Bước 2:

Bước 3:

Bước 4:

25
III. KẾT LUẬN

1. Nhóm em đã nhận diện được đầy đủ các khuôn mặt đã được mã hóa, đồng thời
nhận diện được các khuôn mặt khác có trong ảnh, video, camera thời gian thực.
2. Tuy độ chính xác chưa tốt đối với các khuôn mặt chưa được học nhưng khả năng
nhận diện khuôn mặt đã ổn định.

Tài liệu tham khảo:

1. Deep Learning cơ bản, Bài 6: Convolutional neural network, https://nttuan8.com/bai-


6-convolutional-neural-network/
2. GMO-Z.com, Dlib: Phần 2 - Xác định facial landmark với dlib và python,
https://blog.vietnamlab.vn/dlib-phan-2-xac-dinh-facial-landmark-voi-dlib-va-python-2/
3. Machine Learning cơ bản, Bài 19: Support Vector Machine,
https://machinelearningcoban.com/2017/04/09/smv/
4. VIBO, Tìm hiểu về phương pháp mô tả đặc trưng HOG (Histogram of Oriented
Gradients), https://viblo.asia/p/tim-hieu-ve-phuong-phap-mo-ta-dac-trung-hog-
histogram-of-oriented-gradients-V3m5WAwxZO7

26
27

You might also like