1. Trang chủ
  2. » Giáo Dục - Đào Tạo

NGHIÊN cứu VÀ CHẾ tạo XE tự HÀNH THEO VẠCH KẺ DÙNG xử LÝ ẢNH

70 13 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

Thông tin cơ bản

Định dạng
Số trang 70
Dung lượng 3,25 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

có thể tự hành được, chúng ta cần một hệ thống phát hiện đường đi dựa trên hình ảnh thu được từ camera.. Nhưng thực tế có rất nhiều vấn đề về các vạch kẻ như: khoảng cách giữa các vạch k

Trang 1

ĐẠI HỌC ĐÀ NẴNG

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT

BÁO CÁO TỔNG KẾT

ĐỀ TÀI KHOA HỌC VÀ CÔNG NGHỆ CẤP TRƯỜNG

NGHIÊN CỨU VÀ CHẾ TẠO XE TỰ HÀNH THEO

VẠCH KẺ DÙNG XỬ LÝ ẢNH

Chủ nhiệm đề tài: TS Phạm Tuấn

Đà Nẵng, Tháng 11 Năm 2021

Trang 2

ĐẠI HỌC ĐÀ NẴNG

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT

BÁO CÁO TỔNG KẾT

ĐỀ TÀI KHOA HỌC VÀ CÔNG NGHỆ CẤP TRƯỜNG

NGHIÊN CỨU VÀ CHẾ TẠO XE TỰ HÀNH THEO

VẠCH KẺ DÙNG XỬ LÝ ẢNH

Mã số: T2020-06-157

Xác nhận của cơ quan chủ trì đề tài Chủ nhiệm đề tài

Trang 3

DANH SÁCH NHỮNG THÀNH VIÊN THAM GIA NGHIÊN CỨU ĐỀ TÀI

Trang 4

MỤC LỤC

Chương 1 TỔNG QUAN VỀ CÁC PHƯƠNG PHÁP PHÁT HIỆN VẠCH KẺ 7

1.1 Phương pháp phát hiện vạch kẻ bằng xử lý ảnh 7

1.1.1 Hệ màu RGB 7

1.1.2 Hệ màu HSV 7

1.1.3 Ảnh xám và ảnh nhị phân 10

1.1.4 Giới thiệu về edge detection 10

1.1.5 Edge detection là gì 12

1.1.6 Edge detection với OpenCV 13

1.1.7 Phát hiện vạch kẻ bằng OpenCV 23

1.2 Phương pháp phát hiện vạch kẻ bằng học sâu 26

1.2.1 Convolution 26

1.2.2 Ví dụ về convolution 27

1.2.3 Phát hiện vạch kẻ đường với mạng học sâu Unet 29

Chương 2 THIẾT KẾ CHẾ TẠO XE TỰ HÀNH 31

2.1 Thiết kế phần cơ khí 31

2.1.1 Giới thiệu về L298N 31

2.1.2 Thông số kỹ thuật 31

2.1.3 Chức năng của L298N 32

2.1.4 Phương pháp điều chế độ rộng xung (PWM) 33

2.1.5 Liên hệ với Raspberry 34

2.1.6 Động cơ Planet 36

2.1.7 Mạch điều khiển PCA9685 37

2.1.8 Chế tạo cơ khí cho xe mô hình 37

2.2 Thiết kế phần điều khiển 39

2.2.1 Phát hiện cạnh với thuật toán Canny 39

2.2.2 Phát hiện vạch kẻ đường 41

2.2.3 Kết hợp 2 cạnh để tìm ra vạch kẻ đường 43

2.2.4 Các vấn đề cần lưu tâm 43

2.2.5 Nội suy góc đánh lái 45

2.2.6 Ổn định góc lái 46

2.2.7 Lưu đồ thuật toán 47

2.3 Thiết kế phần mềm cho hệ thống nhúng 48

2.3.1 Cài đặt hệ điều hành cho hệ thống nhúng 48

Trang 5

2.3.2 Cài đặt môi trường 50

2.3.3 Cài đặt các kết nối cho Raspberry Pi 51

Chương 3 KIỂM TRA KHẢ NĂNG TỰ HÀNH 54

3.1 Xây dựng sa hình 54

3.2 Thử nghiệm và chỉnh sửa 56

Kết luận 60

Kiến nghị 60

Hướng phát triển đề tài 60

TÀI LIỆU THAM KHẢO 61

Trang 6

DANH MỤC CÁC HÌNH VẼ

Hình 1 Hệ màu RGB 7

Hình 2 Hệ màu HSV 8

Hình 3 Hình ảnh thí nghiệm tách vật thể cho hệ màu HSV 8

Hình 4 Hình của một chữ Hán chỉ có màu trắng và đen 11

Hình 5 Hình ảnh phóng to bức hình trên 11

Hình 6 Ảnh gốc và edge detection 12

Hình 7 Các thông số để xác định một edge detection tốt 13

Hình 8 Ảnh gốc mình họa edge detection 14

Hình 9 Bức ảnh trắng đen từ bức ảnh gốc 15

