
Еще в 2005 году Себастьян Трун и Stanford Racing Team выиграли DARPA Grand Challenge, автономно завершив 150-мильный маршрут через пустыню Мохаве на своей машине Stanley за самое быстрое время. У меня мурашки по коже каждый раз, когда я смотрю видео с этого события, поэтому, когда Udacity объявили в феврале, что они собирают автономную гоночную команду для участия в мероприятии Self-Racing Cars, я был в восторге. В наши дни Себастьян играет совсем другую роль в качестве основателя и президента Udacity, но он вдохновляет таких студентов, как я, идти по его стопам через недавно выпущенную Программу нанодипломного образования для инженеров по самостоятельному вождению автомобилей. Наша команда Self-Racing Cars только что участвовала в гонке Self-Racing Cars в минувшие выходные (1-2 апреля). Это был невероятный опыт, которым для нас большая честь поделиться.
Соревнование

15 февраля Udacity отобрал группу из 18 талантливых инженеров (из сотен претендентов) для формирования команды Self-Racing Cars. Наша команда состояла из людей с самым разным опытом со всего мира, с общими чертами, которые мы все были зачислены в программу Udacity Self-Driving Car Nanodegree, и чрезвычайно увлеченных автономными транспортными средствами. Команде было дано шесть недель на разработку программного обеспечения для управления автономным транспортным средством по трассе Thunderhill Raceway для мероприятия Self-Racing Cars. Мы были партнером для этого мероприятия с замечательной командой PolySync, которая предоставила нам автомобиль Kia Soul, оснащенный их Комплектом управления автомобилем с открытым исходным кодом (OSCC). У нашей команды не было доступа к машине раньше, чем за 2 дня до мероприятия, поэтому шестинедельная подготовка была посвящена ознакомлению с программным обеспечением PolySync и созданию наших собственных автономных моделей / систем, которые будут связываться с OSCC для управления транспортное средство.
Автомобиль PolySync имел единственную обращенную вперед камеру Point Grey Black Fly и GPS Swift Navigation. Автомобиль также был оборудован радаром и лидаром, но мы не использовали эти системы на мероприятии. Наша команда на раннем этапе решила, что мы хотим разработать автономную систему сквозного типа глубокого обучения и как можно меньше полагаться на GPS. Следование по путевым точкам GPS - довольно обычное дело, но разработка основанного на видении подхода к глубокому обучению с использованием единственной камеры, обращенной вперед, в качестве единственного входа, находится на переднем крае разработки автономных транспортных средств.
Итак, шесть недель, 18 человек, которые никогда не встречались, никто не имел формального опыта работы с автономными транспортными средствами, и одна камера…. Ах да, и нам нужно было название команды! Поскольку мы разрабатывали автономную систему для Kia Soul, «Soulless» казался нам идеально подходящим.
Организация
На нашей первой встрече мы разделились на четыре команды: первая для разработки симулятора для тестирования наших моделей, другая для запуска и запуска программного обеспечения PolySync, третья для разработки «безопасного» подхода к моделированию и последняя для разработки «быстрого» подход. Эти команды были очень подвижными и требовали большого количества кроссоверов. Помимо наших еженедельных часовых встреч в Google Hangout, все мы общались через Slack. Разница во времени между США, Европой и Австралией создавала некоторые проблемы (члены команды в семи разных часовых поясах!), Но помимо нескольких тихих часов здесь и там, наша команда работала и общалась круглосуточно через Slack, минуя эстафету между членами команды на разных континентах.

