NVIDIA Jetson Nano: Обнаружение и отслеживание полос движения

Закарайа Петерсон
|  Создано: 9 Апреля, 2020  |  Обновлено: 23 Марта, 2021
Самолеты-невидимки и квантовый радар

Автономные транспортные средства постепенно становятся важной частью автомобильной промышленности. Многие считают, что полностью автономные транспортные средства скоро будут ездить рядом с людьми, и технологические компании соревнуются за возможность развертывания полностью автономных транспортных средств. В декабре 2018 года Waymo, компания, возникшая из проекта самоуправляемых автомобилей Google, официально запустила свою коммерческую службу самоуправляемых автомобилей в пригородах Феникса. Компании вроде May Mobility, Drive.ai и Uber следуют тем же путем.

Автономные транспортные средства могут показаться великой мечтой, но полуавтономные транспортные средства уже среди нас. Новые автомобили Tesla обладают функцией Tesla Autopilot, которая способна на распознавание и отслеживание полос движения, адаптивный круиз-контроль и самостоятельную парковку. Способность идентифицировать и отслеживать полосы на дороге является одним из многих предварительных условий для беспилотных транспортных средств. Хотя распознавание полос может показаться сложной задачей, вы можете начать разработку алгоритмов распознавания и отслеживания полос с помощью аппаратной платформы NVIDIA Jetson Nano.

Введение в Jetson Nano

Модуль COM Jetson Nano немного больше, чем Raspberry Pi 3, но он может параллельно запускать нейронные сети с мощностью 472 Gflops. Это примерно в 22 раза мощнее, чем Raspberry Pi 3, и при этом очень энергоэффективно, потребляя всего лишь 5 Вт. Эта плата идеально подходит для встроенных AI приложений, работающих на урезанном ядре Linux. Она обладает достаточной вычислительной мощностью и объемом памяти на борту для приложений обработки изображений и видео высокого качества. Ключевые особенности Jetson Nano включают:

  • GPU: 128-ядерный GPU на базе архитектуры NVIDIA Maxwell™
  • CPU: Четырехъядерный ARM® A57
  • Камера: MIPI CSI-2 DPHY линии, 12x (Модуль) и 1x (Набор для разработчиков)
  • Память: 4 ГБ 64-битная LPDDR4; 25.6 гигабайт/секунду
  • Соединение: Гигабитный Ethernet
  • Поддержка ОС: Linux для Tegra®
  • Размер модуля: 70мм x 45мм
  • Набор для разработчиков - отличный инструмент для тестирования нового алгоритма для приложений компьютерного зрения/обработки изображений. Если вы не знакомы с платформой Jetson Nano, ознакомьтесь с этой статьей. В противном случае, продолжайте читать, чтобы узнать, как вы можете легко развернуть мощное приложение для обработки изображений для распознавания полос движения.
Developer kit for NVIDIA Jetson Nano
Набор для разработчиков NVIDIA Jetson Nano. [Image source]

Распознавание полос движения с Jetson Nano

Для этого проекта нам понадобится COM модуль Jetson Nano или разработочная плата и камера CSI (камера Raspberry Pi CSI Camera v2 подойдет отлично). Я покажу эту реализацию на примере разработочной платы Nano, но вы легко можете построить собственную базовую плату для COM модуля Nano и развернуть это приложение. Камера CSI будет подключена к порту камеры на Jetson Nano, хотя вы также можете использовать USB-камеру или IP-камеры. Ниже приведены необходимые требования для успешной работы этого проекта:

Аппаратное обеспечение

  • NVIDIA Jetson Nano
  • Камера CSI

Пакеты программного обеспечения

  • Python
  • OpenCV
  • Nanocamera

Реализация

Полная реализация этого проекта доступна на GitHub. Следуйте предстоящим шагам, чтобы запустить демонстрацию этого проекта. Эти шаги являются важными этапами обработки изображений, которые предназначены для повышения точности распознавания полос движения.

Восприятие

Первый шаг нашей системы обнаружения полос движения заключается в возможности чтения живых изображений с камеры. Для новых пользователей, работающих с Jetson Nano, работа с камерами может быть сложной. Для этого мы будем использовать библиотеку NanoCamera. Эта библиотека не является лучшим выбором для приложения производственного уровня, но подходит для более простого приложения, как показано здесь.

Сначала установите библиотеку с помощью pip:

.

Чтение живого изображения с камеры:

.

Удаление шума с помощью размытия

Чтобы сделать изображение более гладким и удалить нежелательный шум, мы можем применить гауссово размытие. Это включает в себя расчет значения каждого пикселя как взвешенного среднего окружающих пикселей.

Gaussian blur algorithm for lane recognition
Алгоритм Гауссова размытия для сглаживания изображений.

OpenCV включает функцию для применения гауссова размытия к изображению:

.

Преобразование цвета

После гауссова размытия изображение все еще находится в RGB и должно быть преобразовано в цветовое пространство HSV. Разделение цветов будет использоваться для удаления нежелательных цветов из изображения. Как только изображение находится в HSV, мы можем «удалить» все ненужные цвета из изображения, указав диапазон оттенков серого.

.

Морфологические операции - Расширение

Дилатация добавляет пиксели к границам объектов на изображении. Применение дилатации к изображению поможет закрыть любые свободные пространства в линейных изображениях.

.