Hình 10 Bộ lọc Gaussian 16

Hình 11 Hình ảnh đã qua bộ lọc 17

Hình 12 Nhân Sobel dưới dạng 3D 18

Hình 13 Hình ảnh đã qua bộ lọc Sobel 19

Hình 14 Bản đồ vùng ngưỡng 20

Hình 15 Bản đồ vùng ngưỡng có thêm các đường cong dốc 21

Hình 16 Các cạnh Canny cuối cùng của chúng tôi 22

Hình 17 Hình ảnh đầu vào 23

Hình 18 ROI để phát hiện làn đường 24

Hình 19 Vạch kẻ được xác dịnh từ hình ảnh đầu vào 25

Hình 20 Hình ảnh gốc và vạch kẻ được phát hiện 25

Hình 21 Đầu vào và tích chập 26

Hình 22 Bảng tính toán tích chập 27

Hình 23 Chạy hết một hàng 28

Hình 24 Chạy xuống hàng tiếp theo và kết quả cuối cùng 29

Hình 25 Phát hiện đường bằng phương pháp học sâu 30

Hình 26 Mạch cầu L298N 31

Hình 27 Sơ đồ chân L298N 32

Hình 28 Bảng trạng thái mạch cầu H L298 33

Hình 29 Nguyên lý điều xung PWM 34

Hình 30 Xung khi sử dụng với hàm AnalogWrite trong raspberry 35

Hình 31 động cơ planet 36

Hình 32 Mạch PCA9685 37

Hình 33 Kết nối Pi4 và PCA9685 38

Hình 34 Bức ảnh nhận được từ camera 38

Hình 35 Khu vực màu xanh đã được phân tách 39

Hình 36 Cạnh của vạch kẻ đường đã được phát hiện 40

Hình 37 Các cạnh của vạch kẻ đường được phát hiện 42

Hình 38 Hướng đi của xe được nội suy 45

Hình 39 Lưu đồ thuật toán 47

Hình 40 Mạch Raspberry Pi 4 48

Hình 41 Chọn đúng file image và tải về 49

Hình 42 Flash image vào thẻ nhớ 49

Hình 43 Menu của Pi 4 51

Hình 44 Bảng Interfaces của Pi 4 52

Trang 7

Hình 45 Bảng IP của Raspberry Pi 53

Hình 46 Địa điểm phát triển và kiểm thử phần mềm 55

Hình 47 Khu vực màu đỏ được tách ra 56

Hình 48 Vạch kẻ phát hiện được 57

Hình 49 Vạch kẻ, và hướng đi của xe mô hình 57

Trang 8

DANH MỤC CÁC CHỮ VIẾT TẮT CỦA CÁC THUẬT NGỮ TIẾNG ANH

RGB Red, Green, Blue

HSV Hue, Saturation, Value

PWM Pulse-width modulation

Trang 9

ĐẠI HỌC ĐÀ NẴNG

TRƯỜNG ĐH SƯ PHẠM KỸ THUẬT

CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM

Độc lập - Tự do - Hạnh phúc

THÔNG TIN KẾT QUẢ NGHIÊN CỨU

1 Thông tin chung:

- Tên đề tài: NGHIÊN CỨU VÀ CHẾ TẠO XE TỰ HÀNH THEO VẠCH KẺ DÙNG

XỬ LÝ ẢNH

- Mã số: T2020-06-157

- Chủ nhiệm: TS Phạm Tuấn

- Thành viên tham gia: ThS Trần Duy Chung

- Cơ quan chủ trì: Trường ĐH Sư phạm Kỹ thuật – Khoa Điện – Điện tử

- Thời gian thực hiện: 11/2020 đến 11/2021

Do đó, chúng tôi đề xuất giải pháp sử dụng xử lý ảnh trong xe tự hành để giải quyết các vấn đề trên thay cho giải pháp truyền thống là dùng cảm biến

- Làm chủ công nghệ và nội địa hóa sản phẩm

4 Tóm tắt kết quả nghiên cứu:

Cách tiếp cận

- Nghiên cứu các phương pháp phát hiện và nội suy vạch kẻ

- Xây dựng chương trình cho thiết bị nhúng, nhận hình ảnh từ camera và điều khiển

xe

Phương pháp nghiên cứu

- Nghiên cứu các tài liệu khoa học về phát hiện và nội suy vạch kẻ bằng xử lý ảnh

- Thiết kế, chế tạo xe tự hành và tiến hành thử nghiệm khả năng tự hành

Trang 10

5 Tên sản phẩm:

- Mô hình xe tự hành theo vạch kẻ dùng xử lý ảnh (Xe có kích thước dài*rộng*cao

là 60*30*30, tốc độ là 1km/h)

- Chương trình xử lý ảnh phát hiện và nội suy vạch kẻ

- Một bài báo khoa học có tên: “Semantic Road Segmentation using Deep Learning”,

2020 Applying New Technology in Green Buildings (ATiGB)

