Ceres Solver 入门

news2025/1/15 21:07:24

1. Ceres Solver 是什么

Ceres 可以解决以下形式的边界约束鲁棒化非线性最小二乘问题:

在这里插入图片描述
给定初始值,通过优化算法,得到最优解。

其中, f i f_i fi是CostFunction,也叫误差函数,或者代价函数。 ρ i \rho_i ρi是LossFunction。LossFunction 是一个标量函数,用于减少异常值对非线性最小二乘问题的解决方案的影响。 x i x_i xi就是我们输入的变量(包括要优化的和不用优化的)。

2. 如何使用Ceres

Ceres 求解优化问题的函数是:

CERES_EXPORT void Solve(const Solver::Options& options,
                        Problem* problem,
                        Solver::Summary* summary);

Ceres的用法就是围绕这个函数的参数展开的。

2.1 Solver::Options

Solver::Options 用来设置优化的参数。

常用的就是设置迭代的次数,步长,线性求解器的类型。

2.2 Problem

Problem 用来定义待解的优化问题。

在这里插入图片描述
核心就是往优化问题里面添加Residual block:

template <typename... Ts>
ResidualBlockId AddResidualBlock(CostFunction* cost_function,
                                 LossFunction* loss_function,
                                 double* x0,
                                 Ts*... xs)

残差块有三个参数,cost_function对应 f i f_i fi,loss_function对应 ρ i \rho_i ρi,x0和xs对应 x i x_i xi

我们来展开讲CostFunction和LossFunction。

2.2.1 CostFunction

CostFunction是一个基类,单看这个基类本身是没什么作用的,实际上使用的时候是用它的派生类AutoDiffCostFunction,如下所示:

template <typename CostFunctor,
	int kNumResiduals,  // Number of residuals, or ceres::DYNAMIC.
	int... Ns>          // Number of parameters in each parameter block.
class AutoDiffCostFunction final
	: public SizedCostFunction<kNumResiduals, Ns...> {
public:
	// Takes ownership of functor by default. Uses the template-provided
	// value for the number of residuals ("kNumResiduals").
	explicit AutoDiffCostFunction(CostFunctor* functor,
		Ownership ownership = TAKE_OWNERSHIP)
		: functor_(functor), ownership_(ownership) {
		static_assert(kNumResiduals != DYNAMIC,
			"Can't run the fixed-size constructor if the number of "
			"residuals is set to ceres::DYNAMIC.");
	}
	...
}

对于这个类,我们要关注的是CostFunctor,因为它定义的就是我们优化问题的cost_function,也就是方程中的 f i f_i fi。这个CostFunctor是一个结构体,我们需要在里面重写Operator(),从而定义我们的cost_function,如下所示:

struct CostFunc
{
	template <typename T>
	bool operator()(const T* const x0,
		const T* const ... xs,
		T* residuals) const
		{
			//定义residuals是怎么来的
			//...
			return true;
		}
};

举个例子:

f ( x ) = 1 2 ( 10 − x ) 2 f(x)= \frac {1} {2} (10−x)^2 f(x)=21(10x)2

那么,residuals就对应方程里面的10-x.

2.2.2 LossFunction

LossFunction 就是套在cost_function外面一层的修饰,为了提升鲁棒性。一般是nullptr,代表LossFunction就是1。如果为了提升鲁棒性,可以换成别的函数,常用的是HuberLoss:

在这里插入图片描述
在Ceres里面的代码如下:

class CERES_EXPORT HuberLoss final : public LossFunction {
	 public:
	  explicit HuberLoss(double a) : a_(a), b_(a * a) {}
	  void Evaluate(double, double*) const override;
	
	 private:
	  const double a_;
	  // b = a^2.
	  const double b_;
};

举个例子:

f ( x ) = 1 2 ( 10 − x ) 2 f(x)= \frac {1} {2} (10−x)^2 f(x)=21(10x)2

