Код этого проекта можно найти на: Github.
Эту статью также можно найти на моем сайте здесь.

В третьем проекте Курс инженера по самоуправляемому автомобилю udacity я использовал симулятор автомобиля, предоставленный организаторами курса, для сбора данных об ожидаемом поведении при вождении, а затем использовал эти данные для обучения модели CNN с глубоким обучением (сверточная нейронная сеть NVIDIA сетевая архитектура ») для управления автомобилем в моделируемой среде.

Проект состоял из следующих этапов:

  1. Собирайте тренировочные данные, управляя автомобилем вокруг симулятора.
  2. Реализуйте нейронную сеть NVIDIA.
  3. Обучите и проверьте работоспособность модели.

Сбор тренировочных данных

Тренажер может работать в двух режимах: тренировочном и автономном.

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

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

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

Реализация нейронной сети NVIDIA

Для этого проекта использовалась библиотека глубокого обучения Keras.

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

Чтобы улучшить свое решение, я решил использовать архитектуру нейронной сети NVIDIA, описанную здесь, в их блоге разработчиков. Цитата из их статьи:

В новом автомобильном приложении мы использовали сверточные нейронные сети (CNN) для сопоставления необработанных пикселей фронтальной камеры с командами рулевого управления для беспилотного автомобиля. Этот мощный комплексный подход означает, что при минимальном количестве обучающих данных, полученных от людей, система учится управлять, с разметкой полос или без нее, как на местных дорогах, так и на автомагистралях.

Ниже представлена ​​диаграмма архитектуры нейронной сети NVIDIA, взятая из их блога:

Нейронная сеть NVIDIA, представленная выше, состоит из 9 слоев: 1 уровня нормализации, 5 сверточных слоев и 3 полностью связанных слоев.

Моя реализация CNN немного отличалась: всего у меня было 12 слоев: 1 слой обрезки, 1 слой нормализации, 4 сверточных слоя, 3 слоя исключения и 3 полностью связанных слоя.

Слои обрезки использовались для удаления пейзажей (деревья, вода и т. Д.) Из входных данных, чтобы модель могла сфокусироваться на объектах дороги. Входные изображения были обрезаны на 70 пикселей сверху и 25 пикселей снизу. Также были добавлены слои исключения, чтобы уменьшить чрезмерную подгонку в соответствии с рекомендацией статьи под названием Отсев: простой способ предотвратить переоснащение нейронных сетей исследователя из Университета Торонто Nitish Srivastava.

Ниже приводится подробное описание каждого слоя:

А ниже приведена реализация кода вышеуказанных слоев в Keras:

Тренировка и тестирование

Данные обучения были разделены на 80% данных, используемых для обучения, и 20% данных, используемых для проверки. Перед разделением данные перетасовывались. Используемая метрика производительности представляла собой среднеквадратическую потерю ошибки с целью ее минимизации в максимально возможной степени.

После экспериментов я обнаружил, что идеальное количество эпох для обучения модели - 5 эпох, эпохи больше 10, как правило, не соответствуют модели.

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

На следующем изображении показаны среднеквадратические потери ошибок на наборах для обучения и проверки для каждой эпохи:

Как и ожидалось, среднеквадратичная потеря ошибки как для обучающего, так и для проверочного набора уменьшалась с увеличением количества тренировок модели (эпох).

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