6 Hiệu quả, phương thức chuyển giao kết quả nghiên cứu và khả năng áp dụng:

- Làm chủ công nghệ và nội địa hóa sản phẩm

- Chuyển giao sản phẩm cho Khoa Điện – Điện tử trường Đại học Sư phạm Kỹ thuật

7 Hình ảnh, sơ đồ minh họa chính:

Trang 11

- Project Leader: Tuan Pham

- Member: Chung Tran Duy

- Duration: from November 2020 to November 2021

2 Objectives:

- Model of self-driving car following lines using image processing (The length*width*height of the vehicle is 60*30*30, the speed is 1km/h)

- Image processing software can detect and follows lines

3 Creativeness and innovativeness:

- Previously, self-driving cars had to use sensors to detect lines with fixed paint colors to be able to move But in fact there are many problems with the lines such as: the distance between the lines is not uniform, the lines may fade over time, the color is not uniform Nowadays, with the development of the machine Studies in the field of image processing have created many applications in self-driving cars Therefore, we propose a solution to use image processing in self-driving cars to solve the above problems instead of the traditional solution of using sensors

- Mastering technology and product localization

4 Research results:

- Model of self-driving car following lines using image processing (The length*width*height of the vehicle is 60*30*30, the speed is 1km/h)

- Image processing software can detect and follows lines

- A scientific paper: “Semantic Road Segmentation using Deep Learning”, 2020 Applying New Technology in Green Buildings (ATiGB)

5 Effects, transfer alternatives of reserach results and applicability:

- Mastering technology and product localization

- Transfer source code, and technology to Faculty of electrical and electronic engineering

Trang 13

có thể tự hành được, chúng ta cần một hệ thống phát hiện đường đi dựa trên hình ảnh thu được từ camera Tuy nhiên, các loại xe tự hành trên đều có giá thành rất cao và rất khó để để có thể mở rộng ra nếu không làm chủ được sản phẩm

1.2 Trong nước

− Hiện nay tại Việt Nam các nghiên cứu về xe tự hành vẫn còn rất hạn chế Năm 2019, FPT đã thông báo thử nghiệm thành công xe tự lái [3], tuy nhiên kết quả thử nghiệm chưa được công bố một cách rộng rãi và chi tiết Để có được bản quyền phần mềm

xe tự hành, chúng ta cần bỏ chi phí rất lớn và phụ thuộc lớn vào nhà cung cấp

2 Tính cấp thiết của đề tài

− Trước đây, các loại xe tự hành đều phải dùng các cảm biến để phát hiện các vạch kẻ với màu sơn cố định để có thể di chuyển được Nhưng thực tế có rất nhiều vấn đề về các vạch kẻ như: khoảng cách giữa các vạch kẻ là không đồng nhất, vạch kẻ có thể phai màu theo thời gian, màu sắc không đồng nhất…Ngày nay, với sự phát triển của máy học trong lĩnh vực xử lý ảnh đã tạo ra rất nhiều ứng dụng trong xe tự hành Do

đó, chúng tôi đề xuất giải pháp sử dụng xử lý ảnh trong xe tự hành để giải quyết các vấn đề trên thay cho giải pháp truyền thống là dùng cảm biến

3 Mục tiêu của đề tài

− Mô hình xe tự hành theo vạch kẻ dùng xử lý ảnh (Xe có kích thước dài*rộng*cao là 60*30*30, tốc độ là 1km/h)

− Chương trình xử lý ảnh phát hiện và nội suy vạch kẻ

4 Đối tượng và phạm vi nghiên cứu trong đề tài

Đối tượng nghiên cứu:

− Nghiên cứu các phương pháp phát hiện và nội suy vạch kẻ

− Xây dựng chương trình cho thiết bị nhúng, nhận hình ảnh từ camera và điều khiển xe

Phương pháp nghiên cứu:

- Nghiên cứu các tài liệu khoa học về phát hiện và nội suy vạch kẻ bằng xử lý ảnh

- Thiết kế, chế tạo xe tự hành và tiến hành thử nghiệm khả năng tự hành

6 Nội dung nghiên cứu

Đề tài gồm có 3 chương:

Chương 1: Tổng quan về các phương pháp phát hiện vạch kẻ

Trang 14

1.1 Phương pháp phát hiện vạch kẻ bằng xử lý ảnh

1.2 Phương pháp phát hiện vạch kẻ bằng học sâu

Chương 2: Thiết kế và chế tạo xe tự hành

Trang 15

Chương 1 TỔNG QUAN VỀ CÁC PHƯƠNG PHÁP PHÁT HIỆN VẠCH KẺ

1.1 Phương pháp phát hiện vạch kẻ bằng xử lý ảnh

1.1.1 Hệ màu RGB

RGB là không gian màu phổ biến dùng trong máy tính, máy ảnh, điện thoại và nhiều thiết bị kĩ thuật số khác nhau Không gian màu này khá gần với cách mắt người tổng hợp màu sắc Nguyên lý cơ bản là sử dụng 3 màu sắc cơ bản R (red - đỏ), G (green - xanh lục)