当我们将LossFunction定义成nullptr的时候,那么优化函数就是上面的式子。如果定义成HuberLoss的时候,那么优化函数如下所示:

f ( x ) = H u b e r ( 1 2 ( 10 − x ) 2 ) f(x)=Huber( \frac {1} {2} (10−x)^2) f(x)=Huber(21(10x)2)

2.3 Solver::Summary

用来存日志的。

3. 示例

参考ceres教程(1)

参考

  1. ceres教程(1)
  2. Ceres Solver 入门教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/926876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十七课:利用 Setup Factory 制作 Qt 软件安装包

功能描述&#xff1a;详细介绍如何利用 Setup Factory 制作 Qt 软件安装包&#xff0c;从 Setup Factory 软件下载、安装&#xff0c;到如何利用 Setup Factory 制作软件安装包&#xff0c;手把手教你将 Qt 应用程序制作成具有安装向导的安装包。 一、Setup Factory 简介 Setu…

C语言程序结构、基本语法与数据类型

文章目录 1. 程序结构1.1 Hello World示例1.2 编译并执行C程序 2. 基本语法2.1 C 标记2.2 分号2.3 注释2.4 标识符2.5 关键字2.6 C中的空格 3. 数据类型3.1 整数类型3.2 浮点类型3.3 void类型 1. 程序结构 1.1 Hello World示例 #include <stdio.h>int main() {/* my fi…

DirectExchange直连交换机

目录 一、简介 二、使用步骤 三、demo 父pom文件 pom文件 配置文件 config 消费者 生产者 测试 一、简介 直连型交换机&#xff0c;根据消息携带的路由键将消息投递给对应队列。 大致流程&#xff0c;有一个队列绑定到一个直连交换机上&#xff0c;同时赋予一个路由…

AMEYA360代理品牌:纳芯微芯片解决方案为光伏市场赋能

近年来&#xff0c;光伏市场进入了一个新的增长维度。SolarPower Europe数据显示&#xff0c;2022年全球光伏新增装机量达239GW&#xff0c;占所有可再生能源新增容量的三分之二。国家能源局也宣称&#xff0c;2022年我国工商业光伏新增装机达25.87GW&#xff0c;同比增长236.7…

淘宝商品数据采集(如何快速获取淘宝商品信息),淘宝API接口申请指南

淘宝作为国内的电商平台&#xff0c;拥有海量的商品信息。对于想要进行淘宝商品数据采集的人来说&#xff0c;如何快速获取淘宝商品信息是一个重要的问题。本文将介绍一些快速获取淘宝商品信息的方法。 1. 使用淘宝开放平台PI 淘宝开放平台提供了多种PI接口&#xff0c;可以通…

如何选择合适的开源许可证?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

java八股文面试[java基础]——异常

自定义异常&#xff1a; 异常Exception 是指程序运行时&#xff0c; 由于输入错误、网络、程序逻辑等原因导致运行时出现的问题。出现异常时&#xff0c;程序会暂时中断执行&#xff0c;并根据产生异常的原因&#xff0c;创建对应异常类型的异常对象&#xff0c;并抛出给JVM捕…

高速收费站的智慧之选,工控机助力顺畅通行!

2020年初取消高速公路省界收费站后&#xff0c;全国高速公路进入“一张网运行、一体化服务”的新阶段。随着ETC用户量快速增长、驾乘人员对收费站高效通行需求不断提升&#xff0c;收费数据在线化运营及精准化、智能化、人性化的收费服务将成为主流。如何提高收费系统集成度、降…

Day4:前端路由(进阶篇)

目标: 持续输出&#xff01;每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。 主要面向群体&#xff1a;前端开发工程师&#xff08;初、中、高级&#xff09;、应届、转行、培训等同学 Day4-今日话题 今天分享的是前端路由的进阶篇&#xff0c;将从路由的…

传感网应用开发1+X实训室建方案

