1. Trang chủ
  2. » Tất cả

Hcmute nhận dạng cảm xúc thông qua khuôn mặt dùng mạng nơ ron tích chập cnn

83 6 0

Đ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 SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH CƠNG TRÌNH NGHIÊN CỨU KHOA HỌC CỦA SINH VIÊN NHẬN DẠNG CẢM XÚC THƠNG QUA KHN MẶT DÙNG MẠNG NƠ-RON TÍCH CHẬP CNN MÃ SỐ: SV2020-133 SKC 0 Tp Hồ Chí Minh, tháng 07/2020 Luan van BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐH SƯ PHẠM KỸ THUẬT TPHCM BÁO CÁO TỔNG KẾT ĐỀ TÀI NGHIÊN CỨU KHOA HỌC CỦA SINH VIÊN NHẬN DẠNG CẢM XÚC THÔNG QUA KHN MẶT DÙNG MẠNG NƠ-RON TÍCH CHẬP CNN SV2020-133 Chủ nhiệm đề tài: NGUYỄN VĂN PHÚC TP Hồ Chí Minh, tháng 7/2020 Luan van BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐH SƯ PHẠM KỸ THUẬT TPHCM BÁO CÁO TỔNG KẾT ĐỀ TÀI NGHIÊN CỨU KHOA HỌC CỦA SINH VIÊN NHẬN DẠNG CẢM XÚC THÔNG QUA KHUÔN MẶT DÙNG MẠNG NƠ-RON TÍCH CHẬP CNN SV2020-133 Thuộc nhóm ngành khoa học: Kỹ thuật Sinh viên thực hiện: Nguyễn Văn Phúc Nam, Nữ: Nam Dân tộc: Kinh Lớp: 16141CLVTA Khoa: Đào Tạo Chất Lượng Cao Năm thứ: Số năm đào tạo: năm Ngành học: Công nghệ kỹ thuật điện tử - truyền thông Giảng viên hướng dẫn: ThS Huỳnh Thị Thu Hiền TP Hồ Chí Minh, tháng 7/2020 Luan van MỤC LỤC MỤC LỤC i DANH MỤC HÌNH iv DANH MỤC BẢNG vii CÁC TỪ VIẾT TẮT viii THÔNG TIN KẾT QUẢ NGHIÊN CỨU CỦA ĐỀ TÀI ix CHƯƠNG TỔNG QUAN 1.1 TÌNH HÌNH NGHIÊN CỨU 1.2 LÝ DO CHỌN ĐỀ TÀI 1.3 MỤC TIÊU ĐỀ TÀI 1.4 PHƯƠNG PHÁP NGHIÊN CỨU 1.5 ĐỐI TƯỢNG VÀ PHẠM VI NGHIÊN CỨU 1.6 BỐ CỤC ĐỀ TÀI CHƯƠNG CƠ SỞ LÝ THUYẾT 2.1 TỔNG QUAN VỀ QUÁ TRÌNH XỬ LÝ ẢNH 2.1.1 Xử lý ảnh 2.1.2 Điểm ảnh 2.1.3 Độ phân giải 2.1.4 Tăng cường ảnh 2.1.5 Khôi phục ảnh 2.1.6 Phân tích ảnh 2.1.7 Nén liệu ảnh 2.1.8 Nhận dạng ảnh 2.2 KHUÔN MẶT VÀ CẢM XÚC 10 i Luan van 2.2.1 Đặc trưng mặt người : 10 2.2.2 Phương pháp tiếp cận đặc trưng khuôn mặt : 11 2.2.3 Biểu cảm khuôn mặt bày tỏ cảm xúc : 11 2.3 MẠNG NƠ-RON TÍCH CHẬP 12 2.3.1 Mạng nơ-ron nhân tạo 12 2.3.2 Mạng nơ-ron tích chập 15 2.3.2.1 Mơ hình tổng quan 15 2.3.2.2 Các lớp mơ hình 16 2.3.3 Những vấn đề xảy với mơ hình CNN 20 2.3.3.1 Quá khớp (Overfitting) 20 2.3.3.2 Drop out 21 2.4 Giới thiệu máy tính nhúng kit Raspberry Pi 23 2.5 Xử lý ảnh với Python 24 2.5.1 Giới thiệu ngơn ngữ lập trình Python: 24 2.5.2 Các thư viện sử dụng Python 25 CHƯƠNG THIẾT KẾ HỆ THỐNG NHẬN DẠNG CẢM XÚC THÔNG QUA KHUÔN MẶT DÙNG MẠNG NƠ-RON TÍCH CHẬP TRÊN KIT RASPBERRY PI 28 3.1 YÊU CẦU CỦA HỆ THỐNG 28 3.2 MƠ HÌNH HỆ THỐNG 28 3.2.1 Sơ đồ khối hệ thống 28 3.2.2 Mơ hình CNN sử dụng hệ thống 29 3.3 TẬP DỮ LIỆU 30 3.3.1 Tập liệu mẫu có sẵn 30 ii Luan van 3.3.2 Tập liệu riêng 32 3.4 QUÁ TRÌNH HUẤN LUYỆN VÀ KIỂM TRA 34 3.4.1 Quá trình huấn luyện 34 3.4.2 Quá trình kiểm tra 35 CHƯƠNG KẾT QUẢ 37 4.1 KẾT QUẢ HUẤN LUYỆN VÀ KIỂM TRA 37 4.2 ỨNG DỤNG NHẬN DẠNG CẢM XÚC THÔNG QUA KHUÔN MẶT TRÊN KIT RASPBERRY PI 40 CHƯƠNG KẾT LUẬN VÀ KIẾN NGHỊ 53 5.1 KẾT LUẬN 53 5.2 KIẾN NGHỊ 53 TÀI LIỆU THAM KHẢO 54 PHỤ LỤC A 56 iii Luan van DANH MỤC HÌNH Hình 2.1: Quy trình xử lý ảnh Hình 2.2: Ví dụ pixel ảnh Hình 2.3: Sự thay đổi độ mịn hình ảnh theo kích thước Hình 2.4: Một số thơng tin tìm thấy ảnh khn mặt 11 Hình 2.5: Cấu trúc tổng quát mạng nơ-ron ANN 13 Hình 2.6: Quá trình xử lý thơng tin mạng 13 Hình 2.7: Hàm tổng nhiều nơ-ron n input 14 Hình 2.8: Sự khác cấu trúc ANN CNN 15 Hình 2.9: Quá trình thực mạng CNN 16 Hình 2.10: CNN tìm điểm tương đồng ảnh 16 Hình 2.11: Chập ma trận ảnh với lọc 3x3 17 Hình 2.12: Ví dụ lớp RELU 18 Hình 2.13: Maxpooling với lọc 2x2, bước trượt 19 Hình 2.14: Phân lớp liệu lớp kết nối đầy đủ 20 Hình 2.15: Ví dụ minh họa lỗi khớp CNN 21 Hình 2.16: Kỹ thuật Drop-out giải vấn đề overfitting 22 Hình 2.17: Hình ảnh thực tế kit Raspberry Pi 23 Hình 2.18: Cấu trúc thư viện OpenCV 26 Hình 3.1: Sơ đồ khối hệ thống 28 Hình 3.2: Kiến trúc mạng CNN dùng hệ thống 29 Hình 3.3: Một số hình ảnh tập liệu mẫu 31 Hình 3.4: Biểu đồ số lượng cảm xúc tập liệu mẫu FERC-2013 32 Hình 3.5: Biểu đồ phân loại số lượng cảm xúc tập liệu riêng 33 iv Luan van Hình 3.6: Lưu đồ thuật tốn q trình huấn luyện 35 Hình 3.7: Lưu đồ thuật tốn q trình kiểm tra 36 Hình 4.1: Biểu đồ độ xác qua kiểm tra trình huấn luyện 37 Hình 4.2: Ma trận tương quan mơ hình với ngõ vào liệu tập mẫu 38 Hình 4.3: Ma trận tương quan mơ hình với ngõ vào liệu tập riêng 39 Hình 4.4: Camera kết nối với kit raspberry Pi 41 Hình 4.5: Giao diện ứng dụng nhận dạng cảm xúc 41 Hình 4.6: Thông báo chọn file 42 Hình 4.7: Nhận dạng cảm xúc “ bình thường ” 43 Hình 4.8: Nhận dạng cảm xúc “ bình thường ”từ ảnh tải lên hệ thống 43 Hình 4.9: Nhận dạng cảm xúc “ vui vẻ ” 44 Hình 4.10: Nhận dạng cảm xúc “ ngạc nhiên ” 45 Hình 4.11: Nhận dạng cảm xúc “ buồn ” 46 Hình 4.12: Nhận dạng cảm xúc “ giận ” 47 Hình 4.13: Nhận dạng cảm xúc “ khó chịu ” 48 Hình 4.14: Nhận dạng cảm xúc “ sợ hãi ” 49 Hình 4.15: Nhận dạng cảm xúc “ bình thường ” thành cảm xúc “ buồn ” biểu cảm không rõ ràng 49 Hình 4.16: Nhận dạng cảm xúc “ bình thường ” thành cảm xúc “ sợ hãi ” cường độ sáng cao ảnh nhận dạng bị ngược sáng 50 Hình 4.17: Khơng nhận dạng khn mặt góc nghiêng đặc trưng khuôn mặt bị 50 Hình 4.18: Nhận dạng cảm xúc “ bình thường ” thành cảm xúc “ sợ hãi ” cường độ ánh sáng khuôn mặt yếu 51 v Luan van Hình 4.19: Nhận dạng cảm xúc “ bình thường ” thành cảm xúc “ buồn ” khuôn mặt bị thay đổi góc nghiêng đồng thời khn mặt khơng ngang tầm diện với camera 51 vi Luan van DANH MỤC BẢNG Bảng 3.1: Bảng phân loại số lượng cảm xúc tập liệu mẫu FERC-2013 31 Bảng 3.2: Bảng phân loại số lượng cảm xúc tập liệu riêng 33 Bảng 4.1: So sánh độ xác qua kiểm tra hai mơ hình 37 Bảng 4.2: Đánh giá tỉ lệ nhận dạng cảm xúc kiểm tra tập riêng 40 Bảng 4.3: So sánh độ xác hai mơ hình 40 vii Luan van [11] Lương Mạnh Bá, Nguyễn Thanh Thủy, “Nhập môn xử lý ảnh số” Hà Nội, Việt Nam: Nhà xuất khoa học kỹ thuật, 2006 [12] Saad ALBAWI,TareqAbedMOHAMMED, “Understanding of a Convolutional Neural Network” Department of Computer Engineering Faculty of Engineering and Architecture Istanbul Kemerburgaz University Istanbul, Turkey,2017 [13] N Kwak, “Introduction to Convolutional Neural Networks ( CNNs)”, 2016 [14] R E Turner, “Lecture 14 : Convolutional neural networks for computer vision”, 2014 [15] Neeraj Kumar, Alexander C Berg, Peter N Belhumeur, and Shree K Nayar “Attribute and simile classifiers for face verification” In Computer Vision, 2009 IEEE 12th International Conference oti, pages 365-372 IEEE, 2009 [16] Richard F.Lyon “A Brief History of ‘Pixel’”, FoveonInc., 2820 San Tom as Expressway, Santa Clara CA 95051 [17] Robin Milner, Mads Tofte, Robert Harper “The Definition of Standard ML”, Lab oratory for Foundations of Computer Science Department of Computer Science University of Edinburgh [18] Florian Schroff, Dmitrv Kalcnichenko, and James Philbin “Facenet: A unified embedding for face recognition and clustering In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition”, pages 815-823,2015 55 Luan van PHỤ LỤC A MÃ NGUỒN CHƯƠNG TRÌNH from tkinter import * from tkinter import ttk from tkinter import messagebox from PIL import ImageTk, Image from tkinter.filedialog import askopenfilename from keras.preprocessing.image import img_to_array from keras.models import load_model import numpy as np import imutils import cv2 import glob import os root = Tk() StringA = StringVar() filename ='' def open_file(): filename = askopenfilename(initialdir="*/", 56 Luan van filetypes =(("All Files","*.*"),("Video", "*.mp4"),("Image", "*.jpg"),("Image", "*.png")), title = "Choose a file." ) StringA.set(filename) messagebox.showinfo("Thông báo", "Đã chọn file!!!!") pass def detect_realtime_video(): import detect_real_time_video def detect_image(): image = StringA.get() imagename = os.path.basename(image) imgname = os.path.splitext(imagename)[0] detection_model_path = 'haarcascade_files/haarcascade_frontalface_default.xml' emotion_model_path = 'models/_mini_XCEPTION.106-0.65.hdf5' face_detection = cv2.CascadeClassifier(detection_model_path) emotion_classifier = load_model(emotion_model_path, compile=False) 57 Luan van EMOTIONS = ["gian du" ,"kho chiu","so hai", "vui ve", "buon", "ngac nhien","binh thuong"] orig_frame = cv2.imread(image) frame = cv2.imread(image,0) faces = face_detection.detectMultiScale(frame,scaleFactor=1.1,minNeighbors=5,minSize=(30,30 ),flags=cv2.CASCADE_SCALE_IMAGE) if len(faces) > 0: faces = sorted(faces, reverse=True,key=lambda x: (x[2] - x[0]) * (x[3] x[1]))[0] (fX, fY, fW, fH) = faces roi = frame[fY:fY + fH, fX:fX + fW] roi = cv2.resize(roi, (48, 48)) roi = roi.astype("float") / 255.0 roi = img_to_array(roi) roi = np.expand_dims(roi, axis=0) preds = emotion_classifier.predict(roi)[0] emotion_probability = np.max(preds) label = EMOTIONS[preds.argmax()] 58 Luan van cv2.putText(orig_frame, label, (fX, fY - 10), cv2.FONT_HERSHEY_SIMPLEX, 2.5, (0, 0, 255), 3) cv2.putText(orig_frame, str(round(emotion_probability*100,2)) + '%', (0,450), cv2.FONT_HERSHEY_SIMPLEX, 3.5, (0, 0, 255), 3) cv2.putText(orig_frame, "Emotion Detection" , (0,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2) cv2.putText(orig_frame, "gian du" + ' ' + str(round(preds[0]*100,2)) + '%', (0,90), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2) cv2.putText(orig_frame, "kho chiu" + ' ' + str(round(preds[1]*100,2)) + '%', (0,130), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2) cv2.putText(orig_frame, "so hai" + ' ' + str(round(preds[2]*100,2)) + '%', (0,170), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2) cv2.putText(orig_frame, "vui ve" + ' ' + str(round(preds[3]*100,2)) + '%', (0,210), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2) cv2.putText(orig_frame, "buon" + ' ' + str(round(preds[4]*100,2)) + '%', (0,250), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2) cv2.putText(orig_frame, "ngac nhien"+ ' ' + str(round(preds[5]*100,2)) + '%', (0,290), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2) cv2.putText(orig_frame, "binh thuong" + ' ' + str(round(preds[6]*100,2)) + '%', (0,330), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2) cv2.rectangle(orig_frame, (fX, fY), (fX + fW, fY + fH),(0, 0, 255), 2) 59 Luan van cv2.imwrite('result/'+ imgname + '_' + label + ".jpg",orig_frame) cv2.imshow('Detect_Image',orig_frame) cv2.waitkey(0) cv2.destroyAllWindows() return def detect_video(): video = StringA.get() detection_model_path = 'haarcascade_files/haarcascade_frontalface_default.xml' emotion_model_path = 'models/_mini_XCEPTION.75-0.64.hdf5' face_detection = cv2.CascadeClassifier(detection_model_path) emotion_classifier = load_model(emotion_model_path, compile=False) EMOTIONS = ["gian du" ,"kho chiu","so hai", "vui ve", "buon", "ngac nhien","binh thuong"] cv2.namedWindow('Video') cap = cv2.VideoCapture(video) while True: frame = cap.read()[1] frame = imutils.resize(frame,width=580) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 60 Luan van faces= face_detection.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(30,30), flags=cv2.CASCADE_SCALE_IMAGE) frameClone = frame.copy() if len(faces) > 0: faces = sorted(faces, reverse=True, key=lambda x: (x[2] - x[0]) * (x[3] - x[1]))[0] (fX, fY, fW, fH) = faces roi = gray[fY:fY + fH, fX:fX + fW] roi = cv2.resize(roi, (48, 48)) roi = roi.astype("float") / 255.0 roi = img_to_array(roi) roi = np.expand_dims(roi, axis=0) preds = emotion_classifier.predict(roi)[0] emotion_probability = np.max(preds) label = EMOTIONS[preds.argmax()] for (i, (emotion, prob)) in enumerate(zip(EMOTIONS, preds)): text = "{}: {:.2f}%".format(emotion, prob * 100) 61 Luan van w = int(prob * 300) cv2.rectangle(frameClone, (7, (i * 35) + 5),(w, (i * 35) + 35), (0, 0, 255), -1) cv2.putText(frameClone, text, (10, (i * 35) + 23),cv2.FONT_HERSHEY_SIMPLEX, 0.45,(255, 255, 255), 2) cv2.putText(frameClone, label, (fX, fY - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2) cv2.rectangle(frameClone, (fX, fY), (fX + fW, fY + fH),(0, 0, 255), 2) cv2.imshow('video', frameClone) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() return def label_img(img): word_label = img.split('.',1)[-1] if word_label == 'jpg': return 62 Luan van elif word_label == 'png': return elif word_label == 'mp4': return def exit_app(): root.destroy() ######################################################################## ######################################################################## ################################################################### # chữ viết Title = root.title( "Emotion Detection") label_1 = ttk.Label(root, text="TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HỒ CHÍ MINH",foreground = "blue",font = "times 16 bold ") label_2 = ttk.Label(root, text="KHOA ĐÀO TẠO CHẤT LƯỢNG CAO",foreground = "blue",font = "times 16 bold") label_3 = ttk.Label(root, text="NGHÀNH CÔNG NGHỆ KỸ THUẬT ĐIỆN TỬ TRUYỀN THÔNG",foreground = "blue",font = "times 16 bold") label_4 = ttk.Label(root, text="ĐỀ TÀI NGHIÊN CỨU KHOA HỌC NĂM HỌC 20192020",foreground = "red",font = "times 20 bold") label_5 = ttk.Label(root, text="NHẬN DẠNG CẢM XÚC THÔNG QUA KHUÔN MẶT \n DÙNG MẠNG NƠ-RON TÍCH CHẬP CNN",foreground = "red",font = "times 26 bold") 63 Luan van label_6 = ttk.Label(root, text="GVHD: ThS HUỲNH THỊ THU HIỀN",foreground = "blue",font = "times 16 bold") label_7 = ttk.Label(root, text="SVTH: NGUYỄN VĂN PHÚC",foreground = "blue",font = "times 16 bold") label_8 = ttk.Label(root, text="Chọn file Nhận dạng Trực tuyến = "black",font = "times 14 bold") label_1.pack() label_2.pack() label_3.pack() label_4.pack() label_4.place(x=400,y=130) label_5.pack() label_5.place(x=300,y=200) label_6.pack() label_6.place(x=650,y=350) label_7.pack() label_7.place(x=650,y=380) 64 Luan van Thoát",foreground label_8.pack() label_8.place(x=645,y=485) ######################################################################## ######################################################################## ################################################################### photo1 = Image.open("icons/click.png") photo1 = photo1.resize((60, 60), Image.ANTIALIAS) photo1 = ImageTk.PhotoImage(photo1) a = Button(root,image = photo1,command=open_file) a.pack() a.place(x = 650, y = 525) photo2 = Image.open("icons/start.png") photo2 = photo2.resize((60, 60), Image.ANTIALIAS) photo2 = ImageTk.PhotoImage(photo2) filename1 = StringA.get() name=label_img(filename1) if name == 0: b = Button(root,image = photo2,command = detect_image) else: 65 Luan van b = Button(root,image = photo2,command = detect_video) b.pack() b.place(x = 760, y = 525) photo3 = Image.open("icons/start_1.png") photo3 = photo3.resize((60, 60), Image.ANTIALIAS) photo3 = ImageTk.PhotoImage(photo3) c = Button(root,image = photo3,command=detect_realtime_video) c.pack() c.place(x = 870, y = 525) photo4 = Image.open("icons/off.png") photo4 = photo4.resize((60, 60), Image.ANTIALIAS) photo4 = ImageTk.PhotoImage(photo4) c = Button(root,image = photo4,command=exit_app) c.pack() c.place(x = 980, y = 525) ######################################################################## ######################################################################## ################################################################### 66 Luan van im1=Image.open("icons/ute.png") im1 = im1.resize((125, 150), Image.ANTIALIAS) im1=ImageTk.PhotoImage(im1) label_im = Label(image=im1) label_im.image = im1 label_im.pack() label_im.place(x=235, y=0) im2=Image.open("icons/fhq.png") im2 = im2.resize((150, 150), Image.ANTIALIAS) im2=ImageTk.PhotoImage(im2) label_im = Label(image=im2) label_im.image = im2 label_im.pack() label_im.place(x=1105, y=0) im3= Image.open("icons/emotion.jpg") im3 = im3.resize((300, 300), Image.ANTIALIAS) im3 = ImageTk.PhotoImage(im3) label_im = Label(image=im3) label_im.image = im3 label_im.pack() 67 Luan van label_im.place(x=235, y=320) menubar = Menu(root) w, h = root.winfo_screenwidth(), root.winfo_screenheight() root.geometry("%dx%d+0+0" % (w, h)) root.config(menu=menubar) root.mainloop() 68 Luan van Luan van ... đặc trưng khuôn mặt : 11 2.2.3 Biểu cảm khuôn mặt bày tỏ cảm xúc : 11 2.3 MẠNG NƠ -RON TÍCH CHẬP 12 2.3.1 Mạng nơ- ron nhân tạo 12 2.3.2 Mạng nơ- ron tích chập ... thống nhận dạng cảm xúc thông qua khn mặt dùng mơ hình mạng nơ- ron tích chập Chương 4: Kết quả: Chương trình bày kết đạt trình huấn luyện, trình kiểm tra mơ hình ứng dụng nhận dạng cảm xúc thông qua. .. THIẾT KẾ HỆ THỐNG NHẬN DẠNG CẢM XÚC THƠNG QUA KHN MẶT DÙNG MẠNG NƠ -RON TÍCH CHẬP TRÊN KIT RASPBERRY PI 3.1 YÊU CẦU CỦA HỆ THỐNG Hệ thống nhận dạng cảm xúc khuôn mặt từ máy ảnh đến mặt người cự ly

Ngày đăng: 02/02/2023, 10:16

Xem thêm:

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w