Подход
Когда наша внутренняя команда настроена, мы все приступили к работе. Результат работы каждой команды кратко описан ниже:
Команда симуляторов
С помощью Udacity и члена сообщества с открытым исходным кодом (благодарность в конце) в течение первой недели мы смогли выпустить довольно реалистичный симулятор в Unity, используя спутниковые изображения и данные о высоте, которые Kairos Aerospace »Были собраны на мероприятии Автогонки 2016 . Ниже показано видео автономного вождения автомобиля Kia Soul в симуляторе. После первоначального выпуска мы постоянно добавляли функции в симулятор в течение шести недель. Этот симулятор оказался прекрасным полигоном для тестирования наших моделей и дал существенное представление о том, что работает, а что нет. Поскольку у нас не было настоящего автомобиля до нескольких дней, предшествовавших мероприятию, это был решающий шаг.
Команда разработчиков PolySync
Сбор данных - наша команда PolySync преследовала несколько целей. Во-первых, нам нужно было извлечь данные, которые PolySync взял из гонки 2016 года, чтобы обучить наши модели глубокого обучения. Этот процесс также подготовил почву для конвейера обработки данных, который мы создали для быстрой обработки данных во время гонки. На установку и запуск программного обеспечения PolySync потребовалось несколько недель попыток, но команда PolySync оказалась чрезвычайно полезной. Мы извлекли около 30 минут данных о событии 2016 года. и фрагмент этих данных можно увидеть на видео ниже.
Собрав данные за 2016 год, мы работали над созданием конвейера данных, который позволил бы нам быстро создавать .CSV, включая все необходимые данные для обучения и соответствующие каталоги изображений. Это оказалось одной из самых сложных задач, с которыми мы столкнулись. Около 10 разных членов команды работали над сквозными моделями, поэтому формат обучающих данных должен был соответствовать подходам каждого. Мы также обнаружили, что большая часть данных, которые мы собрали в 2016 году, а также на треке Thunderhill, не содержала информации о дроссельной заслонке. Наша команда быстро работала над созданием измененной переменной «ускорение», которая имитировала бы дросселирование автомобиля. После работы с PolySync мы устранили проблему с дроссельной заслонкой, и все наши окончательные наборы данных содержали информацию о дроссельной заслонке.
Приятным сюрпризом в дни гонки стала точность собранных данных GPS. Один из членов команды создал визуализацию тренировочных заездов, и при увеличении масштаба можно фактически разделить каждый круг по трассе. Изображение GPS, наложенное на трек, показано ниже.

Архитектура системы. Вторая цель заключалась в разработке интерфейса между нашими моделями и PolySync. Изображения и другая информация от транспортного средства будет передаваться через PolySync нашим моделям, а затем наши модели могут отправлять обратно команды рулевого управления, газа и торможения через PolySync в OSCC. Программное обеспечение PolySync написано на C ++, но наша команда смогла создать оболочку Python, которая позволила взаимодействовать с нашими моделями, разработанными на Python. Это обеспечило максимальную гибкость для команды моделирования, которая разрабатывала модели глубокого обучения с использованием комбинации Keras и Tensorflow. Наша системная архитектура для связи с PolySync показана ниже:

