BÀI TẬP LỚN XỬ LÝ ẢNH ĐỀ TÀI NHẬN DẠNG KHUÔN MẶT (FACIAL RECOGNITION)

28 36 0
BÀI TẬP LỚN XỬ LÝ ẢNH ĐỀ TÀI NHẬN DẠNG KHUÔN MẶT (FACIAL RECOGNITION)

Đ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

Đạ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 LỜI NÓI ĐẦU I GIỚI THIỆU ĐỀ TÀI II QUI TRÌNH THỰC HIỆN .3 Tìm xác định khn mặt .4 1.1 HOG (histogram of oriented gradients) .4 1.2 Face_recognition .8 Chỉnh hướng khuôn mặt 2.1 Facial landmark 2.2 Multi_face_landmarks .10 Mã hóa khn mặt 11 3.1 Convolutional Neural Network .11 3.2 Face_encodings .15 Xác thực tên người từ đoạn mã hóa 16 4.1 SVM Classifier 16 4.2 Compare_faces Face_distance 17 Thực hành kết 18 5.1 Code 18 5.2 Giải thích hàm 20 5.3 Kết 24 III KẾT LUẬN 26 Tài liệu tham khảo: 26 LỜI NÓI ĐẦU Trong khoảng mười năm gần lại đây, với phát triển nhanh chóng cơng nghệ, dẫn tới đời hang loạt thiết bị với khả xử lí, tốc độ tính tốn vượt bậc Cùng lúc đó, việc thu nhận xử lý thơng tin với khối lượng ngày lớn, phần mềm thủ cơng khơng cịn hiệu “Xử lý ảnh” đời mang lại xác nhanh chóng có nhiều ứng dụng sống Khơng mơn học quan trọng địi hỏi kiến thức tốn xác suất, mà cịn hữu ích việc giải nhiều toán, vấn đề thực tiễn Với mục tiêu áp dụng kiến thức học có thêm hiểu biết lĩnh vực xử lý ảnh, nhóm chọn đề tài “Nhận dạng khn mặt (Facial Recognition)” Trong q trình tìm hiểu tài liệu, hạn chế tầm hiểu biết nên báo cáo cịn số khuyết điểm Kính mong nhận ý kiến góp ý để nhóm hồn thiện I GIỚI THIỆU ĐỀ TÀI Vào thời điểm viết viết này, hẳn cụm từ Nhận dạng khuôn mặt (Facial Recognition) đã khơng cịn khái niệm q xa lạ Đây kỹ thuật nhằm xác định người từ hình ảnh khung hình video lấy Công nghệ nhận diện khuôn mặt trở nên quen thuộc, áp dụng phổ biến hệ thống an ninh nhiều nơi giới, có Việt Nam Ưu điểm công nghệ so với 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) việc nó khơng địi hỏi hợp tác đến từ người dùng Thông qua tập lớn lần này, nhóm chúng em xây dựng hệ thống cho việc nhận dạng khuôn mặt dựa vào thư viện Dlib OpenCV II QUI TRÌNH THỰC HIỆN Hiện có nhiều kỹ thuật để thực việc nhận dạng khuôn mặt, nhiên điểm chung kỹ thuật phải thực qua bước: ● Xác định lấy (các) khn mặt có hình ảnh, video, camera từ thời gian thực ● Từ khuôn mặt lấy từ bước 1, thực việc phân tích chỉnh hướng khuôn mặt, xác định tọa độ điểm mắt mũi miệng hướng khuôn mặt theo liệu gốc ● Mã hóa khn mặt dùng encode từ thư viện face_recognition thành ảnh 128 vecto ● Từ thông tin có sau phân tích, kết luận xác minh danh tính người dùng Tìm xác định khuôn mặt 1.1 HOG (histogram of oriented gradients) HOG(histogram of oriented gradients) feature descriptor sử dụng computer vision xử lý ảnh, dùng để detec đối tượng Mục đích “feature descriptor” trừu tượng hóa đối tượng cách trích xuất đặc trưng đối tượng bỏ thơng tin khơng hữu ích Vì vậy, HOG sử dụng chủ yếu để mơ tả hình dạng xuất đối tượng ảnh Các bước việc tính vector HOG cho ảnh: Tính gradient, tính vector đặc trưng cho (cells), chuẩn hóa khối (blocks), tính tốn vector đặc trưng HOG - Tính gradient: Thường thực hai phép nhân chập ảnh gốc với chiều, tương ứng với toán tử lấy đạo hàm theo hai hướng Ox Oy Trong đó, hướng tương ứng đó: Nếu ảnh input I, ảnh đạo hàm riêng theo hướng tính theo cơng thức: Gradient bao gồm hai thành phần cường độ(Gradient Magnitude) hướng(Gradient Derection) theo công thức: Ví dụ: Kết phép lấy đạo hàm: - Tính vector đặc trưng cho (cells): Sau tính đạo hàm, ta có thành phần hướng điểm ảnh cell ảnh input Các giá trị hướng chia thành vùng hướng khoảng từ tới 360° Các giá trị hướng nằm khoảng [0, 360/9) gán (coi nhau), giá trị hướng khoảng [360/9, 2*360/9) gán 2… Sau histogram cell tính độc lập Để đáp ứng tốt với thay đổi điều kiện ánh sáng độ tương phản, giá trị gradient cần phải chuẩn hóa cục bộ, điều địi hỏi việc nhóm cell thành vùng liên kết không gian với gọi khối Vector HOG tổng hợp histogram cell chuẩn hóa từ tất khối Các khối chia không tách biệt nhau, nói cách khác cell đóng góp thơng tin hướng (tại điểm ảnh nó) nhiều lần Như hình ảnh trên, pixel có bao quanh màu xanh lam Nó có hướng 80 độ cường độ 2, thêm vào bin thứ (hướng 80 độ) Tiếp theo pixel có bao quanh màu đỏ Nó có hướng 10 độ cường độ Vì khơng có bin 10 độ, nên vote cho bin độ 20 độ, bin thêm đơn vị Sau vote hết pixel cell kích thước 8x8 vào bin, ta thu kết sau: - Chuẩn hóa khối (blocks): Có nhiều phương pháp dùng cho việc chuẩn hóa khối Gọi v vector cần chuẩn hóa chứa tất histogram khối, ||vk|| giá trị chuẩn theo chuẩn k=1, e số nhỏ, giá trị chuẩn hóa tính cơng thức sau: - Tính tốn vector đặc trưng HOG:  Với hình ảnh kích thước 64x128, chia thành block 16x16 chồng nhau, có block ngang 15 block dọc, nên có 7x15 = 105 blocks  Mỗi block gồm cell Khi áp dụng biểu đồ 9-bin cho cell, block đại diện vector có kích thước 36x1  Vì vậy, nối tất vector block lại với nhau, ta thu vector đặc trưng HOG ảnh có kích thước 105x36x1 = 3780x1 Ví dụ minh họa thuật tốn HOG: 1.2 Face_recognition Định vị trả tọa độ faces ảnh Đầu tiên lấy vị trí khn mặt, sau cần chúng để vẽ hộp thơng qua hàm face_locations (dựa thuật tốn HOG) thư viện face_recognition Tọa độ xác định vị trí khn mặt Chỉnh hướng khn mặt Sau tách mặt Nhưng phải đối mặt với vấn đề khác: khuôn mặt với góc chụp khác hồn tồn khác với máy tính Để giải vấn đề này, cố gắng biến đổi ảnh cho mắt mơi ln ln vị trí ảnh học Điều khiến việc so sánh khuôn mặt bước dễ 2.1 Facial landmark Việc xác định facial landmark gồm có hai bước:  Bước 1: Xác định vị trí khn mặt ảnh  Bước 2: Xác định điểm tạo nên cấu trúc khuôn mặt Việc xác định vị trí khn mặt thực nhiều cách từ đơn giản thuật toán Haar cascades đến phức tạp thuật toán dựa deep-learning Tuy nhiên dù sử dụng thuật toán nào, mục đích cuối thu vùng (thường hình vng) xác định tọa độ (x,y) bao quanh khuôn mặt ảnh Sau xác định khuôn mặt ảnh, xác định cấu trúc khuôn mặt Facial landmark xác định vị trí miệng, lơng mày, mắt phải, mắt trái, mũi, hàm Ví dụ xác định facial landmark dlib cài đặt thuật toán mô tả báo One Millisecond Face Alignment with an Ensemble of Regression Trees của Kazemi Sullivan (2014), được xác định 68 landmarks theo tọa độ (x,y): - Relu: hàm kích hoạt Neural Network Hiện nay, hàm Relu sử dụng phổ biến thông dụng Đặc biệt, Relu sở hữu ưu điểm bật như: hỗ trợ tính tốn nhanh nên ưa chuộng sử dụng việc huấn luyện mạng Neuron Công thức: f(x) = max(0, x) - Fully connected layer: Sau ảnh truyền qua nhiều convolutional layer pooling layer model học tương đối đặc điểm ảnh (ví dụ mắt, mũi, khung mặt,…) ma trận output layer cuối cùng, kích thước H*W*D, chuyển vector kích thước (H*W*D) Áp dụng vào tốn Mã hóa khn mặ, truyền khn mặt tìm vào mạng nơron để tách lọc vector 128 chiều 13 Kết quả: 14 3.2 Face_encodings Encode ả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 của khn mặt Cũng đó, bước huấn luyện mơ hình từ khn mặt sang vector cịn gọi bước TRÍCH CHỌN ĐẶC TRƯNG Hàm face_encodings thư viện face_recognition encode ảnh vector 128 chiều Kết 15 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) khái niệm trong thống kê và khoa học máy tính cho tập hợp phương pháp học có giám sát liên quan đến để phân loại và phân tích hồi quy SVM cơng cụ đắc lực cho tốn xử lý ảnh, hiểu đơn giản với toán phân nhóm, tồn đường thằng phân chia nhóm Ý tưởng SVM tìm siêu phẳng (hyper lane) để phân tách điểm liệu Siêu phẳng chia không gian thành miền khác miền chứa loại giữ liệu Đối với tốn với khơng gian chiều, ta thấy tìm nhiều đường thẳng để phân chia điểm xanh, đỏ Trong SVM sử dụng thuật ngữ Margin, là khoảng cách siêu phẳng (trong trường hợp không gian chiều đường thẳng) đến điểm liệu gần tương ứng với phân lớp SVM cố gắng tối ưu thuật toán tìm cách maximize giá trị margin này, từ tìm siêu phẳng đẹp nhất để phân lớp liệu 16 Giả sử đường thẳng phân chia cần tìm có phương trình là: w x +w2 x 2+ b=0 Margin đường thẳng tính 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 tính cơng thức: margin = ‖w‖ Áp dụng thuật toán SVM vào tập để xác định người sở liệu có đo lường gần với ảnh đầu vào 4.2 Compare_faces Face_distance Dùng hàm compare_faces face_distance để tìm tên người từ đoạn mã hóa Face_recognition.compare_faces trả danh sách chứa True false Nếu khuôn mặt khớp với hình ảnh đào tạo trả true vị trí tên lớp phát 17 Face_recognition.face_distance trả danh sách chứa khoảng cách khuôn mặt điểm khn mặt huấn luyện Khoảng cách thấp có nghĩa phù hợp Kết Thực hành kết 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 = 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 = / (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 * 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 hàm List append() Dùng để thêm phần tử vào vị trí cuối List tại, khơng trả List mà thay vào cập nhật List Print(myList) In list: [‘Bill_Gates.jpg’, ‘Elon_Musk.jpg’, ‘Jack_Ma.jpg’, … ] os.path.splitext() Chia filename thành hai phần vị trí dấu chấm cuối bên phải, lưu giữ kết dạng tuple classNames.append(os.path.splitext(cl)[0]): Lấy name trước dấu “ “ Print(classNames) 20 In list: [‘Bill_Gates.’, ‘Elon_Musk.’, ‘Jack_Ma.’, … ] Cv2.cvtColor Thực chức chuyển đổi hệ màu BGR sang RGB (OpenCV đọc màu dạng BGR (Xanh lục xanh đỏ), hầu hết ứng dụng máy tính đọc RGB (Xanh lục đỏ xanh lam)) face_recognition.face_encodings(img)[0] Encode ả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 của khn mặt Cũng đó, bước huấn luyện mơ hình từ khn mặt sang vector cịn gọi bước TRÍCH CHỌN ĐẶC TRƯNG VD: hình Bill-Gates sẽ được biểu diễn sau encodeList.append(encode) Sau 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 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ã bắt đầu vòng lặp vơ hạn (sẽ phá vỡ sau câu lệnh break), có ret frame định nghĩa cap.read () Về bản, ret boolean liên quan đến việc có hay khơng có trả về, khung khung trả Nếu khơng có khung, bạn khơng gặp lỗi, bạn nhận 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 để trình nhận dạng mặt nhanh scale = 0.25 box_multiplier = 1/scale facesCurFrame = face_recognition.face_locations(imgS) 22 Định vị trả tọa độ faces ảnh Lần này, lần chúng tơi lấy vị trí khn mặt - cần chúng để vẽ hộp encodesCurFrame = face_recognition.face_encodings(imgS, facesCurFrame) Bây chúng tơi biết vị trí, chúng tơi chuyển chúng đến face_encodings đối số thứ hai Nếu khơng có điều đó, tìm kiếm khn mặt lần làm chậm tồn q trình for encodeFace, faceLoc in zip(encodesCurFrame, facesCurFrame): Ví dụ công dụng hàm zip(): matches = face_recognition.compare_faces(encodeListKnown, encodeFace) Face_recognition.compare_faces trả danh sách chứa True false Nếu khn mặt khớp với hình ảnh đào tạo trả true vị trí tên lớp phát faceDis = face_recognition.face_distance(encodeListKnown, encodeFace) Face_recognition.face_distance trả danh sách chứa khoảng cách khn mặt điểm khn mặt huấn luyện Khoảng cách thấp có nghĩa phù hợp matchIndex = np.argmin(faceDis) Np.argmin trả số điểm có khoảng cách thấp lưu biến matchIndex y1, x2, y2, x1 = faceLoc 23 y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 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 phát cv2.putText(img, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 0.7, (255, 255, 255), 2) Cv2.putText vẽ văn khung cap.release() cv2.destroyAllWindows() Thao tác giải phóng webcam, sau đóng tất cửa sổ imshow () 5.3 Kết Bước 1: 24 Bước 2: Bước 3: Bước 4: 25 III KẾT LUẬN Nhóm em nhận diện đầy đủ khuôn mặt mã hóa, đồng thời nhận diện khn mặt khác có ảnh, video, camera thời gian thực Tuy độ xác chưa tốt khn mặt chưa học khả nhận diện khuôn mặt ổn định Tài liệu tham khảo: Deep Learning bản, Bài 6: Convolutional neural network, https://nttuan8.com/bai6-convolutional-neural-network/ GMO-Z.com, Dlib: Phần - Xác định facial landmark với dlib python, https://blog.vietnamlab.vn/dlib-phan-2-xac-dinh-facial-landmark-voi-dlib-va-python-2/ Machine Learning bản, Bài 19: Support Vector Machine, https://machinelearningcoban.com/2017/04/09/smv/ VIBO, Tìm hiểu 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-hoghistogram-of-oriented-gradients-V3m5WAwxZO7 26 27

Ngày đăng: 16/06/2022, 05:32

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

Tài liệu liên quan