và B (blue - xanh lam) để biểu diễn tất cả các màu sắc

Hình 1 Hệ màu RGB

Thông thường, trong mô hình 24 bit mỗi kênh màu sẽ sử dụng 8bit để biểu diễn, tức là giá trị R, G, B nằm trong khoảng 0 - 255 Bộ 3 số này biểu diễn cho từng điểm ảnh, mỗi số biểu diễn cho cường độ của một màu Với mô hình màu 24bit thì số màu tối đa có thể tạo

ra là 256 x 256 x 256 = 16777216 màu Một điểm cân lưu ý là với các thư viện đọc ảnh và hiển thị ảnh như matplotlib, Pillow thì các ảnh được đọc theo RGB tuy nhiên Opencv đọc ảnh theo các kênh BGR

Bên cạnh hệ màu RGB thì ta sẽ nghe đến RGBA, thực ra đây là một hệ màu được lấy căn bản từ hệ màu RGB tuy nhiên có thêm một kênh alpha (α) Kênh α được sử dụng như

là kênh mờ, nếu một pixel có giá trị 0% trong kênh α của nó thì nó hoàn toàn trong suốt, trong khi giá trị 100% sẽ khiến cho điểm đó bị mờ đục Điều này được ứng dụng rất nhiều trong việc ghép các ảnh lại và mang một độ chân thực nhất định

1.1.2 Hệ màu HSV

Trang 16

Hình 2 Hệ màu HSV

Không gian màu HSV (còn gọi là HSB) là một cách tự nhiên hơn để mô tả màu sắc, dựa trên 3 số liệu:

• H: (Hue) Vùng màu

• S: (Saturation) Độ bão hòa màu

• B (hay V): (Bright hay Value) Độ sáng

Ứng dụng điển hình nhất của HSV là trong việc lọc màu Giả sử chúng ta có 1 bài toán

là nhận dạng màu sắc của đèn đường giao thông và đầu vào là ảnh dưới và yêu cầu ở đây là nhận dạng đèn màu xanh lá cây

Hình 3 Hình ảnh thí nghiệm tách vật thể cho hệ màu HSV

Trang 17

Với bài toán này thì hướng tiếp cận đơn giản nhất chính là lọc màu xanh lá cây ra khỏi ảnh Từ kiến thức ở bên trên thì mỗi một màu sẽ được thể hiện tương đối qua một khoảng giá trị với mỗi hệ màu tương ứng Vậy chúng ta sẽ làm một phép thử qua 2 hệ màu RGB và HSV xem hiệu quả như thế nào

Trước hết chúng ta gọi một vài thư viện cần thiết

import os

import cv2 #thư viện opencv-python

import numpy as np # thư viện numpy cho xử lý mảng

mask = cv2.inRange(img, lower_green, upper_green)

# Sử dụng hàm logic and để hiển thị kết quả

result = cv2.bitwise_and(img, img, mask = mask)

Kết quả có vẻ không được tốt :D nhưng cũng có thể là do việc chọn khoảng khá cao với kênh G (220) khiến không nhận được màu Tiếp tục thay khoảng rộng thêm 1 chút nữa

Trang 18

#chọn ngưỡng cho hệ màu HSV

lower_blue = np.array([36,0,0])

upper_blue = np.array([86,200, 200])

mask = cv2.inRange(img, lower_green, upper_green)

# Sử dụng hàm logic and để hiển thị kết quả

result = cv2.bitwise_and(img, img, mask = mask)

Từ 2 kết quả trên măc dù với các ngưỡng tương đối nhưng có thể nhận xét được hệ màu HSV hoạt động khá là tốt trong các bài toán cần lọc màu hay tiến xa hơn là việc nhận dạng, tracking v v

Thức tế với các bài toán khi có ảnh rõ ràng thì hoàn toàn có thể sử dụng hệ màu RGB tuy nhiên trong điều kiện thực tế thường các màu sẽ bị mờ hoặc có vẩn đục do ngoại cảnh bên ngoài nên thường hay ưu tiên việc sử dụng hệ màu HSV hơn

1.1.3 Ảnh xám và ảnh nhị phân

Ảnh xám (GrayScale) đơn giản là một hình ảnh trong đó các màu là các sắc thái của màu xám Lý do cần phải phân biệt giữa ảnh xám và các ảnh khác nằm ở việc ảnh xám cung cấp ít thông tin hơn cho mỗi pixel Với ảnh thông thường thì mỗi pixel thường được cung cấp 3 trường thông tin trong khi với ảnh xám chỉ có 1 trường thông tin, việc giảm khối lượng thông tin giúp tăng tốc độ xử lý nhưng vẫn đảm bảo các tác vụ cần thiết

Ảnh nhị phân (binary) được xem như là 1 bước giảm thông tin nữa so với ảnh xám Với ảnh xám thì ngưỡng xám của mỗi pixel được miêu tả trong khoảng [0;255] nhưng với ảnh nhị phân thì mỗi pixel chỉ có giá trị bằng 0 hoặc 255 Tuy thông tin bị giảm khá nhiều nhưng ảnh nhị phân lại thể hiện được rất rõ các yếu tố về góc cạnh và hình dạng của vật thể, điều

