open3d.pipelines.registration.RobustKernel#

class open3d.pipelines.registration.RobustKernel#

Base class that models a robust kernel for outlier rejection. The virtual function weight() must be implemented in derived classes.

The main idea of a robust loss is to downweight large residuals that are assumed to be caused from outliers such that their influence on the solution is reduced. This is achieved by optimizing:

(1)#x=argminxi=1Nρ(ri(x))

where ρ(r) is also called the robust loss or kernel and ri(x) is the residual.

Several robust kernels have been proposed to deal with different kinds of outliers such as Huber, Cauchy, and others.

The optimization problem in (1) can be solved using the iteratively reweighted least squares (IRLS) approach, which solves a sequence of weighted least squares problems. We can see the relation between the least squares optimization in stanad non-linear least squares and robust loss optimization by comparing the respective gradients which go to zero at the optimum (illustrated only for the ith residual):

12(wiri2(x))x=wiri(x)ri(x)x(ρ(ri(x)))x=ρ(ri(x))ri(x)x.

By setting the weight wi=1ri(x)ρ(ri(x)), we can solve the robust loss optimization problem by using the existing techniques for weighted least-squares. This scheme allows standard solvers using Gauss-Newton and Levenberg-Marquardt algorithms to optimize for robust losses and is the one implemented in Open3D.

Then we minimize the objective function using Gauss-Newton and determine increments by iteratively solving:

(JWJ)1JWr,

where WRn×n is a diagonal matrix containing weights wi for each residual ri

The different loss functions will only impact in the weight for each residual during the optimization step. Therefore, the only impact of the choice on the kernel is through its first order derivate.

The kernels implemented so far, and the notation has been inspired by the publication: “Analysis of Robust Functions for Registration Algorithms”, by Philippe Babin et al.

For more information please also see: “Adaptive Robust Kernels for Non-Linear Least Squares Problems”, by Nived Chebrolu et al.

__init__(*args, **kwargs)#
weight(self, residual)#

Obtain the weight for the given residual according to the robust kernel model.

Parameters:

residual (float) – value obtained during the optimization problem

Returns:

float