open3D源码分析第十三篇

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是损失函数的标度参数。

该类主要用于处理异常,提高健壮性,属于非功能需求。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值