Настройка Ceres bundle, DENSE_NORMAL_CHOLESKY быстрее, чем SCHUR, но не должно быть? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть простая проблема с настройкой Связки, с двумя камерами и 230 точками, которые я пытаюсь решить с помощью Ceres. Моя цель - получить максимально быстрое решение, которое я могу, но результаты, которые я вижу, противоречат документации о проблемах настройки комплекта.

Как указано здесь :

one way to solve this problem is to set Solver::Options::linear_solver_type to SPARSE_NORMAL_CHOLESKY and call Solve(). And while this is a reasonable thing to do, bundle adjustment problems have a special sparsity structure that can be exploited to solve them much more efficiently. Ceres provides three specialized solvers (collectively known as Schur-based solvers) for this task.

Однако, когда я использую DENSE_NORMAL_CHOLESKY, используя настройки решателя:

options.sparse_linear_algebra_library_type = SUITE_SPARSE;
options.linear_solver_type = ceres::DENSE_NORMAL_CHOLESKY;
options.minimizer_progress_to_stdout = false;
options.logging_type = ceres::SILENT;
options.max_num_iterations = 20;

Это дает мне:

Time (in seconds):
Preprocessor                         0.006372

Residual only evaluation           0.000359 (12)
Jacobian & residual evaluation     0.003254 (12)
Linear solver                      0.001549 (12)
Minimizer                            0.008216

Postprocessor                        0.000008
Total                                0.014596

Однако, когда я переключаюсь на решатели SCHUR, как показано ниже:

options.use_explicit_schur_complement = true;
options.sparse_linear_algebra_library_type = SUITE_SPARSE;
options.linear_solver_type = ceres::ITERATIVE_SCHUR; 
options.minimizer_progress_to_stdout = false;
options.logging_type = ceres::SILENT;
options.max_num_iterations = 20;
options.preconditioner_type = SCHUR_JACOBI;

Работает медленнее, с:

Time (in seconds):
Preprocessor                         0.007213

  Residual only evaluation           0.000306 (10)
  Jacobian & residual evaluation     0.002611 (10)
  Linear solver                      0.007781 (10)
Minimizer                            0.013027

Postprocessor                        0.000009
Total                                0.020249

Что я могу сделать, чтобы получить более быстрый результат? Я попытался упорядочить, каждый вид linear_solver_type и различные предварительные условия. Настройка options.num_threads = 8; также не имеет никакого значения. Я что-то упустил?

1 Ответ

0 голосов
/ 29 января 2019

Используйте аналитические производные. Большая часть вашего времени проводится там.

...