NVIDIA Jetson Nano: Phát hiện và Theo dõi làn đường

Zachariah Peterson
|  Created: Tháng Tư 9, 2020  |  Updated: Tháng Ba 23, 2021
Máy bay tàng hình và radar lượng tử

Xe tự hành đang dần trở thành một phần quan trọng của ngành công nghiệp ô tô. Nhiều người tin rằng xe hoàn toàn tự động sẽ sớm được lái cùng với con người, và các công ty công nghệ đang trong cuộc đua để triển khai xe tự động hoàn toàn. Vào tháng 12 năm 2018, Waymo, công ty phát triển từ dự án xe tự lái của Google, chính thức bắt đầu dịch vụ xe tự lái thương mại tại các vùng ngoại ô của Phoenix. Các công ty như May Mobility, Drive.ai và Uber đang theo đuổi con đường tương tự.

Xe tự hành có thể có vẻ như một tầm nhìn lớn, nhưng xe bán tự động đã xuất hiện giữa chúng ta. Các xe mới của Tesla có tính năng Tesla Autopilot, có khả năng nhận diện và theo dõi làn đường, kiểm soát hành trình thích ứng và tự đỗ xe. Khả năng nhận diện và theo dõi làn đường trên đường là một trong nhiều điều kiện tiên quyết cho xe không người lái. Mặc dù nhận diện làn đường có vẻ như là một vấn đề khó khăn, bạn có thể bắt đầu phát triển các thuật toán nhận diện và theo dõi làn đường với nền tảng phần cứng NVIDIA Jetson Nano.

Giới thiệu về Jetson Nano

Jetson Nano COM có kích thước hơi lớn hơn Raspberry Pi 3, nhưng nó có thể chạy các mạng nơ-ron song song với sức mạnh 472 Gflops. Điều này khoảng 22 lần mạnh hơn Raspberry Pi 3 và rất tiết kiệm năng lượng, chỉ tiêu thụ khoảng 5 W. Bo mạch này hoàn hảo cho các ứng dụng AI nhúng chạy trên nhân Linux được tối ưu hóa. Nó có đủ sức mạnh xử lý và bộ nhớ trên bo cho các ứng dụng xử lý hình ảnh và video chất lượng cao. Các tính năng chính của Jetson Nano bao gồm:

  • GPU: GPU 128 lõi dựa trên kiến trúc NVIDIA Maxwell™
  • CPU: Bốn nhân ARM® A57
  • Camera: MIPI CSI-2 DPHY lanes, 12x (Module) và 1x (Bộ Phát Triển)
  • Bộ nhớ: 4 GB LPDDR4 64-bit; 25.6 gigabyte/giây
  • Kết nối: Gigabit Ethernet
  • Hỗ trợ HĐH: Linux cho Tegra®
  • Kích thước Module: 70mm x 45mm
  • Bộ phát triển là công cụ tuyệt vời để thử nghiệm một thuật toán mới cho các ứng dụng xử lý ảnh/thị giác máy tính. Nếu bạn chưa quen với nền tảng Jetson Nano, hãy xem bài viết này. Nếu không, hãy tiếp tục đọc để xem làm thế nào bạn có thể dễ dàng triển khai một ứng dụng xử lý ảnh mạnh mẽ cho nhận dạng làn đường.
Developer kit for NVIDIA Jetson Nano
Bộ phát triển NVIDIA Jetson Nano. [Image source]

Nhận dạng làn đường với Jetson Nano

Dự án này đòi hỏi chúng ta cần một Jetson Nano COM hoặc bảng phát triển và một camera CSI (camera CSI Raspberry Pi v2 hoạt động tốt). Tôi sẽ trình bày ứng dụng này sử dụng bảng phát triển Nano, nhưng bạn có thể dễ dàng xây dựng một bảng cơ sở tùy chỉnh cho Nano COM và triển khai ứng dụng này. Camera CSI sẽ được kết nối với cổng camera trên Jetson Nano, mặc dù bạn có thể sử dụng camera USB hoặc camera IP. Dưới đây là những yêu cầu cần thiết để dự án này hoạt động thành công:

Phần cứng

  • NVIDIA Jetson Nano
  • Camera CSI

Gói Phần mềm

  • Python
  • OpenCV
  • Nanocamera

Triển khai

Quá trình triển khai đầy đủ cho dự án này có thể tìm thấy trên GitHub. Hãy theo dõi các bước tiếp theo để có một bản demo của dự án này hoạt động. Những bước này là các bước xử lý hình ảnh quan trọng nhằm mục đích làm cho việc nhận diện làn đường chính xác hơn.

Nhận thức

