Как обрабатывать отсутствующие данные в структуре из оптимизации движения/регулировки пакета
Вопрос
Я работаю над структурой из приложения движения и отслеживаю несколько маркеров, размещенных на объекте, чтобы определить жесткую структуру объекта.
Приложение, по сути, использует стандартную оптимизацию Левенберга-Маркварда в течение нескольких представлений камеры и сводит к минимуму различия между ожидаемыми точками маркера и точками маркеров, полученными в 2D из каждого представления.
Для каждой точки маркера и каждого представления Следующая функция сведена к минимуму:
double diff = calculatedXY[index] - observedXY[index]
Где значение рассчитываемого, зависит от ряда неизвестных параметров, которые необходимо найти с помощью оптимизации, а наблюдаемый - позиция точки маркера в 2D. В общей сложности у меня есть (маркерные точки * представления) количество функций, подобных вышеуказанным, которые я стремлюсь свести к минимуму.
Я закодировал симуляцию камеры, видя все точки маркера, но мне было интересно, как справиться с случаями, когда во время запуска точек не видно из -за освещения, окклюзии или просто не в виде камеры. В реальном запуске приложения я буду использовать веб -камеру для просмотра объекта, поэтому вполне вероятно, что не все маркеры будут видны одновременно и в зависимости от того, насколько надежным алгоритм моего компьютерного зрения, я не смогу обнаружить Маркер все время.
Я подумал о том, чтобы установить значение DIFF на 0 (Sigma Squared Wild = 0) в случае, когда маркерная точка не может быть замечена, может ли это исказить результаты, однако?
Еще одна вещь, которую я заметил, это то, что алгоритм не так хорош, когда представлен слишком много взглядов. Это, скорее всего, оценит плохое решение, когда будет представлено слишком много взглядов. Является ли это общей проблемой с корректировкой пакета из -за повышенной вероятности попадания в локальный минимум, когда представлено слишком много просмотров?
Решение
Обычной практикой является просто исключать термины, соответствующие отсутствующим маркерам. Т.е. Не пытайтесь минимизировать calculateXY-observedXY
если нет observedXY
срок. Нет необходимости устанавливать что -либо на ноль, вы даже не должны рассматривать этот термин в первую очередь - просто пропустите его (или, я думаю, в вашем коде эквивалентно установить ошибку на ноль).
Регулировка комплекта может ужасно выйти из строя, если вы просто бросите в него большое количество наблюдений. Сначала создайте свое решение постепенно, сначала решив с помощью нескольких просмотров, а затем продолжайте добавлять.
Вы можете попробовать какой -то «надежный» подход. Вместо использования наименьших квадратов используйте «функцию потери»1. Анкет Они позволяют вашей оптимизации выжить, даже если есть несколько неверных наблюдений. Вы все еще можете сделать это в рамке Левенберг-Маркварда, вам просто нужно включить производную функции потерь в якобиан.