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

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

На мое решение этого проекта повлияли nvidia paper, comma.ai paper и vivek’s blog, с которыми я консультировался, работая над решением. Библиотека глубокого обучения Keras использовалась с бэкэндом Tensorflow для выполнения операций глубокого обучения.

Этот пост организован следующим образом: 1. Запись данных, 2. Обработка данных, 3. Обучение модели, 4. Тестирование модели и 5. Заключение.

1. Запись данных

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

Udacity предоставил набор обучающих данных (24 108 наборов данных), которые можно загрузить с помощью симулятора. Я подумал, что наборов данных Udacity может быть недостаточно, поэтому я записал свои собственные обучающие данные (104 145 наборов данных) и буду использовать наборы данных Udacity для проверки. Построение гистограммы из 10000 выборок обучающих данных показывает, что данные с дорожки 1 имеют больше 0 и левые углы поворота из-за характера дорожки, поэтому наш этап обработки также будет включать в себя увеличение и балансировку данных, в другом случае, чтобы предотвратить наши модель от предвзятого отношения к прямому и левому повороту.

2. Обработка данных

Обработка данных выполняется для того, чтобы наша модель могла легко работать с необработанными данными для обучения. В этом проекте обработка данных встроена в генератор (keras fit_generator), что позволяет обрабатывать данные в реальном времени. Преимущество здесь в том, что в случае, когда мы работаем с очень большим объемом данных, весь набор данных не загружается в память, поэтому мы можем работать с управляемым пакетом данных за раз. Следовательно, для повышения эффективности генератор запускается параллельно модели.

Ниже приведены этапы обработки данных:

  1. Произвольный выбор изображений центральной, левой и правой камер: Симулятор предоставляет три вида камеры, а именно; центральный, левый и правый виды. Поскольку от нас требуется использовать только один вид камеры, мы выбираем случайным образом из трех представлений. При использовании левого и правого изображений мы добавляем и вычитаем 0,25 к углам поворота соответственно, чтобы компенсировать смещение камеры 1.
  2. Перевести изображение (дрожание) и компенсировать углы поворота. Поскольку исходный размер изображения составляет 160 x 320 пикселей, мы случайным образом перемещаем изображение влево или вправо и компенсируем перенос углов поворота с 0,008 на пиксель перевод. Затем мы обрезаем интересующую область размером 120x220 пикселей из изображения. Обратите внимание, что я перевел только в горизонтальном направлении для своего решения.
  3. Случайное переворачивание изображения. Чтобы сбалансировать левое и правое изображения, мы случайным образом переворачиваем изображения и меняем знак на углах поворота. На следующем рисунке показан вид с левой, правой и центральной камер после дрожания, кадрирования и корректировки углов. Вид правой камеры перевернут, так что он выглядит как изображение левой камеры.
  4. Увеличение яркости Мы моделируем различные случаи яркости, преобразовывая изображение в канал HSV и произвольно масштабируя канал V.

Построение выборки из 10000 обработанных изображений показывает более сбалансированное распределение углов поворота после обработки:

3. Модельное обучение

Модель Nvidia была принята для обучения, потому что она давала лучший результат после экспериментов с другими типами моделей (например, comma.ai). Сеть состоит из 9 уровней, включая слой нормализации, 5 сверточных слоев и 3 полностью связанных слоя. В отличие от модели Nvidia, входное изображение было разделено на плоскости HSV перед передачей в сеть.

Изображение было нормализовано в первом слое. Согласно статье Nvidia, это позволяет также ускорить нормализацию с помощью обработки графическим процессором.

Свертка использовалась в первых трех слоях с шагом 2x2 и ядром 5x5, а свертка без шага с размером ядра 3x3 в последних двух сверточных слоях.

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

Переобучение было уменьшено за счет использования агрессивного исключения (0,2) на всех уровнях и регуляризации L2 (0,001) на первом слое. Это оказалось хорошей практикой, поскольку модель можно было обобщить на второй трек, не используя ее для обучения.

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

Хотя было более 100 000 обучающих данных, каждая эпоха состояла из 24 064 выборки. Это сделало обучение более управляемым, и, поскольку мы использовали генератор, все данные обучения по-прежнему использовались в обучении, но в разные эпохи.

Повторяю, что для обучения использовались данные, записанные самостоятельно, а данные, предоставленные Udacity, использовались для проверки во время обучения.

4. Тестирование модели

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

Дополнительно для проверки на обобщение модель была протестирована на втором треке. Приятно отметить, что модель никогда не тренировалась на семплах с этого трека, но успешно ездит по нему. См. Видео с результатами теста Track 2 ниже:

5. Заключение

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

Примечания

Ниже приведены личные заметки о работе над этим проектом:

  1. Обработка данных так же важна, как и процесс обучения: я понял, что, возможно, наиболее важной частью этого проекта было придумать обработку данных, которая предвосхищает тестовые примеры и обобщает, следовательно, использование дрожания и яркости увеличение. Когда я смог тренироваться на модели Nvidia, мне стало легко работать и с моделью comma.ai, которая также дала удовлетворительный результат при той же обработке данных.
  2. Количество данных. Чем больше данных, тем выше эффективность обучения. Я мог легко увидеть улучшение, когда у меня было много данных для обучения, и я мог проверить их по набору данных Udacity.
  3. Некоторая обработка, которая мне показалась бесполезной. Хотя некоторые другие люди использовали эти методы, в моем случае они не имели никакого значения. Примеры: вертикальное перемещение, изменение углов поворота около 0 путем добавления некоторого равномерного шума и использование входного сигнала квадратного размера.

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