Способы сегментации точек в Point Clouds

Введение


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


Пример данных и решаемой задачи:
пример данных


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


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


Существующие датасеты


Сейчас в открытом доступе есть следующие датасеты по этой теме:



Особенности работы с Point Clouds


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


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


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


Наиболее важные статьи


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


  • PointNet
  • PointNet++
  • DGCNN

Рассмотрим их поподробнее.


  • PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
    Первопроходцы в работе с неструктурированными данными.
    • как решают: В статье описано две модели: для сегментации точек и классификации объекта. Общая часть состоит из следующих блоков:
      • сеть для определения преобразования (перевод системы координат), которое потом применится ко всем точкам
      • преобразование, применяемое к каждой точке по отдельности (обычный персепторн)
      • maxpooling, который объединяет информацию с разных точек и создает глобальный вектор признаков для всего объекта.
      • далее начинаются различия между моделями:
        1. модель для классификации: глобальный вектор признаков идет на вход полносвязному слою для определения класса всего облака точек
        2. модель для сегментации: глобальный вектор признаков и подсчитанные признаки для каждой точки идут на вход полносвязному слою, который определяет класс для каждой точки.
    • код

архитектура PointNet


  • PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space
    Те же ребята из Стенфорда, что описали PointNet.
    • как решают: рекурсивно применяют pointNet к более мелким подоблакам, по аналогии со сверточными сетями. То есть делят пространство кубы, к каждому применяют PointNet, потом из этих кубов составляются новые кубы. Это позволяет выделить локальные признаки, которые теряла предыдущая версия сети.
    • код

архитектура PointNet++


  • Dynamic Graph CNN for Learning on Point Clouds


    • как решают: на основе имеющихся точек строят граф: вершины — точки, ребра существуют только между текущей точкой и k ближайшими к ней точками. Далее определяют Edge conv — специальную свертку на ребрах исходящих из текущей точки. В статье предложено несколько вариантов этой свертки. В результате использовался следующий: для каждой точки x[i] по всем её J соседним точкам считали M признаков feature[i,m]=max_j(Relu(θ[m]∗(x[i]−x[j]) +φ[m]∗x[i])). Полученное значение запоминается, как новый эмбединг точки. Здесь используются локальные (x[j]−x[i]) и глобальные (x[j]) координаты как входные данные для свертки.
      После того, как определена свертка на графе, строится сверточная сеть. Можно заметить и подсчет преобразований и применения их к каждой точке по аналогии с PointNet.
      В этой статье вы найдете прекрасный обзор других методов решения.


    • код




архитектура DGCNN