一、概述 1.1建设背景 从院校实际教学情况与人才培养计划为出发点&#xff0c;贯彻传感网应用开发1X实训室职业技能等级标准&#xff0c;充分考虑传感网应用开发1X实训室从业人员的职业发展路径与成长路径&#xff0c;以职业素养、职业技能、知识水平为主要框架结构&#xff…

无涯教程-进程 - 镜像

现在&#xff0c;我们已经了解了如何获取进程及其父进程的基本信息&#xff0c;是时候来研究进程信息的细节了。 以下是进程镜像的图形表示。 进程镜像(Process Image)到底是什么? 进程镜像是执行程序时所需的可执行文件&#xff0c;该镜像通常包含以下部分- 代码段或文本片段…

三维模型数据加载速度不理想?这三种加载方式供你选择!

在四维轻云平台的使用过程中&#xff0c;有用户反映三维模型数据加载速度较慢。因此&#xff0c;平台推出了默认方式、质量优先、速度优先三种数据加载方式供用户选择。下面就来简单介绍一下这三种加载方式的特点&#xff0c;用户可根据需求选择合适的数据加载方式。 默认方式…

Django(2)-编写你的第一个 Django 应用

创建一个基本的投票应用程序。 它将由两部分组成&#xff1a; 一个让人们查看和投票的公共站点。 一个让你能添加、修改和删除投票的管理站点。 创建应用 $ python manage.py startapp polls每一个应用是一个python包&#xff0c;一个项目可以包含多个应用。 可以看到生成…

Telegraf 本地代码vscode调试

需要安装的软件&#xff1a; golang 1.20vscodevscode推荐的go插件 在RUN按钮中&#xff0c;创建Launch 自动生成launch.json文件&#xff0c;此处增加了&#xff1a;args参数。 {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions…

JS逆向系列之商指针数据解密

文章目录 声明案例地址y解密算法分析ecryptByPrivateKey 解密算法分析写代码前的流程梳理参考代码往期逆向文章推荐声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! 案例地址 aHR0cDovL…

系统上线安全测评需要做哪些内容?

电力信息系统、航空航天、交通运输、银行金融、地图绘画、政府官网等系统再正式上线前需要做安全测试。避免造成数据泄露从而引起的各种严重问题。 那么系统上线前需要做哪些测试内容呢&#xff1f;下面由我给大家介绍 1、安全机制检测-应用安全 身份鉴别 登录控制模块 应提供…

字节一面:post为什么会发送两次请求?

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;因为在前端开发的日常开发中我们总是会与post请求打交道&#xff0c;一个小小的post请求也是牵扯到很多知识点的&#xff0c;博主在这给大家细细道来。 &#x1f680; 作者…

视频尺寸缩小,一键批量剪辑,轻松制作精简版

大家好&#xff01;在视频剪辑中&#xff0c;有时我们需要将大尺寸的视频缩小&#xff0c;以适应特定的需求和平台要求。为了帮助您轻松制作精简版视频&#xff0c;我们推出了一款全新的工具——视频尺寸缩小批量剪辑软件&#xff01;让您一键批量将视频尺寸缩小&#xff0c;轻…

为什么叫源表?源表是如何四象限工作的?

为何称呼为源表&#xff1f; “源”为电压源和电流源&#xff0c;“表”为测量表&#xff1b; “源表”即指一种可作为四象限的电压源或电流源提供精确的电压或电流&#xff0c;同时可同步测量电流值或电压值的测量仪表。&#xff08;恒流源时测电压&#xff0c;恒压源时测电…

手机盖板IR油墨透光率检测仪T03

手机盖板作为手机最外层玻璃面板&#xff0c;其加工一般有落料、倒边、抛光、镀膜、丝印等多道加工工序组成&#xff0c;其中任何一个工序出现差错&#xff0c;都有可能导致手机盖板产生缺陷&#xff0c;例如漏油、透光、IR孔不良、视窗划伤、油墨区划伤、內污、边花等&#xf…