计算机视觉中的核心优化技术
想象您正在用相机拍摄一个3D物体。物体上的每个点都会投影到相机的2D图像平面上。如果我们知道相机的参数和3D点的位置,我们可以计算出这个点应该出现在图像的哪个位置。
但在实际情况中,由于各种因素(噪声、测量误差、模型不完美等),计算得到的投影位置往往与实际观测到的位置不完全一致。这个差异就是重投影误差。
投影过程涉及多个非线性变换:
旋转矩阵R包含三角函数,相对于旋转角度是非线性的
从3D到2D的投影涉及除法运算:u = fX/Z, v = fY/Z
径向和切向畸变模型包含多项式非线性项
对于一个3D点 P = (X, Y, Z) 和其在图像中的观测位置 p_obs = (u_obs, v_obs),重投影误差定义为:
其中 π 是非线性投影函数,θ 包含所有待优化参数。
对于n个观测点,我们要解决的非线性最小二乘问题为:
这是一个典型的非线性最小二乘问题,因为残差函数r(θ)相对于参数θ是非线性的。
最常用的非线性最小二乘求解器
• 结合高斯-牛顿法和梯度下降法的优点
• 自适应调整阻尼参数λ,兼顾收敛速度和稳定性
• 更新公式:(JᵀJ + λI)Δθ = -Jᵀr
基于二次近似的快速方法
• 假设Hessian矩阵 H ≈ JᵀJ(忽略二阶项)
• 收敛快,但可能不稳定
• 更新公式:(JᵀJ)Δθ = -Jᵀr
大规模稀疏问题的高效解法
• 利用问题的稀疏结构,使用Schur补消元
• 分别优化相机参数和3D点坐标
• 典型实现:Ceres Solver, g2o
设定相机参数、3D点位置的初始估计值。对非线性问题,好的初始值至关重要!
对每个观测点计算重投影误差:rᵢ = pᵢ,obs - π(Pᵢ, θ)
计算残差函数对参数的偏导数:J = ∂r/∂θ
这是非线性优化的关键步骤!
根据选定算法求解增量:(JᵀJ + λI)Δθ = -Jᵀr
θ^(k+1) = θ^k + Δθ,可能需要线搜索确定步长
检查||∇f|| < ε或||Δθ|| < ε,未收敛则返回步骤2
确定相机的内参和畸变参数,确保图像测量的准确性。
从多视角图像中重建3D场景结构,如建筑物3D模型。
机器人同时进行定位与地图构建,实现自主导航。
电影制作中的角色动画,体育分析中的运动跟踪。
车辆定位、障碍物检测和路径规划的基础技术。
精确的相机姿态估计,实现虚拟对象的准确叠加。
直接反映了模型预测与实际观测之间的像素级差异,具有直观的几何解释。
在高斯噪声假设下,非线性最小二乘估计等价于最大似然估计,具有最优统计性质。
投影函数的雅可比矩阵具有良好的稀疏结构,可以高效计算和存储。
Ceres、g2o等成熟库提供了高效的非线性最小二乘求解器,易于使用。
在一定条件下,Levenberg-Marquardt等算法具有全局收敛保证。
非线性目标函数通常存在多个局部最优解,算法可能收敛到次优解而非全局最优。
解决策略:多随机初始化 + RANSAC预处理 + 粗到细策略
非线性优化对初始估计极其敏感,差的初始值会导致收敛失败或错误结果。
解决策略:使用线性方法(DLT、五点算法)获得初始估计
某些几何配置下,雅可比矩阵JᵀJ条件数很大,导致数值不稳定。
解决策略:加正则化项 + 预条件处理 + 避免退化配置