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

20 149 0
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

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BỘ 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 Mục lục DANH MỤC HÌNH LỜI MỞ ĐẦU Bài báo cáo trình bày hệ thống nhận diện khn mặt Nội dung báo cáo gồm phần: Giới thiệu đề tài: Trình bày sơ nét đề tài nhận dạng khuôn mặt, ứng dụng yêu cầu đề tài “Nhận dạng khuôn mặt người dựa phần thơng tin khn mặt” Trình bày số vấn đề liên quan đến nhận diện khuôn mặt Xây dựng hệ thống nhận diện khuôn mặt GIỚI THIỆU Nhận diện khuôn mặt toán quan tâm nay, vấn đề mà công ty công nghệ lớn giới thức quan tâm Vậy hệ thống nhận dạng khn mặt gì? Hệ thống nhận dạng khn mặt cơng nghệ có khả xác định xác minh người qua ảnh kỹ thuật số khung hình từ video Đây tốn phức tạp, đòi hỏi loạt vấn đề cần giả quyết: • Việc làm cần phải tìm kiếm tất khn mặt có hình Sau đưa nhũng đặc trưng khn mật • So sánh đặc trưng với người khác để biết tên họ • Bộ não người có nhiều neural thân kinh để làm tất điều tự động Quả thật, người q giỏi với máy tính, khơng có khả cao cấp Do cần phải dạy cho cách làm bước cách riêng biệt Các vấn đề liên quan 2.1 Nhận dạng khuôn mặt Vấn đề cần tìm hiểu “làm để xác định khn mặt khung hình” Có thể thấy rõ ràng cần phải xác định vị trí khn mặt hình trước nói cho người khác có hình Để giải vấn đề này, ta cần làm cho hình trở thành ảnh đen trắng Như biết, nay, pixel thường thể mơ hình RBG (24bit) , giá trị chạy từ – 255 (1), phân tích pixel cách trực tiếp phải phân tích ma trận chiều, cách chuyển hình ảnh dạng xám, giảm lượng giữ liệu mà máy tính phải phân tích, đơn giản hóa cơng thức,… Hình Ảnh mặt người đen trắng Sau đó, nhìn vào pixel hình ảnh pixel xung quanh Hình Ảnh Pixel Mục tiêu tìm độ đậm điểm ảnh so với điểm ảnh xung quanh, sau vẽ vector hướng mà ảnh trở nên tối Hình 3A,B Vector từ điểm ảnh Việc lặp cho pixel hình ảnh, kết thúc toàn pixel thay mũi tên Những mũi tên gọi gradients (2) chúng điểm sáng tới tối tồn hình ảnh Nếu phân tích pixel trực tiếp, hình ảnh tối hình ảnh sáng người có giá trị pixel hoàn toàn khác Nhưng xem xét hướng thay đổi độ sáng tối Thì với ảnh tối, sáng kết thúc với mơ tả vector Do vấn đề dẽ dàng giải nhiều Để thực việc này, chia nhỏ hình ảnh thành vuông nhỏ Trong ô vuông, ta đếm gradients hướng (bao nhiêu điểm lên, điểm lên-phải, điểm sang phải, vv ) Sau đó, thay vng hình ảnh hướng mũi tên mạnh Kết cuối biến hình ảnh ban đầu thành biểu diễn đơn giản để nắm bắt cấu trúc khn mặt cách đơn giản: Hình 4.Biểu diễn cấu trúc mặt người HOG Để tìm khn mặt hình ảnh này, tất phải làm tìm phần hình ảnh trơng giống với hình ảnh mẫu biết trích từ loạt khn mặt training khác, sử dụng HoG (histogram of oriented gradients) Hình HOG Việc sử dụng cơng nghệ này, giúp bạn dễ dàng xác định khuôn mặt hình bạn có Hình Xác định khn mặt 2.2 Mã hóa khn mặt Sau tìm kiếm thành công khuôn mặt người, cần phải mã hóa tất khn mặt mà tìm dạng số u cầu đặt ra: cần phải có thuật tốn để trích, xuất phép đo từ khuôn mặt với nhãn khuôn mặt May mắn cho chúng ta, có nhiều thuật toán đưa 30 năm vần đề như: Bag of Word, FaceNetm DeepFace, Triplet Loss sử dụng Convolutional Neural Network (CNN) để training vào tạo 128 vector đo cho khuôn mặt, với thuật toán Triplet Loss 2.2.1 Giới thiệu Triplet Loss Triplet Loss thuật toán cho hệ thống mạng neural nhân tạo, cần đưa vào đầu vào: • Khuôn mặt biết (anchor) • Khuôn mặt khác người (positive) • lấy tiếp khn mặt người mà bạn chưa xác định (negative) Sau đó, thuật tốn kiểm tra phép đo mà tạo cho khn mặt, tinh chỉnh mạng neural, tính khoảng cách khn mặt, đảm bảo phép đo tạo cho hình ảnh #1 #2 thấp phép đo cho hình ảnh #2 #3 lớn (3), xem hình Hình 7.Triplet Sau lặp lại bước rất nhiều lần cho nhiều người khác nhau, mạng neural tạo 128 phép đo cho người 2.2.2 Nhược điểm FaceNet, cấu trúc áp dụng triplet loss huấn luyện với số lượng lớn hình ảnh (hơn 200 triệu ảnh triệu đối tượng), lớn gấp lần so với liệu có Để xây dựng liệu lớn khó thực phòng thiết bị, học thuật đòi hỏi kiến trúc máy lớn 2.3 Tìm kiếm khn mặt từ tệp mã hóa Đây bước đơn giản trình Tại bước này, cần phải tìm người sở liệu biết có “khoảng cách” gần với ảnh đưa vào Bạn làm điều thuật tốn classification Machine Learning SVM, k-NN, … Nó xác định ảnh đưa vào bạn tập huấn luyện Về vấn đề nêu giúp bạn tạo hệ thống nhật dạng khuôn mặt Ở phần sau hướng dẫn bạn tạo hệ thống dựa vấn đề 10 Xây dựng hệ thống nhận dạng khuôn mặt 3.1 Xác định khuôn mặt ảnh Dlib Điều cần làm với ảnh/ khung hình có xác định xem ảnh/ khung hình có xuất bao người, khuôn vị trí chúng ảnh Bài tốn trở nên giống với toán xác định vật thể (Object Detection) Đây toán khó cần nhiều kinh nghiệm lý thuyết xử lý ảnh để giải bước Dlib chương trình thư viện OpenCV, hỗ trợ người dùng việc xác định khn mặt Thuật tốn mà Dlib cung cấp mà sử dụng HOG (Histogram of Oriented Gradients) 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 hàm dlib hog_face_detector = dlib.get_frontal_face_detector() # Thực xác định HOG SVM start = time.time() faces_hog = hog_face_detector(image, 1) end = time.time() print("Hog + SVM Execution time: " + str(end-start)) # Vẽ đường bao màu xanh xung quanh khuôn mặt xác định HOG + SVM for face in faces_hog: 11 x = face.left() y = face.top() w = face.right() - x h = face.bottom() - y cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2) cv2.imshow("image", image) cv2.waitKey(0) dlib.get_frontal_face_detector: hàm sử dụng HOG + SVM để xác định khn mặt Hình 8A,B.Trước sau chạy 3.2 Biểu diễn khuôn mặt dạng vector Để định khuôn mặt "của ai", cần tính “mức độ” giống, khác khn mặt lấy Và nói độ giống, khác nhau, để đơn giản, quy tốn Tính khoảng cách vector Dù xử lý âm hay xử lý ảnh hay xử lý ngôn ngữ tự nhiên, việc chuyển vector để tính khoảng 12 cách lựa chọn tốt Và viết này, biến khung hình khn mặt vector có 128 chiều Vấn đề quan trọng là: Cần có mơ hình chuyển từ khung hình khn mặt sang vector, cho ảnh khn mặt gần vector tương ứng phải có khoảng cách gần ảnh khn mặt khác vector tương ứng phải xa Và để giải vấn đề này, 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ẽ biểu diễn rõ ràng kiến trúc mạng CNN Ta có ảnh input đầu vào Qua hàng loạt Convolutional Layer Max Pool Layer, cuối fully connected Hình 9.Mơ hình CNN 3.3.1 ConvNet Đây mạng học sâu với cấu trúc nhánh Với ảnh đưa vào, thu vector cuối đầu 13 Hình 10.Mơ hình ConvNet 3.3 Triplet gì? Tiếng việt Triplet tạm dịch "bộ ba" Với nhiều toán khác trước mơ hình học sâu, thơng thường cho ảnh vào để mơ hình học, nhiên với tốn lần này, phải sử dụng "bộ ba" Bộ ba bao gồm: ảnh mặt người (anchor), ảnh mặt khác người (positive), ảnh mặt người khác (negative) Với việc huấn luyện mơ thế, có thêm thơng tin mối quan hệ ảnh, điều giúp mơ hình phù hợp nhiều với toán 3.3.1 Triplet loss Với f(p) vector biểu diễn p D khoảng cách vector Hàm loss l Nhìn qua chút, huấn luỵên hàm CÀNG LỚN CÀNG TỐT (max) Điều có nghĩa mơ hình cố gắng học cho ngày, giảm khoảng cách vector f(pi) (anchor Image) f(pi+) (Positive Image), 14 tăng khoảng cách Anchor Image Negative Image! Đây điều muốn mô hình học 3.4 Huấn luyện mơ hình def convnet_model_(): vgg_model = applications.VGG16(weights=None, include_top=False, input_shape=(221, 221, 3)) x = vgg_model.output x = GlobalAveragePooling2D()(x) x = Dense(4096, activation='relu')(x) x = Dropout(0.6)(x) x = Dense(4096, activation='relu')(x) x = Dropout(0.6)(x) x = Lambda(lambda x_: K.l2_normalize(x,axis=1))(x) # x = Lambda(K.l2_normalize)(x) convnet_model = Model(inputs=vgg_model.input, outputs=x) return convnet_model def deep_rank_model(): convnet_model = convnet_model_() first_input = Input(shape=(221, 221, 3)) 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) 15 second_input = Input(shape=(221, 221, 3)) second_conv = Conv2D(96, kernel_size=(8,8), strides=(32,32), padding='same')(second_input) second_max = MaxPool2D(pool_size=(7,7), strides=(4,4), padding='same')(second_conv) second_max = Flatten()(second_max) second_max = Lambda(lambda x: K.l2_normalize(x, axis=1))(second_max) merge_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) final_model outputs=l2_norm_final) = Model(inputs=[first_input, second_input, convnet_model.input], return final_model deep_rank_model = deep_rank_model() Xây dựng mơ hình ConvNet mục 3.3, ảnh đưa vào đường khác nhau, trước nối lại để tạo thành vector 128 chiều Vector đại diện cho ảnh, mơ hình huấn luyện tốt, 128 thuộc tính coi 128 thuộc tính đặc trưng khn mặt Cũng đó, bước huấn luyện mơ hình từ khn mặt sang vector gọi bước trích chọn đặc trưng Giờ code hàm triplet loss theo công thức batch_size = 24 16 _EPSILON = K.epsilon() def _loss_tensor(y_true, y_pred): y_pred = K.clip(y_pred, _EPSILON, 1.0 - _EPSILON) loss = g = for i in range(0, batch_size, 3): try: q_embedding = y_pred[i] p_embedding = y_pred[i+1] n_embedding = y_pred[i+2] D_q_p = K.sqrt(K.sum((q_embedding - p_embedding)**2)) D_q_n = K.sqrt(K.sum((q_embedding - n_embedding)**2)) loss = loss + g + D_q_p - D_q_n except: continue loss = loss/batch_size*3 return K.maximum(loss, 0) deep_rank_model.compile(loss=_loss_tensor, nesterov=True)) optimizer=SGD(lr=0.001, momentum=0.9, đưa ảnh theo BỘ BA Và từ hàm loss tính theo BỘ BA, khơng phải tính riêng đầu mơ hình khác Đây cách chọn BỘ BA, ảnh đầu coi ảnh anchor, ảnh positive (ảnh class) cuối ảnh negative (ảnh khác class) def image_batch_generator(images, labels, batch_size): 17 labels = np.array(labels) while True: batch_paths = np.random.choice(a = len(images), size = batch_size//3) input_1 = [] for i in batch_paths: pos = np.where(labels == labels[i])[0] neg = np.where(labels != labels[i])[0] j = np.random.choice(pos) while j == i: j = np.random.choice(pos) k = np.random.choice(neg) while k == i: k = np.random.choice(neg) input_1.append(images[i]) input_1.append(images[j]) input_1.append(images[k]) input_1 = np.array(input_1) input = [input_1, input_1, input_1] yield(input, np.zeros((batch_size, ))) 18 deep_rank_model.fit_generator(generator=image_batch_generator(X, y, batch_size), steps_per_epoch=len(X)//batch_size, epochs=2000, verbose=1, callbacks=callbacks_list Tài liệu tham khảo (1) Gradien https://vi.wikipedia.org/wiki/Gradien (2) RBG https://vi.wikipedia.org/wiki/M%C3%B4_h%C3%ACnh_m%C3%A0u_RGB (3) Triplet loss https://en.wikipedia.org/wiki/Triplet_loss (4) Xây dựng hệ thống kiểm soát nhận dạng khuôn mặt với OpenCV Dlib Deep Learning – Phạm Hoàng Anh 19 F Schroff, D Kalenichenko and J Philbin, "Facenet: A unified embedding for face recognition and clustering," Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pp 815-823, 2015 20 ... thống nhận diện khuôn mặt Nội dung báo cáo gồm phần: Giới thiệu đề tài: Trình bày sơ nét đề tài nhận dạng khuôn mặt, ứng dụng yêu cầu đề tài Nhận dạng khuôn mặt người dựa phần thông tin khuôn mặt ... đến nhận diện khuôn mặt Xây dựng hệ thống nhận diện khuôn mặt GIỚI THIỆU Nhận diện khuôn mặt toán quan tâm nay, vấn đề mà công ty công nghệ lớn giới thức quan tâm Vậy hệ thống nhận dạng khuôn mặt. .. đề nêu giúp bạn tạo hệ thống nhật dạng khuôn mặt Ở phần sau hướng dẫn bạn tạo hệ thống dựa vấn đề 10 Xây dựng hệ thống nhận dạng khuôn mặt 3.1 Xác định khuôn mặt ảnh Dlib Điều cần làm với ảnh/

Ngày đăng: 22/05/2020, 21:15

Từ khóa liên quan

Mục lục

  • Mục lục

  • DANH MỤC HÌNH

  • LỜI MỞ ĐẦU

  • 1. GIỚI THIỆU

  • 2. Các vấn đề liên quan

    • 2.1. Nhận dạng khuôn mặt

    • 2.2 Mã hóa khuôn mặt

      • 2.2.1 Giới thiệu Triplet Loss

      • 2.2.2 Nhược điểm

      • 2.3 Tìm kiếm khuôn mặt từ tệp đã mã hóa

      • 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 

        • 3.2 Biểu diễn các khuôn mặt dưới dạng vector

        • 3.3 Mô hình học sâu CNN

          • 3.3.1 ConvNet

          • 3.3 Triplet là gì?

            • 3.3.1 Triplet loss

            • 3.4 Huấn luyện mô hình

            • Tài liệu tham khảo

Tài liệu cùng người dùng

Tài liệu liên quan