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

В этом сообщении блога я представляю архитектуру нейронной сети для преобразования этого типа ввода:

в этот тип вывода:

Небольшое примечание: боковые камеры на самом деле не охватывают весь угол 360 ° вокруг автомобиля, поэтому модели необходимо вывести недостающие области из тех, которые фактически предоставлены при вводе. Также: я получил семантическую сегментацию бесплатно из симулятора CARLA, это не результат какой-либо модели, это чистая правда.

Мотивация

Повторюсь: учитывая четыре боковые камеры со встроенной семантической сегментацией (мы обсудим это чуть позже), мы соберем вид сверху вниз с камеры над автомобилем. С этой точки зрения мы можем сразу увидеть окружение автомобиля, направление дороги и положение других транспортных средств на дороге. Вдохновением для этого проекта послужил конкурс CARLA Autonomous Driving (AD) Challenge, в котором одна из категорий основана на данных с четырех боковых камер.

Если вы не слышали о конкурсе CARLA Autonomous Driving (AD) Challenge, это нормально, это не является предварительным условием для этого сообщения в блоге, я все равно расскажу о важных частях здесь.

Задача CARLA AD Challenge - завершить заданный маршрут (см. Выше) с использованием различных типов входных данных, которые могут использоваться алгоритмом, управляющим автомобилем. Ниже приведены четыре категории, или: Дорожки, которые определяют доступный ввод:

Давайте посмотрим на описание дорожки 2:

Track 2 - RGB-камеры: для смелых команд машинного обучения, которые хотят исследовать вождение только с камерами.

Храбрый? ML? Ага, это мы;)

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

Настраивать

Итак, если в CARLA Challenge доступны камеры RGB без семантической сегментации, почему я использовал ее в своей модели? На то есть три причины:

  1. Было проще получить прямой ответ на фундаментальный вопрос: «можно ли это сделать?»
  2. Я подумал, что как только я узнаю ответ на поставленный выше вопрос, я смогу предложить достойную модель семантической сегментации, особенно для синтетических изображений, полученных из моделируемой среды.
  3. Кроме того, я подумал, что когда у меня будет нейронная сеть, способная отображать четыре камеры семантической сегментации в один вид сверху вниз в симуляторе, и что, если бы у меня были похожие боковые камеры, установленные на реальной машине, и предполагая, что У меня была бы достойная модель семантической сегментации изображений реального мира, я бы смог воссоздать этот семантический вид с высоты птичьего полета в реальном мире. Легко, правда? ;)

Хотя последняя причина, по общему признанию, несколько надуманная, на самом деле я лично считаю ее наиболее убедительной.

Архитектура

Моя первоначальная мысль заключалась в том, чтобы использовать полностью сверточный автоэнкодер для четырех входных изображений, каким-то умным образом объединить их узкие места и построить полностью сверточную сеть для сборки вида сверху вниз. Но если задуматься, полностью сверточные модели отображают заданную часть ввода на определенную часть вывода. Что-то вроде сопоставления «1-к-1». И для наших целей архитектура должна позволять любой части ввода влиять на любую часть вывода. Назовем это сопоставлением «любой-к-любому». (Ретроспективный комментарий см. В разделе РЕДАКТИРОВАТЬ ниже.)

Чтобы смоделировать это отображение «любой-к-любому», нам понадобится где-то в нашей архитектуре слой, обладающий этим волшебным свойством переноса информации от любого из входных нейронов к любому из выходных нейронов. Если бы существовал только такой слой ...

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

Я, вероятно, должен объяснить свою кажущуюся враждебность к плотному слою: количество параметров в моей окончательной модели составляет 8 234 179, из которых 7 150 080 относятся к плотным слоям! Таким образом, у меня есть подозрение, что есть более естественный подход. И во что бы то ни стало можно было использовать плотные слои, но более умным способом, чем я. Может быть, модуль факторизации - это то, что вам нужно? Может есть повторный подход? Я открыт для ваших мыслей и предложений в разделе комментариев.

Модель, которую я использовал для вывода, имеет следующее графическое представление:

Соответствующие части:

  • серый: четыре входа от камер FrontSS, LeftSS, RightSS, и RearSSSS ”, конечно же, означает" семантическая сегментация ");
  • оранжевый: encoder_submodel , который является полностью сверточным кодировщиком части автокодера (все входы используют одну и ту же модель кодировщика), подробнее об автокодировщике ниже;
  • желтый: стопка плотных слоев, за которой следует Conv2D, затем Concatenate, а затем Conv2D - одна стопка на один тип ввода;
  • оранжевый: decoder_submodel , который является частью полностью сверточного декодера того же автокодировщика, из которого мы извлекли encoder_submodel (опять же, есть один декодер для всех типов ввода);
  • васильковый: reconstruction - окончательный смысловой вид с высоты птичьего полета.

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

