Ceres Solver: 高效的非线性优化库(一)

注:本文基于Ceres官方文档,大部分由英文翻译而来。可作为非官方参考文档。


简介

Ceres,原意是谷神星,是发现不久的一颗轨道在木星和火星之间“矮行星”(冥王星降级之后,同为矮行星)。Google开源了Ceres Solver库,是一个解很多非线性最优化问题的高效、方便的工具。


安装

引用地址:http://ceres-solver.org/installation.html

目前开源方未提供可安装文件。需要源码下载编译。

下载方式,首先安装Git。Git,主流版本管理工具,使用方法见官方文档。

git clone https://ceres-solver.googlesource.com/ceres-solver

依赖项:

  • Eigen,好用的数学库,无源码,全部是头文件。
  • CMake,工程生产工具,跨平台。
  • Glog,log库,选装。TBB,选装。
  • Gflags,SuiteSparse, CXSparse,BLAS,LAPACK主要是用来解大型稀疏矩阵的,必须要装。

Linux系统下可以很方便的用命令行安装各种库。

sudo apt-get install cmake libatalas-base-dev libeigen3-dev libsuitesparse-dev

安装Ceres-Solver,根据CMake的方式,进入Ceres目录,

mkdir build & cmake ..
make -j4
sudo make install

可以愉快的使用Ceres啦!先看Example,有示例嘛,学起来更快!

直接运行一下如下结果,

bin/simple_bundle_adjuster ../ceres-solver-1.14.0/data/problem-16-22106-pre.txt

似乎成功了?输出很多内容,好像看不懂。没关系,能运行成功,说明Ceres安装成功,可以愉快的使用。

注:这里解释的是更多在linux下面安装。Widows下基本大同小异,需要花点时间的是SuiteSparse几个三方库的安装和配置,不过也并不复杂。


实战

找到并使用Ceres-Solver

推荐使用CMake工具找到并使用Ceres,类似OpenCV。

什么是非线性最小二乘问题

Ceres-Solver可解形如下列公式的问题

\[\begin{split}\min_{\mathbf{x}} &\quad \frac{1}{2}\sum_{i} \rho_i\left(\left\|f_i\left(x_{i_1}, ... ,x_{i_k}\right)\right\|^2\right) \\
\text{s.t.} &\quad l_j \le x_j \le u_j\end{split}
\]

有点复杂,具体什么含义呢?

比如,平面(空间)很多带噪声的点,我们要拟合一条直线(平面)或曲线。比如,三维视觉的全局最优问题。

