Клонирование стиля вождения с помощью Keras и симулятора, похожего на видеоигру

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

СБОР ДАННЫХ И БОРЬБА С ПРЕДВАРИТЕЛЬНОСТЬЮ

Обученная сеть настолько хороша, насколько хороши данные, которые мы ей вводим.

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

Пока я играл с симулятором, я решил использовать данные, предоставленные Udacity, так как не был уверен в своих навыках вождения. Он состоит из 8 036 точек данных. Я использовал 85% образцов для обучения, а остальные 15% были использованы для проверки. График на гистограмме показывает, что управляющие измерения около 4 000 из этих выборок находятся в диапазоне [-0,05, -0,05]. Кроме того, данные смещены в сторону левых поворотов из-за дорожки, используемой для записи этих данных.

Чтобы бороться с этими предубеждениями, я сделал следующее:

  1. Для каждой точки данных я случайным образом выбираю одно из трех положений камеры [левое, центральное, правое] и использую коррекцию поворота 0,25. Значение коррекции рулевого управления было скорректировано в зависимости от того, как обучалась сеть, (для борьбы со смещением рулевого управления в центре полосы движения)
  2. Я также произвольно перевернул изображение и изменил знак угла поворота (для борьбы со смещением влево)
  3. Выполнение этих двух действий, описанных выше, увеличивает набор данных в шесть раз, как ясно объяснил Навошта.

СТРАТЕГИЯ ОБУЧЕНИЯ

Я использовал batch_size из 64, а epoch из 10 используется для обучения данных. Увеличение размера пакета может привести к нехватке памяти на сервере. Кажется, что большее количество эпох не влияет на результат функции потерь с риском переобучения. Функция генератора использовалась для генерации выборок для каждого пакета данных, которые будут подаваться при обучении и проверке сети.

Я использовал генератор, чтобы нам не нужно было без надобности хранить много данных и использовать только ту память, которую мне нужно использовать за раз. Обратите внимание, что в моем коде - для простоты - я не использую последний пакет данных, размер которого меньше выбранного мной batch_size. Кажется, это не проблема.

МОДЕЛЬ

В приведенной выше таблице представлена ​​архитектура модели, которую я использовал. Эта архитектура создана по образцу исследования Comma.AI. Прежде чем я решил использовать эту архитектуру, я попытался использовать рекомендованную модель NVIDIA, но используемый сервер AWS (g2.2xLarge) вызывал ошибки нехватки памяти во время выполнения.

Как видно из приведенного выше кода, верхние 75 пикселей и нижние 25 пикселей обрезаны, поскольку эти пиксели отвлекают гораздо меньше бесполезной информации. Нас не интересует небо или капот машины. Я обрезал внутри модели, так как известно, что эта функция относительно быстрая, потому что модель распараллеливается на графическом процессоре. Данные нормализованы, поскольку считается, что это экспериментально улучшает результаты. Далее следуют три свертки и два полностью связанных слоя. ELU() (экспоненциальные линейные единицы) представлены как активизирующие элементы в сети, которые, как говорят, ускоряют обучение и приводят к более высокой точности. Субдискретизация также использовалась в каждом сверточном слое. Эта архитектура также использует агрессивные вероятности выпадения (0,2 и 0,5) для уменьшения переобучения. В модели использовался оптимизатор Адама, поэтому скорость обучения не настраивалась вручную. Функция потерь, используемая для оптимизации, - это функция среднеквадратичной ошибки.

РЕЗЮМЕ И РЕКОМЕНДАЦИИ

Для этого проекта у меня есть:

  • Использовал симулятор для сбора данных, которые можно было использовать в качестве образцов поведения при вождении.
  • В Керасе построена сеть, предсказывающая углы поворота по изображениям.
  • Обучил и проверил модель с помощью набора для обучения и проверки с данными, предоставленными Udacity
  • Проверено, что модель может успешно объехать одну колею, не съезжая с дороги.

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

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

Вот ссылки на интересные дискуссии об увеличении данных: