|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<html class="no-js" lang="en" >
|
|
Packit |
ea1746 |
<head>
|
|
Packit |
ea1746 |
<meta charset="utf-8">
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<title>Modeling Non-linear Least Squares — Ceres Solver</title>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<link rel="top" title="Ceres Solver" href="index.html"/>
|
|
Packit |
ea1746 |
<link rel="next" title="Solving Non-linear Least Squares" href="nnls_solving.html"/>
|
|
Packit |
ea1746 |
<link rel="prev" title="Interfacing with Automatic Differentiation" href="interfacing_with_autodiff.html"/>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<script src="_static/js/modernizr.min.js"></script>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
</head>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<body class="wy-body-for-nav" role="document">
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Ceres Solver
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
1.13
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
|
|
Packit |
ea1746 |
<input type="text" name="q" placeholder="Search docs" />
|
|
Packit |
ea1746 |
<input type="hidden" name="check_keywords" value="yes" />
|
|
Packit |
ea1746 |
<input type="hidden" name="area" value="default" />
|
|
Packit |
ea1746 |
</form>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Why?
|
|
Packit |
ea1746 |
Installation
|
|
Packit |
ea1746 |
Tutorial
|
|
Packit |
ea1746 |
On Derivatives
|
|
Packit |
ea1746 |
Modeling Non-linear Least Squares
|
|
Packit |
ea1746 |
Introduction
|
|
Packit |
ea1746 |
CostFunction
|
|
Packit |
ea1746 |
SizedCostFunction
|
|
Packit |
ea1746 |
AutoDiffCostFunction
|
|
Packit |
ea1746 |
DynamicAutoDiffCostFunction
|
|
Packit |
ea1746 |
NumericDiffCostFunction
|
|
Packit |
ea1746 |
Numeric Differentiation & LocalParameterization
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
DynamicNumericDiffCostFunction
|
|
Packit |
ea1746 |
CostFunctionToFunctor
|
|
Packit |
ea1746 |
DynamicCostFunctionToFunctor
|
|
Packit |
ea1746 |
ConditionedCostFunction
|
|
Packit |
ea1746 |
GradientChecker
|
|
Packit |
ea1746 |
NormalPrior
|
|
Packit |
ea1746 |
LossFunction
|
|
Packit |
ea1746 |
Instances
|
|
Packit |
ea1746 |
Theory
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
LocalParameterization
|
|
Packit |
ea1746 |
Instances
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
AutoDiffLocalParameterization
|
|
Packit |
ea1746 |
Problem
|
|
Packit |
ea1746 |
rotation.h
|
|
Packit |
ea1746 |
Cubic Interpolation
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Solving Non-linear Least Squares
|
|
Packit |
ea1746 |
Covariance Estimation
|
|
Packit |
ea1746 |
General Unconstrained Minimization
|
|
Packit |
ea1746 |
FAQS, Tips & Tricks
|
|
Packit |
ea1746 |
Users
|
|
Packit |
ea1746 |
Contributing
|
|
Packit |
ea1746 |
Version History
|
|
Packit |
ea1746 |
Bibliography
|
|
Packit |
ea1746 |
License
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
</nav>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Ceres Solver
|
|
Packit |
ea1746 |
</nav>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Docs »
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Modeling Non-linear Least Squares
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Modeling Non-linear Least Squares¶
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Introduction¶
|
|
Packit |
ea1746 |
Ceres solver consists of two distinct parts. A modeling API which
|
|
Packit |
ea1746 |
provides a rich set of tools to construct an optimization problem one
|
|
Packit |
ea1746 |
term at a time and a solver API that controls the minimization
|
|
Packit |
ea1746 |
algorithm. This chapter is devoted to the task of modeling
|
|
Packit |
ea1746 |
optimization problems using Ceres. Solving Non-linear Least Squares discusses
|
|
Packit |
ea1746 |
the various ways in which an optimization problem can be solved using
|
|
Packit |
ea1746 |
Ceres.
|
|
Packit |
ea1746 |
Ceres solves robustified bounds constrained non-linear least squares
|
|
Packit |
ea1746 |
problems of the form:
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
(1)\[\begin{split}\min_{\mathbf{x}} &\quad \frac{1}{2}\sum_{i}
|
|
Packit |
ea1746 |
\rho_i\left(\left\|f_i\left(x_{i_1},
|
|
Packit |
ea1746 |
... ,x_{i_k}\right)\right\|^2\right) \\
|
|
Packit |
ea1746 |
\text{s.t.} &\quad l_j \le x_j \le u_j\end{split}\]
|
|
Packit |
ea1746 |
In Ceres parlance, the expression
|
|
Packit |
ea1746 |
\(\rho_i\left(\left\|f_i\left(x_{i_1},...,x_{i_k}\right)\right\|^2\right)\)
|
|
Packit |
ea1746 |
is known as a residual block, where \(f_i(\cdot)\) is a
|
|
Packit |
ea1746 |
CostFunction that depends on the parameter blocks
|
|
Packit |
ea1746 |
\(\left\{x_{i_1},... , x_{i_k}\right\}\).
|
|
Packit |
ea1746 |
In most optimization problems small groups of scalars occur
|
|
Packit |
ea1746 |
together. For example the three components of a translation vector and
|
|
Packit |
ea1746 |
the four components of the quaternion that define the pose of a
|
|
Packit |
ea1746 |
camera. We refer to such a group of scalars as a parameter block. Of
|
|
Packit |
ea1746 |
course a parameter block can be just a single scalar too.
|
|
Packit |
ea1746 |
\(\rho_i\) is a LossFunction . A LossFunction is
|
|
Packit |
ea1746 |
a scalar valued function that is used to reduce the influence of
|
|
Packit |
ea1746 |
outliers on the solution of non-linear least squares problems.
|
|
Packit |
ea1746 |
\(l_j\) and \(u_j\) are lower and upper bounds on the
|
|
Packit |
ea1746 |
parameter block \(x_j\).
|
|
Packit |
ea1746 |
As a special case, when \(\rho_i(x) = x\), i.e., the identity
|
|
Packit |
ea1746 |
function, and \(l_j = -\infty\) and \(u_j = \infty\) we get
|
|
Packit |
ea1746 |
the more familiar unconstrained non-linear least squares problem.
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
(2)\[\frac{1}{2}\sum_{i} \left\|f_i\left(x_{i_1}, ... ,x_{i_k}\right)\right\|^2.\]
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
For each term in the objective function, a CostFunction is
|
|
Packit |
ea1746 |
responsible for computing a vector of residuals and if asked a vector
|
|
Packit |
ea1746 |
of Jacobian matrices, i.e., given \(\left[x_{i_1}, ... ,
|
|
Packit |
ea1746 |
x_{i_k}\right]\), compute the vector
|
|
Packit |
ea1746 |
\(f_i\left(x_{i_1},...,x_{i_k}\right)\) and the matrices
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
\[J_{ij} = \frac{\partial}{\partial
|
|
Packit |
ea1746 |
x_{i_j}}f_i\left(x_{i_1},...,x_{i_k}\right),\quad \forall j
|
|
Packit |
ea1746 |
\in \{1, \ldots, k\}\]
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
class
CostFunction ¶
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
public:
|
|
Packit |
ea1746 |
virtual bool Evaluate(double const* const* parameters,
|
|
Packit |
ea1746 |
double* residuals,
|
|
Packit |
ea1746 |
double** jacobians) = 0;
|
|
Packit |
ea1746 |
const vector<int32>& parameter_block_sizes();
|
|
Packit |
ea1746 |
int num_residuals() const;
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
protected:
|
|
Packit |
ea1746 |
vector<int32>* mutable_parameter_block_sizes();
|
|
Packit |
ea1746 |
void set_num_residuals(int num_residuals);
|
|
Packit |
ea1746 |
};
|