В моем предыдущем посте о беспилотных автомобилях и связанном с ним проекте Udacity Nano degree я писал об использовании глубокой нейронной сети для классификации дорожных знаков. На этот раз я буду использовать подход глубокой нейронной сети, чтобы имитировать поведение человека при вождении (в данном конкретном случае вождение автомобиля в симуляторе).

Цель проекта

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

Анализ тренировочных данных

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

В результате было получено 36 534 снимков. Изображения содержат данные, полученные с трех камер автомобиля: левой, центральной и правой.

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

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

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

Поскольку данные тренировки содержат круги в обоих направлениях трека, угол поворота не смещен:

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

Дополнение и предварительная обработка данных

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

Предварительная обработка изображений в этом случае выполняется в самой модели, поскольку при использовании графического процессора она обходится дешевле, чем центральный процессор. Я обрезал 50 пикселей сверху и 20 пикселей снизу каждого изображения, чтобы удалить ненужный шум с изображений (передняя часть автомобиля, небо, деревья и т. Д.).

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

Я реализовал архитектуру глубокой нейронной сети из статьи NVidia: Сквозное обучение для беспилотных автомобилей в Keras, запустив TensorFlow на бэкэнде. Это отличный документ, и я рекомендую прочитать его, если вы больше разбираетесь в реальном применении этой глубокой нейронной сети.

Вот короткое видео NVidia, на котором автомобиль работает с той же моделью, основанной на архитектуре сверху, в реальной жизни:

Сама глубокая нейронная сеть принимает входные изображения (160 x 320 x 3). В самом начале он содержит слои нормализации и обрезки. Это продолжается с 3 сверточными слоями с шагом 2x2 и ядром 5x5. За ними следуют 2 дополнительных сверточных слоя без шага и ядра 3x3. Слои свертки связаны с тремя полностью связанными слоями, что приводит к выходному контрольному значению. Нелинейность вводится между всеми сетевыми уровнями с помощью функции RELU. ADAM используется для наших курсов обучения.

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

Обучение и конечный результат

Обучение проводилось на инстансе Amazon EC2, оснащенном графическими процессорами. После тренировки машина смогла самостоятельно пройти трассу:

Заключение

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

Проект можно найти в моем репозитории на Github: