Luận văn tốt nghiệp ngành kỹ thuật cơ khí ô tô “Công nghệ nhận diện làn đường, biển báo cho xe tự hành bằng RASBERRY PI” là thành quả của quá trình nghiên cứu, nỗ lực không ngừng của em trong suốt thời gian qua với sự giúp đỡ tận tình của quý thầy Trường Đại Học Giao Thông Vận Tải Thành Phố Hồ Chí Minh, các bạn bè và đồng nghiệp trong ngành kỹ thuật cơ khí nói chung và chuyên ngành ô tô nói riêng.
TRƯỜNG ĐẠI HỌC GIAO THƠNG VẬN TẢI TP HỒ CHÍ MINH VIỆN CƠ KHÍ - - LUẬN VĂN TỐT NGHIỆP CÔNG NGHỆ NHẬN DIỆN LÀN ĐƯỜNG, BIỂN BÁO CHO XE TỰ HÀNH SỬ DỤNG RASPBERRY PI NGÀNH: KỸ THUẬT CƠ KHÍ CHUN NGÀNH: CƠ KHÍ Ơ TƠ Giảng viên hướng dẫn: Th.S Nguyễn Hồng Thắng Sinh viên thực hiện: Phạm Chí Đức Mã số sinh viên: 1751080012 Lớp: CO17A TP HỒ CHÍ MINH, 2023 LỜI CẢM ƠN Luận văn tốt nghiệp ngành kỹ thuật khí tô “Công nghệ nhận diện đường, biển báo cho xe tự hành RASBERRY PI” thành q trình nghiên cứu, nỗ lực khơng ngừng em suốt thời gian qua với giúp đỡ tận tình q thầy Trường Đại Học Giao Thơng Vận Tải Thành Phố Hồ Chí Minh, bạn bè đồng nghiệp ngành kỹ thuật khí nói chung chun ngành tơ nói riêng Em xin bày tỏ biết ơn đến quý thầy hướng dẫn Th.S Nguyễn Hồng Thắng quan tâm, trực tiếp hướng dẫn tận tình để luận văn hồn thành Đồng thời, em gửi lời cảm ơn đến ban giám hiệu nhà trường, phịng đào tạo, ban lãnh đạo viện khí môn chuyên ngành tạo điều kiện cho em hồn thành luận văn tốt nghiệp Sau cùng, em xin cảm ơn gia đình ln bên cạnh, động viên giúp đỡ suốt thời gian thực luận văn Xin chân thành cảm ơn! Tp Hồ Chí Minh, ngày 23 tháng 11 năm 2022 Sinh viên thực Phạm Chí Đức ii TĨM TẮT LUẬN VĂN Trong thời đại cách mạng cơng nghiệp hóa, đại hóa Xe ngày đại việc ứng dụng công nghệ Internet vạn vật (IOT), trí tuệ nhân tạo (AI) tích hợp vào xe đặc biệt xe tự hành Các chuyên gia dự đoán, khoảng 15 đến 20 năm nữa, xe tự hành phổ biến thịnh hành so với phương tiện phổ thông Hiện có nhiều tập đồn sản xuất xe tập đồn cơng nghệ tham gia vào đua phát triển công nghệ tự lái thơng minh cho xe giúp cho xe tự lái đến nơi cần thiết mà khơng cần có can thiệp người Đặc biệt công nghệ tự hành bắt đầu ứng dụng khng viên Bình Dương với khả tự hành cấp độ Mục đích đề tài phần xử lý nhận diện đường, biển báo dựa tính trạng giao thơng Việt Nam xe tự hành nên có phân đường riêng biệt Nên ứng dụng đề tài dựa điều kiện xe phải phân chia cách vạch sơn trắng điều kiện ánh sáng thích hợp để nhận diện qua camera Trên thực tế có nhiều phương pháp để nhận diện đường cách hiệu xác nhất, thời gian hạn chế nên để phù hợp với khối lượng luận văn, em xin dùng phương pháp nhận diện vách kẻ trẳng thẳng làm sở để ứng dụng vào đề tài Nội dung luận văn xây dựng thành chương sau đây: Chương 1: Cơ sở lý thuyết Chương 2: Cài đặt hệ điều hành xây dựng mơ hình Chương 3: Xây dựng thuật tốn nhận diện đường Chương 4: Xây dựng thuật toán nhận diện biển báo Thuật toán xây dựng tảng mở OpenCV, sử dụng ngôn ngữ C++ thay cho ngôn ngữ Python phổ thông để tăng thời gian xử lý thời gian thực Đề tài nghiên cứu để làm tảng cho việc phát triển hoàn thiên ứng dụng thực tế tương lai iii MỤC LỤC CHƯƠNG 1: CƠ SỞ LÝ THUYẾT .1 1.1 Tổng quan xe tự hành 1.1.1 Khái niệm xe tự hành 1.1.2 Lịch sử phát triển xe tự hành .1 1.2 Tình hình xe tự hành giới nước .3 1.2.1 Tình hình nghiên cứu xe tự hành giới 1.2.2 Tình hình nghiên cứu xe tự hành nước .4 1.3 Định hướng đề tài .5 1.4 Khái niệm OpenCV 1.5 Một số phương pháp nhận diện đường 1.5.1 Phương pháp tìm đường thẳng hàm Houghlines .6 1.5.2 Phương pháp phát vạch trắng 1.5.3 Phương pháp nhận diện đường nâng cao .8 1.6 Lựa chọn phương pháp áp dụng vào mơ hình 1.7 Sơ lược linh kiện cho hệ thống 10 1.7.1 Raspberry Pi 3b+ 10 1.7.2 Module điều khiển động L298N 13 1.7.3 Động RC Servo MG996 18 1.7.4 Raspberry Pi camera 20 CHƯƠNG 2: XÂY DỰNG VÀ THIẾT KẾ SƠ ĐỒ MẠCH ĐIỆN HỆ THỐNG 22 2.1 Sơ đồ mơ hình xe tự hành Raspberry Pi 22 2.2 Cài đặt hệ điều hành 24 2.3 Lập trình để thu hình ảnh thơng qua camera phương pháp OpenCV 26 iv 2.4 Code để tính tốn số lượng khung hình giây (FPS) 28 CHƯƠNG 3: XÂY DỰNG THUẬT TOÁN NHẬN DIỆN LÀN ĐƯỜNG 30 3.1 Chuyển đổi tín hiệu hình ảnh 30 3.2 Tạo vùng đường cần theo dõi ROI (Region of interest) 30 3.3 chuyển đổi góc nhìn thẳng (Bird eye view) 31 3.4 Xác định phân ngưỡng ảnh (Threshhold) 33 3.5 Phát cạnh Canny (Canny Edge Detection) .33 3.6 Xác định đường biểu đồ phân phối Histogram 34 3.7 Xác định tâm đường phương pháp bám đường 35 3.8 Lập trình cho mơ hình 37 CHƯƠNG 4: XÂY DỰNG THUẬT TOÁN NHẬN DIỆN BIỂN BÁO BẰNG PHƯƠNG PHÁP CASCADE HAAR .41 4.1 Tổng quan Haar cascade 41 4.1.1 Khái niệm Haar Cascade 41 4.1.2 Nguyên lý hoạt Động 41 4.2 Xây dựng tệp nhận diện biển báo 43 4.2.1 Cài đặt phần mềm 43 4.2.2 Lập trình để thu ảnh mẫu 43 4.2.3 Tạo thư mục ảnh dương 46 4.2.4 Huấn luyện mơ hình nhận diện ảnh 48 4.3 Lập trình nhận diện biển báo chung với chương trình nhận diện đường 50 4.3.1 Code hệ thống 50 4.3.2 Giải thích code hệ thống 57 4.3.2.1 Tải tệp XML vào chương trình xác định đường 57 4.3.2.2 Xác định khoảng cách biển báo 58 v CHƯƠNG 5: KẾT LUẬN 60 5.1 Những mặt tích cực hạn chế đề tài 60 5.2 Hướng phát triển đề tài 61 vi DANH SÁCH HÌNH VẼ Hình 1.1 Xe tụ hành mơi trường xung quanh Hình 1.2 Các tính nhận diện qua camera xe Hình 1.3 Các cấp độ xe tự hành Hình 1.4 Xe tự hành Phenikaa-X Hình 1.5 Một đoạn đường cao tốc Hình 1.6 Đoạn cao tốc sau áp dụng phát cạnh Hình 1.7 Làn đường phát sau xử lý ảnh máy tính Hình 1.8 Phương pháp phát vạch trắng Hình 1.9 Phương pháp nhận diện đường nâng cao Hình 1.10 Raspberry Pi 3b+ 10 Hình 1.11 Sơ đồ mạch Raspberry Pi 3b+ 11 Hình 1.12 Module điều khiển động L298N 13 Hình 1.13 Sơ đồ chân cắm L298N 14 Hình 1.14 Sơ đồ mạch điền L298N với Raspberry Pi 15 Hình 1.15 Điều khiển tốc độ động DC phương pháp tính hiều PWM 16 Hình 1.16 Các trường hợp chu kỳ xung 16 Hình 1.17 Nguyên lý hoạt động mạch cầu H 17 Hình 1.18 Động Servo MG996 .18 Hình 1.19 Góc quay Servo dựa xung điều khiển .20 Hình 1.20 Camera Raspberry Pi 20 Hình 2.1 Sơ đồ tổng thể mơ hình xe tự hành Raspberry Pi 21 Hình 2.2 Sơ đồ khối nguyên lý hoạt động mơ hình sử dụng mạch Raspberry Camera 22 vii Hình 2.3 Mơ hình mơ nhìn từ xuống 24 Hình 2.4 Mơ hình mơ nhìn ngang 24 Hình 2.5 Các phiên hệ điều hành Raspberry OS 25 Hình 2.6 Giao diện Raspberry Pi Imager 25 Hình 2.7 Giao diện khởi động Raspberry Pi 26 Hình 2.8 Hình ảnh thông qua Webcam 28 Hình 2.9 Số khung hình giây thu 29 Hình 3.1 Phần đường xe cần quan sát 31 Hình 3.2 Ứng dụng chuyển đổi góc nhìn thực tế 31 Hình 3.3 Ảnh sau chuyển đổi góc nhìn 32 Hình 3.4 Góc nhìn camera sau phân ngưỡng ảnh 33 Hình 3.5 Camera sau dã xử lý cạnh 34 Hình 3.6 Làn đường xác định sau sử dụng biểu đồ phân phối .35 Hình 3.7 Tâm đường xác định 36 Hình 3.8 Làn đường bị nghiêng phía so với tâm ảnh 36 Hình 3.9 Làn đường bị nghiêng bên trái so với tâm ảnh 40 Hình 4.1 Các đặc điểm hình chữ nhật sử dụng để phát điểm khác ảnh 42 Hình 4.2 Áp dụng tính hình chữ nhật để nhận diện khuôn mặt .42 Hình 4.3 Logo Cascade trainer GUI 43 Hình 4.4 Giao diện Cascade Trainer GUI .43 Hình 4.5 Các mẫu ảnh có chứa biển bảo nguy hiểm .45 Hình 4.6 Các mẫu ảnh khơng chứa biển báo nguy hiểm .45 Hình 4.7 Giao diện ô Cropper ứng dụng 46 Hình 4.8 Giao diện sau chọn thư mục có chứa tệp ảnh 46 viii Hình 4.9 Biển báo dược cắt 47 Hình 4.10 Ảnh thu sau cắt 47 Hình 4.11 Giao diện nhập đầu vào thư mục 48 Hình 4.12 Quá trình huấn luyện nhận diện biển báo .48 Hình 4.13 Giao diện chạy thử nhận diện biển báo 49 Hình 4.14 Một số mẫu ảnh cho sau chạy thử tệp XML 49 Hình 4.15 khoảng cách phát vật thể thông qua camera 59 Hình 4.16 khoảng cách phát vật thể so với thực tế .59 Hình 5.1 Khi xe lên dốc bị đường 60 ix LUẬN VĂN TỐT NGHIỆP SVTH: PHẠM CHÍ ĐỨC CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 1.1 Tổng quan xe tự hành 1.1.1 Khái niệm xe tự hành Xe tự hành, hiểu đến xe tự lái, xe có khả hồn thành khả vận chuyển người xe truyền thống Nó có khả cảm nhận mơi trường xung quanh điều hướng thông qua cảm biến camera mà không cần can thiệp người Hình 1.1 Xe tự hành môi trường xung quanh 1.1.2 Lịch sử phát triển xe tự hành Năm 1939, triển lãm General Motors, Norman Bel Geddes tạo xe tự lái Đó xe điện từ trường điều khiển sóng vơ tuyến tạo thành nhờ gai kim loại từ hóa gắn đường Năm 1977, Nhật Bản cải tiến ý tưởng cách sử dụng hệ thống camera chuyển liệu đến máy tính để xử lý hình ảnh đường Tuy nhiên, xe di chuyển với tốc độ khoảng 32km/giờ Sau thập kỷ, người Đức tiếp tục cho đời phương tiện trang bị camera tự lái với tốc độ khoảng 90km/giờ Khi công nghệ cải thiện khả phát phản ứng với môi trường xe tự lái tăng theo Trang LUẬN VĂN TỐT NGHIỆP SVTH: PHẠM CHÍ ĐỨC 4.2.4 Huấn luyện mơ hình nhận diện ảnh Sau có thư mục “p” “n” ta lại mục Input -> Train tiến hành lựa thư mục chứa thư mục phía bấm Start bắt đầu Hình 4.11 Giao diện nhập đầu vào thư mục Chương trình bắt đầu huấn luyện xuất tệp XML tùy theo số stage số ảnh dương ảnh âm nhiều hay có thời gian đợi lâu tỉ lệ phát vật thể hiệu Hình 4.12 Quá trình huấn luyện nhận diện biển báo Trang 48 LUẬN VĂN TỐT NGHIỆP SVTH: PHẠM CHÍ ĐỨC Khi huấn luyện hồn thành ta tiến hành vào mục Test để chạy thử mẫu ảnh ngẫu nhiên Hình 4.13 Giao diện chạy thử nhận diện biển báo Sau cho tệp Cascade.XML chạy thử ta thấy loạt ảnh đưa vào ảnh phát cho biển báo thể bẳng ô chữ nhật màu đỏ quanh biển báo ảnh không nhận diện biển báo khơng thể Hình 4.14 Một số mẫu ảnh cho sau chạy thử tệp XML Trang 49 LUẬN VĂN TỐT NGHIỆP SVTH: PHẠM CHÍ ĐỨC 4.3 Lập trình nhận diện biển báo chung với chương trình nhận diện đường 4.3.1 Code hệ thống #include #include #include #include using namespace std; using namespace cv; Mat frame, Matrix, framePers, frameGray, frameThresh, frameEdge, frameFinal, frameFinalDuplicate; Mat ROILane; int LeftLanePos, RightLanePos, frameCenter, laneCenter, Result, laneEnd; stringstream ss; vector histrogramLane; VideoCapture Camera; Point2f Source[] = { Point2f(50,200),Point2f(580,200),Point2f(0,360), Point2f(640,360) }; Point2f Destination[] = { Point2f(135,0),Point2f(500,0),Point2f(135,480), Point2f(500,480) }; Trang 50 LUẬN VĂN TỐT NGHIỆP SVTH: PHẠM CHÍ ĐỨC //nhan dien bien bao CascadeClassifier nguyhiem_Cascade; Mat frame_nguyhiem, RoI_nguyhiem, gray_nguyhiem; vector nguyhiem; void Setup(int argc, char** argv) { Camera.set(CAP_PROP_FRAME_WIDTH, ("-w", argc, argv, 720)); Camera.set(CAP_PROP_FRAME_HEIGHT, ("-h", argc, argv, 480)); Camera.set(CAP_PROP_BRIGHTNESS, ("-br", argc, argv, 50)); Camera.set(CAP_PROP_CONTRAST, ("-co", argc, argv, 50)); Camera.set(CAP_PROP_SATURATION, ("-sa", argc, argv, 50)); Camera.set(CAP_PROP_GAIN, ("-g", argc, argv, 50)); Camera.set(CAP_PROP_FPS, ("-fps", argc, argv, 0)); } void Perspective() { line(frame, Source[0], Source[1], Scalar(0, 0, 255), 2); line(frame, Source[1], Source[3], Scalar(0, 0, 255), 2); line(frame, Source[3], Source[2], Scalar(0, 0, 255), 2); line(frame, Source[2], Source[0], Scalar(0, 0, 255), 2); Matrix = getPerspectiveTransform(Source, Destination); warpPerspective(frame, framePers, Matrix, Size(720, 480)); } void Capture() Trang 51 LUẬN VĂN TỐT NGHIỆP SVTH: PHẠM CHÍ ĐỨC { Camera.grab(); Camera.retrieve(frame); cvtColor(frame, frame_nguyhiem, COLOR_BGR2RGB); cvtColor(frame, frame, COLOR_BGR2RGB); } void Threshold() { cvtColor(framePers, frameGray, COLOR_RGB2GRAY); inRange(frameGray, 200, 255, frameThresh); Canny(frameGray, frameEdge, 300, 600, 3, false); add(frameThresh, frameEdge, frameFinal); cvtColor(frameFinal, frameFinal, COLOR_GRAY2RGB); cvtColor(frameFinal, frameFinalDuplicate, COLOR_RGB2BGR); } void Histrogram() { for(int i=0; i< frame.size().width; i++) { ROILane = frameFinalDuplicate(Rect(i,140,1,280)); divide(255, ROILane, ROILane); histrogramLane.push_back((int)(sum(ROILane)[0])); } } void LaneFinder() Trang 52 LUẬN VĂN TỐT NGHIỆP SVTH: PHẠM CHÍ ĐỨC { vector::iterator LeftPtr; LeftPtr = max_element(histrogramLane.begin(), histrogramLane.begin() + 170); LeftLanePos = distance(histrogramLane.begin(), LeftPtr); vector::iterator RightPtr; RightPtr = max_element(histrogramLane.begin() + 300, histrogramLane.end()); RightLanePos = distance(histrogramLane.begin(), RightPtr); line(frameFinal, Point2f(LeftLanePos, 0), Point2f(LeftLanePos, 480), Scalar(0, 255, 0), 2); line(frameFinal, Point2f(RightLanePos, 0), Point2f(RightLanePos, 480), Scalar(0, 255, 0), 2); } void LaneCenter() { laneCenter = (RightLanePos - LeftLanePos) / + LeftLanePos; frameCenter = 300; line(frameFinal, Point2f(laneCenter, 0), Point2f(laneCenter, 480), Scalar(0, 255, 0), 3); line(frameFinal, Point2f(frameCenter, 0), Point2f(frameCenter, 480), Scalar(255, 0, 0), 3); Result = laneCenter - frameCenter; } void nguyhiem_detection() Trang 53 LUẬN VĂN TỐT NGHIỆP SVTH: PHẠM CHÍ ĐỨC { if (!nguyhiem_Cascade.load("C:/Users/DUC/source/repos/opencvc/opencvc/sample/clas sifier/nguyhiem_cascade.xml")) { printf("Unable to open stop cascade file"); } RoI_nguyhiem = frame_nguyhiem(Rect(0, 0, 400, 240)); cvtColor(RoI_nguyhiem, gray_nguyhiem, COLOR_RGB2GRAY); equalizeHist(gray_nguyhiem, gray_nguyhiem); nguyhiem_Cascade.detectMultiScale(gray_nguyhiem, nguyhiem); for (int i = 0; i < nguyhiem.size(); i++) { Point P1(nguyhiem[i].x, nguyhiem[i].y); Point P2(nguyhiem[i].x + nguyhiem[i].width, nguyhiem[i].y + nguyhiem[i].height); rectangle(RoI_nguyhiem, P1, P2, Scalar(0, 0, 255), 2); putText(RoI_nguyhiem, "bien bao nguy hiem", P1, FONT_HERSHEY_PLAIN, 1, Scalar(0, 0, 255, 255), 2); dist_nguyhiem = ((-1.07) * (P2.x - P1.x) + 102.597); ss.str(" "); ss.clear(); ss