РЕДАКТИРОВАТЬ: как указал Бартош Топольски, можно использовать полностью сверточную архитектуру с этим свойством любой к любому. Вам просто нужно убедиться, что размер фильтра сверточного слоя после узкого места автоэнкодера достаточно велик (относительно размера узкого места). Я проверил, и он прав, это блокнот с моделью, в которой не используются плотные слои. Это решение не обладает некоторыми свойствами, присущими стандартной полностью сверточной модели. есть (нельзя ожидать, что ввод другой формы будет обработан правильно), но он доказывает, что текущая архитектура может быть улучшена. Для варианта с 3 классами (подробности ниже) моя модель имела потери ~ 0,062, а у Bartek - ~ 0,042 на тестовой выборке! А на 7-классном варианте у шахты было ~ 0,40, а у Бартека ~ 0,36.

Цель

Вид сверху вниз имеет ряд преимуществ:

  • он объединяет релевантную информацию из четырех изображений в одно;
  • он может служить строительным блоком для алгоритмов локализации / отображения;
  • его можно использовать для планирования пути (пример которого я представляю ниже);
  • он позволяет обучать агента обучения с подкреплением более высокого уровня, который выбирает оптимальный путь, а не атомарные действия (чуть более длинный комментарий через мгновение).

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

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

Обучение

Я обучил модель на данных, собранных в двух городах по умолчанию, доступных в CARLA (Town01 и Town02), 40 серий на город, каждая серия длиной 1000 кадров. Для проверки и тестирования я использовал отдельные серии, но из одних и тех же городов. Все результаты, показанные здесь, были получены на тестовых эпизодах.

Я собрал изображения с разрешением 300 × 200 (как и в CARLA AD Challenge), но поскольку обучение заняло много времени, я уничтожил их, выбрав все остальные строки / столбцы и затем обрезал их так, чтобы форма делилась на 8 (требование полностью сверточного автоэнкодера), так что окончательная форма была 144 × 96. В этой настройке обучение заняло ~ 16 часов на моем GTX 1080 Ti. Вывод на той же машине занимает 4,5 мс, однако обратите внимание, что при полной настройке (от RGB до семантического вида с высоты птичьего полета) нам также потребуется некоторое время для семантической сегментации входных изображений.

Семантический вид с высоты птичьего полета

Вот подборка входных боковых камер, достоверных данных и прогнозируемого вида сверху вниз (полные результаты можно найти здесь):

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

Вместо этого я решил потратить некоторое время на использование этого прогнозируемого вида сверху вниз для планирования пути.

Примерное планирование пути

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

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

Лучше понять, что я имею в виду:

Белые точки обозначают путевые точки процедуры планирования пути. Путь находится с использованием жадного алгоритма, который сканирует диапазон возможных путевых точек, берет сферу с центром в данной путевой точке и вычисляет среднюю дорогу для этой сферы. Затем выбирается путевая точка с самой высокой средней дорогой, и процедура повторяется. Для реализации см. Этот скрипт, функция называется find_waypoints.

Я должен подчеркнуть: эти точки были добавлены после процесса сбора данных, поэтому иногда путевые точки «не могут принять решение» и переходят от одного варианта к другому. Но если бы машина действительно пошла по тропе, таких случаев не было бы.

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

Обсуждение

Должен сказать, результаты для 7-классного варианта выглядят немного странно. Основная причина в том, что входные данные не содержат всей информации, необходимой для восстановления вида сверху вниз. Черт возьми, боковые камеры не обеспечивают полный обзор автомобиля на 360 °. Но также: некоторые классы встречаются редко и / или образуют тонкие формы, и я заметил, что эти типы фигур теряются в процессе кодирования. U-Net, например, лучше обрабатывает такие подробные формы, потому что использует пропускаемые соединения. Я не совсем знаю, как эти пропускаемые соединения впишутся в мою текущую модель, но, возможно, стоит изучить их.

Вариант с тремя классами менее шаткий отчасти потому, что расположение объектов более «выводимо» из ввода, а отчасти потому, что эти три класса, по общему признанию, легче предсказать. Под «выводимым» я подразумеваю: кроме транспортных средств, очень немногое может произойти в узких областях, не покрытых какой-либо из боковых камер, модель может легко догадаться об этом.

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

Дальнейшая работа

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

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

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

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

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

использованная литература

В этой работе авторы решают аналогичную задачу, но с использованием омографии:

[1] Дэн, Л., Ян, М., Ли, Х., Ли, Т., Ху, Б., и Ван, К. (2018). Семантическая сегментация дорожной сцены на основе ограниченной деформируемой свертки с использованием камер объемного обзора. препринт arXiv arXiv: 1801.00708

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