Различные результаты для фундаментальной матрицы в Matlab

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

[fMatrix, epipolarInliers, status] = estimateFundamentalMatrix(...
  matchedPoints1, matchedPoints2, 'Method', 'RANSAC', ...
  'NumTrials', 10000, 'DistanceThreshold', 0.1, 'Confidence', 99.99);

inlierPoints1 = matchedPoints1(epipolarInliers, :);
inlierPoints2 = matchedPoints2(epipolarInliers, :);

figure; showMatchedFeatures(I1, I2, inlierPoints1, inlierPoints2);
legend('Inlier points in I1', 'Inlier points in I2');

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

Inliner Points

ОБНОВЛЕНИЕ: я думал, что различия были вызваны методом RANSAC, но, используя LMedS, MSAC, я все еще получаю разные результаты на одних и тех же данных.


person Martin Ch    schedule 04.02.2014    source источник


Ответы (3)


РЕДАКТИРОВАТЬ: по общему признанию, это только частичный ответ, поскольку я только объясняю, почему это вообще возможно с этими методами подбора, а не как улучшить входные ключевые точки, чтобы избежать этой проблемы с самого начала. Существуют проблемы с распределением совпадений ваших ключевых точек, как указано в других ответах, и есть способы решить эту проблему на этапе обнаружения ключевых точек. Но причина, по которой один и тот же ввод может давать разные результаты при повторном выполнении estimateFundamentalMatrix с одними и теми же парами ключевых точек, заключается в следующем. (Опять же, это не дает разумного совета по улучшению ключевых точек, чтобы решить эту проблему).

Причина разных результатов при повторных запусках в связана с методом RANSAC (а также с LMedS и MSAC). Все они используют стохастическую (случайную) выборку и поэтому не являются детерминированными. Все методы, кроме Norm8Point, работают путем случайной выборки 8 пар точек за раз для (до) NumTrials.

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

Обратите внимание на документацию для параметра 'NumTrials' (ДОПОЛНИТЕЛЬНОЕ ПРИМЕЧАНИЕ: изменение этого параметра — не решение, но это объясняет поведение):

'NumTrials' — Количество случайных попыток найти выбросы 500 (по умолчанию) | целое число

Количество случайных испытаний для нахождения выбросов в виде разделенной запятой пары, состоящей из 'NumTrials' и целочисленного значения. Этот параметр применяется, если для параметра Метод задано значение LMedS, RANSAC, MSAC или LTS.

MSAC (Консенсус M-оценки SAmple) представляет собой модифицированный RANSAC (Консенсус RANdom SAmple). Детерминированные алгоритмы для LMedS имеют экспоненциальную сложность, поэтому практически требуется стохастическая выборка.

Прежде чем вы решите использовать Norm8Point (опять же, это не решение), имейте в виду, что этот метод НЕ предполагает выбросов и, следовательно, не устойчив к ошибочным совпадениям. Попробуйте использовать больше испытаний, чтобы стабилизировать другие методы (РЕДАКТИРОВАТЬ: я имею в виду, вместо того, чтобы переключаться на Norm8Point, но если вы можете сделать резервную копию в своих алгоритмах, тогда обратитесь к входным данным - ключевым точкам - в качестве первой линии атаки) . Кроме того, чтобы сбросить генератор случайных чисел, вы можете делать rng('default') перед каждым вызовом estimateFundamentalMatrix. Но опять же, обратите внимание, что, хотя это будет заставлять один и тот же ответ при каждом запуске, улучшение распределения ключевых точек в целом является лучшим решением.

person chappjc    schedule 04.02.2014
comment
так есть ли способ сделать его детерминированным? - person Martin Ch; 05.02.2014
comment
Используйте метод Norm8Point, если у вас есть вычислительная мощность для использования всех точек вместо случайной выборки 8 пар точек за раз. Однако этот метод не предполагает НИКАКИХ выбросов и, таким образом, не устойчив к ошибочным совпадениям! Возможно, если вы будете использовать больше испытаний, другие методы стабилизируются? - person chappjc; 05.02.2014
comment
Есть один глупый способ, особенно в C++, но вам нужно изменить исходный код. Генератор псевдослучайных чисел всегда дает одну и ту же серию с одним и тем же начальным числом. Таким образом, вы инициализируете генератор случайных чисел не случайным, а одним предопределенным числом. - person old-ufo; 05.02.2014
comment
@old-ufo Хороший вопрос. Если генератор является общесистемным генератором, вы можете выполнять rnd('default') перед каждым запуском. - person chappjc; 05.02.2014
comment
Да, я могу модифицировать генератор случайных чисел в Matlab (установить собственное начальное число), но как мне узнать, какой из случайных чисел подходит для получения наилучшего результата? - person Martin Ch; 05.02.2014
comment
@MartinCh По умолчанию используется Mersenne Twister с начальным числом 0, что вполне нормально. Не пытайтесь получить лучшие результаты, заменив генератор, а увеличив 'NumTrials'. Чтобы сбросить генератор, просто делайте rnd('default') перед каждым вызовом estimateFundamentalMatrix. Функция estimateFundamentalMatrix>generateRandomIndices использует общесистемный генератор, так что это должно работать. - person chappjc; 05.02.2014
comment
@chappjc Спасибо;) Я полагаю, вы имели в виду rng вместо rnd, потому что в Matlab нет функции rnd - person Martin Ch; 05.02.2014

