Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 77 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
77
Dung lượng
2,45 MB
Nội dung
BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI Khoa Cơ Khí - - ĐỒ ÁN TỐT NGHIỆP CHUYÊN NGÀNH CÔNG NGHỆ KĨ THUẬT CƠ ĐIỆN TỬ NGHIÊN CỨU, THIẾT KẾ MƠ HÌNH HỆ THỐNG PHÁT HIỆN VÀ CẢNH BÁO NGƯỜI KHÔNG ĐEO KHẨU TRANG GVHD : Ths Nguyễn Đức Minh Sinh viên thực hiện: Vũ Minh Đức - 2018603884 Nguyễn Minh Hoàng - 2018605201 Phạm Văn Giang Hà Nội - 2022 - 2018603943 MỤC LỤC CHƯƠNG GIỚI THIỆU CHUNG VỀ HỆ THỐNG NHẬN DẠNG VÀ CẢNH BÁO NGƯỜI ĐEO KHẨU TRANG .1 1.1 Lịch sử nghiên cứu 1.2 Các vấn đề đặt 1.3 Phương pháp nghiên cứu .2 1.4 Giới hạn nghiên cứu 1.5 Ý nghĩa thực tiễn CHƯƠNG CƠ SỞ LÝ THUYẾT 2.1 Lý thuyết nhận dạng xử lý ảnh 2.1.1 Lý thuyết xử lý ảnh 2.1.2 Cơ sở lý thuyết nhận dạng khuôn mặt .7 2.1.3 Các cơng cụ hỗ trợ lập trình 11 2.2 Hệ thống khí 13 2.3 Hệ thống điện, điều khiển 13 CHƯƠNG TÍNH TỐN, THIẾT KẾ HỆ THỐNG NHẬN DẠNG NGƯỜI ĐEO KHẨU TRANG .15 3.1 Tính tốn, thiết kế hệ thống khí 16 3.1.1 Tính tốn sơ ban đầu .17 3.1.2 Tính tốn lựa chọn động barrie 17 3.1.3 Tính tốn thiết kế thân barrie .20 3.1.4 Tính tốn thiết kế rào phân .21 3.1.5 Mơ mơ hình Barrie tự động 22 3.2 Tính tốn, thiết kế hệ thống điện 23 3.2.1 Khối camera 24 3.2.2 Khối xử lý .26 3.2.3 Khối âm 27 3.2.4 Mạch khuếch đại âm 28 3.2.5 Giao tiếp máy tính Arduino 29 3.2.6 Sơ đồ kết nối hệ thống điện 30 3.3 Tính tốn thiết kế hệ thống điều khiển 30 3.3.1 Bài tốn xử phát khn mặt 30 3.3.2 Xây dựng chương trình 32 3.3.3 Giao diện phần mềm phát người không đeo trang 45 3.3.4 Các bước để kết nối Python Arduino 46 CHƯƠNG KẾT LUẬN VÀ ĐỊNH HƯỚNG PHÁT TRIỂN 48 4.1 Kết đạt 48 4.1.1 Kết đạt 48 4.1.2 Kết phát người không đeo trang 49 4.1.3 Hạn chế: 51 4.2 Định hướng phát triển 51 DANH MỤC HÌNH ẢNH Hình 2-1 Quy trình xử lý ảnh Hình 2-2 Sơ đồ phân tích xử lý ảnh lưu đồ thơng tin khối .7 Hình 2-3 Phương pháp đánh dấu điểm khuôn mặt (Landmark) .8 Hình 2-4 Sơ đồ phân tích xử lý ảnh lưu đồ thông tin khối .8 Hình 2-5 Mơ hình mạng neural 11 Hình 2-6 Sơ đồ khối mạch điều khiển tín hiệu .14 Hình 3-1 Tổng quan hệ thống .15 Hình 3-2 Cơ cấu bên barie 15 Hình 3-3 Các lực tác dụng lên chắn barrie 18 Hình 3-4 Lực tác dụng lên đầu kéo 19 Hình 3-5 Động 12v, 50 W 20 Hình 3-6 Các hình chiếu trụ Barrie 21 Hình 3-7 Các hình chiếu rào phân 22 Hình 3-8 Cơ cấu bên barie mơ Solidworks .22 Hình 3-9 Barrie mô solidworks 23 Hình 3-10 Sơ đồ hệ thống điện .23 Hình 3-11 Khoảng cách nhìn rõ mặt .24 Hình 3-12 Camera HDFULL 25 Hình 3-13 Arduino UNO 26 Hình 3-14 Mạch thu phát âm ISD 1820 .28 Hình 3-15 Modul khuechs đại PAM 8610 29 Hình 3-16 Kết nối serial máy tính Arduino .29 Hình 3-17 Sơ đồ nguyên lý mạch điện 30 Hình 3-18 Cấu trúc chương trình 31 Hình 3-19 Khn mặt kiểm tra 32 Hình 3-20 Lưu đồ thuật tốn thu thập liệu 33 Hình 3-21 Tập liệu người đeo trang 34 Hình 3-22 Tập liệu người khơng đeo trang 34 Hình 3-23 Lưu đồ thuật tốn huấn luyện mơ hình .35 Hình 3-24 Cấu tạo ảnh RGB 37 Hình 3-25 Chuyển ảnh RGB sang ảnh xám 38 Hình 3-26 Sơ đồ phát người không đeo trang video/ webcam .41 Hình 3-27 Rất nhiều khn mặt giả phát .43 Hình 3-28 Khn mặt thật phát 44 Hình 3-29 Kết dự đốn trường hợp khơng đeo trang 44 Hình 3-30 Kết dự đoán trường hợp đeo trang .45 Hình 3-31 Giao diện phần mềm bắt đầu khởi động 45 Hình 4-1 Thiết bị phát người khơng đeo trang 48 Hình 4-2 Trường hợp đeo trang 49 Hình 4-3 Kết trường hợp không đeo trang 50 Hình 4-4 Trường hợp đeo trang sai trương đương không đeo trang 50 DANH MỤC BẢNG BIỂU Bảng 3-1 Thông số kỹ thuật Ardunio UNO 27 Bảng 3-2 Đánh giá huấn luyện mơ hình 39 LỜI NÓI ĐẦU Thế kỷ XXI chứng kiến phát triển vượt bậc khoa học công nghệ, đánh dấu mở đầu thời đại cơng nghệ 4.0 Nhưng bên cạnh thảm họa môi trường người trực tiếp gián tiếp tạo Điển đại dịch Covid19 khởi phát vào cuối thập kỷ thứ làm cho hàng trăm triệu người mắc bệnh, cướp hàng triệu sinh mạng, gây thiệt hại kinh tế làm chậm tiến độ phát triển lồi người Nó tạo thách thức lớn khoa học công nghệ người để chạy đua thắng dịch bệnh Để góp phần vào cơng đẩy lùi dịch bệnh thời đại cơng nghệ nhóm chúng em nghĩ ý tưởng “Máy nhận diện người không đeo trang” Sản phẩm hệ thống camera nhận diện, giám sát đặt trước cổng vào văn phịng, siêu thị, nơi cơng cộng … để nhận diện người không đeo trang cảnh báo ngồi loa Mơ hình sử dụng camera thu lại hình ảnh khn mặt người vào cổng đưa lên máy tính, sau sử dụng phần mềm python thư viện open cv để xử lý ảnh thu cuối phát tín hiệu loa để cảnh báo, giúp nâng cao ý thức người góp phần đẩy lùi dịch bệnh LỜI CẢM ƠN Nhóm em xin chân thành cảm ơn đến thầy, cô môn Cơ Điện Tử Trường Đại học Công Nghiệp Hà Nội giúp đỡ tạo điều kiện thuận lợi cung cấp tài liệu để hoàn thành đề tài nghiên cứu Đồng thời, nhóm em muốn gửi lời cảm ơn sâu sắc đến giáo viên hướng dẫn thầy Nguyễn Đức Minh, thầy tận tình hướng dẫn, tạo điều kiện thuận lợi giúp đỡ nhóm suốt q trình thực đồ án mơn Nhóm xin gửi lời cảm ơn đến bạn bè hỗ trợ chia kinh nghiệm cho nhóm thời gian qua Cuối nhóm em xin chúc thầy tồn thể bạn lớp nhiều sức khỏe thành công cơng việc Xin chân thành cảm ơn! Nhóm sinh viên thực Vũ Minh Đức Nguyễn Minh Hoàng Phạm Văn Giang PHỤ LỤC Bản vẽ thiết kế Barrie: 53 54 55 56 Code chương trình train model nhận diện trang #import thư viện cần thiết from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.applications import MobileNetV2 from tensorflow.keras.layers import AveragePooling2D from tensorflow.keras.layers import Dropout from tensorflow.keras.layers import Flatten from tensorflow.keras.layers import Dense from tensorflow.keras.layers import Input from tensorflow.keras.models import Model from tensorflow.keras.optimizers import Adam from tensorflow.keras.applications.mobilenet_v2 import preprocess_input from tensorflow.keras.preprocessing.image import img_to_array from tensorflow.keras.preprocessing.image import load_img from tensorflow.keras.utils import to_categorical from sklearn.preprocessing import LabelBinarizer from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report from imutils import paths import matplotlib.pyplot as plt import numpy as np import argparse import os #Tạo đường dẫn tới thư mục liệu dataset ap = argparse.ArgumentParser() 57 ap.add_argument("-d", " dataset", required=True, help="path to input dataset") ap.add_argument("-p", " plot", type=str, default="plot.png", help="path to output loss/accuracy plot") ap.add_argument("-m", " model", type=str, default="mask_detector.model", help="path to output face mask detector model") args = vars(ap.parse_args()) #Xác định thông số phục vụ trình train model INIT_LR = 1e-4 EPOCHS = 20 BS = 32 #Lấy danh sách ảnh thư mục chứa liệu print("đang load ảnh") imagePaths = list(paths.list_images(args["dataset"])) data = [] labels = [] #Lặp lại nhiều lần với hình ảnh for imagePath in imagePaths: #Trích xuất nhãn dán từ tên tệp label = imagePath.split(os.path.sep)[-2] #Tải xử lí ảnh đầu vào image = load_img(imagePath, target_size=(224, 224)) image = img_to_array(image) image = preprocess_input(image) 58 #Cập nhật liệu hình ảnh dán nhãn tương úng cho ảnh data.append(image) labels.append(label) #Chuyễn đổi liệu sang dạng mảng data = np.array(data, dtype="float32") labels = np.array(labels) lb = LabelBinarizer() labels = lb.fit_transform(labels) labels = to_categorical(labels) #Tập liệu phục vụ trình train model (chiếm 75%) #Tập liệu phục vụ trình thử nghiệm cuối – Testing set (chiếm 25%) (trainX, testX, trainY, testY) = train_test_split(data, labels, test_size=0.20, stratify=labels, random_state=42) aug = ImageDataGenerator( rotation_range=20, zoom_range=0.15, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.15, horizontal_flip=True, fill_mode="nearest") baseModel = MobileNetV2(weights="imagenet", include_top=False, input_tensor=Input(shape=(224, 224, 3))) headModel = baseModel.output headModel = AveragePooling2D(pool_size=(7, 7))(headModel) 59 headModel = Flatten(name="flatten")(headModel) headModel = Dense(128, activation="relu")(headModel) headModel = Dropout(0.5)(headModel) headModel = Dense(2, activation="softmax")(headModel) model = Model(inputs=baseModel.input, outputs=headModel) for layer in baseModel.layers: layer.trainable = False #Biên dịch model print("Đang biên dịch model") opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS) model.compile(loss="binary_crossentropy", optimizer=opt, metrics=["accuracy"]) # Bắt đầu training print("đang training") H = model.fit( aug.flow(trainX, trainY, batch_size=BS), steps_per_epoch=len(trainX) // BS, validation_data=(testX, testY), validation_steps=len(testX) // BS, epochs=EPOCHS) # Đưa dự đốn model qua thơng số print("các thơng số độ xác") predIdxs = model.predict(testX, batch_size=BS) #Đưa dự đoán gần cho nhãn dán predIdxs = np.argmax(predIdxs, axis=1) 60 print(classification_report(testY.argmax(axis=1), predIdxs, target_names=lb.classes_)) # lưu model dạng file đuôi model print("Đang lưu model") model.save(args["model"], save_format="h5") # XUất biểu đồ thể xác model N = EPOCHS plt.style.use("ggplot") plt.figure() plt.plot(np.arange(0, N), H.history["loss"], label="train_loss") plt.plot(np.arange(0, N), H.history["val_loss"], label="val_loss") plt.plot(np.arange(0, N), H.history["accuracy"], label="train_accuracy") plt.plot(np.arange(0, N), H.history["val_accuracy"], label="val_accuracy") plt.title("Training Loss and Accuracy") plt.xlabel("Epoch #") plt.ylabel("Loss/Accuracy") plt.legend(loc="lower left") plt.savefig(args["plot"]) #Code trương trình nhận diện cảnh báo người đeo trang: #import thư viện cần thiết from tensorflow.keras.applications.mobilenet_v2 import preprocess_input from tensorflow.keras.preprocessing.image import img_to_array from tensorflow.keras.models import load_model from imutils.video import VideoStream 61 import numpy as np import argparse import imutils import time import cv2 import os #import serial #Arduino_serial = serial.Serial('COM3',9600) #s = Arduino_serial.readline() def detect_and_predict_mask(frame, faceNet, maskNet): #lấy kích thước khung ảnh (h, w) = frame.shape[:2] blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300), (104.0, 177.0, 123.0)) faceNet.setInput(blob) detections = faceNet.forward() # khởi tạo danh sách khn mặt, vị trí tương ứng chúng # Danh sách dự đoán mạng trang faces = [] locs = [] preds = [] #lặp lại nhiều lần phát for i in range(0, detections.shape[2]): confidence = detections[0, 0, i, 2] 62 # Lọc phát yếu cách đảm bảo độ tin cậy lớn độ tin cậy tối thiểu(0.8) if confidence > args["confidence"]: box = detections[0, 0, i, 3:7] * np.array([w, h, w, h]) (startX, startY, endX, endY) = box.astype("int") (startX, startY) = (max(0, startX), max(0, startY)) (endX, endY) = (min(w - 1, endX), min(h - 1, endY)) # Trích xuất ảnh vùng khn mặt, chuyển đổi từ BGR sang RGB, thay đổi kích thướng thành 224x224 xử lí face = frame[startY:endY, startX:endX] face = cv2.cvtColor(face, cv2.COLOR_BGR2RGB) face = cv2.resize(face, (224, 224)) face = img_to_array(face) face = preprocess_input(face) #Vẽ viền xung quanh khuôn mặt phát faces.append(face) locs.append((startX, startY, endX, endY)) #Nếu phát có khn mặt tiến hành nhận diện xem có đeo trang hay không if len(faces) > 0: faces = np.array(faces, dtype="float32") preds = maskNet.predict(faces, batch_size=32) return (locs, preds) ap = argparse.ArgumentParser() ap.add_argument("-f", " face", type=str, 63 default="face_detector", help="path to face detector model directory") ap.add_argument("-m", " model", type=str, default="mask_detector.model", help="path to trained face mask detector model") ap.add_argument("-c", " confidence", type=float, default=0.5, help="minimum probability to filter weak detections") args = vars(ap.parse_args()) #Tải mơ hình nhận diện khn mặt print("Đang load model nhận diện khuôn mặt người") prototxtPath = os.path.sep.join([args["face"], "deploy.prototxt"]) weightsPath = os.path.sep.join([args["face"], "res10_300x300_ssd_iter_140000.caffemodel"]) faceNet = cv2.dnn.readNet(prototxtPath, weightsPath) #Tải mơ hình nhận diện trang print("đang load model nhận diện có đeo trang hay khơng") maskNet = load_model(args["model"]) # Khời tạo luồng video cho phép máy ảnh hay webcam hoạt động print("Bắt đầu khởi động vào webcam lấy hình ảnh") vs = VideoStream(src=0).start() time.sleep(2.0) # lặp lại liên tục khung hình video while True: # lấy khung hình từ luồng video theo chuỗi thay đổi kích thước để có chiều rộng tối đa 400 pixel 64 frame = vs.read() frame = imutils.resize(frame, width=800) # Phát xem họ có đeo trang hay không (locs, preds) = detect_and_predict_mask(frame, faceNet, maskNet) has_mask = True for (box, pred) in zip(locs, preds): #Dự đoán vùng khuôn mặt giới hạn (startX, startY, endX, endY) = box (mask, withoutMask) = pred if mask > withoutMask: label = "Mask" color = (0, 255, 0) #Arduino_serial.write('0'.encode()) else: has_mask = False label = "No Mask" color = (0, 0, 255) #Arduino_serial.write('1'.encode()) cv2.putText(frame, label, (startX-50, startY - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2) cv2.rectangle(frame, (startX, startY), (endX, endY), color, 2) if has_mask: Arduino_serial.write('0'.encode()) else: Arduino_serial.write('1'.encode()) 65 #hiển thị khung ảnh lên hình cv2.imshow("Nhận diện trang", frame) key = cv2.waitKey(1) & 0xFF #Nhấn Q để vịng lặp if key == ord("q"): break cv2.destroyAllWindows() vs.stop() #Code chương trình điều khiển đèn loa phần mềm Arduino: const int led=13; int value=0; void setup() { Serial.begin(9600); pinMode(led, OUTPUT); digitalWrite (led, LOW); Serial.println("Connection established "); } void loop() { while (Serial.available()) { value = Serial.read(); } 66 if (value == '1') digitalWrite (led, HIGH); else if (value == '0') digitalWrite (led, LOW); } 67 ... thực Vũ Minh Đức Nguyễn Minh Hoàng Phạm Văn Giang CHƯƠNG GIỚI THIỆU CHUNG VỀ HỆ THỐNG NHẬN DẠNG VÀ CẢNH BÁO NGƯỜI ĐEO KHẨU TRANG 1.1 Lịch sử nghiên cứu Những người tiên phong công nghệ nhận diện... khí 13 2.3 Hệ thống điện, điều khiển 13 CHƯƠNG TÍNH TỐN, THIẾT KẾ HỆ THỐNG NHẬN DẠNG NGƯỜI ĐEO KHẨU TRANG .15 3.1 Tính tốn, thiết kế hệ thống khí 16 3.1.1... động 45 Hình 4-1 Thiết bị phát người không đeo trang 48 Hình 4-2 Trường hợp đeo trang 49 Hình 4-3 Kết trường hợp không đeo trang 50 Hình 4-4 Trường hợp đeo trang sai trương