Усреднение функций SIFT для оценки позы

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

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

Итак, мой вопрос: какой дескриптор мне связать с 3D-точкой, чтобы получить наилучшие результаты?

Пока я придумал несколько возможных решений...

  1. Усредните все дескрипторы, связанные с 3D-точкой (взятые из конвейера SfM), и используйте этот «дескриптор среднего» для сопоставления в PnP. Этот подход кажется мне немного надуманным — я недостаточно знаю дескрипторы функций (в частности, SIFT), чтобы комментировать достоинства и недостатки этого подхода.
  2. «Прикрепите» все дескрипторы, вычисленные во время конвейера SfM, к соответствующей им трехмерной точке. Во время PnP у вас, по сути, будут дубликаты точек для сопоставления (по одному дубликату для каждого дескриптора). Это явно интенсив.
  3. Найдите «центральную» точку зрения, в которой появляется функция (из конвейера SfM), и используйте дескриптор из этого представления для сопоставления PnP. Поэтому, если объект появляется на изображениях, сделанных при -30, 10 и 40 градусах (от нормали к поверхности), используйте дескриптор из изображения 10 градусов. Мне это кажется наиболее перспективным решением.

Есть ли стандартный способ сделать это? Мне не удалось найти какие-либо исследования или советы в Интернете по этому вопросу, поэтому мне действительно просто любопытно, есть ли лучшее решение или зависит ли оно от объекта/ситуации.




Ответы (1)


Дескрипторы, которые используются для сопоставления в большинстве систем SLAM или SFM, инвариантны к вращению и масштабу (и в некоторой степени устойчивы к изменениям интенсивности). Именно поэтому мы можем сопоставить их с разных точек зрения. Таким образом, в целом не имеет особого смысла пытаться использовать их все, усреднять их или использовать те, которые взяты из определенного изображения. Если сопоставление в вашей SFM было сделано правильно, дескрипторы перепроекции 3d точки из вашего облака точек в любом из ее наблюдений должны быть очень близки, поэтому вы можете использовать любой из них 1.

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

Теперь способ реализации этого обычно зависит от вашего приложения (насколько у вас есть ковидимость или базовая линия между позами из вашего SFM и т. д.). В качестве примера, давайте отметим ваше изображение-кандидат I_0 и давайте отметим изображения из вашего SFM I_1, ..., I_n. Во-первых, сопоставьте между I_0 и I_1. Теперь предположим, что q_0 — это точка 2d из I_0, которая успешно сопоставлена ​​с q_1 из I_1, что соответствует некоторой точке 3d Q. Теперь, чтобы обеспечить согласованность, рассмотрим перепроецирование Q в I_2 и назовем его q_2. Сопоставьте I_0 и I_2. Точка, которой соответствует q_0 в I_2 близка к q_2? Если да, сохраните совпадение 2d/3d между q_0 и Q и так далее.

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

Редактировать: Спасибо за разъяснения в комментариях. Вот несколько мыслей (поправьте меня):

  1. Давайте рассмотрим дескриптор SIFT s_0 из I_0 и отметим F(s_1,...,s_n) ваш агрегированный дескриптор (это может быть среднее значение или объединение дескрипторов SIFT s_i в соответствующих им I_i и т. д.). Затем при сопоставлении s_0 с F вы захотите использовать только подмножество s_i, принадлежащее изображениям, точка зрения которых близка к I_0 (из-за упомянутой вами проблемы 30deg, хотя я думаю, что это должно быть 50deg). Это означает, что вы должны присвоить вес каждому s_i, который зависит от позы вашего запроса I_0. Вы, очевидно, не можете сделать это при построении F, поэтому вы должны сделать это при сопоставлении. Тем не менее, у вас нет сильного априора позы (иначе, я полагаю, вам не понадобился бы PnP). В результате вы не можете точно определить этот вес. Поэтому я думаю, что здесь есть два вывода/варианта:

    • Дескрипторы SIFT не приспособлены к задаче. Вы можете попробовать придумать перспективно-инвариантный дескриптор. Есть литература на эту тему.

    • Старайтесь сохранять некоторую визуальную информацию в виде «Ключевых кадров», как во многих системах SLAM. В любом случае не имеет смысла сохранять все ваши изображения, просто сохраните несколько, которые хорошо распределены (по позе) в каждой области, и используйте их для распространения 2D-соответствий на 3D-кейс.

  2. Если вы сопоставляете только точку 2d вашего запроса и дескрипторы 3d без какой-либо формы проверки согласованности (как я предложил ранее), вы внесете много шума...

tl;dr Я бы сохранил несколько изображений.


1 Поскольку вы говорите, что получаете свою 3D-реконструкцию из конвейера SFM, некоторые из них, вероятно, считаются выбросами, а некоторые — выбросами (обозначены логическим флагом). Если они являются выбросами, просто игнорируйте их, если они являются выбросами, то они являются результатом сопоставления и триангуляции, и их положение уточнялось несколько раз, поэтому вы можете доверять любому из их дескрипторов.

person Ash    schedule 27.05.2018
comment
Благодарим вас за вклад. Мое приложение работает в режиме реального времени, но в некоторой степени ограничено памятью, поэтому о сохранении изображений из SfM или, по крайней мере, обнаруженных в нем функций для этапа оценки позы не может быть и речи. Однако я думаю, что должен быть способ сохранить любую пространственную информацию, которая была бы сохранена при таком подходе, путем связывания 3D-точек с набором поз камеры, в которых они появляются, и использования этого для сужения области поиска. - person John B; 28.05.2018
comment
После проверки функции, которые в моем случае являются SIFT, которые были сопоставлены и триангулированы в конвейере SfM, в некоторой степени различаются. Насколько я понимаю, эти типы функций точно совпадают только до 30 градусов от плоскости изображения, поэтому, если я хочу дать пользователю моего приложения наилучшие шансы обнаружить эту точку (если он > 30 градусов от плоскости), мне кажется, что я хотел бы включить несколько дескрипторов для этой точки, чтобы сделать ее обнаруживаемой из более широкого диапазона. - person John B; 28.05.2018
comment
@JohnBent Спасибо за ваш ответ! Я все еще очень скептически отношусь к этому подходу, я отредактировал ответы и добавил к ним некоторые из моих упрощенных размышлений, надеюсь, это поможет. - person Ash; 28.05.2018
comment
Я ценю ваши вдумчивые ответы! Мне нужно провести небольшой эксперимент с этим. Кажется, я знаю, как это должно работать в моей голове, но так получается редко :) Позже выложу результаты. - person John B; 28.05.2018
comment
@JohnBent Круто, было бы приятно увидеть! - person Ash; 28.05.2018