Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 100 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
100
Dung lượng
6,82 MB
Nội dung
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 ĐỒ ÁN TỐT NGHIỆP NGÀNH CÔNG NGHỆ KỸ THUẬT CƠ ĐIỆN TỬ ỨNG DỤNG XỬ LÝ ẢNH GIÁM SÁT CÔNG NHÂN ĐỘI MŨ BẢO HỘ LAO ĐỘNG GVHD: ThS PHAN THỊ THU THUỶ SVTH: THẠCH EC MÔ NIN MAI PHƯỚC THỌ S K L 9 Tp Hồ Chí Minh, tháng 8/2023 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH KHOA CƠ KHÍ CHẾ TẠO MÁY ĐỒ ÁN TỐT NGHIỆP Đề tài: “ỨNG DỤNG XỬ LÝ ẢNH GIÁM SÁT CÔNG NHÂN ĐỘI MŨ BẢO HỘ LAO ĐỘNG” Giảng viên hướng dẫn: ThS PHAN THỊ THU THUỶ Sinh viên thực hiện: THẠCH EC MÔ NIN MSSV: 18146411 Lớp: 181462B Sinh viên thực hiện: MAI PHƯỚC THỌ MSSV: 18146381 Lớp: 181462A Khố: 2018 – 2022 Tp Hồ Chí Minh, tháng 08/2023 TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HCM CỘNG HỒ XÃ HỘI CHỦ NGHĨA VIỆT NAM KHOA CƠ KHÍ CHẾ TẠO MÁY Độc lập - Tự – Hạnh phúc Bộ môn Cơ điện tử NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Học kỳ 2/năm học 2022-2023 Giảng viên hướng dẫn: ThS Phan Thị Thu Thuỷ (0243) – 0903130454 Sinh viên thực hiện: Thạch Ec Mô Nin MSSV: 18146411 Điện thoại: 0975356377 Mai Phước Thọ MSSV: 18146381 Điện thoại: 0788900844 Mã số đề tài: – Tên đề tài: 22223DT169 - Ứng dụng xử lý ảnh giám sát công nhân đội mũ bảo hộ lao động Các số liệu, tài liệu ban đầu: - Tài liệu deep learning, thuật tốn liên quan mạng nơ-ron tích chập (CNN), - MobileNetV1-V2,…để xử lý phân loại đối tượng Dữ liệu ảnh: ảnh người đội mũ, người đội mũ lưỡi trai người không đội mũ làm tập liệu huấn luyện, tập liệu kiểm tra cho mô hình Đối tượng: người đội mũ bảo hộ nhựa - Thiết bị giám sát: camera - Nội dung đồ án: - Tổng quan toán giám sát sử dụng mũ bảo hộ lao động nước nước Thiết kế hệ thống giám sát bao gồm camera, hình hiển thị, máy chủ Raspberry - Thiết kế tạo mơ hình máy học nhận diện người đội mũ người không đội mũ Thử nghiệm đánh giá độ xác hệ thống giám sát Kết luận hướng phát triển Các sản phẩm dự kiến: Báo cáo thuyết minh, file trình chiếu, mạch điều khiển, mơ hình đồ án, vẽ (nếu có) Ngày giao đồ án: 15/03/2023 Ngày nộp đồ án: 15/07/2023 Ngơn ngữ trình bày: Bản báo cáo: Tiếng Anh i Tiếng Việt Trình bày bảo vệ: Tiếng Anh Tiếng Việt TRƯỞNG KHOA TRƯỞNG BỘ MÔN GIẢNG VIÊN HƯỚNG DẪN (Ký, ghi rõ họ tên) (Ký, ghi rõ họ tên) (Ký, ghi rõ họ tên) Được phép bảo vệ (GVHD ký, ghi rõ họ tên) i LỜI CAM KẾT - Tên đề tài: Ứng dụng xử lý ảnh giám sát công nhân đội mũ bảo hộ lao động - GVHD: ThS Phan Thị Thu Thuỷ - Họ tên sinh viên: Mai Phước Thọ - MSSV: 18146381 Lớp: 181462A Địa sinh viên: An Bình, Hồ Bình, Chợ Mới, An Giang Số điện thoại liên lạc: 0788900844 - Email: maiphuocthoc2.vtt@gmail.com Ngày nộp khoá luận tốt nghiệp (ĐATN): 18/07/2023 - Lời cam kết: “Nhóm thực đề tài xin cam đoan khoá luận tốt nghiệp (ĐATN) cơng trình tơi nghiên cứu thực Tôi không chép từ viết cơng bố mà khơng trích dẫn nguồn gốc Nếu có vi phạm nào, tơi xin chịu hồn tồn trách nhiệm” Tp Hồ Chí Minh, ngày 18 tháng 07 năm 2023 Ký tên ii LỜI CẢM ƠN Quá trình thực đồ án tốt nghiệp giai đoạn quan trọng quãng đời người sinh viên ĐATN tiền đề nhằm trang bị cho chúng em kỹ nghiên cứu, kiến thức quý giá trước chuẩn bị lập nghiệp Trong thời gian thực đồ án “Ứng dụng xử lý ảnh giám sát công nhân đội mũ bảo hộ lao động” chúng em nhận nhiều giúp đỡ từ nhà trường, quý thầy cơ, gia đình bạn bè Nay chúng em xin gửi lời cảm ơn chân thành tri ân sâu sắc thầy cô Trường Đại Học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh, đặc biệt thầy Khoa Cơ Khí Chế Tạo Máy trường tận tình dạy, trang bị cho chúng em kiến thức cần thiết suốt thời gian ngồi ghế giảng đường, làm tảng cho chúng em để hồn thành đồ án Chúng em xin trân trọng cảm ơn Cô Phan Thị Thu Thuỷ tận tình giúp đỡ, cung cấp cho chúng em kiến thức thực tế quan trọng, tài liệu cần thiết, đồng thời định hướng cho chúng em cách tư cách làm việc khoa học, góp ý q báu khơng q trình thực đồ án mà hành trang tiếp bước cho chúng em trình học tập nghiên cứu sau Và cuối cùng, xin gửi lời cảm ơn sâu sắc đến cha, mẹ, bạn bè ân nhân sẵn sàng giúp đỡ chúng em suốt trình thực đề tài Trong lúc thực đề tài, chắn chúng em không tránh khỏi thiếu sót Rất mong nhận ý kiến đóng góp từ phía thầy, để đề tài hồn thiện Chúng em xin chân thành cảm ơn! Mai Phước Thọ, Thạch Ec Mơ Nin iii TĨM TẮT ĐỒ ÁN ỨNG DỤNG XỬ LÝ ẢNH GIÁM SÁT CÔNG NHÂN ĐỘI MŨ BẢO HỘ LAO ĐỘNG Hiện Việt Nam, ngành cơng nghiệp nặng giữ vai trị chủ đạo kinh tế đời sống xã hội Gắn liền với phát triển vấn đề đảm bảo cơng tác quản lý an tồn lao động phải trú trọng Đồng thời năm gần đây, Việt Nam xảy nhiều vụ tai nạn lao động khu vực sản xuất kho chứa hàng hoá, nguyên nhân chủ yếu dẫn đến vật rơi rớt tác động vào người lao động Theo nguyên nhân khác lơ không tuân thủ quy định sử dụng đồ bảo hộ người lao động dẫn đến tỉ lệ tử vong va đập rơi rớt cao Điều thúc đẩy việc nghiên cứu tạo hệ thống giám sát công nhân đội mũ bảo hộ lao động Mục tiêu tăng cường quản lý giám sát cơng nhân tn thủ quy định an tồn lao động, đội mũ bảo hộ trước vào khu làm việc Đồ án nghiên cứu mơ hình nhận dạng người đội mũ bảo hộ, phát nhận dạng khuôn mặt người không đội mũ, chụp ảnh, lưu thông tin người khơng sử dụng mũ Mơ hình gồm webcam, hình hiển thị HDMI máy tính nhúng Raspberry Pi Để nhận dạng phát khuôn mặt, đội mũ bảo hộ cần ứng dụng mơ hình học sâu (deep learning), cụ thể mơ hình MobilenetV2 (là kiến trúc CNN nhà nghiên cứu Google phát triển vào năm 2017) thư viện Dlib (là thư viện mã nguồn mở giúp xây dựng ứng dụng máy học thị giác máy tính), thu thập ảnh mũ bảo hộ khuôn mặt làm sở liệu, thiết kế giao diện người dùng nhúng chương trình nhận dạng lên máy tính nhúng Raspberry Pi Sau thời gian tháng thực đề tài, nhóm giải vấn đề sau: thu thập liệu hình ảnh dùng để nhận dạng, đào tạo mơ hình nhận dạng mũ bảo hộ nhận dạng khuôn mặt, thiết kế giao diện điều khiển, nhúng chương trình lên Raspberry Pi, chạy thử nghiệm nhận dạng với độ xác cao Tuy nhiên tồn vài hạn chế, giao điện thiết kế đơn giản, liệu ảnh hạn chế, kết nhận dạng phụ thuộc nhiều vào điều kiện môi trường tốc độ nhận dạng khơng nhanh Từ hạn chế đó, cần cải thiện tốc độ xử lý, sử dụng nhiều webcam để nhận dạng xác thiết kế giao diện đẹp iv ABSTRACT IMAGE PROCESSING APPLICATION TO MONITOR WORKERS WEARING SAFETY HELMETS Currently in Vietnam, heavy industry is playing a key role in the economy and social life Associated with that development, the issue of ensuring occupational safety management must be more focused At the same time, in recent years, Vietnam has had many labor accidents in production areas and warehouses, mainly caused by falling objects impacting on workers Accordingly, another cause is also due to the workers' neglect to comply with the regulations on the use of protective equipment, leading to a higher death rate when falling and falling That spurred the research and creation of a monitoring system for workers wearing helmets The objective is to strengthen the management and supervision of workers to comply with labor safety regulations, wear protective helmets before entering the working area Research project on identification model of people wearing helmets, detecting and recognizing faces of people without hats, taking pictures, saving information about people without hats The model includes a webcam, an HDMI display and a Raspberry Pi embedded computer To recognize and detect faces, wearing a helmet needs the application of a deep learning model, specifically the MobilenetV2 model (a CNN architecture developed by researchers at Google in 2017) and the Dlib library (an open source library for building machine learning and computer vision applications), collecting helmet and face images as a database, designing user interfaces and embedding programs identifier on the Raspberry Pi embedded computer After months of implementing the project, the team has solved the following problems: collecting image data for identification, training helmet and face recognition models, designing a control interface control, embed the program on the Raspberry Pi, run the identification test with quite high accuracy However, there are still some limitations, the design interface is still simple, the image data is limited, the recognition results are highly dependent on environmental conditions, and the recognition speed is not fast From those limitations, it is necessary to improve processing speed, use more webcams for more accurate identification and design a better interface v MỤC LỤC Trang NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP .i LỜI CAM KẾT ii LỜI CẢM ƠN iii TÓM TẮT ĐỒ ÁN iv ABSTRACT v MỤC LỤC vi DANH MỤC BẢNG BIỂU .ix DANH MỤC SƠ ĐỒ VÀ HÌNH VẼ x DANH MỤC TỪ VIẾT TẮT xiii CHƯƠNG 1: GIỚI THIỆU 1.1 Tính cấp thiết đề tài 1.2 Ý nghĩa khoa học thực tiễn đề tài .1 1.3 Mục tiêu nghiên cứu đề tài 1.4 Đối tượng phạm vi nghiên cứu 1.4.1 Đối tượng nghiên cứu 1.4.2 Phạm vi nghiên cứu .2 1.5 Phương pháp nghiên cứu .3 1.5.1 Cơ sở phương pháp luận 1.5.2 Các phương pháp nghiên cứu cụ thể .3 1.6 Kết cấu đồ án tốt nghiệp CHƯƠNG 2: TỔNG QUAN NGHIÊN CỨU ĐỀ TÀI 2.1 Giới thiệu .4 2.1.1 Phương pháp phát khuôn mặt 2.1.2 Phương pháp nhận dạng mũ bảo hộ 2.1.3 Phương pháp nhận dạng khuôn mặt 2.2 Phân tích xây dựng hệ thống 2.2.1 Yêu cầu đặt với mơ hình 2.2.2 Quy trình thực vi 2.3 Các nghiên cứu liên quan đến đề tài 2.3.1 Các nghiên cứu nước 2.3.2 Các nghiên cứu nước 2.4 Các tồn có mơ hình CHƯƠNG 3: CƠ SỞ LÝ THUYẾT 10 3.1 Chọn mũ bảo hộ nhận dạng 10 3.2 Học máy .10 3.2.1 Học máy gì? .10 3.2.3 Thư viện học máy sử dụng đồ án .11 3.3 Học sâu 12 3.3.1 Học sâu gì? 12 3.3.2 Mạng MobileNetV2 .15 CHƯƠNG 4: PHƯƠNG HƯỚNG VÀ CÁC GIẢI PHÁP 27 4.1 Phương pháp phát khuôn mặt 27 4.1.1 Phương án 27 4.1.2 Phương án 28 4.2 Phương pháp nhận dạng mũ bảo hộ 29 4.3 Phương pháp nhận diện khuôn mặt .31 CHƯƠNG 5: THIẾT KẾ MƠ HÌNH NHẬN DẠNG 33 5.1 Thiết kế mơ hình 33 5.1.1 Webcam Pk-920H A4tech 33 5.1.2 Màn hình inch HDMI LCD Waveshare 34 5.1.3 Máy tính nhúng Raspberry Pi 3B+ 35 5.1.4 Hệ điều hành Raspberry Pi OS 64bit 36 5.1.5 Trình biên dịch code PyCharrm 37 5.1.6 Ngơn ngữ lập trình Python 37 5.1.7 Phần mềm VNC viewer .38 5.1.8 Thiết kế hệ thống nhận dạng mũ bảo hộ 38 5.2 Phát triển chương trình nhận dạng .39 5.2.1 Đào tạo mơ hình nhận dạng mũ bảo hộ .40 vii def show_result(data): st.insert("end",">>> " + str(data)+"\n") st.see("end") #Hàm gán giá trị cho state_cap def cap_image(): global state_cap #biến toàn cục state_cap = #Hàm in liệu encod encodings.pickle def listid(): try: data = pickle.loads(open("/home/pi/Desktop/encodings.pickle", "rb").read()) #đọc liệu từ tệp encodings.pickle cách mở tệp chế độ đọc nhị phân ("rb") #và sử dụng pickle.loads() để tải liệu except FileNotFoundError: #try gặp lỗi tạo data = {"encodings": "", "names": ""} data = {"encodings": "", "names": ""} dataname = data["names"] show_result("List ID: " + str(dataname)) #Hàm xóa cặp giá trị encodings.pickle def del_id(): try: data = pickle.loads(open("/home/pi/Desktop/encodings.pickle", "rb").read()) except FileNotFoundError: data = {"encodings": "", "names": ""} dataname = data["names"] dataencod = data["encodings"] try: i = dataname.index(entry1.get()) XII #gán vị trí mà entry1.get() trùng với dataname vào i show_result("Delete ID: "+entry1.get() +" ") dataname.pop(i) dataencod.pop(i) #Xóa phần tử thứ i khỏi danh sách dataname dataencod, i mục người cần xóa data["names"] = dataname data["encodings"] = dataencod #Gán lại danh sách dataencod dataname bị xóa phần tử i vào "encodings"và"names" data f = open("/home/pi/Desktop/encodings.pickle", "wb") #file encodings.pickle tạo mở chế độ ghi nhị phân ("wb") f.write(pickle.dumps(data)) #ghi dử liệu vào file f.close() show_result("Delete done") except: show_result("Name not found: "+entry1.get()) #Hàm di chuyển thư mục def mv_folder(): source_folder = '/home/pi/dataset/NewName' destination_folder = '/home/pi/dataset' # Lấy danh sách thư mục thư mục "NewName" subdirectories = [f for f in os.listdir(source_folder) if os.path.isdir(os.path.join(source_folder, f))] # Chuyển thư mục sang thư mục đích for directory in subdirectories: source_path = os.path.join(source_folder, directory) destination_path = os.path.join(destination_folder, directory) XIII shutil.move(source_path, destination_path) #Hàm mã hóa encoding khuôn mặt càn nhận diện def encode(): show_result("Encodings ") knownEncodings = [] knownNames = [] try: data = pickle.loads(open("/home/pi/Desktop/encodings.pickle", "rb").read()) except FileNotFoundError: data = {"encodings": knownEncodings, "names": knownNames} imageDatasets = list(paths.list_images("/home/pi/dataset/NewName")) #tạo danh sách đường dẫn tới hình ảnh thư mục for (i, imagePath) in enumerate(imageDatasets): #chạy đường dẫn hình ảnh danh sách imageDatasets show_result("[INFO] processing image {}/{}".format(i + 1,len(imageDatasets))) name = imagePath.split(os.path.sep)[-2] #trích xuất tên người từ đường dẫn hình ảnh cách #sử dụng split()tách đường dẫn thành phần tử #dựa ký tự phân cách đường dẫn /(os.path.sep) lấy phần tử thứ cuối đếm lên image = cv2.imread(imagePath) #đọc hình ảnh từ đường dẫn rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) #chuyển đổi khơng gian màu hình ảnh từ BGR sang RGB(Red-Green-Blue) để phù hợp với thư viện face_recognition boxes = face_recognition.face_locations(rgb, model="hog") #xác định vị trí khn mặt hình ảnh cách sử dụng face_recognition lưu trữ vào boxes #model="hog" xử lý khn mặt dựa tính gradient hình ảnh Nó sử dụng histogram hướng gradient để phát đặc trưng khuôn mặt XIV encodings = face_recognition.face_encodings(rgb, boxes) #mã hóa khn mặt danh sách vector mã hóa (encoding) tương ứng với khn mặt hình ảnh for encoding in encodings: #vòng lặp, vector (encoding) (name) #của khuôn mặt thêm vào danh sách data["encodings"] data["names"] data["encodings"].append(encoding) data["names"].append(name) f = open("/home/pi/Desktop/encodings.pickle", "wb") #file encodings.pickle tạo mở chế độ ghi nhị phân ("wb") f.write(pickle.dumps(data)) #ghi dử liệu vào file f.close() show_result("Encode done") mv_folder() # sau mã hóa khn mặt hồn thành #di chun folder chưa ảnh ngồi tránh trường hợp #mã hóa lặp lại tốn tài nguyên rasp #vòng lắp chương trinh def main_loop(): global state_cap, path_image,detector #biến tồn cục _, frame = cap.read() #đọc khung hình từ cap = cv2.VideoCapture(0) frame = imutils.resize(frame, width=400) #hay đổi kích thước khung hình tahng rộng 400pixel gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #Chuyển đổi khung hình từ khơng gian màu BGR sang khơng gian màu xám phù hớp với detec khuôn mặt rects = detector(gray, 0) XV #xác định vùng chứa khuôn mặt for (i, rect) in enumerate(rects): #lặp qua hình chữ nhật danh sách rects (x, y, w, h) = face_utils.rect_to_bb(rect) #chuyển đổi hình chữ nhật rect khn mặt #thành giá trị (x, y, w, h) cv2.rectangle(frame, (x,y), (x+w, y+h),(0,0,255), 2) #vùng chứa khuôn mặt vẽ màu đỏ độ dày đường vẻ if state_cap == 1: if entry1.get(): # entry1.get() có giá trị tạo thư mục cso tên giá trị entry1.get() #theo đường dẫn folder_path = '/home/pi/dataset/NewName/' + str(entry1.get()) os.makedirs(folder_path, exist_ok=True) path_image = filedialog.asksaveasfilename(title = "Select file",filetypes = (("jpg files","*.jpg"),("all files","*.*"))) #filedialog tương tác với tập tin hệ thơng chọn vị trí tên tập tin để lưu ảnh try: #ghi khung hình vào đường dẫn cv2.imwrite(path_image,frame) show_result("Take Photo: " + path_image) except: show_result("None Photo") else: #nếu entry1.get() khơng có giá trị thi in No Name write your name show_result("No Name write your name") state_cap = XVI frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) #Chuyển đổi khơng gian màu khung hình từ BGR sang RGBA #đỏ (R), xanh (G), xanh dương (B) kênh alpha (A) độ suốt img = Image.fromarray(frame) #chuyển đổi từ mảng numpy frame sang đối tượng hình ảnh sử dụng để hiển thị imgtk = ImageTk.PhotoImage(image=img) #đối tượng hiển thị hình ảnh giao diện người dùng im=Label(image=imgtk) #tạo đối tượng tkinter với hình ảnh imgtk làm nội dung tỉnh im.image=imgtk #gán đối tượng hình ảnh giao diện imgtk vào im im.pack() #hiển thị im giao diện người dùng im.place(x=15,y=15) #đặt vị trí (im) giao diện người dùng có cửa sổ 700x350 tk.after(100, main_loop) #gọi hàm main_loop() sau 100 mili #tạo nút nhấn có tk đưa vào cửa sổ Tk tkinter có tên text #có màu bg có rộng cao #là width height gọi hàm command BT = Button(tk, text ="Take Photo",bg = "dark green", width=10,height = 2, command = cap_image) #hiển thị BT giao diện người dùng BT.pack() #đặt vị trí BT giao diện người dùng có cửa sổ 700x350 BT.place(x=460,y=230) BT = Button(tk, text ="List ID",bg = "#528B8B",width=10,height = 2, command = listid) XVII BT.pack() BT.place(x=460,y=280) BT = Button(tk, text ="Encode",bg = "#FF6103",width=10,height = 2, command = encode) BT.pack() BT.place(x=580,y=230) BT = Button(tk, text ="Delete",bg = "dark red",width=10,height = 2, command = del_id) BT.pack() BT.place(x=580,y=280) #tạo vùng văn có width=32, height=10 st = ScrolledText(tk, width=32, height=10) st.pack() st.place(x=420,y=15) #tạo ô nhập liệu có màu chữ fg có màu bg có kiểu chữ font có chiều rộng width entry1= Entry(tk,fg="green",bg="light gray",font="Times 13", width= 30) entry1.pack() entry1.place(x=420,y=200) main_loop() #gọi hàm tk.mainloop() #khởi chạy giao diện người dùng cv2.destroyAllWindows() #các cửa sổ giải phóng sau chương trình kết thúc cap.release() #giải phóng tài nguyên đối tượng cap XVIII C – Chạy video thời gian thực, lưu liệu vi phạm #các thư viện sử dụng #pickle sử dụng để lưu trữ mơ hình máy học huấn luyện import pickle #dlib xử lý hình ảnh thị giác máy tính, phát nhận dạng import dlib #thư viện imutils hỗ trợ việc xử lý ảnh (kích thước, cắt ảnh, xoay ảnh, ) #và xử lý video OpenCV #face_utils thực nhận dang khuôn mặt #VideoStream cho phép truy cập dễ dàng đến luồng video từ webcam, #video luồng mạng from imutils import face_utils from imutils.video import VideoStream import imutils #face_recognition nhận dạng khuôn mặt, so sánh khuôn mặt import face_recognition #numPy gói cho tính tốn Python import numpy as np #opencv xử lý ảnh video, bao gồm đọc ghi tệp tin hình ảnh nhiều thứ khác import cv2 #preprocess_input sử dụng để tiền xử lý ảnh trước đưa vào mơ hình MobileNet V2 #img_to_array chuyển đổi hình ảnh thành mảng NumPy trước đưa vào mơ hình #load_model sử dụng để tải mơ hình lưu trữ trước 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 #os cung cấp hàm để tương tác với hệ điều hành import os #re thực hoạt động tìm kiếm so khớp mẫu chuỗi ký tự XIX import re #pandas thực thao tác phân tích liệu, #như đọc ghi liệu từ định dạng khác (ví dụ: CSV, Excel) import pandas as pd #datetime làm việc với ngày Python from datetime import datetime print("[INFO] loading ") detector = dlib.get_frontal_face_detector() #phát khuôn mặt ảnh data = pickle.loads(open("/home/pi/Desktop/encodings.pickle", "rb").read()) #mở đọc tải liệu từ tệp tin encodings.pickle maskNet = load_model("/home/pi/Desktop/NonBH.model") #tải mơ hình từ tệp tin NonBH.model mouse_clicked = False #hàm click chuột giao diện cảnh báo nón bảo hộ àn hình hdmi def mouse_callback(event, x, y, flags, param): global mouse_clicked if event == cv2.EVENT_LBUTTONUP: mouse_clicked = True cv2.namedWindow("Frame") cv2.setMouseCallback("Frame", mouse_callback) #hàm nhận diện tạo liệu lưu trữ gồm csv file hình ảnh def face_recog(rgb, boxes): #hàm nhận đầu vào rgb boxes name = "Unknown" try: XX #mã hóa khn mặt danh sách vector mã hóa (encoding) tương ứng với khn mặt hình ảnh encodings = face_recognition.face_encodings(rgb, boxes) for encoding in encodings: #vòng lặp kiểm tra độ trùng khớp vector (encoding) #trong danh sách encodings matches = face_recognition.compare_faces(data["encodings"], encoding, 0.4) #so sánh vector đặc trưng khn mặt mã hóa (encoding) với danh sách vector đặc trưng có sẵn data["encodings"] #kết danh sách giá trị True/False if True in matches: #nếu có true matches matchedIdxs = matches.index(True) #tìm vị trí khn mặt trùng khớp name = data["names"][matchedIdxs] #lấy tên vị trí trùng khớp now = datetime.now() #lấy thời gian thoigian = now.strftime("%H:%M:%S %d/%m/%Y") #định dạng thành chuổi thời gian "%H:%M:%S %d/%m/%Y" imagename = thoigian.replace(":", "-").replace("/", "-") #tên ảnh lưu theo định dạng thời gian ký tự : - không phép #hiển thị nên đổi thành ký tự try: csvfile = pd.read_csv('report.csv') #đọc file report.csv except FileNotFoundError: # Nếu file chưa tồn tại, tạo DataFrame lưu vào file CSV csvfile = pd.DataFrame(columns=['Name', 'Time']) XXI csvfile.to_csv('report.csv', index=False) new_row = [name, thoigian] #tạo hàng chứa tên thời gian csvfile.loc[-1] = new_row #thêm hàng vào DataFrame #chỉ số -1 sử dụng để thêm hàng vào đầu DataFrame csvfile.reset_index(drop=True) #cập nhật lại số hàng DataFrame csvfile.to_csv("report.csv", index=False) #ghi lại vào tệp tin 'report.csv' folder_path = '/home/pi/image_report/' + str(name) #lưu đường dẫn có tên name vào folder_path os.makedirs(folder_path, exist_ok=True) #tự tao folder theo tên name cv2.imwrite(folder_path + '/' + imagename + '.jpg', rgb) #lưu ảnh định dạng ipg có tên imagename theo đường dẫn tạo print(name) except: #mã hóa khn mặt kiểm tra không trùng khớp chạy print("no face") print("no face") return(name)#trả giá trị name vs = VideoStream(src=0).start() #đọc video từ nguồn liệu camera while True: frame = vs.read() #đọc khung hình từ luồn video lưu vào frame frame = cv2.resize(frame, (666, 400)) #thay đổi kích thước khung hình đọc 800x480 kích thước hình chia 1,2 XXII gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #chuyển đổi khung hình sang ảnh xám sử dụng cho detec khuôn mặt rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) #chuyển đổi khung hình từ khơng gian màu BGR sang RGB, sử dụng cho thư viện face_recognition rects = detector(gray, 0) #xác định vùng chứa khuôn mặt boxes = [] name = None for (i, rect) in enumerate(rects): #lặp qua hình chữ nhật danh sách rects (x, y, w, h) = face_utils.rect_to_bb(rect) #chuyển đổi hình chữ nhật rect khuôn mặt #thành giá trị (x, y, w, h) if y < 121: continue #kiểm tra vị trí y khn mặt tiếp tục với khuôn mặt khác y b else "NotOK" if label == "NotOK": #nếu kết khuôn mặt frame xác định notok #thi nhận dạng tên khn mặt hàm face_recog(rgb, boxes) #có kết gán vào name color = (0, 0, 255) name = face_recog(rgb, boxes) else: #ngược lại gán color màu xanh color =(0, 255, 0) cv2.putText(frame, name, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX,0.75, (0, 255, 0), 2) XXIV #ghi chữ frame ghi name vị trí (x, y-10), #có FONT_HERSHEY_SIMPLEX có kích thước 75% kích thước ban đầu, #màu xanh, độ đậm cv2.rectangle(frame, (x-20,y-120), (x+w+20, y+h+20),color, 2) #vẽ hình chữ nhật khung hình cso tọa độ #có màu color, độ đậm label = "{}: {:.2f}%".format(label, max(a,b) * 98) #chuỗi chứa thơng tin độ xác dự đốn hiển thị đến chữ số sau dấu thập phân cv2.putText(frame, label, (x, y+50),cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2) #ghi chữ frame ghi label vị trí (x, y+50), #có FONT_HERSHEY_SIMPLEX có kích thước 90% kích thước ban đầu, #có màu color, độ đậm cv2.imshow("Frame", frame) #hiển thị khung hình lưu biến frame cửa sổ có tên "Frame" if mouse_clicked: break key = cv2.waitKey(1) & 0xFF #chờ phím nhấn khoảng thời gian #1 millisecond trả mã ASCII phím #lấy bit thấp mã if key == ord("q"): break #nếu phím q nhấn ngắt khỏi vịng lặp cv2.destroyAllWindows()#các cửa sổ giải phóng sau chương trình kết thúc vs.stop() #tắt trình stream video XXV S K L 0