Создание семантических облаков точек для конкурса Kaggle Lyft 3D Object Detection for Autonomous Vehicles

Вступление

В этом посте подробно описан подход, который мы с Стефано Джомо использовали для наших записей в недавнем конкурсе по обнаружению 3D-объектов Kaggle Lyft для автономных транспортных средств (https://www.kaggle.com/c/3d-object -обнаружение автономных транспортных средств ).

В этом соревновании использовались данные, полученные автомобилями Lyft, оснащенными несколькими камерами и датчиками LIDAR. Автомобили запечатлели сотни 20-секундных сцен на дорогах Пало-Альто. Целью конкурса было разместить трехмерные ограничивающие объемы вокруг различных классов объектов из этих сцен.

Мы обучили модель UNet на двумерном представлении данных с высоты птичьего полета. 2D-представление было создано с помощью ряда этапов предварительной обработки, которые объединили каждое облако точек LIDAR с семантической информацией, полученной с камер, а также с карты улиц Пало-Альто.

Чтобы преобразовать 2D-прогнозы из модели в 3D-ограничивающие объемы, мы выполнили ряд шагов постобработки с использованием методов компьютерного зрения и построения карты местности с использованием облаков точек LIDAR.

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

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

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

Наборы данных

Данные для конкурса взяты из набора данных Lyft уровня 5 (https://level5.lyft.com/), который соответствует формату данных nuScenes (https://www.nuscenes.org/). Метаданные для каждой из сущностей в схеме данных представлены с помощью JSON.

Lyft создал SDK для облегчения работы со структурами данных: он позволяет пользователю перемещаться по сценам, манипулировать блоками, визуализировать данные датчиков и так далее. Репозиторий SDK находится здесь (https://github.com/lyft/nuscenes-devkit) и может быть установлен как пакет pip.

Сцены, образцы и датчики

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

Обучающая выборка имела аннотации, состоящие из ограничивающих объемов вокруг всех интересующих объектов в каждой выборке. Интересующие объекты попали в девять классов. Как видно на гистограмме, классы были довольно несбалансированными (обратите внимание на шкалу журнала). Было более полумиллиона автомобилей и менее 200 машин экстренной помощи.

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

Также была предоставлена ​​карта, полученная из OpenStreetMap (https://www.openstreetmap.org/), охватывающая регион, включающий все сцены в данных.

Наборы данных для обучения и тестирования

Наборы данных для обучения и тестирования вместе содержали более 350 000 изображений и около 60 000 облаков точек. В общей сложности наборы данных занимали 120 гигабайт дискового пространства!

Задача и критерий оценки

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

Прогнозы оценивались с использованием показателя Средняя точность. Средняя точность прогнозов была рассчитана для диапазона пороговых значений пересечения по объединению (IOU), а показатель рассчитан как M ean из этих средней точности.

Расчет средней точности работает следующим образом. При заданном пороге долгового обязательства, равном 0,6, например, все тома, которые перекрывали наземные тома не менее чем на 60%, считались совпадениями, в то время как другие считались ложноположительными. Затем была рассчитана Средняя точность для этого порога как количество совпадений, деленное на количество прогнозируемых объемов. Пороги 0,5, 0,55,…, 0,9, 0,95 использовались для расчета среднего средней точности.

Сегментация изображений камеры

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

Мы использовали предварительно обученную сеть PyTorch, опубликованную лабораторией информатики и искусственного интеллекта Массачусетского технологического института (https://github.com/CSAILVision/semantic-segmentation-pytorch). Модель была обучена на наборе данных анализа сцены ADE20K (http://groups.csail.mit.edu/vision/datasets/ADE20K/), который содержит большое количество сцен, включая сцены дорог общего пользования в США вдоль с сегментацией на основе правды для 150 классов объектов.

Мы выполнили логический вывод для каждого изображения в тестовой и обучающей выборках, сохранив результат в виде изображений в формате GIF, чтобы сэкономить место на диске. Из 150 классов мы выбрали подмножество из 24 классов в зависимости от их частоты и значимости для соревнований. Например, мы исключили классы для предметов домашнего обихода, таких как диваны и кровати. Мы выбрали 24 класса, чтобы уменьшить размер встраивания, необходимый для представления категориальной информации.

Проецирование классов в облака точек

Lyft SDK предоставляет функциональные возможности для визуализации облака точек на изображении камеры. Мы вдохновились этим кодом, чтобы выполнить обратную операцию: сопоставить изображение и семантические данные с точками в облаке точек.

На рисунке показано, как мы проецировали изображение с камеры и семантическую карту на соответствующие точки в облаке точек. Например, P была точкой на облаке точек LIDAR. Мы спроецировали P на изображение камеры вдоль линии, соединяющей P с датчиком LIDAR, найдя двухмерную точку Q. Мы использовали Q для выборки маски семантической сегментации и нахождения семантического класса для точки P.

Объединение семантических данных и данных камеры с нескольких датчиков

Мы спроецировали классы сегментации и данные изображения камеры для каждого изображения в каждом образце. Объединив все проекции, мы получили семантическое облако точек, где каждая точка имеет ассоциированную метку семантического класса.

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

Визуализация выше показывает все семантическое облако точек, выраженное в сферических координатах, где ось x - азимут, а ось y - высота луча, соединяющего точку с датчиком LIDAR.

Модель Birds Eye View

Мы рассмотрели различные возможные сетевые архитектуры, в том числе архитектуры с трехмерными свертками и сети предложений регионов. Эти модели были сложными и требовали больших вычислительных затрат, и, чтобы гарантировать своевременную отправку заявок, мы приняли прагматичное решение и решили использовать эталонную модель, предоставленную командой Lyft, в качестве отправной точки (https://github.com/lyft/nuscenes -devkit / blob / master / notebooks / Ссылка% 20Model.ipynb .

Эталонная модель была основана на виде сверху вниз (или с высоты птичьего полета) облака точек LIDAR. Идея заключалась в том, чтобы вокселизировать облако точек, разделив измерение Z на три области, получив трехканальное 2D-представление. Нормализованное количество точек в каждом вокселе затем использовалось в качестве интенсивности пикселя, причем первый канал был назначен для самой низкой Z-области, а третий канал - для самой высокой Z-области. Обзор с высоты птичьего полета можно рассматривать как изображение в формате RGB.

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

Улучшение модели Birds Eye View

Вдохновленные статьей PointPillars (https://arxiv.org/abs/1812.05784), мы расширили эту эталонную модель, используя несколько каналов для передачи в модель дополнительной информации.

В частности, мы добавили информацию из карты улиц и из нашего семантического облака точек. Для включения семантической информации мы использовали 5-мерное встраивание в стиле статьи Entity Embedding из конкурса Rossmann Store Sales Kaggle (https://arxiv.org/pdf/1604.06737.pdf).

Мы модифицировали реализацию PyTorch UNet, используемую в эталонной модели, и обучили ее с помощью библиотеки fastai Джереми Ховарда.

Постобработка

Создание 2D-прямоугольников

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

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

Высота и возвышение

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

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

Создание карты высот местности

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

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

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

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

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

Заключение

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

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

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

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

Спасибо Стефано Джомо за прекрасные рисунки! И спасибо за чтение!

Если вы хотите посмотреть больше интересных видеороликов, которые мы создали на основе набора данных и наших масок семантической сегментации, вот плейлист на YouTube: