在视觉SLAM与三维重建的相机优化问题中,我们往往把重投影误差最小化建模成非线性最小二乘。直接套用标准牛顿法时,若目标函数在当前迭代点附近的二阶近似不可靠,海森矩阵可能不正定,求解出的牛顿步会让误差不降反升,表现为优化曲线剧烈震荡、甚至发散。这类现象在初值较差或场景退化时尤为明显。为了把求解过程拉回稳定轨道,阻尼牛顿法与置信域方法提供了两套互补思路:前者从矩阵层面做软化,后者从步长层面做围栏。

阻尼牛顿法的原理与实现
阻尼牛顿法的核心是在正规方程里给海森矩阵加上一个阻尼系数乘以单位阵,即求解 (H + λI) Δx = -g,其中 H 是海森矩阵,g 是梯度,λ 为非负阻尼因子。当 λ 较大时,更新方向趋近于梯度下降,步长保守;当 λ 趋近于零,方法退化为标准牛顿法。通过每步根据实际误差下降量调整 λ,系统能在曲率可信时快进、不可信时慢行,从而抑制震荡。
具体实现中通常采用信赖策略:先以当前 λ 算步并比较预测下降与实际下降的比值 ρ。若 ρ 小于阈值,说明模型偏差大,增大 λ 重算;若 ρ 接近一,减小 λ 以逼近牛顿步。下面给出简化的阻尼牛顿迭代代码:
import numpy as np
def damped_newton(f_grad, f_hess, x0, max_iter=50, lam=1e-3, tol=1e-6):
x = x0.copy()
for i in range(max_iter):
g = f_grad(x)
if np.linalg.norm(g) < tol:
break
H = f_hess(x)
while True:
try:
# 阻尼项 lambda*I 保证矩阵正定倾向
A = H + lam * np.eye(len(x))
delta = np.linalg.solve(A, -g)
break
except np.linalg.LinAlgError:
lam *= 10
x_new = x + delta
# 实际误差下降由调用者评估,此处仅示意更新
x = x_new
lam = max(lam * 0.5, 1e-8)
return x
该方法的优势是改动极小、易嵌入现有牛顿框架,且对海森近似误差有天然缓冲。缺点是 λ 的调度依赖经验,若场景高度非线性,单一标量阻尼未必能反映不同参数维度的差异,此时可改用对角阻尼或更精细的莱文贝格马夸尔特形式。
置信域方法的机制与对比
置信域思路不直接修改海森,而是给每次迭代的位移 Δx 设一个半径 Δ,只在以当前点为中心、半径为 Δ 的区域内信任二阶模型。子问题为最小化 m(Δx)=f+gᵀΔx+0.5ΔxᵀHΔx 且满足 ‖Δx‖≤Δ。用实际下降与模型预测下降的比值 ρ 决定下一步:ρ 高则扩大 Δ,低则缩小。这样单步不会跑太远,从根源上避免越过谷底引起的反弹。
与阻尼牛顿相比,置信域对步长边界的控制更显式,尤其适合海森条件数恶劣的情况。下面的伪代码展示置信域循环骨架:
// 简化置信域迭代框架
double delta = 1.0;
while (!converged) {
// 求解受限子问题,得到步长step
Vector step = solve_tr_subproblem(grad, hess, delta);
double rho = (cost(x) - cost(x + step)) /
(-model_decrease(step));
if (rho < 0.25) {
delta *= 0.5; // 模型差,收缩区域
} else if (rho > 0.75) {
delta = std::max(delta, 2.0 * step.norm());
}
if (rho > 0.0) {
x = x + step; // 接受更新
}
}
实践中置信域的计算成本略高,因为要解带约束的子问题,但在相机优化这种参数维度中等、精度要求高的场景里,它比纯阻尼法更不容易卡在虚假极小。很多开源BA库把二者结合:用置信域定边界,用阻尼项保矩阵可逆,兼具稳健与效率。
在相机优化中的混合策略与调参
真实相机优化常同时面临初值漂移与观测噪声,单独用一种方法仍可能震荡。工程上推荐阻尼牛顿与置信域混合:以置信域半径为外层围栏,以阻尼系数为内层正则。这样即使某帧位姿雅可比突变,半径收缩会限制破坏,阻尼系数上升会让方向偏梯度,双保险降低发散概率。
调参时建议把初始 λ 设在 1e-3 到 1e-1,初始 Δ 取参数尺度的若干倍;监控每步 ρ 与重投影误差曲线,若连续多步 ρ 低于 0.1,说明模型失配,应优先缩 Δ 而非只加 λ。此外,对相机内参与外参分组设置阻尼权重,能进一步削弱震荡。以下为分组阻尼示例:
# 对位姿与焦距使用不同阻尼
lam_pose = 1e-2
lam_focal = 1e-4
A = H.copy()
for i in pose_idx:
A[i, i] += lam_pose
for j in focal_idx:
A[j, j] += lam_focal
delta = np.linalg.solve(A, -g)
综上,相机优化震荡的本质是二阶模型局部失效,阻尼牛顿法与置信域分别从矩阵软化与步长围栏切入。理解二者差异并混合使用,可显著提升光束法平差的稳定性,让位姿与结构估计平滑收敛。
damped_Newtontrust_regioncamera_optimization修改时间:2026-08-16 02:22:31