Я знаю, что уже слишком поздно для вашего ответа, но я думаю, что это будет полезно для кого-то в будущем. На самом деле, проблема в вашем случае двояка,

  • Вырожденное расположение элементов, т. Е. Расположение элементов в основном локализовано (на вас: P) и не очень хорошо распределено по всему изображению.

  • Эти матчи вроде как в одной плоскости. Я знаю, вы бы возразили, что ваше тело не плоское, но если сравнить его с глубиной комнаты, то оно как бы плоское.

Математически это означает, что вы как бы извлекаете E (или F) из плоской поверхности, которая всегда имеет бесконечные решения. Чтобы разобраться в этом, я бы предложил использовать некоторое ограничение на расстояние между любыми двумя извлеченными функциями SURF, т. е. любые две функции SURF, используемые для сопоставления, должны находиться на расстоянии не менее 40 или 100 пикселей (в зависимости от разрешения вашего изображения).

person Vishu    schedule 14.09.2014
comment
@jhegedus Какое отношение это имеет к недетерминированному ответу? Один и тот же вход не дает того же результата из-за случайной выборки. Нестабильный результат - это другая проблема, и в этом смысле этот ответ полезен, но он не изменит того факта, что вы все равно можете получить разные совпадения ключевых точек. ОП об этом не знал. Пожалуйста, прокомментируйте, почему мой ответ неверен. Вопрос был не в том, как получить максимальную отдачу от сопоставления ключевых точек, а в том, почему я каждый раз получаю разные результаты для одних и тех же данных. - person chappjc; 14.03.2015
comment
Да, наличие нескольких правильных ответов — это то, что позволяет методу надежной подгонки сходиться к различным решениям, но причина, по которой это может произойти даже при повторных запусках с одними и теми же входными данными, заключается в случайной выборке. Совет в ответ полезен, чтобы понять, почему именно эта проблема нестабильна, и я с ним полностью согласен. ОП нужно было понять обе проблемы, но он хотел знать, почему estimateFundamentalMatrix недетерминирован. - person chappjc; 14.03.2015
comment
Что ж, очевидно, что есть различия из-за случайности RANSAC. Что не очевидно, так это то, почему и когда эти различия значительны. Как говорит ОП, я думал, что дифференциалы. были вызваны RANSAC, потому что он знает, что RANSAC является случайным. Его знает каждый, кто знает, что означает эта аббревиатура. Таким образом, вопрос заключается не в том, чтобы объяснить, что RANSAC является случайным, а в том, чтобы объяснить, почему различия значительны. Действительно, очень сложный вопрос! - person jhegedus; 15.03.2015
comment
@chappjc Я хотел, чтобы Мартин понял причину этой проблемы, и изменение только параметра «numTrials» не повлияет на ответ, если используется какой-либо адаптивный метод немаксимального подавления. Другие предложенные ответы пренебрегли этим очень важным соображением, и поэтому я подумал о том, чтобы довести его до сведения будущих читателей. - person Vishu; 15.03.2015
comment
@jhegedus ОП явно не знал, что LMedS и MSAC тоже работают таким образом, если вы читаете остальную часть этой цитаты. Для протокола: я действительно думаю, что этот ответ лучше моего с точки зрения общего понимания, но я не думаю, что ввел в заблуждение настолько, чтобы оправдать отрицательный голос... Вот и все. - person chappjc; 15.03.2015
comment
@Vishu Я думаю, что твой ответ превосходен. Возможно, я немного ввел в заблуждение относительно количества испытаний, но обратите внимание, что я в первую очередь назвал эту часть документов, чтобы ОП увидел, что все эти методы являются стохастическими. Я намеренно не стал вникать в то, как решить проблему перед фитингом, поскольку мне казалось, что вопрос заключается в том, почему при одних и тех же входных данных возможны разные выходы. Эта область исследования, очевидно, намного шире. - person chappjc; 15.03.2015
comment
@jhegedus Я не думаю, что ОП вообще знал, что может быть разница, не просто существенная, а любая разница. Ни о каких различиях речи не шло. Он просто сказал, что есть разница. Таким образом, это выглядело как своего рода пустяковый вопрос (например, как это возможно?), а не запрос общего руководства по улучшению стабильности компьютерной гомографии. Для меня более очевидно, что улучшение входных данных (ключевой точки) является предпочтительным способом решения проблемы, если проблема действительно существует, но опять же, нет никаких указаний на крайне неправильный ответ. - person chappjc; 15.03.2015
comment
Понятно, правда, @chappjc, согласен, я немного, пожалуй, поторопился с реакцией, извините за волнение. - person jhegedus; 16.03.2015

Еще один способ улучшить функции SURF — установить для «NumOctaves» в detectSURFFeatures(rgb2gray(I1),'NumOctaves',5); большие значения.

Я столкнулся с той же проблемой, и это помогло (немного).

person jhegedus    schedule 14.03.2015
comment
Хороший совет, но я хотел бы отметить, что независимо от того, как сильно вы настраиваете детектор и экстрактор признаков, в конечном итоге неправильная сцена (возможно, невозможная) в видеопотоке может появиться и создать проблемы. В этом случае все еще может быть желательно обеспечить воспроизводимые результаты ... проблема для любого метода, использующего случайную выборку :) и как я интерпретировал вопрос. +1 тем не менее. Я надеюсь, что мой первоначальный ответ не был слишком вводящим в заблуждение. Ваше здоровье. - person chappjc; 16.03.2015