Команды безопасного и быстрого моделирования
Хотя изначально они создавались как отдельные команды, они быстро объединились, поскольку мы начали понимать, насколько сложно заставить наши модели управлять всеми тремя ключевыми командами транспортных средств, используя только входные изображения. Хотя мы много пробовали, наши разработанные модели в основном можно было разделить на три разных блока, как описано ниже. Общий подход заключался в том, чтобы сначала обучить эти модели на данных симулятора до такой степени, чтобы они могли успешно проехать по трассе симулятора. Затем мы обучили, проверили и протестировали те же модели с реальными данными о транспортном средстве или использовали комбинации симуляторов и реальных данных для окончательных моделей.
Модели CNN
Сверточные нейронные сети (CNN) могут использоваться для автономного вождения транспортных средств путем обучения модели с помощью входных изображений и соответствующих целей рулевого управления, дроссельной заслонки и торможения. NVIDIA недавно выпустила документ, в котором продемонстрирована успешная реализация этой методологии управления транспортным средством. Udacity также сделал это одним из своих проектов для программы Self-Driving Car Nanodegree, и многие из нас в команде недавно реализовали этот подход для управления транспортным средством в симуляторе Unity от Udacity. Для тех, кто интересуется подробностями, я написал еще один пост о реализации CNN, использованной для проекта Udacity, здесь.
Общая идея заключается в том, что архитектура CNN способна определять закономерности в пикселях изображения (полосы движения, дорога / бездорожье), которые коррелируют с определенными элементами управления транспортным средством. Один из ключевых приемов с этими моделями заключается в том, что вы не можете просто обучить их с помощью изображений центральной камеры. Если модель видит только обучающие данные, движущиеся по центру дороги, как только вы немного отклонитесь от этого обученного пути, модель увидит изображения, отличные от тех, на которых она была обучена, и отклонится от курса. Наша команда использовала порядка 10 различных типов дополнений изображений, которые изменяют обучающие изображения (и соответствующие цели), чтобы наши модели были обучены выходить из таких ситуаций. Другой ключевой трюк заключается в том, что данные трека Thunderhill смещены в сторону левых поворотов, так как они образуют петлю против часовой стрелки. Переворачивание изображений и соответствующих целей наведения является требованием для уменьшения этого смещения. CNN также может принимать другие входные данные, такие как данные GPS или скорость автомобиля, и мы экспериментировали с множеством различных комбинаций входных и выходных данных. В целом наши архитектуры уровня CNN были похожи на подход NVIDIA, поскольку они показали себя хорошо в симуляторе и имеют приемлемую задержку вычислений при работе на реальном транспортном средстве. Описание и код многих реализованных нами методов можно найти здесь.
Модели RNN
Подход для рекуррентных нейронных сетей (RNN) аналогичен подходу для CNN, но вместо того, чтобы брать отдельные изображения / цели (один момент времени) для обучения, модель обучается на последовательностях изображений и целей. Для зрения, вместо использования двумерной свертки над входными изображениями, модель теперь использует трехмерную свертку с дополнительным измерением глубины во времени. Выходные данные этой трехмерной свертки затем передаются на несколько слоев RNN с сохранением состояния. Для нашего подхода мы использовали долгую краткосрочную память с сохранением состояния (LSTM) и верхние уровни ванильной RNN. В основе нашего подхода лежат методы, разработанные Ильей Эдренкиным, инженером-программистом из Германии, который занял первое место в конкурсе Udacity's open source Deep Learning Competition для управления транспортными средствами. Любые увеличения изображений должны быть реализованы по-другому для моделей RNN, поскольку они основаны на просмотре последовательностей изображений.
PoseNet
Попробовав методы CNN и RNN, описанные выше в Kia Soul, мы время от времени совершали поворот на трассе, но изо всех сил пытались найти что-то более многообещающее. Мы смогли отразить наши подходы Джорджа Хотца из comma.ai, и одна идея, которую он упомянул во время разговора, была подходом в стиле PoseNet. Один член команды смог быстро реализовать модифицированную версию концепции PoseNet, и внезапно мы сделали несколько поворотов на трассе со скоростью ~ 25 миль в час.
PoseNet использует CNN для локализации с 6 степенями свободы. В нашем подходе шестимерный GPS был заменен одномерным значением, отсчитывающим вверх от -1 до 1 от начала до финиша. Подробное описание нашей методологии, включая код, можно найти здесь. Архитектура показана ниже.
Возможное улучшение - не только прогнозировать угол поворота, но и позволить сети планировать путь.

Дни, предшествующие соревнованию
Поскольку наша разработка программного обеспечения в основном завершена, мы были уверены, что перед соревнованием сможем заставить одну из моделей работать. Одним из самых крутых моментов было то, что каждый член команды отправился на гонку. К четвергу гоночной недели большая часть команды собралась в отеле Baymont Inn в Уиллоузе, Калифорния. Это была первая встреча многих из нас лично, но после столь тесной совместной работы в течение последних шести недель это было похоже на встречу со старыми друзьями. Это тоже была первая встреча с машиной! Команда PolySync приехала из Портленда, штат Орегон, поздно вечером в среду, что позволило нам провести четверг и пятницу на трассе, чтобы проверить наши подходы.

