2021SC@SDUSC
RobustKernel.h
注释中文部分是源码解读,分析和问题在源码之后
#pragma once
namespace open3d {
namespace pipelines {
namespace registration {
//健壮内核类class RobustKernel
//为异常值拒绝建立健壮内核模型的基类。虚函数权(双残差);必须在派生类中实现。
//这种方法只在不同类型的内核之间存在差异,并且易于扩展。
//到目前为止已经实现的内核和符号都受到了出版物“注册算法鲁棒函数分析”的启发,Philippe Babin等人。
//我们得到每个残差对应的权重,并将非线性最小二乘问题转化为迭代加权最小二乘问题。改变每个残差的权重相当于改变用于异常值剔除的鲁棒核。
//给定残差`r`和给定损失函数`p(r)`的权重w(r)计算如下:对于所有r,w(r)=(1/r)*(dp(r)/dr)
//因此,选择对核的唯一影响是它的一阶导数
class RobustKernel {
public:
//析构函数
virtual ~RobustKernel() = default;
// 根据鲁棒核模型获得给定残差的权重。这种方法必须在为不同的健壮内核建模的派生类中实现。
virtual double Weight(double residual) const = 0;
};
//L2Loss类
//用于剔除异常值的经典损失函数。
//给定剩余“r”的损失p(r)计算如下:p(r)=r^2/2class
L2Loss : public RobustKernel {
public:
//给定残差“r”的权重w(r)计算如下:对于所有r,w(r)=1.0
double Weight(double residual) const override;
};
//L1类损失
//用于异常值剔除的L1损失函数。
//给定剩余‘r’的损失p(r)计算如下:p(r)=abs(r)
class L1Loss : public RobustKernel {
public:
//给定剩余‘r’的重量w(r)计算如下:对于所有r,w(r)=1.0/abs(r)
double Weight(double residual) const override;
};
//HuberLoss类
//用于剔除异常值的HuberLoss损失函数。
class HuberLoss : public RobustKernel {
public:
//参数化构造函数。
explicit HuberLoss(double k) : k_(k) {}
double Weight(double residual) const override;
public:
// 缩放参数。
double k_;
};
//高加索类class CauchyLoss
//用于异常值剔除的CauchyLoss损失函数。
//给定剩余“r”的损失p(r)计算如下:对于所有r,p(r)=(k^2/2)*log(1+(r/k)^2
class CauchyLoss : public RobustKernel {
public:
//参数化构造函数。
explicit CauchyLoss(double k) : k_(k) {}
//给定残差“r”的权重w(r)计算如下:w(r)=1/(1+(r/k)^2),其中k是损失函数的标度参数。
double Weight(double residual) const override;
public:
// 缩放参数。
double k_;
};
//类GMLoss
//用于异常值剔除的德国McClure损失函数。
//给定剩余‘r’的损失p(r)计算如下:对于所有r,p(r)=(r^2/2)/(1+(r/k)^2
class GMLoss : public RobustKernel {
public:
//参数化构造函数
explicit GMLoss(double k) : k_(k) {}
// 给定残差“r”的权重w(r)计算如下:对于所有rw,w(r)=k/(k+r^2)^2,其中k是损失函数的标度参数。
double Weight(double residual) const override;
public:
// 缩放参数。
double k_;
};
//TukeyLoss类
//这就是所谓的Tukey损失函数,它积极地试图抑制较大的错误。
class TukeyLoss : public RobustKernel {
public:
//参数化构造函数
explicit TukeyLoss(double k) : k_(k) {}
public:
double Weight(double residual) const override;
public:
double k_;
};
}
}
}
1.Weight()其输入值为一个double值,为在优化步骤中获得的剩余值。根据健壮核模型获得给定残差的权重。这种方法必须在为不同的健壮内核建模的派生类中实现。
2.Weight()继承上一个函数,输入值不变,但该输入值可忽略。给定残差“r”的权重w(r)计算如下:对于所有r,w(r)=1.0
3.Weight()继承上一个函数,输入值不变,给定剩余‘r’的重量w(r)计算如下:对于所有r,w(r)=1.0/abs(r)
4.Weight()继承上一个函数,输入值不变,给定残差“r”的权重w(r)计算如下:w(r)=1/(1+(r/k)^2),其中k是损失函数的标度参数。
5.Weight()继承上一个函数,输入值不变,给定残差“r”的权重w(r)计算如下:对于所有rw,w(r)=k/(k+r2)2,其中k是损失函数的标度参数。
该类主要用于处理异常,提高健壮性,属于非功能需求。