Сиди крепко дружище, я за тобой поеду!

Позвольте мне сначала процитировать, что такое клонирование поведения?

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

С приведенной выше цитаты давайте начнем и попытаемся понять, как это можно сделать. Но сначала предыстория этого проекта. Это мой третий проект Самоуправляемый автомобиль Udacity Nanodegree. Весь этот проект выполнен на питоне с помощью keras (Tensorflow, как в фоновом режиме). Я предполагаю, что читатели этого поста знакомы с keras и основами нейронной сети (в основном сверточной нейронной сети). Если вы хотите продолжить, вы можете использовать систему с графическим процессором и симулятор беспилотного автомобиля udacity (Linux, macOS, Windows).

Набор данных (сбор данных)

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

Но нужно понимать, что здесь записывать данные. Итак, позвольте мне объяснить, какие данные регистрируются (фиксируются) и как.

Сбор данных в симуляторе вдохновлен бумагой Nvidia, согласно этой статье на автомобиле установлено 3 фронтальных камеры (одна справа от капота, одна по центру и одна слева от капота. ). Изображение ниже описывает настройку камер и рулевого управления (Изображение из Nvidia Paper).

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

Стратегия сбора данных

Я следовал следующей стратегии для сбора необходимых данных.

  • Проехал по трассе 1 три круга, сделав машину по центру полосы.
  • Проехал один круг по трассе 1 в направлении, противоположном полосе движения (чтобы уменьшить уклон при повороте).
  • Несколько раз водил машину слева от полосы и до центра полосы (это заставит сеть узнать, если машина выезжает из центральной полосы, а затем, как вернуться на центральную полосу). то же самое для правой полосы на центральную полосу.
  • Множественные данные о плавных поворотах на каждом повороте.

Балансировка набора данных

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

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

Есть некоторые изображения, которые имеют скорость менее 20 миль / сек, я удалил эти изображения и сохранил только со скоростью более 20 миль / сек (интуиция подсказывает, что может быть случай с более низкой скоростью, машина может поворачивать и может не находиться на центральной полосе).

Увеличение данных

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

Вертикальный случайный сдвиг

Для каждого изображения я случайным образом сдвигаю каждое изображение по вертикали между -20 и + 20%. Этот вертикальный сдвиг помогает модели значительно лучше работать на обоих треках и дает больше обобщений.

Горизонтальный флип

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

Случайная тень

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

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

Сетевая архитектура

Я начал с архитектуры Nvidia CNN и сделал эталонную модель для дальнейшего улучшения.

В архитектуре Nvidia я добавил еще один полностью связанный слой (здесь я хотел изучить паттерн на треке 1 с минимальной эпохой).

Вышеупомянутая модель может быть запрограммирована в keras (я использовал уровень активации ELU, он быстрее сходится для проблем регрессии, плюс он вносит нелинейность в сеть во время обучения)

Позвольте мне показать вам, как эта настройка выполняется с помощью рулевого колеса (изображение из бумаги Nvidia).

Я использовал оптимизатор adam, который мгновенно меняет скорость обучения. Я тренирую эту сеть с 4 эпохи и на удивление учусь ездить по трассе 1, Впечатляет !!

Обучение и генератор

Поскольку мы имеем дело с данными изображений, мы не можем загрузить все это в память одновременно, поэтому мы используем замечательную функцию Kera fit_generator. Эта функция принимает в качестве аргумента генератор Python, который возвращает данные.

Этот генератор случайным образом выбирает batch_size выборки из наших пар X / y. Я эмпирически обнаружил, что batch_size равный 64 работает лучше, чем 32, 128 или 256.

Результат

В следующем видео показано изменение угла поворота.

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

Отражение

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

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

Есть предложения, как я могу улучшить свое решение? Я бы хотел это услышать. Спасибо за чтение!