在工程应用中,最后要求解的线性方程组往往是原来的残差模型进行线性化后的误差方程。通常情况下,模型的线性化由人工完成,而求解误差方程则借助Eigen等矩阵运算库(参考1)来实现。现在,我们有了另一种选择,那就是ceres solver。ceres是Google公司用来解决非线性优化问题的开源库,主要是为了解决SFM问题中的光束法平差而设计的。与一般的矩阵运算库不同的是,我们只需要给ceres提供原始的残差模型就可以了,而无需自己求偏导数。ceres solver的安装和向导可以在下面给出的参考2的链接中找到,一个写的很好的中文用例可以在参考3的连接中找到。参考3给出的更多的是对参考2的翻译,最后也给出了一个空间后方交会的例子,但是未知数的数量只有6个,属于比较简单的例子。本文将结合实际应用,给出一个大规模最小二乘问题的求解实例。
现在有如上所示的一个能量函数,这个函数的第一项是观测值约束,第二项是未知数的平滑约束,这是一个工程领域十分常见的能量函数模型。我们用这个模型是要解决,利用一幅图像中稀疏的深度观测值来估计出一个密集的深度图(图1)。因此,对于一幅图像而言,每个像素对应一个未知数,比如对于1000*1000的一幅图像将会有100W个未知数。公式1是个非线性方程,但是求解这个问题却可以通过求偏导转换为一个线性方程组,具备确定解。但是由于未知数个数很多,所以利用QR分解等直接法不可能求解。好在ceres提