Код этого проекта можно найти на: Github.
Эту статью также можно найти на моем сайте здесь.
В третьем проекте Курс инженера по самоуправляемому автомобилю udacity я использовал симулятор автомобиля, предоставленный организаторами курса, для сбора данных об ожидаемом поведении при вождении, а затем использовал эти данные для обучения модели CNN с глубоким обучением (сверточная нейронная сеть NVIDIA сетевая архитектура ») для управления автомобилем в моделируемой среде.
Проект состоял из следующих этапов:
- Собирайте тренировочные данные, управляя автомобилем вокруг симулятора.
- Реализуйте нейронную сеть NVIDIA.
- Обучите и проверьте работоспособность модели.
Сбор тренировочных данных
Тренажер может работать в двух режимах: тренировочном и автономном.
В режиме обучения пользователь управляет движением автомобиля, используя угол поворота рулевого колеса, дроссельную заслонку и тормоза. Управлять автомобилем можно с помощью клавиатуры или мыши. В режиме обучения вы можете нажать кнопку записи, и симулятор начнет сохранять данные о вождении в определенном месте. Данные о вождении состоят из каждого изображения с левой, правой и передней камер (размеры 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, как правило, не соответствуют модели.
Модель была подогнана с помощью оптимизатора адама, поэтому скорость обучения не нужно было настраивать вручную.
На следующем изображении показаны среднеквадратические потери ошибок на наборах для обучения и проверки для каждой эпохи:
Как и ожидалось, среднеквадратичная потеря ошибки как для обучающего, так и для проверочного набора уменьшалась с увеличением количества тренировок модели (эпох).
По окончании тренировочного процесса модель смогла автономно управлять транспортным средством по трассе, не сходя с дороги. Ниже представлено видео модели в действии: