Обеспечение ICP, внутренние метрики

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

Вот краткий урок по картинкам.

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

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

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

Теперь эта часть проста и работает, и мне нужна помощь: Как мне определить, хороша ли моя поза?

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

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

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

Рисунок 5

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

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

Рисунок 6

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

2/11 < SOME_THRESHOLD

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

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

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

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

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

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


person Fantastic Mr Fox    schedule 28.11.2012    source источник
comment
Как определяется поза? Сегменты линий?   -  person FoolishSeth    schedule 30.11.2012
comment
Как однородная матрица преобразования.   -  person Fantastic Mr Fox    schedule 30.11.2012
comment
Из любопытства, вы нашли решение? Использовали ли вы что-то из предложенного в ответах или придумали что-то свое?   -  person Andrei    schedule 05.12.2012
comment
Нет, мы придумали некоторые другие вещи, но они не очень работают. Я надеялся получить еще несколько ответов.   -  person Fantastic Mr Fox    schedule 06.12.2012
comment
Просто из интереса, вы говорите, что хотите убедиться, что ваше решение ICP является наиболее оптимальным решением в глобальном масштабе? Таким образом, вы пытаетесь избежать локальных минимумов, которые обычно возникают при выполнении ICP?   -  person BeRecursive    schedule 21.01.2013
comment
@BeRecursive Да, это было бы неплохо.   -  person Fantastic Mr Fox    schedule 05.03.2013


Ответы (3)


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

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

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, также полученное в результате экспериментов.

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

person Andrei    schedule 30.11.2012
comment
Я действительно не читал это должным образом до сих пор. Что касается второго предложения, вам нужна реальная поза для сравнения. У нас нет фактической позы, так что это не сработает. - person Fantastic Mr Fox; 06.12.2012

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

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

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

Обновить

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

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

person FoolishSeth    schedule 30.11.2012
comment
К сожалению, основывать свою уверенность в правильности позы на значении, которое вы пытаетесь свести к минимуму, не очень хорошая идея. Каждый раз, когда поза попадает в локальный минимум, она показывает хорошую позу. На самом деле он всегда будет показывать хорошую позу, если ICP работает правильно, что не очень хорошо. Хороший ответ, хотя. - person Fantastic Mr Fox; 30.11.2012
comment
Это не совсем имеет смысл. Конечно, алгоритм может достигать локальных минимумов, но значение, которое он пытается минимизировать, все равно не будет таким маленьким, как если бы он нашел глобальный оптимум. - person FoolishSeth; 30.11.2012
comment
В обычном случае ICP да, но с пороговым удалением точек вы обнаружите, что он часто похож или меньше, чем глобальные минимумы. Вы также должны помнить, что точки модели также не совсем совпадают с точками данных. Мы попробовали этот метод и обнаружили, что он не очень хорош для нашей цели. - person Fantastic Mr Fox; 30.11.2012
comment
Итак, фактический алгоритм выполняет шаг минимизации, а затем этап удаления порога? - person FoolishSeth; 30.11.2012
comment
Нет, он выполняет сопоставление точек, чтобы найти расстояние до ближайшей точки на модели, затем он решит не использовать эту точку, если она недостаточно близка (т.е. является выбросом). - person Fantastic Mr Fox; 30.11.2012

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

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

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

person JasonD    schedule 06.12.2012
comment
Хорошее предложение, есть ли у вас какие-либо документы или ссылки, где это делается. Также меня беспокоит вычислительная интенсивность, как вы думаете, это будет очень интенсивно? Как вы проверяете покрытие формы, когда модель сложнее треугольника, скажем, грузовика или самолета? - person Fantastic Mr Fox; 07.12.2012
comment
В значительной степени придумываю это по мере продвижения, хотя в материалах Siggraph может быть что-то, но это похоже на знакомую проблему. Во всяком случае, я думаю, что, возможно, построение грубого октодерева будет довольно дешевым, и вы могли бы использовать количество листовых узлов, содержащих совпадающие точки, как показатель покрытия. - person JasonD; 07.12.2012