đó rất có lợi trong các bài toán lọc nhiễu, nhận dạng vật thể (object detection), …

1.1.4 Giới thiệu về edge detection

Trước khi tìm hiểu về các phương pháp xác định viền trong ảnh (Edge Detection), trước tiên ta cùng làm rõ khái niệm cạnh (Edge) Trong ảnh, một cạnh (edge) là một ranh giới (boundary) hay một đường viền (contour) mà tại đấy xuất hiện một sự thay đổi lớn về một vài khía cạnh vật lý của ảnh (cường độ sáng, bề mặt phản chiếu, etc.)

Trong ảnh số, một cạnh (edge) là một tập hợp các pixels mà tại pixel đấy xảy ra một sự thay đổi đột ngột về cường độ sáng

Trang 19

Hình 4 Hình của một chữ Hán chỉ có màu trắng và đen

Nhìn vào hình trên, với một thị giác bình thường đều có thể thấy được đâu là cạnh của hình trên Chúng ta sẽ cùng soi kỹ cạnh đó trông như thế nào

Hình 5 Hình ảnh phóng to bức hình trên

Bạn có để thấy độ sáng của pixel trong khu vực cạnh có điểm gì khác biệt so với những pixel xung quanh nó không không? Nói một cách đơn giản (chưa chính xác tuyệt đối), các pixel cạnh có cường độ sáng chênh lệch rõ rệt so với những pixel ở lân cận nó.Cụ thể hơn, hãy cùng xem ví dụ phía dưới đây Những pixel nằm cạnh đường đỏ chính là những pixel

Trang 20

có hiện tượng thay đổi đột ngột độ sáng (từ 0 sang 255 và ngược lại) Những pixel đấy được gọi là cạnh (Edge)

1.1.5 Edge detection là gì

Edge Detection là một kĩ thuật xử ảnh được sử dụng để tìm kiếm viền bao của của các đối tượng trong ảnh Trong xử lý ảnh, việc kiếm việc thực chất là tìm những khu vực bị mất liên tục về độ sáng (a.k.a những khu vực có sự chênh lệch đột biến về cường độ sáng) Edge detection thường được sử dụng để phân vùng ảnh (image segmentation) và trích xuất thông tin từ ảnh phục vụ cho các bài toán trong Thị giác máy (Computer Vision) và Học máy (Machine learning)

Hình 6 Ảnh gốc và edge detection

Tiếp theo, ta cần xác định thế nào là một bộ xác định tốt có hiệu quả cao (good edge detector) Vậy câu hỏi đặt ra thế nào là good edge detector ? Chúng ta có ba tiêu chí:

• Good Detection: giảm thiểu được xác suất false positive (phát hiện nhầm cạnh giả

do noise tạo ra) và false negative (xác suất bị thiếu mất một cạnh)

• Good Localization: vị trí cạnh dự đoán phải gần nhất với cạnh thật (true edges)

• Single response: Cạnh (true edges) được cấu tạo từ rất nhiều points single response

là tiêu chí đánh giá bao nhiêu point được dự đoán cho một true point Càng nhiều point được dự đoán cho một true point thì độ tốt của detector sẽ giảm xuống

Trang 21

Hình 7 Các thông số để xác định một edge detection tốt

1.1.6 Edge detection với OpenCV

Canny Edge Detector là một thuật toán để xác định các cạnh trong một hình ảnh Nó được phát triển bởi John F Canny vào năm 1986 và đã được sử dụng rộng rãi kể từ đó chúng ta sẽ khám phá chi tiết về trình dò cạnh Canny, với sự trợ giúp của thư viện Open Computer Vision cho python (OpenCV-python)

Đầu tiên chúng ta cần cài đặt OpenCV, OpenCV có thể dễ dàng cài đặt nó bằng cách chạy lệnh pip sau:

pip install opencv-python

Tiếp theo, chúng ta thêm hai phần phụ thuộc vào tệp python vào môi trường ảo:

import cv2 as cv

from matplotlib import pyplot as plot

Lệnh đầu tiên là nhập OpenCV python Đây là thư viện mà chúng ta csẽ sử dụng để tạo

ra các cạnh thô và một số hình ảnh bổ sung Chúng ta cũng sẽ sử dụng matplotlib để hiển thị hình ảnh của chúng ta

Để bắt đầu, đây là hình ảnh mà chúng ta sẽ tìm thấy các cạnh Canny của bức ảnh:

Trang 22

Hình 8 Ảnh gốc mình họa edge detection

Thuật toán cạnh Canny yêu cầu hình ảnh thang độ xám hoạt động bình thường Chúng

ta có thể đọc hình ảnh RGB dưới dạng thang độ xám trong OpenCV như sau:

# helper function to easily display our images

def img_show(title, image):

# read in our original image as grayscale