![曲线拟合问题](https://img2018.cnblogs.com/blog/15064/201905/15064-20190528121012765-2108745754.png ''曲线拟合问题'')

注意:直线拟合一般也可用线性回归解决。

公式中的目标函数集合称之为残差项,目标是是这个值最小;\(f_i\)函数被称为代价函数,由参数\(x_i\)组成。\(l_i, u_j\)则是函数的取值范围。

下面用了一个具体的示例说明。

求如下目标函数的最小值。

\[\frac{1}{2}(10 -x)^2.
\]

通过求二阶导数我们很容易知道x=10时,最小值取0.但这里我们尝试用Ceres来解决。

  • 第一步,代价函数\(f(x) = 10 - x\).
struct CostFunctor {
template <typename T>
bool operator()(const T* const x, T* residual) const {
residual[0] = T(10.0) - x[0];
return true;
}};

代码中符号()是一个模板方法,输入是同一类型。

  • 第二步,构建非线性最小二乘问题。
int main(int argc, char** argv)
{
// The variable to solve for with its initial value.
double initial_x = 5.0;
double x = initial_x; // Build the problem.
Problem problem; // Set up the only cost function (also known as residual). This uses
// auto-differentiation to obtain the derivative (jacobian).
CostFunction* cost_function =
new AutoDiffCostFunction<CostFunctor, 1, 1>(new CostFunctor);
problem.AddResidualBlock(cost_function, NULL, &x); // Run the solver!
Solver::Options options;
options.linear_solver_type = ceres::DENSE_QR;
options.minimizer_progress_to_stdout = true;
Solver::Summary summary;
Solve(options, &problem, &summary); std::cout << summary.BriefReport() << "\n";
std::cout << "x : " << initial_x
<< " -> " << x << "\n";
return 0;
}

AutoDiffCostFunctionCostFunctor作为输入,并提供了一个自动求微分的接口。

计算example/helloworld.cc会得到相应输出结果。

iter      cost      cost_change  |gradient|   |step|    tr_ratio  tr_radius  ls_iter  iter_time  total_time
0 4.512500e+01 0.00e+00 9.50e+00 0.00e+00 0.00e+00 1.00e+04 0 5.33e-04 3.46e-03
1 4.511598e-07 4.51e+01 9.50e-04 9.50e+00 1.00e+00 3.00e+04 1 5.00e-04 4.05e-03
2 5.012552e-16 4.51e-07 3.17e-08 9.50e-04 1.00e+00 9.00e+04 1 1.60e-05 4.09e-03
Ceres Solver Report: Iterations: 2, Initial cost: 4.512500e+01, Final cost: 5.012552e-16, Termination: CONVERGENCE
x : 0.5 -> 10

实际上此示例是个线性问题,却能很好的解释非线性优化的思想。

接下来的文章会处理一些更加复杂的问题,敬请期待。

Ceres Solver: 高效的非线性优化库(一)的更多相关文章

  1. Ceres Solver: 高效的非线性优化库(二)实战篇

    Ceres Solver: 高效的非线性优化库(二)实战篇 接上篇: Ceres Solver: 高效的非线性优化库(一) 如何求导 Ceres Solver提供了一种自动求导的方案,上一篇我们已经看 ...

  2. Ceres Solver for android

        最近开发中,需要对图片做一些处理与线性技术,这时就用到了Ceres Solver.如何把Ceres Solver集成到Android里呢? 官网给了一个解决方案,简洁明了:   Downloa ...

  3. Ceres Solver 入门稍微多一点

    其实ceres solver用了挺多的,可能是入门不精,有时候感觉感觉不理解代码上是怎么实现的,这次就通过ceres的官网仔细看了一些介绍,感觉对cpp了解更好了一些. 跟g2o的比较的话,感觉cer ...

  4. VINS(九)Ceres Solver优化(未完待续)

    使用Ceres Solver库处理后端优化问题,首先系统的优化函数为

  5. Android平台使用Ceres Solver

    在Android平台上使用Ceres求解器,官方教程不明确,且编译过程遇到了很多问题. 环境 Ubuntu 18.04 源代码 https://github.com/Great-Keith/ceres ...

  6. Ceres Solver 在win8+vs2013环境下的安装

    参考博文:https://blog.csdn.net/wzheng92/article/details/79504709

  7. OkHttp–支持SPDY协议的高效HTTP库

    Android为我们提供了两种HTTP交互的方式: HttpURLConnection 和 Apache HTTP Client,虽然两者都支持HTTPS,流的上传和下载,配置超时,IPv6和连接池, ...

  8. 关于OkHttp–支持SPDY协议的高效HTTP库 com.squareup.okhttp

    转载:http://liuzhichao.com/p/1707.html OkHttp–支持SPDY协议的高效HTTP库 柳志超博客 » Program » Andriod » OkHttp–支持SP ...

  9. 高效实时的网络会议数据传输库—UDT

    在视频会议系统的研发当中,我们的音.视频数据必须要有相应的可靠性作为保障,因为视频会议系统是一个实时性非常强的系统,如果其数据在网络不太好的情况下,有可能会出现丢包.数据延迟.数据堵塞等现象,出现这些 ...

随机推荐

  1. android/libs/libammsdk.jar" already exists! 解决方法

    Error: Uh oh!"/work/2016/fengkongbao/.meteor/local/cordova-build/platforms/android/libs/libamms ...

  2. 3 View - 错误视图函数

    1.定义视图 本质就是一个函数 视图的参数 一个HttpRequest实例 通过正则表达式组获取的位置参数 通过正则表达式组获得的关键字参数 在应用目录下默认有views.py文件,一般视图都定义在这 ...

  3. app分享代码

    友推是一款是面向移动应用的SDK分享组件,提供给开发者集成使用.通过友推,开发者可以轻松集成社会化分享功能,同时创建及管理推荐好友使用您应用的推荐奖励活动,用户推荐好友安装使用您的应用即可获得推荐奖励 ...

  4. PAT——乙级1012

    1012 数字分类 (20 point(s)) 给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A​1​​ = 能被 5 整除的数字中所有偶数的和: A​2​​ = 将被 5 除后 ...

  5. [oldboy-django][2深入django]rest-framework教程

    # rest-framework教程 - settings.py INSTALL-APPS = [ 'snippets', # app 'rest-framework', ] - 创建model # ...

  6. PAT1024

    科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位 ...

  7. 玲珑杯”ACM比赛 Round #15

    手速狗从西安回来一只浑浑噩噩,好不容易迎来一场送饭比赛体验一把河南的优势,结果被高中生狂虐,无缘奖金..我的奖品梦就这样一次次被打破.... A -- Reverse the lights 最后半小时 ...

  8. Redis实现缓存,你应该懂的哪些思路!

    场景一:类似于微博,实现关注和被关注功能. 思路: 对每个用户使用两个集合类型键,用来存储关注别人的用户和被该用户关注的用户.当用户A关注用户B的时候,执行两步操作: sadd user:A B sa ...

  9. Python的高阶函数小结

    一. 高阶函数定义 简而言之,Python的高阶函数就是指一个函数作为参数传递给另外一个函数的用法. 举一个最简单的高阶函数来说明: >>> def add(x,y,f): retu ...

  10. NOIP试题解析

    NOIP试题解析           by QTY_YTQ noip2010关押罪犯(并查集) 题意是有n个罪犯关在两个监狱中,其中有m对罪犯有仇恨关系,如果有仇恨的罪犯关在一起会产生一定影响力的事件 ...