В четверг мы ожидали приступить к сбору данных и тестированию моделей. К сожалению, нам пришлось столкнуться с проблемами интеграции большую часть утра, как и следовало ожидать в любом проекте, впервые получающем оборудование. Мы наконец убедились, что все взаимодействует, и смогли собрать значительный объем данных с трека для обучения наших моделей. Собрав данные, мы приступили к работе в четверг вечером, чтобы попытаться подготовить наши модели к пятнице. Как упоминалось в разделе данных, мы быстро обнаружили, что в наших данных отсутствует ввод газа. Команда PolySync смогла исправить проблему, но не смогла восстановить данные, которые у нас уже были. Напор и самоотдача этой команды были невероятными! Многие члены команды страдали от различных стадий смены часовых поясов, но все же не спали до 3 часов ночи четверга, чтобы подготовиться к пятнице. Небольшая группа использовала машину на пустой парковке поздно ночью, чтобы убедиться, что все сигналы передаются и принимаются должным образом.

Пятница наступила быстро, так как мы все были на трассе и были готовы к старту в 7 утра. Когда мы впервые протестировали модели в автомобиле, это вызвало огромное волнение. Нажатие кнопки на вашем компьютере и просмотр программного обеспечения, которое вы разработали, берут на себя рулевое управление, газ и тормоз, - это довольно крутое чувство!
К сожалению, с автономными транспортными средствами возникают проблемы, которые беспокоят инженеров и автолюбителей! Вместо того, чтобы машина двигалась по трассе, мы быстро поняли, что что-то не так с нашим рулевым управлением, поскольку модели устанавливали рулевое колесо в одну сторону и не возвращались к центру трассы. В то же время мы также столкнулись с проблемой тормозной системы автомобиля, которую необходимо было устранить. Обе эти проблемы сохранялись всю пятницу, поскольку наша команда лихорадочно работала над выявлением наших ошибок, в то время как команда PolySync неустанно работала над исправлением тормозного модуля Kia Soul и заменой тормозных колодок.

Я должен упомянуть здесь, что команда PolySync была невероятной. Как ни усердно мы работали над правильным программным обеспечением, они работали до поздней ночи, чтобы убедиться, что машина всегда готова к работе.
Наконец, используя метод систематического тестирования наших моделей с интерфейсом PolysSync и программным обеспечением в цикле, мы выяснили поздно вечером в пятницу, что способ чтения байтов необработанного изображения с камеры создает огромную задержку (~ 0,5 с. за изображение). Наша команда смогла быстро решить эту проблему, и мы внезапно отправили команды автомобилю с необходимой частотой 20–30 Гц. Мы также собрали значительно больше данных в пятницу (на этот раз с точным дросселем!) И разработали конвейер обработки, чтобы все члены команды тренировали модели, используя одни и те же проверенные данные. Мы были готовы, может быть ...
Гонка

суббота
Двое из членов команды отправились на трассу очень рано, чтобы посмотреть, сможем ли мы провести какие-либо испытания до начала соревнования. К сожалению, из-за нехватки света и других ранних пташек эти планы не сработали. В то время как в четверг и пятницу у нас была трасса в основном для самих себя, суббота была заполнена стартапами автономных транспортных средств и продвинутыми водителями, готовыми к гонкам на трассе. Наши первые попытки на трассе доказали, что все настроено правильно, однако наши модели все еще боролись. Поскольку мы были ограничены примерно четырьмя 15-минутными сессиями на трассе в течение всего дня, нам пришлось найти новый способ попробовать и проверить модели. Мы записали данные о извилистой дороге, подходящей к зоне трассы, и приступили к тестированию и обучению моделей на ней. Учитывая, что мы собрали очень небольшой объем данных, мы были удивлены тем, что у нас есть модели, которые действительно могут помочь в этом.
День превратился в долгий, наполненный адреналином рывок, в течение которого необходимо было записать данные, обучить модели и протестировать производительность треков - и все это за небольшой промежуток времени. Поиск правильного баланса между кофе, Redbull, Monster и пиццей был критически важен в течение дня. Еще одним преимуществом было то, что один из членов команды был инструктором по вождению гоночного автомобиля, поэтому в любое время, когда нам требовался перерыв, он заставлял нас прыгать в его подготовленную для трека трековую машину Mazda Miata и водить по трассе в темпе, близком к гоночному. 90 миль в час +! Хотя мы добились большего успеха с моделями на основе CNN, которые смотрели не только на изображение, в конце концов, ни одна из моделей не выделялась в качестве лидера. Мы вернулись в бизнес-центр отеля, чтобы снова собраться и составить план атаки на воскресенье.