img = cv.imread("original@2x.jpg", cv.IMREAD_GRAYSCALE)

Trang 23

# show grayscale image using our helper function

img_show("Grayscale Image", img)

Ta cũng đã tạo một chức năng trợ giúp siêu đơn giản để hiển thị hình ảnh của chúng tôi bằng matplotlib Sử dụng chức năng này, chúng ta có thể xem hình ảnh thang độ xám của mình:

Trang 24

OpenCV sử dụng nhân Gaussian 5x5 với sigma = 1 cho bước giảm nhiễu của nó Tôi

đã tạo hình ảnh 3D trực quan về hạt nhân này, có thể nhìn thấy bên dưới Tôi cũng đã bao gồm hiệu ứng của bộ lọc này khi áp dụng cho hình ảnh của chúng tôi

Hình 10 Bộ lọc Gaussian

Trang 25

Hình 11 Hình ảnh đã qua bộ lọc

Hình ảnh 3D của nhân Gaussian 5x5, sigma = 1; Hình ảnh gốc được áp dụng bộ lọc Gaussian Mặc dù hình ảnh được lọc Gaussian có thể xuất hiện giống với hình ảnh thang độ xám ban đầu, nhưng nhìn kỹ hơn sẽ thấy hơi mờ, đặc biệt là xung quanh các cạnh của lá cọ Chúng ta không muốn làm mờ hình ảnh quá nhiều; nếu không, chúng ta sẽ có nguy cơ làm mất các chi tiết của hình ảnh Chúng ta có thể dễ dàng tạo hình ảnh này bằng cách sử dụng

Trang 26

Mặc dù tên gọi gradient cường độ nghe có vẻ phức tạp, nhưng nó chỉ đề cập đến hướng của một cạnh Một cạnh có thể hướng về hầu như bất kỳ hướng nào, nhưng thuật toán chỉ nhìn theo bốn hướng để đơn giản hóa mọi thứ Các hướng là ngang, dọc và hai hướng chéo Trong toán học, chúng ta sẽ viết nó là [0 ° , 90 ° , 45 ° , 135 ° ]

OpenCV sử dụng hạt nhân 3x3 Sobel để xác định đạo hàm theo hướng ngang, sau đó hoán vị nó để xác định đạo hàm theo hướng thẳng đứng Các dẫn xuất này có thể được sử dụng để tìm các cạnh của chúng ta theo bốn hướng mong muốn

Giống như nhân Gaussian, chúng ta cũng có thể hình dung nhân Sobel dưới dạng 3D

Tôi cũng đã bao gồm hình ảnh được lọc Sobel

Hình 12 Nhân Sobel dưới dạng 3D

Trang 27

Hình 13 Hình ảnh đã qua bộ lọc Sobel

Hình ảnh 3D của nhân Sobel ngang 3x3; Hình ảnh mờ Gaussian với hạt nhân Sobel được áp dụng theo cả hai hướng

# obtaining a horizontal and vertical Sobel filtering of the image

img_sobelx = cv.Sobel(img_blur, cv.CV_64F, 1, 0, ksize=3)

img_sobely = cv.Sobel(img_blur, cv.CV_64F, 0, 1, ksize=3)

# image with both horizontal and vertical Sobel kernels applied

img_sobelxy = cv.addWeighted(cv.convertScaleAbs(img_sobelx), 0.5, cv.convertScaleAbs(img_sobely), 0.5, 0)

Tại thời điểm này, chúng ta có các cạnh mỏng, nhưng có một chút trở ngại: không phải tất cả các cạnh của bức hình đều thể hiện chính xác các cạnh thực của hình ảnh Nhiều trong

số các cạnh giả này là do nhiễu và các biến thể màu sắc nhẹ Mặc dù bước đầu tiên của thuật

Trang 28

toán là loại bỏ nhiễu, nhưng không phải tất cả chúng đều bị loại bỏ Điều này là do việc lựa chọn bộ lọc Gaussian 5x5 Bộ lọc loại bỏ hầu hết nhiễu rõ ràng nhưng không loại bỏ quá nhiều để loại bỏ các chi tiết cạnh một cách vô tình Đây là lúc mà ngưỡng kép phát huy tác dụng

Đầu tiên, chúng ta chọn hai giá trị ngưỡng: tối thiểu và tối đa Đây là cái gọi là ngưỡng kép Tiếp theo, chúng ta so sánh gradient cường độ của mỗi cạnh với cả hai giá trị ngưỡng Nếu gradient cường độ của một cạnh lớn hơn giá trị ngưỡng tối đa, thì nó được đánh dấu là một cạnh mạnh (hoặc chắc chắn) Ngược lại, nếu gradient cường độ của cạnh nhỏ hơn giá trị ngưỡng tối thiểu, nó sẽ bị loại bỏ Tuy nhiên, nếu gradient cường độ của cạnh nằm giữa các giá trị ngưỡng tối thiểu và tối đa, nó được đánh dấu là cạnh yếu

Hình 14 Bản đồ vùng ngưỡng

