Поведенческое клонирование - это процесс обучения автомобилю вождению, наблюдая за тем, как водит автомобиль. Этот проект до сих пор был одним из самых сложных и увлекательных в программе Udacity's Self-Driving Car Engineer Nanodegree.

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

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

Давайте посмотрим на симулятор.

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

Модельная архитектура и стратегия обучения

Модель Архитектура

Моя модель основана на популярной непрерывной модели беспилотного вождения, опубликованной nvidia. Эта модель состоит из сверточной нейронной сети с размером фильтра 3x3 и 5 сверточных слоев, за которыми следуют 3 полносвязных слоя. Сверточные слои имеют глубину от 24 до 64 (линии model.py 153–157). Полносвязные слои имеют 100, 50, 10 скрытых единиц соответственно (строки 160–165).

Модель включает слои RELU для введения нелинейности (линии 153–157), а данные нормализуются с использованием лямбда-слоя Кераса (линия 150).

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

Переоснащение

Пропуск был использован между полностью соединенными слоями для предотвращения переобучения (линии 161, 163). Ранняя остановка использовалась для прекращения обучения после того, как потеря валидации перестала уменьшаться на 0,0001 (строка 191).

Модель была обучена и проверена на различных прогонах данных, чтобы убедиться, что модель не переобучена (строка 20). Модель была протестирована путем прогона ее через симулятор и проверки того, что автомобиль остается на трассе.

Настройка параметров

В модели использовался оптимизатор адама, поэтому скорость обучения не настраивалась вручную (строка 211). Остальные параметры, например, коррекция рулевого колеса, выбирались путем ручного гиперпараметрического поиска вручную (строка 27).

Данные обучения

Данные тренировки были собраны при вождении автомобиля по середине трассы. Я использовал комбинацию следующих стратегий: движение по центральной полосе, восстановление от левого / правого к центру полосы, сбор дополнительных данных вокруг крутых поворотов, сбор дополнительных данных вокруг поворотов с отсутствующими полосами движения.

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

Документация по архитектуре и обучению

Подход к архитектурному дизайну

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

Хорошее практическое правило в архитектуре зданий - сначала выбрать простейшую модель и при необходимости добавлять слои. Моим первым шагом было использование нейронной сети всего с одним плотным слоем (256 скрытых единиц). Эта модель не смогла узнать ничего полезного о данных и постоянно выводила угол поворота -0,2.

Затем я протестировал модель, используя первые два сверточных блока из архитектуры vgg16, за которыми следуют 3 плотных слоя (строки 124–144). Эта архитектура могла бы научиться достаточно, чтобы проехать на автомобиле до первого моста на рельсовом пути, но не смогла бы пройти первый крутой левый поворот. Этот конкретный участок трассы является более сложным, потому что правая линия полосы движения также отсутствует.

Поскольку добавление дополнительных слоев было невозможным (я использовал графический процессор nvidia GT750 Ti только с 2 ГБ памяти), я попробовал затем сквозную архитектуру nvidia. Как описано ранее, эта модель состоит из 5 сверточных слоев, за которыми следуют 3 плотных слоя (линии 146–168). Я подумал, что эта модель может быть подходящей, потому что в ней было несколько сверточных слоев для уменьшения размерности и, следовательно, параметров в слоях. Кроме того, он успешно использовался исследователями nvidia для решения аналогичной проблемы.

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

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

Затем я обучил модель до 50 эпох, используя раннюю остановку, чтобы завершить процесс обучения, как только потеря проверки перестала улучшаться.

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

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

В конце процесса транспортное средство может автономно двигаться по трассе, не съезжая с дороги.

Сбор обучающих наборов данных

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

Я начал с записи двух кругов плавного движения по центральной полосе вокруг трека 1 как по часовой, так и против часовой стрелки.

Затем я записал, как автомобиль восстанавливается с левой и правой сторон дороги обратно в центр, чтобы автомобиль научился возвращаться к центру полосы. В этом видео показано, как выглядит восстановление, начиная с левого / правого края к центру:

На каждом временном шаге имитатор записывает три изображения с камеры (в центре, слева, справа). Я использовал все три вида, используя коэффициент коррекции поворота 0,2 (линии 88, 89). Это означает, что если угол поворота для центрального изображения был S, то углы поворота для левого и правого изображений были приняты равными S + 0,2, S-0,2 соответственно.

Чтобы расширить набор данных, я также перевернул изображения и углы, думая, что это поможет модели лучше обобщить (строки 101–107). Это было особенно важно, поскольку трек 1 симулятора в основном состоит из движения влево, что может привести к смещению модели. Например, вот изображение, которое затем было перевернуто:

После сбора и увеличения данных у меня было 46038 тренировочных изображений и соответствующие углы поворота.

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

Финальное выступление

Вот видео модели, проезжающей по треку 1.

Будущая работа

  • Я также собрал значительный объем данных на track2. Моя общая стратегия осталась прежней. Соберите данные о плавном вождении за несколько кругов и дополнительные данные на самых крутых поворотах. Однако существует компромисс между тем, сколько данных использовать с каждой из дорожек 1 и 2. Моя последняя модель может перемещаться по дорожке 2, но касается левой полосы на дорожке 1. Я считаю, что будущая работа может помочь ему пройти оба пути.
  • Поэкспериментируйте с методами предварительной обработки данных, такими как выравнивание гистограммы, чтобы помочь со второй дорожкой, на которой довольно много мест с тенями.

Полную информацию о реализации можно найти здесь.