Статьи на основе PointNet и PointNet++:


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


  • PointWise: An Unsupervised Point-wise Feature Learning Network
    Особенность работы — обучение без учителя


    • как решают: для каждой точки обучают вектор эмбедингов, по которому потом и сегментируют.
      Основной постулат статьи — похожие объекты должны иметь похожие эмбединги (например две разные ножки стула), несмотря на их удаленность. В качестве базовой модели используют PointNet. Основное новшество — функция ошибки. Она состоит из двух частей: ошибки реконструкции и ошибки гладкости.
      Ошибка реконструкции использует информацию о контексте точки. Её задача — сделать эмбединги точек с одинаковым геометрическим контекстом похожими. Для её подсчета на основе вектора эмбедингов для выбранной точки генерируются новые точки около нее. То есть признаковое описание точки должно содержать информацию об форме объекта вокруг точки. Дальше считают, насколько сгенерированные точки выпадают из реальной формы объекта.
      Ошибка гладкости нужна для того, чтобы эмбединги были похожими у лежащих рядом точек и непохожими у далеких точек. Тут самое прекрасное — измерение близости не просто как нормы между двумя точками в евклидовом пространстве, а подсчет расстояние через точки объекта. Для каждой точки выбирается одна точка из k ближайших и из k дальнейших.
      Текущий эмбединг должен быть ближе к ближайшей минимум на некий margin, чем до дальнейшей.

  • SGPN: Similarity Group Proposal Network for 3D Point Cloud Instance Segmentation


    • как решают: как и в PointWise тут самое интересное в подсчете ошибки. В качестве основы — PointNet++, вначале считаем вектор признаков и принадлежнсть объекту для каждой точки в отдельности по аналогии с PointNet++.
      Далее на основе признаков считаем 3 матрицы (похожести, уверенности и сегментации).
      Ошибка обучения будет суммой из трех ошибок, подсчитанных по соответствующим матрицам: L = L1 + L2 + L3
      Пусть N — количество точек
      Матрица похожести — квадратная, размером N*N. Элемент на пересечении iой строки и jго столбца говорит о том, принадлежат ли эти точки одному объекту или нет. Точки, принадлежащие одному объекту, должны иметь похожие вектора признаков. Элементы матрицы могут принимать одно из трех значений: точки i и j принадлежат одному объекту, точки принадлежат одному классу объектов, но разным объектам (и то, и то стул, но стулья разные), или это вообще точки из объектов разных классов. Эта матрица считается по истинным значениям.
      Ошибка похожести
      Матрица уверенности — это вектор длинны N. Для каждой точки считают пересечение деленное на объединение (intersection over union — IoU) между множеством точек, которые принадлежат объекту согласно работе нашего алгоритма, и множеством точек, которые в реальности принадлежат объекту с текущей точкой. Ошибка — просто L2 норма между правдой и подсчитанной матрицей. То есть сеть пытается предсказать, насколько она уверена в предсказание класса для точек объекта.
      Матрица сегментации имеет размер — N * количество классов. Ошибка здесь считается как кроссэнтропия в задаче многоклассовой классификации.
    • код


архитектура SGPN


  • Know What Your Neighbors Do:3D Semantic Segmentation of Point Clouds
    • как решают: Вначале долго считают признаки, сложнее чем в PointNet, с кучей residual связей, и сумм, но в общем и целом — то же самое. Небольшое отличие — они считают признаки для каждой точки в глобальных и локальных координатах.
      Основное отличие тут — это снова подсчет ошибки. Это не стандартная кроссэнтропия, а сумма двух ошибок:
      1. pairwise distance loss — точки из одного объекта должны быть ближе чем τ_near и точки из разных объектов должны быть дольше чем τ_far.
        pairwise distance loss
      2. centroid loss — точки из одного объекта должны быть близки друг к другу

статьи на основе DGCNN:


DGCNN была опубликована недавно (2018), поэтому основанных на этой архитектуре статей немного. Я хочу обратить ваше внимание на одну:



архитектура Linked DGCNN


Заключение


Здесь вы могли найти краткую информацию о современных методах решения задач классификации и сегментации в Point Clouds. Существуют две основных модели (PointNet++, DGCNN), модификации которых сейчас используют для решения этих задач. Чаще всего для модификации изменяют функцию ошибки и усложняют эти архитектуры, добавляя слои и связи.

  • +19
  • 2,5k
  • 6
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 6

    +1
    Одна сеть с двумя головами

    Вроде это два варианта головы. Одновременно они не используются
      0
      Вы правы, ошиблась. Спасибо, поправила! В приложении сказано, что у них даже число слоев отличается.
      0
      А есть ли запись процесса сегментирования на видео? Хотелось бы посмотреть.
      Особенно интересно, как это работает в режиме реального времени (с шагом в n итераций)
        0
        У меня нет записи результатов сегментирования на разных стадиях обучения. Но не уверена, что правильно поняла вопрос.
        0
        Спасибо за ваше исследование этой интересной темы. Не могли бы вы поделиться тем, какой подход для вашей задачи оказался наиболее релевантным и почему остальные оказались не так хороши?
          0
          В конечном итоге применяли не нейронные сети. Использовали кластеризацию из pcl. Мы анализировали схемы дорожного движения и у нас после предобработки объекты были вполне себе разделены (облака точек достаточно разрежены) и основная проблема оказалась — разделение одного объекта на два.

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

        Самое читаемое