Кэнни (Обнаружение краёв)

Для обнаружения линий разметки мы можем использовать технику, называемую обнаружением краёв Кэнни. Обнаружение краёв Кэнни может быть использовано для извлечения полезной структурной информации из объекта. Библиотека OpenCV предоставляет функцию обнаружения краёв Кэнни, которая может быть использована для обнаружения краёв на изображении. Для работы обнаружения Кэнни нам нужно задать минимальный и максимальный пороги. Обычно в OpenCV рекомендуют значение (100, 200) или (200, 400), поэтому мы используем (200, 400).

.
Canny edge detection applied to a camera image
Изображение с применением обнаружения границ по Канни. Обратите внимание на линии, показанные на изображении.

Изолировать область интереса

Изображение, полученное после применения обнаружения краёв Кэнни, содержит некоторый шум. Всю информацию, кроме полос движения на изображении, можно изолировать, уменьшив область интереса. При распознавании полос движения и навигации нам не обязательно видеть всё изображение. Простой способ сделать это - просто обрезать верхнюю половину изображения.

ROI reduction for lane recognition
Оригинальное изображение (слева) и изображение с выделенной областью интереса (справа).

Код для уменьшения области интереса:

.

Обнаружение линейных сегментов - Линии Хафа

После того как область интереса была сокращена, полосы стали четко видны с четырьмя отдельными линиями. Однако компьютер не знает, что эти линии представляют собой границы двух полос. Поэтому нам нужен способ извлечения координат для этих линий полос. Преобразование Хафа - это техника, используемая в обработке изображений для извлечения таких особенностей, как линии, круги и эллипсы. Его можно использовать для поиска прямых линий из числа пикселей, которые кажутся формирующими линию. Это можно сделать с помощью функции HoughLinesP в OpenCV. Функция подгоняет множество линий через все белые пиксели и возвращает наиболее вероятный набор линий с учетом некоторых минимальных пороговых ограничений.

Lines found during lane recognition
Обнаружение линий с применением преобразования Хафа.

Вот наш код, который обнаруживает сегменты линий с использованием преобразования Хафа. Большинство параметров, используемых здесь, можно определить методом проб и ошибок или выбрав параметры из эталонных изображений.

.

Объединение сегментов линий в две линии полос

Результат функции detect_line_segments() дает набор маленьких линий с координатами конечных точек (x1, y1) и (x2, y2). Нам нужно найти способ объединить их всего в две линии для левой и правой полос, но как мы можем это сделать? Один из способов - классифицировать эти сегменты линий по их углам наклона.

Все линии левой полосы имеют положительный уклон, а отрезки линий, принадлежащие правой линии полосы, имеют отрицательный уклон. Основываясь на этих двух новых группах, мы можем взять среднее значение уклонов и пересечений отрезков линий, чтобы получить уклоны и точки пересечения линий левой и правой полос. Это реализовано с помощью функции average_slope_intercept():

..

Функция make_points() является вспомогательной функцией для функции average_slope_intercept(), которая принимает уклон и пересечение линии и возвращает конечные точки отрезка линии. На этом этапе у нас теперь есть линии полос!

Что дальше

На данном этапе выходные данные из этой функции будут введены в другой алгоритм для управления скоростью и направлением движения транспортного средства. Для этого можно вычислить угол поворота руля на основе обнаруженных линий полосы, а затем передать его в контроллер PID для минимизации угла поворота руля и поддержания транспортного средства в центре полосы.

Хотя это было сделано с использованием платы разработки Nano, тот же код предоставляет отправную точку для развертывания системы в встроенной системе обработки изображений для производственной среды. Для этого вам нужно будет построить реальную базовую плату для Jetson Nano. Это проще всего, когда вы используете модульные инструменты проектирования электроники в приложении Upverter Board Builder. Принимая модульный подход, вы можете легко настроить базовую плату для Jetson Nano, камер и других датчиков для распознавания полос движения.

Модульные инструменты проектирования электроники в Upverter дают вам доступ к широкому спектру стандартных в отрасли COM и популярных модулей без необходимости загружать или устанавливать какое-либо новое программное обеспечение. Вы можете создавать аппаратное обеспечение производственного класса для различных приложений, включая распознавание полос и другие задачи обработки изображений с Jetson Nano, используя интерфейс перетаскивания. Если вашей системе требуется дополнительная функциональность, вы можете включить беспроводную связь, массив датчиков и многое другое.

Посмотрите некоторые истории успеха клиентов Gumstix или свяжитесь с нами сегодня, чтобы узнать больше о наших продуктах, инструментах проектирования и услугах.

Об авторе

Об авторе

Закарайа Петерсон (Zachariah Peterson) имеет обширный технический опыт в научных кругах и промышленности. До работы в индустрии печатных плат преподавал в Портлендском государственном университете. Проводил магистерское исследование на хемосорбционных газовых датчиках, кандидатское исследование – по теории случайной лазерной генерации. Имеет опыт научных исследований в области лазеров наночастиц, электронных и оптоэлектронных полупроводниковых приборов, систем защиты окружающей среды и финансовой аналитики. Его работа была опубликована в нескольких рецензируемых журналах и материалах конференций, и он написал сотни технических статей блогов по проектированию печатных плат для множества компаний.

Связанные ресурсы

Вернуться на главную
Thank you, you are now subscribed to updates.