自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(232)
  • 资源 (1)
  • 收藏
  • 关注

原创 常用相机投影及畸变模型(针孔|广角|鱼眼)

omnidirectional camera(广角相机):在一个水平面有360°视野的相机,或视野能覆盖半个球或近似整个球的相机。面镜(mirror)与透镜(lens)的区别:广角相机成像步骤与普通相机基本一致,主要的区别在于镜头聚光的部分,广角相机为了获得更大的FOV,有三种镜头聚光方式:设O−x−y−zO-x-y-zO−x−y−z为相机坐标系,习惯上将zzz轴指向相机前方,xxx轴向右,yyy轴向下。OOO为摄像机的光心,也是针孔模型中的针孔。现实世界的空间点P,经过小孔OOO投影之后,落在物理成像平面

2020-08-12 19:46:05 21930 17

原创 Ceres-Solver和G2O中的new是否存在内存泄露

然而,在某些情况下,这可能是不希望的,因此也可以在构造函数中指定。出来的是否需要释放呢?如果不手动释放,是否存在内存泄漏的风险?与 Ceres 内的内存管理方式异曲同工,G2O 是在将。析构时自动释放掉,所以并不会造成内存泄露的问题。作为第二个参数,同时传递一个指向。可以看见上面的代码段。

2024-05-08 16:33:26 681

原创 错误日志:解决在VScode中调试C++代码断点无效、断点错位的问题

问题可能原因有:程序运行前:程序运行后:

2024-04-11 17:47:29 441

原创 错误日志:symbol lookup error: /lib/libgdal.so.26: undefined symbol: sqlite3_column_table_name

个人感觉一般出现这种问题,一般都是安装 conda 环境后,编译时使用的环境不一致所造成的。这里报错的位置是,但报错信息主要与有关。这个问题是因为安装sqlite3的时候没有把相关函数编译进来,如果之前是使用 ubuntu 上的 apt 软件包安装的,默认是没有编译这个函数的。

2024-04-09 15:53:08 319

原创 C++分析程序各模块耗时-perf火焰图

perf 是一个非常实用且深入的性能分析工具,适用于从底层硬件交互到上层应用程序逻辑的全方位性能剖析。perf 工具的设计目的是为了帮助开发者和系统管理员分析应用程序以及内核本身的性能,寻找潜在的性能瓶颈,并据此进行针对性的优化。

2024-04-07 20:23:53 885

原创 自动驾驶中的 DCU、MCU、MPU、SOC 和汽车电子架构

相关功能集中,集成 MPU/MCU,满足域内功能运算能力要求及功能安全要求;集成标准化软件接口,如 AUTOSAR;带通讯接口,可与整车主网络直连,同时与域内执行器或传感器通过二级通讯总线进行交互,总线类型:车载以太网(TSN)、CAN、LIN、FlexRay…目前,主流车企、零部件企业产品均按照动力、底盘、车身、座舱、自动驾驶五大域控制器推进研发和商业化落地。什么是域控制器(DCU),对汽车未来电子架构有什么影响?

2024-02-18 17:06:10 2566 2

原创 C++三五法则

如果没有这条规则,可能会创造出无法被私有的对象。理论上来说,当析构函数不能被访问时,任何静态定义的对象都不能通过编译器的编译,所以这种情况只会出现在与动态分配有关的拷贝/默认构造函数身上。

2024-02-04 16:13:01 1167

原创 Linux 命令 —— top

如果你想要使用内存使用率排序,则可以按下【M】,若要恢复则按下【P】即可。如果想要退出 top,则按下 【q】。一般来说,如果想要找出最消耗 CPU 资源的那个进程时,大多使用的就是 top 这个程序,然后强制以 CPU 使用资源来排序,就可以很快知道了。相对于 ps 是选取一个时间点的进程状态,top 则可以持续检测进程运行的状态。注意, swap 的使用量要尽量的少,如果 swap 被用很多,表示系统的物理内存存在不足。如果是多内核设备,可以按下数字键【1】来切换成不同 CPU 的负载率。

2024-02-01 20:27:25 1457

原创 3DGS 其二:Street Gaussians for Modeling Dynamic Urban Scenes

