- 博客(372)
- 收藏
- 关注
原创 8. 循环神经网络
高级API提供了循环神经网络的实现。我们构造一个具有256个隐藏单元的单隐藏层的循环神经网络层rnn_layer。事实上,我们还没有讨论多层循环神经网络的意义(这将在 9.3节中介绍)。现在仅需要将多层理解为一层循环神经网络的输出被用作下一层循环神经网络的输入就足够了。# 输入维度,隐藏层(注意不是输出层)维度我们使用张量来初始化隐状态,它的形状是**(隐藏层数,批量大小,隐藏单元数)**。(注意这里相比前面从零开始实现,多了一个隐藏层数)通过一个隐状态和一个输入,我们就可以用更新后的隐状态计算输出。
2024-12-01 17:50:15
1351
原创 6. 卷积神经网络
例如,如果我们拍摄黑白之间轮廓清晰的图像X,并将整个图像向右移动一个像素,即Z[i, j] = X[i, j + 1],则新图像Z的输出可能大不相同。多输入通道:输入是 (C, H, W),则卷积核的大小需要是 (C, h, w), 也就是通道数必须相同,然后计算卷积的时候是把所有通道的卷积结果加起来,得到一个通道的输出。多输出通道:在最流行的神经网络架构中,随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。和下面公式中的不一样,这里是指一半的填充。
2024-11-30 09:06:12
667
原创 5. 深度学习计算
自定义层的时候,把参数设置为 nn.Parameter 的好处:自动优化:当一个张量被封装为 nn.Parameter 时,它会自动被添加到模型的参数列表中(即 model.parameters())。在调用优化器(如 torch.optim.SGD 或 torch.optim.Adam)时,优化器会遍历这些参数并更新它们的值。设备一致性:将张量转换为 nn.Parameter 后,可以确保这些参数与模型的其他部分一起被移动到指定的设备(CPU 或 GPU)。
2024-11-30 09:05:56
1065
原创 4. 多层感知机
当你设置 retain_graph=True 时,PyTorch 不会在 .backward() 调用后释放计算图,而是保留它,以便你可以再次在这个图上调用 .backward()。默认情况下,当 .backward() 被调用后,计算图会被标记为“已使用”(即梯度已被计算),随后如果再次尝试在这个图上调用 .backward(),PyTorch 会抛出一个错误,因为它认为图已经被“消费”过了,不应该再被使用。然而,在某些情况下,你可能需要在同一个图上多次调用 .backward()。
2024-11-21 09:33:12
879
原创 3.线性神经网络
生成器函数是一种特殊的函数,它允许你逐个生成值,而不是一次性返回一个完整的列表或集合。这样做的好处是可以节省内存,特别是在处理大量数据时,因为你可以按需生成数据,而不是一次性将所有数据加载到内存中。由于yield的使用,data_iter函数不会一次性执行完毕并返回一个结果,而是每次调用时返回一个批次的数据,并在下次调用时从上次停止的地方继续执行。使用生成器的好处之一是它们允许你以一种懒加载(lazy loading)的方式处理数据,即只在需要时才生成数据。
2024-11-19 09:37:50
937
原创 2.预备知识
然而,虽然这些更奇特的对象确实出现在高级机器学习中(包括深度学习中), 但当调用向量的反向计算时,我们通常会试图计算一批训练样本中每个组成部分的损失函数的导数。这里,我们的目的不是计算微分矩阵,而是单独计算批量中每个样本的偏导数之和。例如,假设y是作为x的函数计算的,而z则是作为y和x的函数计算的。想象一下,我们想计算z关于x的梯度,但由于某种原因,希望将y视为一个常数, 并且只考虑到x在y被计算后发挥的作用。这里可以分离y来返回一个新变量u,该变量与y具有相同的值, 但丢弃计算图中如何计算y的任何信息。
2024-11-19 09:11:43
852
原创 NeRF资料整理
这个写的很详细,写的也很好,比较清楚的解释了为什么要使用NDC空间,其实就是因为对于实际场景来说它的深度范围是比较难确定的,渲染的时候需要从0到正无穷的深度进行渲染,显然这样无法在代码中进行确定区间的采样,而NDC空间使用坐标变换的方式可以将这个范围变换到[0,1]之间,从而变成一个有界的采样。:这个写的非常好,其中解释了Colmap、LLFF、OpenGL等多种坐标系的区别,如下图所示。唯一的遗憾就是没有讲解NDC空间。:nerf_pl代码中推荐的空间变换的参考,进去看了一下英文写的比较难懂。
2024-01-20 13:47:44
697
原创 DSO 系列文章(3)——DSO后端正规方程构造与Schur消元
DSO代码注释:https://github.com/Cc19245/DSO-CC_Comments
2023-08-20 15:43:22
928
1
原创 DSO 系列文章(1)——DSO系统预处理
而这些全局变量就是对图像建立合适的金字塔,并且计算每一层上的图像宽高、相机内参(即从这层直接反投影到有效归一化平面范围所需要的参数)。(3)输出图像、输入图像与有效归一化平面范围之间的投影关系都知道了,就可以建立输出图像上的像素对应哪个输入图像上的像素,也就是。上面的步骤都是一些预计算量,是对图片进行预处理使用的,对图片预处理之后就无用了,所以负责求解的。,这个很简单,就是把gamma响应函数、渐晕图片读出来,存到类的成员变量中。,然后会把上面创建的相机畸变模型中的光度非线性响应拷贝给它的相机成员变量。
2023-08-20 15:34:22
355
1
原创 VINS-Mono中的边缘化与滑窗 (4)——VINS边缘化为何是局部变量边缘化?
题目想问的问题是VINS 滑窗边缘化时构造舒尔补的H矩阵是由和边缘化掉的状态变量相关的局部变量构成还是由全局变量构成?如下图所示,小车沿着一维方向运动,车上有一个单点激光测距仪可以观测前方的一个路牌,小车轮子上装有码盘。现在让小车从原点出发,维持滑窗的长度为3,并且每次优化都迭代3次。定义此时系统估计的状态变量为(P0,P1,P2,L)(P_0, P_1, P_2, L)(P0,P1,P2,L),其中3个坐标位置和滑窗有关,会随着滑窗的滑动逐渐改变。则此时系统中的各个残差和雅克比如下:r0=6.0
2023-08-20 14:42:27
492
2
原创 docker使用与服务器上的可视化(ROS rviz等)
按照官网命令一步步来即可。添加当前用户到docker用户组,后面运行docker的时候前面不需要加sudo。
2023-06-09 10:18:43
5122
1
原创 VINS-Mono中的边缘化与滑窗 系列文章
本文是 VINS-Mono中的边缘化与滑窗 系列文章,主要是逐步分析了 VINS-Mono中的滑窗边缘化的代码和原理。
2023-03-13 14:09:02
352
原创 VINS-Mono中的边缘化与滑窗 (3)—— 边缘化倒数第二帧及滑窗优化
注意:这一步骤就是滑窗操作的精髓所在!之前我们已经把本次非线性优化、边缘化最老帧的相关计算完成了,但是实际存储在滑窗中的状态变量还没有进行滑窗操作,所以上面依次交换前后两帧,将滑窗中的所有帧都向前移动了一个位置,然后滑窗中的最老帧被抛弃掉了。此时我们会发现滑窗中的最后一个位置变成了最老帧,显然这个是不正确的。实际上我们应该把滑窗中最后一个位置的状态清空,然后等待这下一帧图像的到来,继续处理。
2023-03-13 13:34:55
1371
原创 VINS-Mono中的边缘化与滑窗 (2)—— 边缘化最老帧
如图所示,第一帧的位姿T1T_1T1和速度零偏B1B_1B1是通过IMU预积分约束和滑窗中的最老帧存在约束关系的。因此和最老帧有关的IMU预积分约束包含的参数块是T0,B0,T1,B1T_0, B_0, T_1, B_1T0,B0,T1,B1,要边缘化掉的参数块是T0,B0T_0, B_0T0,B0。代码如下:在函数中,会用一些类变量将上面构建的残差信息块存储起来:第1234帧的 位姿TiT_iTi 是通过视觉重投影和最老帧联系在一起的,此外视觉重投影中还包括IMU和相机外参TicT_{
2023-03-13 12:27:49
1682
3
原创 VINS-Mono中的边缘化与滑窗 (1)—— 边缘化概述
边缘化操作的意义从概率上看就是根据联合概率分布求边缘概率分布,如下为概率论中的定义:所以边缘化的操作就相当于在要被边缘化掉的那个状态上进行积分,把它从概率密度函数中消除掉,但是它的概率信息通过积分仍然保留在了边缘化之后的概率密度中,从而没有损失任何信息。
2023-03-13 11:37:21
936
原创 VIO优化中不客观自由度 (gauge freedom) 的处理 (gauge handle)
第0帧就是在先验观测0的位置,那么只需要把这个先验观测的协方差矩阵设置的非常小,也就是信息矩阵(权重)设置的非常大,这样优化状态离先验观测稍微偏离一点就会造成非常大的误差项,从而最后会把第0帧的优化状态固定在先验的位置。,比如GPS观测,有明确的协方差矩阵,那么就可以把它作为先验融合到滑窗优化中,这样滑窗中第0帧位置可能会发生变化,但是此时就是需要让它有变化,因为我们已经有先验了,需要来修正这个状态。,但是求解之后给变量赋值的时候,是让第滑窗中第0帧的4-DOF保持不变,也就是认为第0帧的状态不发生改变。
2023-03-11 15:31:10
1276
1
原创 IMU 积分的误差状态空间方程推导
本文推导的是 IMU 积分的误差状态空间方程,预积分的推导要比积分复杂,但是推到方法和本文是一样的,因此这里只给出积分的推导方式。另外,本文的推导方式参考了中给出的推导,这种方法是基于李群李代数使用全增量的方法计算误差状态空间方程,非常好理解。名义状态xx:估计出来的状态,真正能算出来的状态;真实状态x\mathbf{x}x:无法计算出来的状态,永远不知道的状态,只能用公式表示出来;误差状态δxδx:真实状态x\mathbf{x}x与 名义状态xxxxδxxxδx。
2023-03-11 15:09:06
1251
原创 Kalman Filter in SLAM 系列文章
此外,在 SLAM 中最常应用的还有 IMU,其中最复杂的是 IMU的运动学方程,不论是滤波法还是优化法都会使用到它,因此本系列文章也会给出。但是由于想推导这两个算法,必须实现知道所依赖的基础的 Kalman Filter 变种算法,因此本系列文章从最基础的经典。及其各种变种,最终目的是推导目前最常用的。的推导,以及状态变量选择为误差状态时的。开始,逐步推导其他变种的算法。本系列文章详细推导和解释了。
2023-03-09 17:58:10
1307
原创 Kalman Filter in SLAM (7) ——Error-state Iterated Kalman Filter (EsIKF, 误差状态迭代卡尔曼滤波)
实际就是把和两个结合起来了,并且如果从本质上来说它就是个迭代卡尔曼滤波 IEKF,只不过是的。
2023-03-09 17:52:02
2969
原创 Kalman Filter in SLAM (6) ——Error-state Kalman Filter (EsKF, 误差状态卡尔曼滤波)
这里先说一句:什么误差状态卡尔曼?完全就是在扯淡!回想上面我们推导的IMU的误差状态空间方程,其实如果后面我们是使用优化的方法,而不是使用滤波的方法,那么推导完IMU的误差状态空间方程就可以了。因为上面我们已经说了,IMU的误差状态空间方程和状态空间方程的协方差矩阵是完全一致的。所以后面如果是使用优化的方法,那么就可以使用误差状态空间方程得到的协方差矩阵作为IMU积分值的置信度了。但是如果我们是要使用滤波的方法呢?那么就要使用基于误差状态(而非状态)的卡尔曼滤波了,也就是我们这里说的误差状态卡尔曼滤波。
2023-03-09 17:34:25
1641
原创 Kalman Filter in SLAM (5) ——IMU Intergration and State Space Representation (IMU积分和状态空间表示)
对于旋转状态有两种表示方式,分别是四元数 qqq 和旋转矩阵 RRR。可以使用这两种中的任意一种表示姿态,比如 VINS-Mono 中用的是四元数,而 FAST-LIO 中用的是旋转矩阵。它们的导数和积分如下计算:q˙=q⊗[012ω]q=q⊗[112ωδt]\dot{q} = q\otimes\begin{bmatrix} 0\\ \frac{1}{2}\omega \end{bmatrix} \qquadq = q\otimes\begin{bmatrix} 1\\ \frac{1}{2
2023-03-09 16:58:25
736
原创 Kalman Filter in SLAM (4) ——Iterated Extended Kalman Filter (IEKF, 迭代扩展卡尔曼滤波)
由于非线性模型中做了线性化近似,当非线性程度越强时,误差就会较大,但是由于线性化的工作点离真值越近, 线性化的误差就越小,因此解决该问题的一个方法是,通过迭代逐渐找到准确的线性化点,从而提高精度。 在EKF的推导中,其他保持不变,仅改变观测的线性化工作点,则有g(xk,nk)≈yop,k+Gk(xk−xop,k)+Cknk\boldsymbol{g}\left(\boldsymbol{x}_{k}, \boldsymbol{n}_{k}\right) \approx \boldsymbol{y}_{\ma
2023-03-09 16:05:53
2286
2
原创 Kalman Filter in SLAM (2) ——Derivation of Kalman Gain and Covariance Matrix (卡尔曼增益和协方差矩阵推导)
【卡尔曼滤波器】_Kalman Filter_全网最详细数学推导
2023-03-09 15:38:53
486
原创 Kalman Filter in SLAM (3) ——Extended Kalman Filter (EKF, 扩展卡尔曼滤波)
系统状态空间方程:xk=Axk−1+BUk−1+wk−1P(ω)∼N(0,Q)zk=Hxk+HkP(v)∼N(0,R)\begin{array}{ll}x_k=A x_{k-1}+B U_{k-1}+w_{k-1} & P(\omega) \sim N(0, Q) \\z_k=H x_k+H_k & P(v) \sim N(0, R)\end{array}xk=Axk−1+BUk−1+wk−1zk=Hxk+HkP(ω)∼N(0,Q)P(v)∼N(0,R)预测:x^k−=Ax^
2023-03-09 15:27:23
873
2
原创 Kalman Filter in SLAM (1) ——Data Fusion and Kalman Filter(数据融合和卡尔曼滤波)
状态方程做预测:根据上一时刻的状态和系统状态空间方程,对当前时刻的状态做预测,同时会更新当前预测的状态的协方差矩阵:观测方程做更新:首先计算 Kalman Gain,然后把它当做权重融合预测状态和观测值,得到系统的最优估计。可以看到,这里预测值是系统状态,观测值是传感器直接的观测量,所以Kalman Gain 是有量纲的,而且它的量纲和H−1H^{-1}H−1量纲是一样的。
2023-03-09 14:44:57
1172
1
原创 Ubuntu18安装新版本PCL-1.13,并和ROS自带PCL-1.8共存
的,这个时候虽然编译可以通过,但是运行的时候会出错。下,最后链接pcl的库的时候会默认链接到这个路径下的库,也就是自己新安装的。的问题比较难解决,但是一般我们安装pcl都是为了一些新特性的算法,而。:因为这里我们安装到用户家目录下的,而非根目录下,所以不用。下,而是安装到自己的用户目录下,然后特殊的工程需要使用。注意这里最好不要安装到系统根目录下,也就是默认的。下,因为经过我测试发现在自己的电脑上,如果安装到了。就是可视化相关的,所以不要这部分也可以。下,其他工程都会优先链接到这个版本的。
2023-03-07 14:05:53
4315
2
原创 贝塞尔曲线与B样条曲线
这个视频讲的很好,尤其是对样条曲线的两种理解方式上,会对后面B样条曲线性质的分析有很大的帮助。本文在前面的部分也会较多的参考这个视频中讲解的内容。但是视频后面讲解B样条曲线的时候稍微简略了一点,因此本文给出我自己的理解。
2023-03-06 20:56:01
3547
1
原创 LVI-SAM坐标系外参分析与代码修改,以适配各种数据集
天下苦LVI-SAM外参久矣!LVI-SAM是LIO-SAM和VINS-Mono的结合体,LIO-SAM和LVI-SAM作者使用的是同一套传感器设备,但是外参配置晦涩,导致让很多人都不知道如果换了数据集或者自己的设备,该如何设定外参数,而且基本上换了数据集全部都跑不下来。导致这一状况的有多个原因作者使用的IMU比较特殊:四元数输出的不是按照IMU坐标系的z/y/x轴动态旋转得到的,所以文件中有两个外参。但是一般来说大多数IMU这两个应该是对应的,此时这两个外参数就是互为转置的关系。
2022-12-16 21:24:44
10061
58
原创 利用ROS中image_transport将sensor_msgs/CompressedImage转为sensor_msgs/Image
利用ROS中image_transport将sensor_msgs/CompressedImage转为sensor_msgs/Image
2022-12-03 16:49:46
2166
原创 力扣hot100——第6天:32最长有效括号、33搜索旋转排序数组、34在排序数组中查找元素的第一个和最后一个位置
参考:力扣题目链接;题解1,题解2这道题目官方的题解讲解的就非常清除了,现在摘录如下:注意:注意dp数组的定义,一定是以为结尾的字符子串,也就是必须包含。尤其注意第二种情况,也就是的时候,此时当前的无法跟匹配直接构成一个有效的字符子串,所以需要到前面去寻找,看是否有和它匹配的。所以问题就变成,我该去前面的什么位置寻找呢?肯定不能随便选一个的位置就和他匹配,因为这样会导致这个匹配的和当前的之间的字符串不一定是合法的括号字符子串。所以我们寻找之前的的前提就是先让中间的字符串是一个合法的字符子串。也就是先去考虑的
2022-12-03 11:36:33
539
原创 力扣hot100——第5天:22括号生成、23合并K个升序链表、31下一个排列
所以这里需要一个死循环,然后在循环里面判断当前选择的节点,如果当前没有选择到有效节点,说明所有的链表都是空了,则说明所有的链表都遍历完毕了,可以跳出循环了。其实这道题目和昨天的合并两个升序链表思路基本是相同的,只不过由于有多个链表,所以代码中寻找当前位置的最小节点的时候需要一个for循环来判断所有的节点,从而寻找一个最小的节点。这道题目是使用递归的方法来求解,因为要求解所有的括号的可能情况,所以必须使用递归的方法来收集结果,而不能使用动态规划的方法。不同的当前节点决定了它后面展开的子树也是不同的。
2022-12-02 23:33:00
513
原创 力扣hot100——第4天:19删除链表的倒数第N个节点、20有效的括号、21合并两个有序链表
这道题目其实很简单,因为两个链表都是已经排序好的,结果只需要同时遍历两个链表的节点,然后判断那个数值更小,然后就选择哪个节点即可。然后再继续往后遍历后面的节点。:这道题目总记得非常熟悉,实际上有一道相加两个链表的节点的题目,跟这道题目非常像。需要注意的是,这里要使用一个虚拟头节点来引导生成的链表,这样更方便编程。
2022-12-02 23:31:04
159
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人