Автономные транспортные средства постепенно становятся важной частью автомобильной промышленности. Многие считают, что полностью автономные транспортные средства скоро будут ездить рядом с людьми, и технологические компании соревнуются за возможность развертывания полностью автономных транспортных средств. В декабре 2018 года Waymo, компания, возникшая из проекта самоуправляемых автомобилей Google, официально запустила свою коммерческую службу самоуправляемых автомобилей в пригородах Феникса. Компании вроде May Mobility, Drive.ai и Uber следуют тем же путем.
Автономные транспортные средства могут показаться великой мечтой, но полуавтономные транспортные средства уже среди нас. Новые автомобили Tesla обладают функцией Tesla Autopilot, которая способна на распознавание и отслеживание полос движения, адаптивный круиз-контроль и самостоятельную парковку. Способность идентифицировать и отслеживать полосы на дороге является одним из многих предварительных условий для беспилотных транспортных средств. Хотя распознавание полос может показаться сложной задачей, вы можете начать разработку алгоритмов распознавания и отслеживания полос с помощью аппаратной платформы NVIDIA Jetson Nano.
Модуль COM Jetson Nano немного больше, чем Raspberry Pi 3, но он может параллельно запускать нейронные сети с мощностью 472 Gflops. Это примерно в 22 раза мощнее, чем Raspberry Pi 3, и при этом очень энергоэффективно, потребляя всего лишь 5 Вт. Эта плата идеально подходит для встроенных AI приложений, работающих на урезанном ядре Linux. Она обладает достаточной вычислительной мощностью и объемом памяти на борту для приложений обработки изображений и видео высокого качества. Ключевые особенности Jetson Nano включают:
Для этого проекта нам понадобится COM модуль Jetson Nano или разработочная плата и камера CSI (камера Raspberry Pi CSI Camera v2 подойдет отлично). Я покажу эту реализацию на примере разработочной платы Nano, но вы легко можете построить собственную базовую плату для COM модуля Nano и развернуть это приложение. Камера CSI будет подключена к порту камеры на Jetson Nano, хотя вы также можете использовать USB-камеру или IP-камеры. Ниже приведены необходимые требования для успешной работы этого проекта:
Полная реализация этого проекта доступна на GitHub. Следуйте предстоящим шагам, чтобы запустить демонстрацию этого проекта. Эти шаги являются важными этапами обработки изображений, которые предназначены для повышения точности распознавания полос движения.
Первый шаг нашей системы обнаружения полос движения заключается в возможности чтения живых изображений с камеры. Для новых пользователей, работающих с Jetson Nano, работа с камерами может быть сложной. Для этого мы будем использовать библиотеку NanoCamera. Эта библиотека не является лучшим выбором для приложения производственного уровня, но подходит для более простого приложения, как показано здесь.
Сначала установите библиотеку с помощью pip:
Чтение живого изображения с камеры:
Чтобы сделать изображение более гладким и удалить нежелательный шум, мы можем применить гауссово размытие. Это включает в себя расчет значения каждого пикселя как взвешенного среднего окружающих пикселей.
OpenCV включает функцию для применения гауссова размытия к изображению:
После гауссова размытия изображение все еще находится в RGB и должно быть преобразовано в цветовое пространство HSV. Разделение цветов будет использоваться для удаления нежелательных цветов из изображения. Как только изображение находится в HSV, мы можем «удалить» все ненужные цвета из изображения, указав диапазон оттенков серого.
Дилатация добавляет пиксели к границам объектов на изображении. Применение дилатации к изображению поможет закрыть любые свободные пространства в линейных изображениях.
Для обнаружения линий разметки мы можем использовать технику, называемую обнаружением краёв Кэнни. Обнаружение краёв Кэнни может быть использовано для извлечения полезной структурной информации из объекта. Библиотека OpenCV предоставляет функцию обнаружения краёв Кэнни, которая может быть использована для обнаружения краёв на изображении. Для работы обнаружения Кэнни нам нужно задать минимальный и максимальный пороги. Обычно в OpenCV рекомендуют значение (100, 200) или (200, 400), поэтому мы используем (200, 400).
Изображение, полученное после применения обнаружения краёв Кэнни, содержит некоторый шум. Всю информацию, кроме полос движения на изображении, можно изолировать, уменьшив область интереса. При распознавании полос движения и навигации нам не обязательно видеть всё изображение. Простой способ сделать это - просто обрезать верхнюю половину изображения.
Код для уменьшения области интереса:
После того как область интереса была сокращена, полосы стали четко видны с четырьмя отдельными линиями. Однако компьютер не знает, что эти линии представляют собой границы двух полос. Поэтому нам нужен способ извлечения координат для этих линий полос. Преобразование Хафа - это техника, используемая в обработке изображений для извлечения таких особенностей, как линии, круги и эллипсы. Его можно использовать для поиска прямых линий из числа пикселей, которые кажутся формирующими линию. Это можно сделать с помощью функции HoughLinesP в OpenCV. Функция подгоняет множество линий через все белые пиксели и возвращает наиболее вероятный набор линий с учетом некоторых минимальных пороговых ограничений.
Вот наш код, который обнаруживает сегменты линий с использованием преобразования Хафа. Большинство параметров, используемых здесь, можно определить методом проб и ошибок или выбрав параметры из эталонных изображений.
Результат функции 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 или свяжитесь с нами сегодня, чтобы узнать больше о наших продуктах, инструментах проектирования и услугах.