基于场景表达的不同,可以将场景重建分为和我感觉这里说的其实是隐式辐射场和显式辐射场更贴切。:用 MLP 网络表示连续的体积场景,如 Mip-NeRF360、DNMP 等将其应用场景扩展到了城市街景,已去的不错的渲染效果。:在点云上定义学习神经描述符,并使用神经渲染器执行可微分的光栅化,大大可以提高了渲染效率。然而,它们需要密集的点云作为输入,并在点云稀疏区域的结果相对模糊。

2024-01-27 14:55:04 1563

转载 DBSCAN原理

DBSCAN是一种非常著名的基于密度的聚类算法。其英文全称是,意即:一种基于密度,对噪声鲁棒的空间聚类算法。直观效果上看,DBSCAN 算法可以找到。DBSCAN 通常适合于对较低维度数据进行聚类分析。

2024-01-25 17:12:13 74

原创 Structure-from-Motion Revisited(COLMAP) 流程介绍

原理挺简单的,但是这文章有点难啃,好多东西该讲没讲,该描述没描述。COLMAP 的整体流程非常王道,在此不做赘述。

2024-01-23 16:58:23 1229

原创 PyTorch 内 LibTorch/TorchScript 的使用

综上,PyTorch 可以导出的模型的几种后缀格式,但是模型导出的关键并不是后缀,而是到处时候提供的信息到底是什么,只要知道了模型的和,以及相应的epochbatch_sizeloss等信息,我们就能够重建出模型,至于要导出哪些信息,就取决于你了,务必在 readme.md 中写清楚,导出了哪些信息。保存场景保存方法文件后缀整个模型(保存模型结构)仅模型参数(不保存模型结构)checkpoints使用ONNX通用保存.onnxTorchScript 无 Python 环境使用。

2024-01-19 11:38:37 1257 2

原创 3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering

α是表达三维场景的一种方式,不同于 NeRF 用一个点来表达,它是用一堆的 3D 高斯来表达。

2024-01-17 15:39:32 1737 1

原创 NeRF 其三:Instant-NGP

系列文章:相比于 Mip-NeRF 对 NeRF 性能上的提升,Instant-NGP 更多的是对 NeRF 在速度上做优化。我们知道,在传统 NeRF 内,给定一个三维的方向向量 d\boldsymbol{d}d,会使用 γ\gammaγ 把它编成 242424 维。 是传统图形学中的一种光照模型,在 Instant-NGP 中使用它将传统 NeRF 的视线方向编码做了替换-------使用球谐函数做方向编码,其将 d\boldsymbol{d}d 映射成了一个固定的 161616 维向量。值得注意的是,

2024-01-16 16:03:28 1781

原创 NeRF 其二:Mip-NeRF

相比于 NeRF,Mip-NeRF 主要是在视觉上的改进。混叠会造成视觉质量的下降,将抗混叠应用到 NeRF 里,就生成了 Mip-NeRF。至于什么是混叠,让我们接着看看。

2024-01-12 15:57:20 1325 1

原创 Ceres Manifolds/LocalParameterization 类

x在老版本中,想实现流形的建模,使用的是类。在 V2.1.0 版本时,新增了Manifolds类并在 V2.2.0 时,Ceres-Solver 官方将类删除了。两个类在用法上区别不大。但不得不说,老版本的命名方式确实不如新版,至少新版又短又一眼能看出其用途。对于四元数或者旋转矩阵这种使用过参数化表示旋转的方式,它们是。

2024-01-10 16:59:08 1182

原创 NeRF 其一:NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

因此 NeRF 的目标也就相当清楚了:首先拍摄多视角的图像,然后要拿到这些图像对应的内外参数(可以使用 COLMAP),这时使用神经网络去学习三维场景内的辐射值(学习不同方向的光线),然后就可以在不同视角下做可视化了。这里要明白光线(ray)的含义,它是由 相机/眼睛 发出,已知会穿过实际 3D 物体的一条虚拟射线,如下图所示:图中的就是我们最后想得到的图,我们要用 NeRF 找到 Image Plane 上面每个像素的 RGB。那么怎么找呢?

