Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 103 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
103
Dung lượng
5,98 MB
Nội dung
0 TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA: CƠ KHÍ BÁO CÁO ĐỒ ÁN TỐT NGHIỆP Đề tài Phân loại kiểm tra chất lượng hoa ứng dụng xử lý ảnh trí tuệ nhân tạo Giáo viên hướng dẫn: ThS Bùi Huy Anh Nhóm: Thành viên nhóm: Nguyễn Minh Hiền 2018605452 Nguyễn Ngọc Kha 2018605696 Mai Thành Long 2018605315 Hà Nội, 2022 I NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN Hà nội, ngày tháng năm 2022 Giáo viên hướng dẫn (Chữ ký) II NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN Hà nội, ngày tháng năm 2022 Giáo viên phản diện (Chữ ký) III MỤC LỤC MỤC LỤC III LỜI MỞ ĐẦU CHƯƠNG GIỚI THIỆU CHUNG VỀ HỆ THỐNG PHÂN LOẠI VÀ KIỂM TRA CHẤT LƯỢNG SẢN PHẨM 1.1 Tổng quan chung 1.2 Các vấn đề đặt 1.3 Phương pháp nghiên cứu 1.4 Mục tiêu 1.5 Phạm vi giới hạn đề tài CHƯƠNG TỔNG QUAN VỀ HỆ THỐNG PHÂN LOẠI VÀ KIỂM TRA CHẤT LƯỢNG HOA QUẢ 2.1 Giới thiệu chung xử lý ảnh 2.2 Giới thiệu trí tuệ nhân tạo Deep learning 2.3 Cấu tạo hệ thống phân loại quản lý chất lượng sản phẩm 24 CHƯƠNG NGHIÊN CỨU THIẾT KẾ HỆ THỐNG PHÂN LOẠI VÀ KIỂM TRA CHẤT LƯỢNG HOA QUẢ 25 3.1 Thiết kế sơ đồ khối hệ thống 25 3.2 Thiết kế vẽ hệ thống 27 3.3 Thiết kế hệ thống điều khiển 31 3.4 Tính tốn thiết kế hệ thống 44 3.5 Tính chọn khối nguồn 50 3.6 Sơ đồ nối dây 52 3.7 Xây dựng chương trình điều khiển 54 3.8 Thiết kế thi cơng mơ hình 59 CHƯƠNG KẾT QUẢ VÀ ĐỊNH HƯỚNG PHÁT TRIỂN 67 4.1 Kết đạt 67 4.2 Đề xuất hướng phát triển 80 KẾT LUẬN 81 IV DANH MỤC HÌNH ẢNH Hình 2.1 Hình ảnh chuyển qua ngơn ngữ máy tính 10 Hình 2.2 Làm phẳng (flattening) ma trận 3×3 thành vecto 9×1 10 Hình 2.3 Một hình GRB có kích thước 4×4×3 11 Hình 2.4 Tích chập hình ảnh 5×5×1 với lọc 3×3×1 hình ảnh chập 3×3×1 12 Hình 2.5 Ma trận gộp 3×3 từ ma trận tích chập 5×5 14 Hình 2.6 Các kiểu ghép gộp 14 Hình 2.7 Cấu trúc mạng Darknet 15 Hình 2.8 Cấu trúc mạng YOLOv1 17 Hình 2.9 Cấu trúc mạng YOLOv2 18 Hình 2.10 Anchor box 20 Hình 2.11 Phát nhiều đối tượng lưới 21 Hình 2.12 Cấu trúc mạng YOLOv3 22 Hình 3.1 Sơ đồ khối hệ thống 25 Hình 3.2 Sơ đồ kế nối chi tiết hệ thống 26 Hình 3.3 Mơ hình hệ thống 27 Hình 3.4 Raspberry Pi 3B+ 32 Hình 3.5 Arduino NANO Atmega 328P 32 Hình 3.6 Sơ đồ chân Arduino NANO 33 Hình 3.7 Giao tiếp USART Arduino NANO Raspberry PI 3B+ 34 Hình 3.8 Kết nối Raspberry Pi3B+ với Arduino NANO 35 Hình 3.9 Camera PI V2 35 Hình 3.10 Cảm biến tiệm cận E18-D80NK 36 Hình 3.11 Kết nối Arduino NANO cảm biến 37 Hình 3.12 Loadcell 38 Hình 3.13 Module HX711 39 Hình 3.14 Sơ đồ kết nối Arduino NANO Loadcell 39 Hình 3.15 Mạch điều khiển động DC L298 40 Hình 3.16 Màn hình inch 41 Hình 3.17 LCD 16×2 41 Hình 3.18 Sơ đồ kết nối Arduino NANO LCD thông qua I2C 42 Hình 3.19 Van điện từ 5/2 AIRTAC 42 Hình 3.20 Sơ đồ kết nối Arduino NANO với van điện từ 43 Hình 3.21 Động Servo MG996R 43 Hình 3.22 Sơ đồ kết nối Arduino NANO động Servo 44 Hình 3.23 Băng tải 44 Hình 3.24 Lực phân bố puly dẫn động băng tải 45 Hình 3.25 Động giảm tốc JGB37-555 46 Hình 3.26 Phân tích lực hộp đựng 48 Hình 3.27 Áp suất p lực đẩy Fd xylanh 48 Hình 3.28 Xylanh khí nén MAL16x150 49 Hình 3.29 Xylanh khí nén MAL 16x50 49 Hình 3.30 Adapter Model 1250 50 Hình 3.31 Mạch hạ áp LM2596 51 Hình 3.32 Adaptor Model CY-0530 51 Hình 3.34 Lưu đồ thuật tốn hệ thống chu trình 54 Hình 3.35 Lưu đồ thuật tốn hệ thống chu trình 55 Hình 3.36 Lưu đồ thuật tốn hệ thống chu trình 56 Hình 3.37 Lưu đồ thuật tốn xử lý ảnh chu trình 57 Hình 3.38 Lưu đồ thuật tốn xử lý ảnh chu trình 58 Hình 3.39 Biểu đồ trạng thái 59 Hình 3.40 Khối cấp 60 V Hình 3.41 Khối băng tải 60 Hình 3.42 Bộ phận chia chín 61 Hình 3.43 Cụm bàn cân Loadcell 61 Hình 3.44 Khối cấp hộp 62 Hình 3.45 Tủ điện 62 Hình 3.46 Mơ hình hồn thiện 63 Hình 3.47 Giao diện hệ điều hành Raspbian 64 Hình 3.48 Thư mục chứa chương trình điều khiển 64 Hình 3.49 Chương trình điều khiển 65 Hình 3.50 Hình ảnh camera khởi động ban đầu 65 Hình 3.51 Kết thúc chương trình 66 Hình 4.1 Dữ liệu ảnh ban đầu 68 Hình 4.2 Dữ liệu đầu vào gắn nhãn 68 Hình 4.3 Tỉ lệ liệu đầu vào 69 Hình 4.4 Điều chỉnh độ bão hịa ảnh 69 Hình 4.5 Làm bóng hình ảnh 70 Hình 4.6 Tăng giảm độ sáng 70 Hình 4.7 Làm mờ ảnh 71 Hình 4.8 Thư viện Pytorch 71 Hình 4.9 Tải liệu YOLOv3 72 Hình 4.10 Giải nén tập liệu từ Robotflow 72 Hình 4.11 Tệp Train Validation 73 Hình 4.12 Thêm lớp chuyển đổi 73 Hình 4.13 Huấn luyện model 74 Hình 4.14 Kết sau huấn luyện 74 Hình 4.15 Biểu đồ biểu thị thông số sau huấn luyện 75 Hình 4.16 Độ xác lớp 75 Hình 4.17 Nhận diện đỏ hỏng YOLOv3 Darknet 76 Hình 4.18 Nhận diện đỏ YOLOv3 Darknet 76 Hình 4.19 Nhận diện xanh YOLOv3 Darknet 76 Hình 4.20 Nhận diện xanh hỏng YOLOv3 Darknet 77 Hình 4.21 Màn hình HDMI hiển thị camera nhận đỏ 77 Hình 4.22 Màn hình HDMI hiển thị camera nhận xanh 78 Hình 4.23 Màn hình HDMI hiển thị camera nhận đỏ hỏng 78 Hình 4.24 Màn hình HDMI hiển thị camera nhận xanh hỏng 79 Hình 4.25 Hệ thống đếm đỏ nhận diện, cân hộp loadcell chưa có hộp 79 Hình 4.26 Hệ thống đếm đủ hộp cân khối lượng sau nhận diện 80 VI DANH MỤC BẢNG BIỂU Bảng 2.1 Những cải tiến phiên YOLOv2 so với YOLOv1 19 Bảng 3.1 Các chi tiết băng tải 28 Bảng 3.2 Các chi tiết hệ thống cấp 28 Bảng 3.3 Các chi tiết hệ thống camera 29 Bảng 3.4 Các chi tiết cấu chia 29 Bảng 3.5 Các chi tiết hệ thống cấp thùng 30 Bảng 3.6 Các chi tiết hệ thống bàn cân 30 Bảng 3.7 Thông số kỹ thuật Arduino NANO 34 Bảng 3.8 Thông số kỹ thuật Camera PI V2 36 Bảng 3.9 Thông số kỹ thuật cảm biến tiệm cận E18-D80NK 37 Bảng 3.10 Thông số kỹ thuật Loadcell 38 Bảng 3.11 Thông số kỹ thuật HX711 39 Bảng 3.12 Thông số kỹ thuật DC L298 40 Bảng 3.13 Thơng số kỹ thuật LCD 16×2 42 Bảng 3.14 Thông số kỹ thuật van điện từ 5/2 43 Bảng 3.15 Thông số Servo MG996R 44 Bảng 3.16 Thông số động JGB37-555 47 Bảng 3.17 Thơng số xylanh khí nén MAL 16x150 49 Bảng 3.18 Thơng số xylanh khí nén MAL 16x50 50 Bảng 3.19 Thông số Adapter Model 1250 50 Bảng 3.20 Thông số mạch hạ áp LM2596 51 Bảng 3.21 Thông số Adaptor Model CY-0530 52 82 TÀI LIỆU THAM KHẢO [1] Nguyễn Văn Long, Ứng dụng xử lý ảnh thực tế với OpenCV, Đại học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh [2] Nguyễn Thanh Hải, Giáo trình Xử Lý Ảnh, Đại học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh [3] Mohamed Elgendy, Deep Learning for Vision Systerms, Manning, November 10, 2020 [4] H Li, Z Lin, X Shen, J Brandt, G Hua (2015) “A Convolutional Neural Network Cascade for Face Detection,” IEEE Conf on Computer Vision and Pattern Recognition, pp 5325-5334 [5] F Girosi, M Jones, and T Poggio Regularization theory and neural networks architectures Neural Computation, 7(2): 219-269, 1995 [6] Stan, Z.L., Jain, A Handbook of face recognition, Springer, New York, USA, 2005 [7] Hà Duy Khánh, “Đồ án phân loại sản phẩm dùng Kit Raspberry, Đồ Án Tốt Nghiệp Đại Học”, Trường Đại Học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh, 2018 [8] Giáo trình Hệ thống tự động thủy khí, Đại học Cơng Nghiệp Hà Nội PHỤ LỤC A Bản vẽ lắp B Bản vẽ phân rã C Sơ đồ nối dây hệ thống D Lưu đồ thuật toán hệ thống E Lưu đồ xử lý ảnh F Thiết kế chương trình điều khiển *) Chương trình điều khiển Python import argparse from sys import platform from models import * # set ONNX_EXPORT in models.py from utils.datasets import * from utils.utils import * import serial ser = serial.Serial( port='/dev/ttyUSB0', baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 ) sleep(5) ser.write(b's'); def detect(save_img=False): cd=0 cx=0 ct=0 img_size = (320, 192) if ONNX_EXPORT else opt.img_size # (320, 192) or (416, 256) or (608, 352) for (height, width) weights, half=opt.weights, opt.half webcam = '0' # Initialize khởi tạo device = torch_utils.select_device(device='cpu' if ONNX_EXPORT else opt.device) # Initialize model model = Darknet(opt.cfg, img_size) # pytorch format model.load_state_dict(torch.load(weights, map_location=device)['model']) # Eval mode model.to(device).eval() # Half precision half = half and device.type != 'cpu' # half precision(độ xác) only supported on CUDA # Set Dataloader view_img = True torch.backends.cudnn.benchmark = True # set True to speed up constant image size inference dataset = LoadStreams('0', img_size=img_size) # Get names and colors names = load_classes(opt.names) colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(names))] # Run inference (chạy suy luận) t0 = time.time() for path, img, im0s, vid_cap in dataset: img = torch.from_numpy(img).to(device) img = img.half() if half else img.float() # uint8 to fp16/32 img /= 255.0 # chuyển đổi số nguyên không dấu từ 0-255 sang số thực xác đơn 0-1 if img.ndimension() == 3: img = img.unsqueeze(0) # Inference t1 = torch_utils.time_synchronized() pred = model(img)[0].float() if half else model(img)[0] t2 = torch_utils.time_synchronized() # Apply NMS pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms) # Process detections for i, det in enumerate(pred): # detections per image # batch_size >= p, s, im0 = path[i], '%g: ' % i, im0s[i] #chia phần bên trái cho bên phải lấy phần dư s += '%gx%g ' % img.shape[2:] # print string: s=s if det is not None and len(det): # Rescale boxes from img_size to im0 size det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round() # Write results for *xyxy, conf, cls in det: # Add bbox to image c=int(cls) print(c) if c==0: cd=cd+1 ct=0 cx=0 label = names[c] + “ “ + str(conf)[7:11] if cd>10: ser.write(b"d") ser.reset_output_buffer() ser.reset_input_buffer() cd=0 sleep(0.05) if c==2: cx=cx+1 ct=0 cd=0 label = names[c] + “ “ + str(conf)[7:11] if cx>10: ser.write(b"x") ser.reset_output_buffer() ser.reset_input_buffer() cx=0 sleep(0.05) if c==1: ct=ct+1 cd=0 cx=0 label = names[c] + “ “ + str(conf)[7:11] if ct>10: ser.write(b"x") ser.reset_output_buffer() ser.reset_input_buffer() ct=0 sleep(0.05) plot_one_box(xyxy, im0, label=label, color=colors[int(cls)]) #print(names[int(cls)] + " " + str(conf)) print(names[int(cls)],conf) # Print time (inference + NMS) print('%sDone (%.3fs)' % (s, t2 - t1)) # Stream results cv2.imshow(p, im0) if cv2.waitKey(1) == ord('q'): # q to quit raise StopIteration print('Done (%.3fs)' % (time.time() - t0)) if name == ' main ': parser = argparse.ArgumentParser() parser.add_argument(' cfg', type=str, default='cfg/yolov3-spp.cfg', help='*.cfg path') parser.add_argument(' names', type=str, default='data/test.names', help='*.names path') parser.add_argument(' weights', type=str, default='92x92.pt', help='weights path') parser.add_argument(' img-size', type=int, default=92, help='inference size (pixels)') parser.add_argument(' conf-thres', type=float, default=0.5, help='object confidence threshold') parser.add_argument(' iou-thres', type=float, default=0.5, help='IOU threshold for NMS') parser.add_argument(' half', action='store_false', help='half precision FP16 inference') parser.add_argument(' device', default='', help='device id (i.e or 0,1) or cpu') parser.add_argument(' classes', nargs='+', type=int, help='filter by class') parser.add_argument(' agnostic-nms', action='store_true', help='classagnostic NMS') opt = parser.parse_args() print(opt) with torch.no_grad(): detect() *) Chương trình điều khiển Arduino Chuong trình Config.h: #define dongco #define xilanh1 #define xilanh2 #define xilanh3 #define sensor1 A1 #define sensor2 A2 #define sensor3 A3 #define buzz A0 #define len1 80 #define xuong1 135 #define len2 108 #define xuong2 50 #include Servo sv1, sv2; #include #include LiquidCrystal_I2C lcd(0x27, 16, 2); #include #include #include #define DT #define SCK Q2HX711 hx711(DT,SCK); float y1 = 100.0; // calibrated mass to be added void tick(int x) { for (int j=0;j