Обеспечение ICP, внутренние показатели

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

Вот учебник по быстрой картине.

Шаг 1. Найдите ближайшую точку в наборе моделей к вашему набору данных:

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

! [Рисунок 2] [2]

Теперь, когда бит прост и работает, мне бы хотелось помочь: Как я могу сказать, хорошая ли позиция, которую у меня есть?

Итак, в настоящее время у меня есть две идеи, но они довольно хаки:

  • Сколько точек указано в алгоритме ICP. То есть, если я подхожу к почти никаким точкам, я полагаю, что поза будет плохой:

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

Figure 5

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

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

Figure 6

Теперь мы исключаем точки, которые находятся слишком далеко, потому что они будут выбросами, теперь это означает, что нам нужна хорошая стартовая позиция для работы ICP, но я в порядке с этим. Теперь в приведенном выше примере уверенность будет говорить "НЕТ", это плохая поза, и было бы правильно, потому что отношение точек к точкам включено:

2/11 < SOME_THRESHOLD

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

Вы не должны быть экспертом по ICP, чтобы ответить на этот вопрос, я ищу хорошие идеи. Используя знания о точках, как мы можем классифицировать, является ли это хорошим решением позы или нет?

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

Каковы некоторые хорошие идеи о том, как это сделать?

PS. Если вы хотите добавить какой-то код, пожалуйста, подойдите к нему. Я работаю в С++.

ПФС. Кто-то поможет мне с пометкой этого вопроса. Я не уверен, где он должен упасть.

Ответ 1

Одним из возможных подходов может быть сравнение позы по их формам и их ориентации.

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

d(I(actual_pose), calculated_pose) < d_threshold

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

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

{x_y min, x_y max, x_z min, x_z max, y_z min, y_z max}

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

Надеюсь, это имеет смысл, или, по крайней мере, вы можете извлечь из этого что-то полезное для своей цели.

Ответ 2

ICP пытается минимизировать расстояние между вашим облаком точек и моделью, да? Разве это не имело бы смысла оценивать его на основе того, что это действительно на самом деле после выполнения?

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

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

Обновление

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

Вы сказали, что объединение двух терминов показалось слабым решением, но это звучит для меня как точное описание того, что вы хотите, и оно отражает две основные особенности алгоритма (да?). Оценка с помощью чего-то вроде error + B * (selected / total) кажется духовно похожей на то, как регуляризация используется для решения проблемы переобучения с алгоритмами градиентного спуска (и аналогичных) ML. Выбор хорошего значения для B займет некоторое время.

Ответ 3

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

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

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