GIỚI THIỆU Nhận diện khuôn mặt là một trong những bài toán được quan tâm nhất hiện nay, làmột trong những vấn đề mà các công ty công nghệ lớn trên thế giới thức sự quan tâm.Vậy hệ thống
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA ĐIỆN TỬ
NHẬN DẠNG KHUÔN MẶT NGƯỜI DỰA TRÊN MỘT PHẦN THÔNG TIN
KHUÔN MẶT
GIÁO VIÊN HƯỚNG DẪN: Ts TỐNG VĂN LUYÊN
THÀNH VIÊN: LÊ ANH QUÂN MSV :1141250051
NGUYỄN VĂN THÀNH MSV :1141250035
NGUYỄN NGỌC LONG MSV:1141250067
PHẠM VĂN THUẤN MSV:1141250074
Trang 2Mục lục
Mục lục 2
DANH MỤC HÌNH 3
LỜI MỞ ĐẦU 4
1 GIỚI THIỆU 5
2 Các vấn đề liên quan 6
2.1 Nhận dạng khuôn mặt 6
2.2 Mã hóa khuôn mặt 10
2.2.1 Giới thiệu Triplet Loss 10
2.2.2 Nhược điểm 11
2.3 Tìm kiếm khuôn mặt từ tệp đã mã hóa 11
3 Xây dựng hệ thống nhận dạng khuôn mặt 11
3.1 Xác định khuôn mặt trong ảnh và Dlib 11
3.2 Biểu diễn các khuôn mặt dưới dạng vector 13
3.3 Mô hình học sâu CNN 13
3.3.1 ConvNet 14
3.3 Triplet là gì? 15
3.3.1 Triplet loss 15
3.4 Huấn luyện mô hình 15
Tài liệu tham khảo 20
Trang 3DANH MỤC HÌNH
Hình 1Ảnh mặt người đen trắng 6
Hình 2 Ảnh từng pixel 6
Hình 3A,B VECTOR TỪ CÁC ĐIỂM ẢNH 7
Hình 4BIỂU DIỄN CƠ BẢN CẤU TRÚC MẶT NGƯỜI HOG 8
Hình 5 HOG 9
Hình 6 xác định khuôn mặt 9
Hình 7 Triplet 10
Hình 8A,B Trước và sau khi chạy 13
Hình 9 Mô hình Cnn 14
Hình 10 mô hình convnet 14
Hình 11 ham triplet loss 15
Trang 42 Trình bày một số vấn đề liên quan đến nhận diện khuôn mặt
3 Xây dựng hệ thống nhận diện khuôn mặt
Trang 51 GIỚI THIỆU
Nhận diện khuôn mặt là một trong những bài toán được quan tâm nhất hiện nay, làmột trong những vấn đề mà các công ty công nghệ lớn trên thế giới thức sự quan tâm.Vậy hệ thống nhận dạng khuôn mặt là gì?
Hệ thống nhận dạng khuôn mặt là một công nghệ có khả năng xác định hoặc xác minhmột người qua các ảnh kỹ thuật số hoặc khung hình từ video
Đây là một bài toán khá phức tạp, nó đòi hỏi một loạt các vấn đề cần được giả quyết:
Việc làm đầu tiên đó là cần phải tìm kiếm tất cả những khuôn mặt có trong bứchình Sau đó đưa ra nhũng đặc trưng về khuôn mật
So sánh những đặc trưng với những người khác để chúng ta có thể biết được têncủa họ
Bộ não của con người có rất nhiều các neural thân kinh để làm tất cả những điềunày tự động và ngay lập tức Quả thật, con người đã quá giỏi nhưng với máy tính,
nó không có khả năng cao cấp như vậy Do đó chúng ta cần phải dạy cho nó cáchlàm từng bước một cách riêng biệt
Trang 62 Các vấn đề liên quan
2.1 Nhận dạng khuôn mặt
Vấn đề đầu tiên chúng ta cần tìm hiểu chính là “làm sao để xác định được một
khuôn mặt trong một khung hình” Có thể thấy rõ ràng chúng ta cần phải xác định vị trí
khuôn mặt trong một bức hình trước khi có thể nói cho người khác có những ai trong bứchình đó
Để giải quyết vấn đề này, ta cần làm cho bức hình trở thành ảnh đen trắng
Như chúng ta đã biết, hiện nay, một pixel thường sẽ được thể hiện bởi mô hình RBG(24bit) , mỗi giá trị sẽ chạy từ 0 – 255[CITATION 1 \l 1033 ], vậy nếu chúng ta phân tíchpixel một cách trực tiếp thì sẽ phải phân tích một ma trận 3 chiều, vậy bằng cách chuyểnhình ảnh về dạng xám, chúng ta có thể giảm lượng giữ liệu mà máy tính phải phân tích,đơn giản hóa các công thức,…
Trang 7Hình 1 Ảnh mặt người đen trắngSau đó, chúng ta cùng nhìn vào mỗi pixel trong hình ảnh và những pixel xung quanh nó.
Hình 2 Ảnh từng Pixel
Trang 8Mục tiêu của chúng ta là tìm ra độ đậm của điểm ảnh hiện tại so với các điểm ảnh xungquanh, sau đó vẽ một vector chỉ hướng mà bức ảnh trở nên tối hơn.
Hình 3A,B Vector từ các điểm ảnh
Việc này được lặp đi cho mỗi pixel trong hình ảnh, và kết thúc khi toàn bộ các pixel đượcthay thế bởi các mũi tên Những mũi tên này được gọi là gradients[CITATION 2 \l 1033 ]
và chúng bắt đầu từ các điểm sáng tới tối trên toàn bộ hình ảnh
Nếu chúng ta phân tích pixel trực tiếp, hình ảnh tối và hình ảnh sáng của cùng một người
sẽ có các giá trị pixel hoàn toàn khác nhau Nhưng nếu chúng ta chỉ xem xét hướng thayđổi độ sáng tối Thì như vậy với một bức ảnh thuần tối, hoặc thuần sáng sẽ kết thúc vớicùng một mô tả vector Do đó vấn đề trên của chúng ta đã có thể dẽ dàng giải quyết hơnnhiều
Để thực hiện việc này, chúng ta sẽ chia nhỏ hình ảnh thành những ô vuông nhỏ Trongmỗi ô vuông, ta sẽ đếm bao nhiêu gradients trong mỗi hướng chính (bao nhiêu điểm lên,điểm lên-phải, điểm sang phải, vv ) Sau đó, chúng ta sẽ thay thế ô vuông đó trong hìnhảnh bằng hướng mũi tên mạnh nhất
Kết quả cuối cùng là chúng ta biến hình ảnh ban đầu thành một biểu diễn đơn giản đểnắm bắt cấu trúc cơ bản của khuôn mặt một cách đơn giản:
Trang 9Hình 4.Biểu diễn cơ bản cấu trúc mặt người HOG
Để tìm khuôn mặt trong hình ảnh này, tất cả những gì chúng ta phải làm là tìm một phầnhình ảnh trông giống nhất với các hình ảnh mẫu đã biết được trích ra từ một loạt các
khuôn mặt đã được training khác, ờ đây chúng tôi sẽ sử dụng HoG (histogram of oriented
gradients)
Trang 10Hình 5 HOGViệc sử dụng công nghệ này, có thể giúp bạn dễ dàng xác định các khuôn mặt trong bất
2.2.1 Giới thiệu Triplet Loss
Triplet Loss là một thuật toán cho các hệ thống mạng neural nhân tạo, trong đó cầnđưa vào 3 đầu vào:
Khuôn mặt đã biết (anchor)
Khuôn mặt khác của người đó (positive)
Trang 11 lấy tiếp khuôn mặt của một người mà bạn chưa xác định (negative)
Sau đó, thuật toán sẽ kiểm tra các phép đo mà nó hiện đang tạo ra cho mỗi khuôn mặt,tinh chỉnh mạng neural, tính ra khoảng cách giữa các khuôn mặt, đảm bảo các phép đo nótạo ra cho hình ảnh #1 và #2 là thấp nhất có thể và các phép đo cho hình ảnh #2 và #3 lớnnhất có thể[CITATION 3 \l 1033 ], xem hình 7
Hình 7.Triplet
Sau khi lặp lại bước này rất rất nhiều lần cho nhiều người khác nhau, mạng neural sẽ tạo
ra 128 phép đo cho mỗi người
2.2.2 Nhược điểm
FaceNet, một cấu trúc áp dụng triplet loss huấn luyện với một số lượng lớn hình ảnh(hơn 200 triệu ảnh của 8 triệu đối tượng), lớn gấp 3 lần so với các bộ dữ liệu hiện có Đểxây dựng bộ dữ liệu lớn như vậy rất khó thực hiện trong các phòng thiết bị, học thuật dođòi hỏi kiến trúc máy lớn
2.3 Tìm kiếm khuôn mặt từ tệp đã mã hóa
Đây là bước đơn giản nhất trong quá trình Tại bước này, chúng ta cần phải tìm
Trang 12Về cơ bản các vấn đề nêu trên sẽ giúp bạn tạo ra một hệ thống nhật dạng khuôn mặt Ởphần sau tôi sẽ hướng dẫn các bạn tạo ra một hệ thống dựa trên những vấn đề trên.
3 Xây dựng hệ thống nhận dạng khuôn mặt
3.1 Xác định khuôn mặt trong ảnh và Dlib
Điều cần làm đầu tiên với bức ảnh/ khung hình chúng ta có đó chính là xác định xemtrong bức ảnh/ khung hình đó có sự xuất hiện của bao người, bao nhiêu khuôn và vị trícủa chúng trong bức ảnh Bài toán trở nên rất giống với bài toán xác định vật thể (ObjectDetection) Đây là một trong những bài toán khá khó bởi chúng ta sẽ cần nhiều kinhnghiệm cũng như lý thuyết về xử lý ảnh để có thể giải quyết được bước này
Dlib là một chương trình của thư viện OpenCV, hỗ trợ người dùng trong việc xác địnhkhuôn mặt Thuật toán mà Dlib cung cấp mà chúng ta sẽ sử dụng đó là HOG (Histogram
of Oriented Gradients) và SVM (Support Vector Machine)
import time
import dlib
import cv2
# Đọc ảnh đầu vào
image = cv2.imread('/your_dir /image.jpg')
# Khai báo việc sử dụng các hàm của dlib
Trang 13# Vẽ một đường bao màu xanh lá xung quanh các khuôn mặt được xác định ra bởi HOG + SVM for face in faces_hog:
dlib.get_frontal_face_detector: hàm sử dụng HOG + SVM để xác định khuôn mặt
Hình 8A,B.Trước và sau khi chạy
Trang 14chúng ta sẽ quy về bài toán Tính khoảng cách giữa các vector Dù là trong xử lý âm
thanh hay xử lý ảnh hay xử lý ngôn ngữ tự nhiên, việc chuyển về vector để tính khoảngcách đều là một lựa chọn rất tốt Và trong bài viết này, chúng ta sẽ biến các khung hìnhkhuôn mặt về các vector có 128 chiều
Vấn đề quan trọng nhất ở đấy chính là:
Cần có một mô hình chuyển từ khung hình khuôn mặt sang vector, sao cho ảnh 2 khuônmặt gần nhau thì 2 vector tương ứng cũng phải có khoảng cách gần nhau ảnh 2 khuônmặt khác nhau thì 2 vector tương ứng cũng phải xa nhau hơn
Và để giải quyết vấn đề này, chúng ta sẽ sử dụng mô hình học sâu ConvNet sử dụng hàm Triplet loss.
3.3 Mô hình học sâu CNN
Hình vẽ dưới đây đã biểu diễn rất rõ ràng kiến trúc của 1 mạng CNN
Ta có ảnh input đầu vào Qua hàng loạt các Convolutional Layer cùng Max Pool Layer, cuối cùng là 2 fully connected.
Hình 9.Mô hình CNN
3.3.1 ConvNet
Đây là một mạng học sâu với cấu trúc 3 nhánh Với 1 ảnh đưa vào, chúng ta sẽ thu được
1 vector cuối cùng đầu ra
Trang 15Hình 10.Mô hình ConvNet
3.3 Triplet là gì?
Tiếng việt của Triplet có thể tạm được dịch ra là "bộ ba" Với rất nhiều các bài toán kháctrước đây của các mô hình học sâu, thông thường chúng ta sẽ cho lần lượt từng ảnh mộtvào để mô hình học, tuy nhiên với bài toán lần này, chúng ta sẽ phải sử dụng từng "bộba"
Bộ ba của chúng ta bao gồm: 1 ảnh mặt của 1 người bất kỳ (anchor), 1 ảnh mặt khác củangười đó (positive), 1 ảnh mặt của người khác (negative) Với việc huấn luyện mô hìnhnhư thế, chúng ta sẽ có thêm thông tin về mối quan hệ giữa các ảnh, điều này giúp môhình chúng ta phù hợp hơn nhiều với bài toán
3.3.1 Triplet loss
Với f(p) là vector biểu diễn p D là khoảng cách giữa 2 vector Hàm loss của chúng ta sẽ
Trang 16và tăng khoảng cách giữa Anchor Image và Negative Image! Đây là điều chúng ta đangmuốn mô hình học được.
3.4 Huấn luyện mô hình
first_conv = Conv2D( 96 , kernel_size = ( 8 , 8 ), strides = ( 16 , 16 ), padding = 'same' )(first_input)
first_max = MaxPool2D(pool_size = ( 3 , 3 ), strides = ( 2 , 2 ), padding = 'same' )(first_conv)
first_max = Flatten()(first_max)
first_max = Lambda( lambda x: K.l2_normalize(x, axis = 1 ))(first_max)
Trang 17merge_one = concatenate([first_max, second_max])
merge_two = concatenate([merge_one, convnet_model.output])
emb = Dense( 4096 )(merge_two)
emb = Dense( 128 )(emb)
l2_norm_final = Lambda( lambda x: K.l2_normalize(x, axis = 1 ))(emb)
Giờ chúng ta sẽ code hàm triplet loss đúng theo công thức
Trang 18_EPSILON = K.epsilon()
def _loss_tensor(y_true, y_pred):
y_pred = K.clip(y_pred, _EPSILON, 1.0 - _EPSILON)
Trang 19pos = np.where(labels == labels[i])[ 0 ]
neg = np.where(labels != labels[i])[ 0 ]
Trang 20deep_rank_model.fit_generator(generator = image_batch_generator(X, y, batch_size),
steps_per_epoch = len(X) // batch_size,
(4) Xây dựng hệ thống kiểm soát nhận dạng khuôn mặt với OpenCV Dlib và DeepLearning – Phạm Hoàng Anh
Trang 21F Schroff, D Kalenichenko and J Philbin, "Facenet: A unified embedding for facerecognition and clustering," Proceedings of the IEEE Conference on Computer Visionand Pattern Recognition, pp 815-823, 2015.