Воскресенье
Вот и мы. Еще одно раннее утро и последний шанс обойти трассу автономно. Кофеин и модели были загружены для нашего первого круга. Вся команда смотрела и надеялась, как мы взлетали. По мере того, как мы ехали по трассе, мы тестировали модель за моделью без каких-либо улучшений по сравнению с предыдущим днем. Как только у нас закончились модели для тестирования, еще одна закончила тренировку, пока мы все еще были на трассе. Мы активировали его и ждали… Он проехал пару поворотов полностью автономно, прежде чем потребовался захват! Это было не идеально, но это был огромный прогресс, который вызвал новый всплеск мотивации в команде! Мы продолжали ездить на этой модели до тех пор, пока наше время на трассе не истекло, и мы не увидели, что она без проблем преодолевает многие повороты на трассе. Мы придерживались того же подхода к обучению и тестированию, который применяли накануне, и продолжали пытаться улучшить наши модели. К концу дня мы смогли пройти каждый поворот на треке (мой любимый - шпилька на 180 градусов), но не смогли пройти полностью автономный круг непрерывно.
Хотя мы не достигли нашей конечной цели по прохождению полностью автономного круга, мы все были в полном восторге и коллективно чувствовали, что если бы у нас была еще пара дней испытаний с автомобилем, у нас был бы успешный подход. Было несколько команд, которые смогли пройти автономный круг на треке, но они в основном полагались на отслеживание путевой точки GPS.
Могу с уверенностью сказать, что я никогда не был в команде, которая работала бы так усердно и так же вместе, как мы за четыре дня, которые мы провели вместе.
Результат
Учитывая наше ограниченное время и врожденные ограничения по проекту, мы очень довольны тем, что смогли сделать! Мы хотели бы показать самое быстрое время на полностью автономном круге, но выполнение всего, что мы делали, дало нам огромное чувство выполненного долга! Нам было очень весело погрузиться в настоящую проблему с беспилотным автомобилем и поработать друг с другом. Мы все чувствуем, что находимся на пороге разработки работающей системы и не можем дождаться продолжения. Мы будем открывать исходный код для большей части собранных данных, моделей, которые мы создали, и симулятора, который мы модифицировали. Подобный опыт не может быть только раз в жизни, он был слишком захватывающим, и теперь мы все стали намного более близкими друзьями. Это не будет последним, что вы слышите о Team Soulless, так что будьте на связи и следите за обновлениями!
Команда
Руководитель группы: Энтони Наварро
Члены команды: Влад Бурка, Дин Лю, Крис Гандлинг, Маруф Манируззаман, Джон Чен, Чандра Сурешкумар, Надя Юдина, Киари Ндегва, Кристи Куи, Харинандо Андрианариманана, Джейкоб Талман, Джендрик Йорденинг, Кароль Маек, Рана Халил, Клаудио Сальваторе Де Мутиис, Джеррик Хоанг, Нахид Алам
Команда PolySync: Джош Хартунг, Лайл Джонсон, Лукас Бакленд, Даниэль Фернандес, Дэвид Соснов

Благодарности
Мы хотели бы поблагодарить Udacity и, в частности, Оливера Кэмерона и Лисбет Ортегу за то, что они собрали эту команду и поддержали нас на этом пути. Мы также получили помощь с симулятором от Аарона Брауна и Тона Крамера, спасибо, ребята!
Мы не можем достаточно отблагодарить Джоша Хартунга и замечательную команду PolySync за поддержку и поддержку наших усилий, когда мы толкали их Kia Soul и (почти) сошли с трассы!
Напоследок хотим сказать огромное спасибо организатору мероприятия Joshua Schachter! Джошуа был очень добр к нашей команде на мероприятии, и мы с нетерпением ждем возвращения на это невероятное мероприятие в следующем году.