Bước đầu tiên của hệ thống phát hiện làn đường của chúng tôi là có khả năng đọc hình ảnh trực tiếp từ camera. Đối với những người dùng mới làm việc với Jetson Nano, việc làm việc với camera có thể sẽ khó khăn. Vì vậy, chúng tôi sẽ sử dụng thư viện NanoCamera. Thư viện này không phải là lựa chọn tốt nhất cho một ứng dụng cấp độ sản xuất, nhưng nó hoạt động cho một ứng dụng đơn giản như được hiển thị ở đây.

Đầu tiên, cài đặt thư viện bằng pip:

.

Đọc hình ảnh trực tiếp từ camera:

.

Loại bỏ Nhiễu bằng Cách Làm Mờ

Để làm cho hình ảnh mượt mà hơn và loại bỏ nhiễu không mong muốn, chúng ta có thể áp dụng làm mờ Gaussian. Điều này liên quan đến việc tính giá trị của mỗi điểm ảnh như một trung bình có trọng số của các điểm ảnh xung quanh.

Gaussian blur algorithm for lane recognition
Thuật toán làm mờ Gaussian cho việc làm mịn hình ảnh. [Nguồn hình ảnh]

OpenCV bao gồm một hàm để áp dụng làm mờ Gaussian cho một hình ảnh:

.

Chuyển Đổi Màu Sắc

Sau khi làm mờ Gaussian, hình ảnh vẫn ở dạng RGB và cần được chuyển đổi sang không gian màu HSV. Việc tách màu sẽ được sử dụng để loại bỏ các màu không mong muốn khỏi hình ảnh. Một khi hình ảnh ở trong HSV, chúng ta có thể “loại bỏ” tất cả các màu không cần thiết khỏi hình ảnh bằng cách chỉ định một phạm vi màu xám.

.

Thao Tác Hình Thái - Giãn Nở

Dãn nở thêm các pixel vào biên của các đối tượng trong hình ảnh. Áp dụng dãn nở cho hình ảnh sẽ giúp đóng các khoảng trống lỏng lẻo trong các hình ảnh đường kẻ.

.

Canny (Phát hiện cạnh)

Để phát hiện các đường kẻ, chúng ta có thể sử dụng một kỹ thuật gọi là phát hiện cạnh Canny. Phát hiện cạnh Canny có thể được sử dụng để trích xuất thông tin cấu trúc hữu ích từ một đối tượng. Thư viện OpenCV cung cấp một chức năng phát hiện cạnh Canny có thể được sử dụng để phát hiện các cạnh trong một hình ảnh. Để phát hiện Canny hoạt động, chúng ta cần cung cấp ngưỡng tối thiểu và tối đa. OpenCV thường khuyến nghị giá trị là (100, 200) hoặc (200, 400), vì vậy chúng tôi đang sử dụng (200, 400).

.
Canny edge detection applied to a camera image
Hình ảnh với phát hiện cạnh Canny. Chú ý đến các làn đường được hiển thị trong hình ảnh.

Phân lập Khu vực Quan tâm

Hình ảnh đầu ra cạnh Canny chứa một số nhiễu. Tất cả thông tin khác ngoài làn đường trong hình ảnh có thể được phân lập bằng cách giảm khu vực quan tâm. Khi thực hiện nhận dạng làn đường và điều hướng, chúng ta không nhất thiết cần phải xem toàn bộ hình ảnh. Một cách dễ dàng để làm điều này chỉ là cắt bỏ nửa trên của hình ảnh.

ROI reduction for lane recognition
Hình ảnh gốc (bên trái), và hình ảnh với vùng quan tâm được cắt (bên phải).

Mã cho việc giảm khu vực quan tâm là:

.

Phát hiện Đoạn Đường - Hough Lines

Sau khi khu vực quan tâm được thu hẹp, các làn đường trở nên rõ ràng với bốn đường kẻ biệt lập. Tuy nhiên, máy tính không biết rằng những đường này đại diện cho ranh giới của hai làn đường. Vì vậy, chúng ta cần một cách để trích xuất tọa độ cho những đường kẻ làn đường này. Biến đổi Hough là một kỹ thuật được sử dụng trong xử lý ảnh để trích xuất các đặc điểm như đường thẳng, hình tròn và hình elip. Nó có thể được sử dụng để tìm các đường thẳng từ một số điểm ảnh dường như tạo thành một đường. Điều này có thể được thực hiện với hàm HoughLinesP trong OpenCV. Hàm này vừa vặn nhiều đường qua tất cả các điểm ảnh trắng và trả về bộ đường thẳng có khả năng cao nhất tuân theo một số ràng buộc ngưỡng tối thiểu.

