对于最小二乘问题,其中最小化可能遇到包含异常值的输入项,即完全虚假的测量值,重要的是使用损失函数来减少它们的影响。
考虑一个来自运动问题的结构。未知量是3D点和摄像机参数,测量值是描述摄像机中某个点预期重投影位置的图像坐标。例如,我们想要对带有消防栓和汽车的街景的几何形状建模,通过带有未知参数的移动摄像机观察,而我们唯一关心的3D点是消防栓的尖顶。
我们的图像处理算法负责生成输入到Ceres的测量数据,它在所有图像帧中找到并匹配了这些消防栓的尖顶,除了在其中一个帧中,它误将一辆汽车的前灯当成了消防栓。如果我们不把那个错误识别结果提出,那么错误的值将使最终结果大大偏离最优解,从而引起较大误差。
采用鲁棒损失函数,降低了大残差的代价。在上面的例子中,这导致离群值项被向下加权,因此它们不会过度影响最终解决方案。
class LossFunction {
public:
virtual void Evaluate(double s, double out[3]) const = 0;
};
关键方法是LossFunction::Evaluate(),它给出一个非负标量s,计算
TODO...