2024-01-07 16:42:00 1069

转载 Ceres 获取雅可比及海塞矩阵

在执行边缘化过程中,我们需要构建整个问题对应的 Hessian 矩阵,然后将要被边缘化的状态变量移动到 Hessian 矩阵的右下角或者左下角,执行舒尔补。因此我们可以将边缘化问题拆解成两个子问题:Hessian 矩阵的构建和被边缘化的状态变量移动到 Hessian 矩阵的右下或左下角。而本文仅记录使用 Ceres 的接口获取优化问题中 Jacobian 和 Hessian 矩阵的过程。

2024-01-05 20:19:01 200

转载 二次型、正定、半正定关系

从上面动图可看出,一个平面在圆锥体上运动,可以得到圆、椭圆、双曲线,这也是它们之间具有线性关系的来源(平面的运动是线性的、或者是仿射的)。根据赫尔维茨定理,正定的条件是 奇数阶顺序主子式为负,而偶数阶顺序主子式为正,仅在这个公式中,一阶顺序主子式为。根据赫尔维茨定理,正定的条件是各阶顺序主子式都为正,仅在这个公式中,一阶顺序主子式为。但到了《多变量微积分》的时候,二阶导数就是一个二次型矩阵,也就是下面说的。这个椭圆看起来有点歪,不太好处理,我们来把它扶正,这就叫做。

2023-12-27 17:59:10 360 1

原创 错误日志:VSCode视图错误 Error loading webview: Error: Could not register service worker:...

关闭 VSCode,重启后即可正常使用。

2023-12-20 16:36:01 547

原创 自动驾驶中的LFM(LED 闪烁缓解)问题

LED闪烁”是由 LED 驱动方式而产生的现象,LED 灯以交流方式驱动,驱动频率一般在 90Hz 以上,即最慢脉冲周期为 11ms 左右,LED 在 11ms 周期内实现一次亮灭,为节能及延长使用寿命,占空比通常不超过50%,如果相机曝光时间较短(例如 3ms),则有可能曝光时间正好对上 LED 被关灭期,这时候图像传感器抓到的就是 LED 灭掉的图像,如果是 LED 阵列,在这种情况下拍到的图像就是一部分亮,一部分暗,这就是“LED闪烁”现象。在 ADAS 中,LED 闪烁造成的危害更大。

2023-11-27 15:00:37 912

转载 一文看懂 NAND、DDR、LPDDR、eMMC、UFS、eMCP、uMCP 存储器的区别

eMMC=Nand Flash+控制器(Controller)+标准封装UFS=eMMC的进阶版eMMC:半双工模式UFS:全双工模式eMCP=eMMC+LPDDR+标准封装uMCP=UFS+LPDDR+标准封装。

2023-11-16 20:22:55 974

原创 使用 ROS 的几个注意事项

sudo rosdep init && rosdep update 时,提示 “rosdep: command not found”。因为使用的zsh,如果直接使用以下命令,解决方式:老老实实安装 rosdep。

2023-11-09 10:44:26 199

原创 知识蒸馏(Knowledge Distillation)简述