Vùng màu xanh lá cây là nơi có độ dốc cường độ cao hơn giá trị ngưỡng tối đa của chúng ta Điều này có nghĩa là bất kỳ cạnh nào trong khu vực này đều được phân loại là cạnh mạnh Tương tự, các cạnh yếu có thể được tìm thấy trong vùng màu xanh lam, vì vùng này nằm giữa hai giá trị ngưỡng của chúng ta Vùng màu đỏ đại diện cho các cạnh có độ dốc thấp hơn giá trị ngưỡng tối thiểu của chúng tôi Do đó, bất kỳ cạnh nào trong vùng này đều bị loại bỏ

Cho đến nay, chúng ta đã xác định được hai loại cạnh: yếu và mạnh Chúng ta biết rằng các điểm mạnh của chúng tôi chắc chắn phải là một phần trong kết quả cuối cùng từ lựa chọn giá trị ngưỡng tối đa của chúng ta Tuy nhiên, chúng ta không chắc phải làm gì với

Trang 29

những điểm yếu của mình Thuật toán cạnh Canny sử dụng một giả định để đơn giản hóa mọi thứ Nó giả định rằng các cạnh yếu được kết nối với các cạnh mạnh thì bản thân nó là mạnh Tương tự như vậy, các cạnh yếu không được kết nối với các cạnh mạnh sẽ bị nhiễu hoặc biến đổi màu sắc Trong bối cảnh của ngưỡng, đây là ý nghĩa của độ trễ Mỗi đường cong đại diện cho các giá trị gradient của một cạnh duy nhất

Hình 15 Bản đồ vùng ngưỡng có thêm các đường cong dốc

Đường cong trên cùng, được tạo từ các phân đoạn A và C, đi qua cả hai vùng xanh lục

và xanh lam Chúng ta biết rằng một cạnh trong vùng màu xanh lá cây là mạnh và một cạnh trong vùng xanh lam là yếu Do đó, phân khúc A là một cạnh mạnh, và phân khúc C là một cạnh yếu Áp dụng theo dõi cạnh bằng độ trễ, chúng ta sẽ đánh dấu C là một cạnh mạnh vì

nó được kết nối với A

Bây giờ chúng ta hãy chuyển trọng tâm của chúng ta đến đường cong dưới cùng Đường cong này được tạo ra từ các phân đoạn B và D Vì B nằm dưới ngưỡng tối thiểu, nên nó đã

bị triệt tiêu Tuy nhiên, D là một điểm yếu, có nghĩa là nó còn phải tranh luận Sử dụng theo dõi cạnh bằng độ trễ, chúng ta có thể thấy rằng D không được kết nối với bất kỳ đoạn nào

đi qua vùng màu xanh lá cây Điều này có nghĩa là nó không được kết nối với bất kỳ cạnh mạnh nào Do đó, nó bị loại bỏ

Tuyệt vời đó, nhưng làm thế nào chính xác thuật toán biết được liệu một cạnh yếu có được kết nối với một cạnh mạnh hay không? Thuật toán cạnh Canny xác định điều này bằng

Trang 30

cách xem xét từng pixel cạnh yếu và 8 pixel lân cận xung quanh của nó Nếu bất kỳ điểm ảnh nào liền kề của nó là một phần của cạnh mạnh, nó được coi là được kết nối với cạnh mạnh Do đó, pixel này được giữ nguyên trong kết quả cuối cùng của chúng tôi Ngược lại, nếu không có pixel lân cận nào mạnh, nó được cho là không phải là một phần của cạnh mạnh và do đó bị triệt tiêu

# finally, generate canny edges

# extreme examples: high threshold [900, 1000]; low threshold [1, 10]

img_edges = cv.Canny(img, 50, 100)

Sau một số thử nghiệm, ta chọn 50 và 100 cho các giá trị ngưỡng thấp và cao, tương ứng Và những giá trị này tạo ra kết quả tốt nhất Chúng ta có thể thử những giá trị khác nhau khác nhau

Hình 16 Các cạnh Canny cuối cùng của chúng tôi

Trang 31

1.1.7 Phát hiện vạch kẻ bằng OpenCV

Khi chúng ta lái xe, chúng ta sử dụng mắt để quyết định nơi cần đến Các vạch trên đường cho chúng ta biết vị trí của các làn đường đóng vai trò là tham chiếu liên tục của chúng ta để điều khiển phương tiện ở đâu Đương nhiên, một trong những điều đầu tiên chúng tôi muốn làm khi phát triển ô tô tự lái là tự động phát hiện các vạch kẻ làn đường bằng cách sử dụng một thuật toán Chúng tôi muốn bắt đầu với một hình ảnh như thế này:

Hình 17 Hình ảnh đầu vào

Bước đầu tiên để làm việc với hình ảnh của chúng ta sẽ là chuyển đổi chúng sang thang

độ xám Đây là một bước quan trọng để sử dụng Canny Edge Detector bên trong OpenCV Bằng cách dùng function sau cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Trước khi có thể phát hiện ra các cạnh của mình, chúng ta cần làm rõ chính xác những

