Цели/этапы этого проекта следующие:

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

Весь код можно найти по моей ссылке github. Стеки, которые я использовал, — это алгоритмы python, OpenCV и компьютерного зрения. Например, определение границ с помощью алгоритма Канни, определение линий с помощью Преобразования Хафа.

1. Описание конвейера обнаружения дорожек.

Мой конвейер состоял из следующих шагов.

1. Преобразование изображений в hls и получение цветовых областей белого и желтого цвета в маске изображения.

Причина в том, что изображение в градациях серого RGB недостаточно надежно, чтобы получить дорожки в разных условиях освещения по сравнению с HSL. В выборе цвета я установил диапазоны значений для белого и желтого.

2. Для получения ребер используется алгоритм OpenCV Canny.

3. Используйте преобразование Хафа с краями, чтобы получить линии.

Шаги 2 и 3 применяются непосредственно из курса Udacity до задания Проекта 1.

Исходное изображение «solidYellowCurve»

Обнаружение краев через цветовое пространство RGB

Обнаружение границ через HSL

Изображение HSL может хорошо обнаруживать левые полосы движения. Еще одно изображение из Challenge.mp4,

Исходное изображение

Обнаружение краев через цветовое пространство RGB

Обнаружение границ через HSL

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

Для более надежного обнаружения я отфильтровываю слишком маленькие и слишком большие наклоны, взвешиваю линии в зависимости от длины и удаляю выбросы (выдающиеся наклоны).

Для взвешивания линий на основе длины интуитивно понятно, что чем длиннее линия, тем больше шансов, что это часть дорожки, близкая к камере, которая более полезна для использования в качестве базовой линии модели дорожки.

Для выдающихся наклонов мы рассматриваем их за пределами одного стандартного отклонения.

«Твердая белая кривая»

«твердый белый правый»

«Твердая желтая кривая2»

«Твердая желтая кривая»

«твердыйжелтыйлевый»

«белыйкарлейнпереключатель»

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

Весовая схема основана на взвешенной схеме. Для каждого временного шага (индекс в деке). Самые последние получают больший вес. Мы используем функцию softmax для этого потока.

wei_total = 0
for time_step in range(sz):
            wei = math.exp(-(self.DEQUE_LENGTH-time_step)*alpha) 
            # the smaller alpha, the more even the weights spread
            # the larger alpha, the most recent image/lane dominates 
            wei_total += wei 
            for x1, y1, x2, y2 in cached_lines[time_step]:
                wx1 += x1*wei
                wy1 += y1*wei
                wx2 += x2*wei
                wy2 += y2*wei
                
        # weighted return line
        if wei_total > 0:  
            ret_line = [[int(wx1/wei_total), int(wy1/wei_total), int(wx2/wei_total), int(wy2/wei_total)]]
        return ret_line

Доступ к видео можно получить по следующим ссылкам на YouTube

2. Определите потенциальные недостатки вашего текущего пайплайна

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

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

3. Предложите возможные улучшения вашей воронки продаж

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

Для крутых дорог нам сначала нужно определить интересующую область.

Интересный практический проект из Проекта 1 инженера по самоуправляемым автомобилям Udacity Nanograde (Term I). После отправки кода наставник Udacity сделал обзор.

Отзыв от полезного наставника Udacity для моего обзора кода

Соответствует спецификациям

В общем, я хотел бы вас поздравить с тем, что вы сделали удивительный первый шаг на этом пути!!

Представление проекта включает в себя все необходимые файлы

Конвейер поиска дорожек

Выходное видео представляет собой аннотированную версию входного видео.

Отличная работа! Ваши аннотации хорошо видны на видео.

Грубо говоря, левая и правая линии дорожки снабжены точными аннотациями почти на всем протяжении видео. Аннотации могут быть сегментированы или сплошными линиями

Между двумя полосами есть четкое разграничение! Вы сделали очень хороший шаг к обнаружению переулков, и ваш пайплайн отражает это :)

Визуально левая и правая линии дорожки точно обозначены сплошными линиями на протяжении большей части видео.

Отражение (это то, что я написал для этого проекта)

Отражение описывает текущий конвейер, определяет его потенциальные недостатки и предлагает возможные улучшения.

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

threshold ~ 50
min_line_len  ~ 100
max_line_gap ~ 160
  • Увеличение порогового значения увеличивает минимальное количество пересечений, необходимых для обнаружения линии, и, таким образом, позволяет лучше различать левую и правую полосы движения.
  • min_line_len, как следует из названия, поможет вам убедиться, что сегменты линий нарисованы на реальных линиях, и, таким образом, поможет исключить некоторые линии.
  • Уменьшение значения max_line_gap поможет вам получить более точные соединенные аннотированные линии, когда есть ломаные полосы, поскольку это позволяет точкам, которые находятся дальше друг от друга, быть соединенными одной линией.
  • Эта исследовательская работа посвящена тому, как обнаруживать кривые, а также поможет в обнаружении выцветших полос. Он использует расширенную версию алгоритма линий hough для обнаружения касательных к кривой, что может помочь вам обнаружить кривую.