被广泛用于模型压缩和迁移学习当中。开山之作应该是。这篇文章中,作者的动机是找到一种方法,把多个模型的知识提炼给单个模型。这里的蒸馏针对的是神经网络的知识。一般认为模型的参数保留了模型学到的知识,因此最常见的迁移学习的方式就是在一个大的数据集上先做预训练,然后使用预训练得到的参数在一个小的数据集上做微调(两个数据集往往领域不同或者任务不同例如先在 ImageNet 上做预训练,然后在 COCO 数据集上做检测。在这篇论文中,作者认为可以将模型看成是黑盒,知识可以看成是输入到输出的映射关系。

2023-10-17 15:05:50 346

原创 NEON优化:性能优化经验总结

NEON 技术是用于系列处理器的先进 SIMD(单指令多数据)架构。它可以加速多媒体和信号处理算法,如视频编码器/解码器、2D/3D图形、游戏、音频和语音处理、图像处理、电话和声音。寄存器被认为是相同数据类型元素的向量数据类型支持:带符号/无符号888位,161616位,323232位,646464位,ARM323232位平台上的单精度浮点数,ARM646464位平台上的单精度浮点数和双精度浮点数。指令在所有通道中执行相同的操作。

2023-09-27 19:59:06 1390 1

原创 CMake 官方完整版

假设,出于教学的目的,我们决定不使用平台log和exp函数,而是希望生成一个预先计算值的表,以便在mysqrt函数中使用。在本节中,我们将创建表作为构建过程的一部分,然后将该表编译到我们的应用程序中。首先,让我们删除中对log和exp函数的检查。然后从mysqrt.cxx中删除对HAVE_LOG和HAVE_EXP的检查。同时,我们可以删除。在子目录中,有一个名为的新源文件被提供来生成表格。检查完文件后,我们可以看到表是作为有效的 C++ 代码生成的,并且输出文件名作为参数传入。下一步是创建。

2023-09-26 15:35:10 672

原创 nvidia-smi 命令详解

是一种命令行实用程序,用于监控和管理 NVIDIA GPU(图形处理器)的状态和性能。它提供了一种简单而强大的方式来获取有关 GPU 的实时信息,并且可以用于诊断、优化和管理 GPU 资源。

2023-09-09 14:36:24 1264

原创 错误日志:Got permission denied while trying to connect to the Docker daemon socket

比如在运行docker ps时会出现题目所述报错,

2023-09-08 16:16:03 459

原创 自动驾驶中间件

中间件是一类提供系统软件和应用软件之间连接、便于软件各部件之间的沟通的软件,应用软件可以借助中间件在不同的技术架构之间共享信息与资源、中间件位于客户机服务器的操作系统之上,管理着计算资源和网络通信。中间件是软件;系统软件和应用软件之间、软件各部件之间;管理客户机与系统软件之间的计算资源和网络通信;中间件为应用软件服务、应用软件为最终用户服务,最终用户并不直接使用中间件。

2023-09-06 16:15:45 811

原创 错误日志:Solving environment: failed with initial frozen solve. Retrying with flexible solve.

文章所说,这里的理解是:现在安装的包,其所依赖的环境有点难解决。什么叫难解决,比如现在这个包依赖很多包,然后这些被依赖的包版本都不满足要求,有的可能需要更新,有的可能你又安装过高了,需要安装更低版本,但是如果你安装更低版本,依赖这个包的一些包又会不舒服。因为是在科学上网的方式下进行的,所以不存在需要切换源的问题。网上别人写的的基本没用。耗时耗力,非常可恶。

2023-09-06 11:36:46 16710

转载 Linux 下的进程间通信

共享文件共享内存(通过信号量)管道(命名和无名)消息队列套接字信号甚至在今天,在以线程为中心的语言,例如 Java、C# 和 Go 等变得越来越流行的情况下,IPC 仍然很受欢迎,因为相比于使用多线程,通过多进程来实现并发有着一个明显的优势:默认情况下,每个进程都有它自己的地址空间,除非使用了基于共享内存的 IPC 机制(为了达到安全的并发,竞争条件在多线程和多进程的时候必须被加上锁),在多进程中可以排除掉基于内存的竞争条件。

2023-09-03 23:27:13 84

原创 nvidia-smi nvcc -V 及 CUDA、cuDNN 安装

注意,这个步骤如果前面安装了 Driver,即步骤1内显示了版本时,这里不要安装 Driver,否则这里的 CUDA 会安装失败。在下载 PyTorch 时,这里的 Compute Platform 是运行的平台,这里是不包括 CUDA 安装的。的结果除了有 GPU 驱动版本型号,还有 CUDA Driver API 的型号,即上面的 12.0。(这里我的.run软件不小心删了,拿的别人的,所以除了版本均一致)的时候,默认安装的与该 CUDA 相同版本的 PyTorch。的错误,有些摸不着头脑。

2023-09-02 16:34:00 3747 3

原创 硬件性能评估指标-DMIPS、MFLOPS、MAC、TOPS

FLOPS主要用于评估计算机在科学计算、图形处理、模拟等需要大量浮点数运算的应用中的性能。因为DMIPS指的是每秒处理几百万指令-Million Instructions。也有1.5GHz的,由厂家设置,因为功耗之类的原因?FLOPS用于衡量计算机系统的浮点数运算性能,因为信号处理计算一般都是乘加计算。,如加法、乘法和除法。

2023-09-01 19:55:31 5514 2

原创 SSE 指令集

这是一个typedef语句,它创建了一个新的数据类型别名__m128_u,它被定义为float类型。: 这是GCC(GNU Compiler Collection)的属性语法,用于为__m128_u类型添加一些属性。(16): 这个属性指定了该类型的大小为 16 字节(128位),这使得 __m128_u 可以在一个128位寄存器中存储。may_alias: 这个属性告诉编译器,指针类型可以别名为 __m128_u,这是因为这种类型的别名可能会导致一些类型别名的规则和内存别名的优化问题。

2023-09-01 16:14:01 859

原创 C++ 编译器优化与SIMD指令集

刚才提到了 xmm 这个系列的寄存器,它们都有128128128位宽,可以容纳444个 float 或者222个 double。刚才的例子中,因为只有一个 float 存在一个128128128位的寄存器内,所以只用到了它最低的323232位。但是这样也没问题,因为我们刚才说的是,addss 它只会加最低位。这就要说到下一节将提到的 addss 了。刚才提到外部函数会让编译器无法优化,但如果是内部函数呢?内部函数是声明和定义在同一个文件,就是它定义在 func 调用它的相同文件。

2023-08-23 14:48:26 1696

原创 C++11 emplace_back 和 push_back

参数 args 被传递给内存分配函数,而内存分配函数将其展开,并使用接收三个参数的 Items 构造函数(#2),而不是默认构造函数(#1)。),这里将展开为 Items(8.2, 2.8, 3)。还可以注意的一点是,如果 MyObject 没有定义移动构造函数,编译器将使用复制构造函数。接下来,构造函数 Items() 创建一个临时 Items 变量,该对象被复制到 vt 的开头,然后被删除。与移动语义一样,就地创建旨在提高效率。在矢量中就地创建所需的对象,而不是创建一个临时变量,再将其复制到矢量中。

2023-08-07 11:42:58 194

原创 特征检测StarDetector:CenSurE: Center Surround Extremas for Realtime Feature Detection and Matching

文章提出了一套尺度不变的中心环绕极值检测器(),并在稳定性(视点变化时的特征的持续性)和准确性(视点变化时特征的一致定位)上做了评估。

2023-07-29 15:34:20 234

原创 GoogleTest 官方文档

GoogleTest 是 Google 的 C++ 测试和模拟框架。

2023-07-20 20:05:40 435

转载 C++17 并行STL算法

表t22.2列出了标准中支持的所有不需要修改就可以并行运行的算法。无限制的并行算法(和“搜索器”一起使用时除外)fill()generate()无并行版本的算法search()(和“搜索器”一起使用时)注意对于为了并行地运行,使用reduce()或者。为了并行地运行,使用...scan()算法。为了并行地运行,使用。表t22.4列出了标准支持的所有只需要进行一些修改就可以并行运行的算法。算法限制for_each()返回类型void、前向迭代器前向迭代器(新)前向迭代器前向迭代器。

2023-07-19 10:05:09 1294

原创 Ceres-Solver 官方文档-其二

像所有基于梯度的优化算法一样,Ceres Solver 依赖于能够评估目标函数及其在其域中任意点的导数。实际上,在使用 Ceres Solver 求解优化问题时,定义目标函数及其雅可比矩阵是用户需要执行的主要任务。应该使用这三种方法中的哪一种(单独使用还是组合使用)取决于情况和用户愿意做出的权衡。不幸的是,数值优化教科书很少详细讨论这些问题,用户只能自己摸索。本文的目的是填补这一空白,并在 Ceres Solver 上下文中详细描述这三种方法中的每一种,以便用户能够做出明智的选择。

2023-07-10 17:37:45 393

Obstacle Detection for Self-Driving Cars

Obstacle Detection for Self-Driving Cars Using Only Monocular Cameras and Wheel Odometry

2020-08-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除