gì chúng ta đang tìm kiếm Đường phân làn luôn có màu vàng và trắng Màu vàng có thể là một màu khó cô lập trong không gian RGB, vì vậy hãy chuyển đổi thay thế thành Hue Value Saturation hoặc không gian màu HSV Tiếp theo, chúng ta sẽ áp dụng một mặt nạ cho RGB ban đầu image để trả lại các pixel mà chúng tôi quan tâm

lower_yellow = np.array([20, 100, 100], dtype = “uint8”)

upper_yellow = np.array([30, 255, 255], dtype=”uint8")

mask_yellow = cv2.inRange(img_hsv, lower_yellow, upper_yellow)

mask_white = cv2.inRange(gray_image, 200, 255)

Trang 32

mask_yw = cv2.bitwise_or(mask_white, mask_yellow)

mask_yw_image = cv2.bitwise_and(gray_image, mask_yw)

Sau khi có được bức ảnh trích xuất các lane đường, chúng ta dùng bộ lọc Gaussian để làm mờ và loại nhiễu

Hình 18 ROI để phát hiện làn đường

Tiếp theo chúng ta dùng phép biến đổi Hough để nối các đường vạch kẻ rời rạc thành các đường thẳng:

complete = cv2.addWeighted(initial_img, alpha, line_image, beta, lambda)

Trang 33

Hình 19 Vạch kẻ được xác dịnh từ hình ảnh đầu vào

Để cho dễ hình dung, ta ghép vạch kẻ đường phát hiện được ghép chung với bức ảnh gốc:

Hình 20 Hình ảnh gốc và vạch kẻ được phát hiện

Trang 34

1.2 Phương pháp phát hiện vạch kẻ bằng học sâu

Trang 35

như là hệ số tổ hợp với lần lượt từng giá trị độ xám của điểm ảnh trong vùng tương ứng với kernel

Phép tích chập được hình dung thực hiện bằng việc dịch chuyển ma trận kernel lần lượt qua tất cả các điểm ảnh trong ảnh, bắt đầu từ góc bên trái trên của ảnh Và đặt anchor point tương ứng tại điểm ảnh đang xét Ở mỗi lần dịch chuyển, thực hiện tính toán kết quả mới cho điểm ảnh đang xét bằng công thức tích chập

Xem minh hoạ thực hiện: Ảnh minh hoạ theo thứ tự từ trái qua phải và từ trên xuống dưới Ảnh cuối cùng là kết quả sau khi thực hiện di chuyển kernel hết toàn bộ ảnh Ký hiệu: (1) ảnh nguồn, (2) kernel, (3) ảnh kết quả

Hình 22 Bảng tính toán tích chập

Để dễ hiểu, bạn có thể xoay ma trận kernel góc 180 độ theo chiều kim đồng hồ, sau đó kết quả tích chập chính là tổng các tích của hai phần tử cùng vị trí nằm trên kernel và trên ảnh

Một số cách xử lý vùng kernel vượt ra ngoài khỏi ảnh:

Bỏ qua, không thực hiện tính phần tử đó vào kết quả

Sử dụng một hằng số để tính toán

Duplicate pixel nằm ở biên của ảnh

Tích chập được định nghĩa là 1 phép toán trên không gian khả tích của các hàm tuyến tính, cho nên nó có tính chất giao hoán, kết hợp và phân phối

Giao hoán: f * g = g * f

Kết hợp: f * g * h = f * (g * h)

Phân phối: f * g + f * h = f * (g + h)

1.2.2 Ví dụ về convolution

Ngày đăng: 12/08/2022, 11:55

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
3. OpenCV, Opencv provides a real-time optimized Computer Vision library, tools, and hardware, URL: https://opencv.org/ Sách, tạp chí
Tiêu đề: Opencv provides a real-time optimized Computer Vision library, tools, and hardware
4. Python & CircuitPython, Adafruit Motor Shield V2, URL: https://learn.adafruit.com/ Sách, tạp chí
Tiêu đề: Adafruit Motor Shield V2
5. Tesla, Autopilot, URL: https://www.tesla.com/autopilot . 6. A Lane detection approach for selfd driving vehicleshttps://medium.com/@ldesegur/a-lane-detection-approach-for-self-driving-vehicles-c5ae1679f7ee Sách, tạp chí
Tiêu đề: Autopilot
8. Alexandre Carlier, U-Net for Road Segmentation. URL: https://github.com/aschneuw/road-segmentation-unet Sách, tạp chí
Tiêu đề: U-Net for Road Segmentation
7. FPT thử nghiệm thành công xe tự hành trong khu đô thị Ecopark, URL: https://viettimes.vn/fpt-thu-nghiem-thanh-cong-xe-tu-hanh-trong-khu-do-thi-ecopark-post117506.html Link
1. Matt Richardson & Shawn Wallace, Getting Started with Raspberry Pi Khác

🧩 Sản phẩm bạn có thể quan tâm

w