Этот пост представляет собой письменную адаптацию книги Terrapin Hackers Hacktorial, представленной в Университете Мэриленда. Оригинальные слайды презентации доступны для просмотра здесь.

В этом хакерском руководстве мы узнаем, как создавать модели глубокого обучения на Python для обучения беспилотного автомобиля с нуля, используя автомобильный симулятор Udacity. Изначально это был вызов от Самоуправляемого автомобильного инженера Udacity Nanodegree. В частности, мы будем использовать структуру, называемую сквозным обучением, о которой я расскажу позже более подробно.

Репозиторий Github, содержащий весь код, находится здесь.

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

Повестка дня:

  1. вступление
  2. Цель
  3. Подход
  4. Установка
  5. Реализация

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

вступление

Глубокое обучение существует с 1980-х годов как исследовательский интерес Джеффри Хинтона, Яна ЛеКуна и многих других. Сочетание повышенной вычислительной мощности и большой емкости современных компьютеров позволило глубокому обучению добиться огромного успеха. Фактически, глубокое обучение так или иначе проникло во многие наши повседневные технологии, такие как наша электронная почта, поисковые системы, больницы и многое другое!

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

Беспилотные автомобили всегда были в центре нашего будущего. Поскольку Google, Uber и другие технологические компании добились огромных успехов за последние пару лет, неудивительно, если мы скоро увидим их на дороге. За последние годы было разработано множество подходов к созданию этих беспилотных автомобилей. Хотя системы, разработанные указанными выше компаниями, представляют собой массивные сложные системы, они часто сводятся к ключевым алгоритмам и компонентам. Благодаря быстрой демократизации искусственного интеллекта мы тоже можем использовать возможности этих алгоритмов и применять их для создания наших собственных беспилотных автомобилей (смоделированных… .. на данный момент).

Цель

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

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

Подход

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

Жестко запрограммированные правила и функции

Это был один из первых подходов к разработке автономных транспортных средств и, вероятно, то, чем мы все его представляли. Правила звучат примерно так: если вы видите знак остановки, остановите машину. Если вы видите пешехода, остановите машину. Если вы находитесь на полосе, убедитесь, что вы в центре, и так далее. Основная проблема в том, что существует слишком много правил, которые нужно отслеживать и записывать. В некоторых сценариях (например, при столкновении с препятствием) эти правила даже не применяются. Этот подход также требует наличия большого количества датчиков для отслеживания автомобиля.

Хорошо: вы точно знаете, что делает машина и почему.

Плохо: необходимо отслеживать слишком много правил и датчиков.

Обучение с подкреплением

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

Моделирование обречено на успех. - Джордж Хотц

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

Хорошо: очень хорошо и оптимально подходит для вождения на тренировках.

Плохо: «Моделирование обречено на успех»

Сквозное обучение ( поведенческое клонирование)

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

Если бы мы показали машине, как водить машину, могла бы она научиться водить машину, как мы?

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

Интуиция, лежащая в основе этого подхода, заключается в том, что пользователь водит машину в течение длительного периода времени в идеально разнообразных сценариях (например, город, автострада и т. Д.) И собирает данные о своем вождении (обычно изображения того, что впереди машины, скорость, ускорение и т. д.). Затем мы берем данные и передаем их в нейронную сеть и пытаемся позволить ей узнать, почему вы предприняли указанное действие для каждой точки данных. Например, если вы постоянно поворачиваете на изгибе дороги, он узнает, что изображение дороги, изгибающейся перед вами, должно означать поворот в направлении поворота. Проблема здесь в том, что модель всегда будет учиться водить, как вы. Итак, если вы решили водить машину как сверхагрессивный нью-йоркский водитель; модель тоже будет!

Хорошо: быстро обучается, легко кодируется и в целом работает хорошо.

Плохо: сфокусирован на данных и не поддается интерпретации.

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

Установка

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

Для запуска моделей и кода убедитесь, что Python установлен. В идеале все настройки должны выполняться в среде Conda , а также во избежание конфликтов при запуске модели, но это необязательно, если вы знаете, что делаете.

Клонируйте репо на свой локальный компьютер и перейдите в каталог.

git clone https://github.com/sujithv28/Behavioral-Cloning-Hacktorial.git
cd Behavioral-Cloning-Hacktorial

Здесь вы можете создать среду conda, если хотите ее использовать. Во время разработки мы использовали Python 2.7, но Python 3 должен работать.

conda create -n hacktorial python=2.7
source activate hacktorial

Установите TensorFlow, следуя инструкциям для вашей системы здесь. С помощью conda вы можете установить TensorFlow, просто запустив:

conda install -c conda-forge tensorflow

Установите все зависимости Python:

pip install -r requirements.txt

Настройте Keras на использование TensorFlow в качестве серверной части:

python
import keras
quit()
nano ~/.keras/keras.json

Измените свои значения, чтобы они выглядели так:

{
    "image_dim_ordering": "tf", 
    "epsilon": 1e-07, 
    "floatx": "float32", 
    "backend": "tensorflow"
}

Также убедитесь, что у вас установлена ​​opencv-python библиотека через pip или homebrew. Вы можете проверить, работает ли это, запустив и убедившись, что ничего не жалуется:

python
import cv2

Вы можете скачать симулятор здесь.

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

wget https://www.dropbox.com/s/3cwc2atg1qorzg4/data.zip?dl=0
unzip -a data.zip?dl=0
rm data.zip?dl=0

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

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

Обзор симулятора

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

Реализация

Template.py - это шаблон для взлома и единственный код, который мы будем изменять. Окончательный код для справки доступен для просмотра в model.py. Файл drive.py от Udacity и содержит код, необходимый для подключения вашей модели, обученной в model.py, с симулятором.

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

Весь код с пояснениями находится в блокноте Jupyter Behavioral Cloning Self-Driving Car Guide.

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

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

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

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

Модель сделает снимок (с левой, центральной или правой камеры) и выведет одно число от -1 до 1, представляющее угол поворота.

Для реализации модели мы использовали Керас. Keras - это библиотека глубокого обучения, которая работает на Tensorflow или Theano и лучше всего подходит для быстрого прототипирования. Для более интенсивных задач глубокого обучения может быть лучшим вариантом PyTorch или TensorFlow.

Обучение модели

Чтобы обучить модель и сохранить параметры, просто запустите:

python model.py

Тестирование модели

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

python drive.py model.json

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

Соображения

  • Попробуйте изменить качество изображения в настройках симулятора для тренировочных данных с более высоким разрешением. Переобучите модель и посмотрите, как это повлияет на характеристики автомобиля.
  • Как машина ведет себя на второй трассе? В чем разница между этими двумя треками и как мы можем их преодолеть на этапе увеличения данных?
  • Что будет, если машина выйдет за пределы трассы? Он умеет себя исправлять? Как мы можем это исправить?

Вот вызов

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

Другие источники

Вот еще несколько замечательных блогов, посвященных их подходу к проекту Udacity Behavorial Cloning Project и объясняющих логику этого подхода.

Окончательный проект можно найти на моем GitHub здесь: https://github.com/sujithv28/Behavioral-Cloning-Hacktorial

Наконец-то…

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