Lines found during lane recognition
Phát hiện đường thẳng với biến đổi Hough được áp dụng.

Đây là mã của chúng tôi phát hiện các đoạn đường sử dụng Biến đổi Hough. Hầu hết các tham số sử dụng ở đây có thể được xác định thông qua thử nghiệm và sai sót hoặc bằng cách chọn các tham số từ hình ảnh tham khảo.

.

Kết hợp các Đoạn Đường thành Hai Đường Làn

Đầu ra của hàm detect_line_segments() tạo ra một tập hợp các đoạn đường nhỏ với tọa độ điểm cuối (x1, y1) và (x2, y2). Chúng ta cần tìm một cách để kết hợp chúng thành chỉ hai đường cho đường làn trái và phải, nhưng làm thế nào để đạt được điều đó? Một cách là phân loại các đoạn đường này theo độ dốc của chúng.

Tất cả các đường kẻ làn trái có độ dốc dương, và các đoạn đường thuộc về làn đường bên phải có độ dốc âm. Dựa trên hai nhóm mới này, chúng ta có thể lấy trung bình của các độ dốc và giao điểm của các đoạn đường để có được độ dốc và giao điểm của các đường làn trái và phải. Điều này được thực hiện với hàm average_slope_intercept():

..

Hàm make_points() là một hàm hỗ trợ cho hàm average_slope_intercept(), nó nhận độ dốc và giao điểm của một đường, và trả về các điểm cuối của đoạn đường. Tại thời điểm này, chúng ta đã có các đường làn!

Tiếp Theo Là Gì

Tại thời điểm này, đầu ra từ hàm này sẽ được đưa vào một thuật toán khác để kiểm soát tốc độ và hướng đi của xe. Để làm điều này, một góc lái có thể được tính toán từ các đường làn được phát hiện và sau đó được truyền đến một bộ điều khiển PID để giảm thiểu góc lái và giữ cho xe ở trung tâm.

Mặc dù việc này được thực hiện với một bảng phát triển Nano, cùng một đoạn mã cung cấp một điểm khởi đầu để triển khai một hệ thống trong một hệ thống xử lý ảnh nhúng cho môi trường sản xuất. Để làm điều này, bạn cần xây dựng một bảng cơ sở thực sự cho Jetson Nano. Điều này dễ dàng nhất khi bạn sử dụng công cụ thiết kế điện tử mô-đun trong ứng dụng Upverter Board Builder. Bằng cách áp dụng cách tiếp cận mô-đun, bạn có thể dễ dàng tùy chỉnh một bảng cơ sở cho Jetson Nano, camera và các cảm biến khác cho nhận dạng làn đường.

Công cụ thiết kế điện tử mô-đun trong Upverter cung cấp cho bạn quyền truy cập vào một loạt các COM tiêu chuẩn của ngành và mô-đun phổ biến mà không cần tải xuống hoặc cài đặt bất kỳ phần mềm mới nào. Bạn có thể tạo ra phần cứng đạt cấp độ sản xuất cho nhiều ứng dụng, bao gồm nhận dạng làn đường và các nhiệm vụ xử lý ảnh khác với Jetson Nano, sử dụng giao diện người dùng kéo và thả. Nếu hệ thống của bạn cần thêm chức năng, bạn có thể bao gồm kết nối không dây, một loạt cảm biến, và nhiều hơn nữa.

Hãy xem một số câu chuyện thành công của khách hàng Gumstix hoặc liên hệ với chúng tôi ngay hôm nay để tìm hiểu thêm về sản phẩm, công cụ thiết kế, và dịch vụ của chúng tôi.

About Author

About Author

Zachariah Peterson has an extensive technical background in academia and industry. He currently provides research, design, and marketing services to companies in the electronics industry. Prior to working in the PCB industry, he taught at Portland State University and conducted research on random laser theory, materials, and stability. His background in scientific research spans topics in nanoparticle lasers, electronic and optoelectronic semiconductor devices, environmental sensors, and stochastics. His work has been published in over a dozen peer-reviewed journals and conference proceedings, and he has written 2500+ technical articles on PCB design for a number of companies. He is a member of IEEE Photonics Society, IEEE Electronics Packaging Society, American Physical Society, and the Printed Circuit Engineering Association (PCEA). He previously served as a voting member on the INCITS Quantum Computing Technical Advisory Committee working on technical standards for quantum electronics, and he currently serves on the IEEE P3186 Working Group focused on Port Interface Representing Photonic Signals Using SPICE-class Circuit Simulators.

Related Resources

Back to Home
Thank you, you are now subscribed to updates.