空间导航数学基础
.small-img {
width: 400px;
}
前言
空间导航方式分为相对导航Relative Navigation和迷失空间导航Lost in Space,相对导航需要依靠其他传感器取得的估计位置信息和姿态信息,依据当前传感器获取的信号完成精调的位姿解算。而迷失空间导航不需要任何初始信息,传感器能够从当前取得的传感信号中独立地解算载体的姿态和位置,具有自主性、无累计误差,是深空探测的必要方式(无论哪种方式,深空探测器都必须要有一种迷失空间导航的传感器,以避免在失去遥测信号后也能够独立地判断当前位置,并与地面站建立联系)。
迷失空间导航
迷失空间导航除了需要当前获取的传感器信号以外,还需要预先存储先验信息,这些先验信息如同人的记忆一样,提供了与导航位置相关的检索目录,传感器通过搜索当前信号与检索目录中信息的匹配程度,获取最可能的目录索引,由此可解算出当前载体最可能的位姿信号,从而完成导航定位。这其中,当前最稳健的导航方式是地形匹配导航,而不变量导航是地形匹配导航中的一种。
陨石坑不变量导航
地外天体最常用、最显著的特征就是其遍布全球的陨石坑,与星表一样,陨 ...
24年8月进展
8月以来经历了暑假放假,中间迷惘一周,大致于8月16号之后才正式进入状态。
第一篇文献
Event-Based Motion Magnification
解决的问题
本文将事件相机用于高速摄影,本质上仍然是一种新型的事件流插帧方式,解决了在高频振动测量领域的高速摄影问题。
主要内容
非最新的事件流插帧算法往往不能处理高频振动这种具有典型周期性的特征,其重建结果难以准确描述高频振动的音叉边缘外形,作者利用事件相机的高速摄影性能,将音叉的高频振动用事件流的放大。使用事件流重建图像时,使用了事件的对数微分性质,因此重建图像时将其积分后求指数,即有:
I(u)=I0(u)exp(c∫t0τp(u,t))I(\mathbf{u})=I_0(\mathbf{u})\exp\left(c\int_{t_0}^\tau p(\mathbf{u},t)\right)
I(u)=I0(u)exp(c∫t0τp(u,t))
其中u\mathbf{u}u是图像III的某个位置,τ\tauτ是插帧时刻。利用上式,可以在一阶近似的意义下解出高频振动场的像素亚像素精度运动,该部分原理构成了下图网络中的SRP ...
部分经典算法推导
前言
经常在论文中看到一些熟悉又陌生的算法名,例如EM,例如GMM,HMM等等,这些算法好像都是知道个大概,但是要我自己去实现,感觉总是这里缺先验那里缺先验,不能完整地复述出来,就是不是自己的东西,有必要像矩阵求导那样,推导一个完整的式子来。
期望最大化算法
英文原名:Expectation-Maximization,缩写名:EM
问题描述
给定某个概率分布X\mathcal{X}X的系列观测值X(θ)X(\theta)X(θ),其中θ\thetaθ是某个未知的,需要被优化的参数,现假设待观测值Z XZ~\mathcal{X}Z X,参数估计要求算法使得似然函数L(θ;X)L(\theta;X)L(θ;X)取得最大值。即使得在出现观测值XXX的概率最大:
L(θ;X)=p(X∣θ)=∑z∈Zp(X,Z∣θ)zL(\theta;X)=p(X|\theta)=\sum\limits_{z\in\mathcal{Z}}p(X,Z|\theta)z
L(θ;X)=p(X∣θ)=z∈Z∑p(X,Z∣θ)z
算法核心
由于不能直接得到隐变量θ\thetaθ的值,且随机变量ZZZ的分布情况也未知, ...
数学概念表达
前言
这里记录一下学习过程中遇到的一些数学记号及其对应性质,在下次遇到后可以直接使用不至于陌生。对于成体系的数学记号,则单独归纳为一篇博客。
KL散度
参考自:KL散度
英文名:Kullback-Leibler divergence,是一种用于衡量两个概率分布之间差异的指标,其定义为:
DKL[P(x)∣∣Q(x)]=∑x∈XP(x)ln[P(x)Q(x)]D_\mathrm{KL}[P(x)||Q(x)]=\sum\limits_{x\in\mathcal{X}}P(x)\ln\Big[\frac{P(x)}{Q(x)}\Big]
DKL[P(x)∣∣Q(x)]=x∈X∑P(x)ln[Q(x)P(x)]
KL散度描述的是使用概率分布Q(x)Q(x)Q(x)来描述分布P(x)P(x)P(x)的编码损失,其性质是非负的、仿射不变的且非对称的。
期望记法
在文献Auto-Encoding Variational Bayes和Denoising Diffusion Probabilistic Models等中经常见到的一种表达式,例如:Eq[∙]\mathbb{E}_q[\bulle ...
SNN初见
前言
事不宜迟,看完的文献总是浅尝辄止,没有总结吸收,还不是自己的东西。积土成山,风雨兴焉!
脉冲
神经元之间通过神经冲动传递信号,脉冲是神经冲动的数学模型。在时域上一连串脉冲组成的冲激函数串称为脉冲序列或者脉冲串spike train[1]。
脉冲序列
通常以冲激函数串表示脉冲序列,则在不同时间处的脉冲组成的脉冲串记为A=∑i=0∞δ(t−ti)A=\sum\limits_{i=0}^{\infty}\delta(t-t_i)A=i=0∑∞δ(t−ti)。
脉冲序列的描述
表征脉冲序列的物理量是活动频率firing rate,缩写为FR,其原始定义为单位时间内的脉冲数目,即:
FR(t)=limΔt→0N(t,t+Δt)Δt\mathrm{FR}(t)=\lim\limits_{\Delta t\rightarrow 0}\frac{N(t,t+\Delta t)}{\Delta t}
FR(t)=Δt→0limΔtN(t,t+Δt)
这一定义式仅具有理论意义,不具有工程实践的价值,因此常用单位时间内的脉冲频率表示FR,在大量样本数据情况下,脉冲频率近似等于脉冲概率,即:
...
从零开始实现扩散模型
前言
关于扩散模型的数学基础性的知识,可以参照原始论文[1]和[2];亦可以参考本文相关的DDPM的博客、DDIM的博客以及条件扩散模型。本文主要讲述如何使用Python作为脚本语言,从零开始实现扩散模型的工程问题,参考论文LDM[4]提供的源代码,使用pytorch-lightning框架完成扩散模型的训练和推理。
代码
本文的全部代码在gitee仓库中开源,见于此处。目前正在整理,后续将整理结果发布于github上。
TODO
[x] 一个便于复用的DDPM框架。
[ ] 一个便于复用的DDIM框架。
[ ] 一个便于复用的LDM框架。
扩散模型——从入门到入土
本博客计划使用pytorch-lightning搭建整个扩散模型的训练框架和数据加载器,并使用此模型完成推理。
DDPM基本框架
实现DDPM也将分为训练和推理两个部分的内容单独处理。首先需要将全部使用的参数,如αt,βt,αˉt\alpha_t,\beta_t,\bar{\alpha}_tαt,βt,αˉt等等都提前保存下来,在某个模型中,它们全部是定值,不能学习。设self.denoiser是本模型所使用的去 ...
pytorch-lightning使用心得
前言
这是啥?从未见过,甚至一来还屡出Bug,我差点就想把这个模块完全给删了。
真是不用不知道,一用吓一跳,好吧,原来这个东西竟然是基于torch构建的一个顶层/分布式/工作流/工具集的究极糅合框架,极大方便了用户的使用,可以说是赛博炼丹师的必学框架。
你最好是真的方便了使用
本框架的核心工作流是从yaml文件不经过显式的模型构建,直接将配置文件实例化得到待训练网络,分离网络构建和数据预处理,然后使用Trainer.fit(model, data)完成隐式的网络训练主流程,对新手不是很友好,因为直接通过Type checker往往不能定位到函数的地址。
使用体验
初次上手这个玩意,我感觉极难用。
再一次接触它时,我似乎多了一些感觉,它确实有存在的意义。
一些说明
本框架作为对Pytorch的上层封装,确实在一定程度上方便了用户的使用,在2021年以前主流的版本是pytorch-lightning 1.4版本,包括latent-diffusion在内的大模型框架都使用的是1.4版本,而在2021年8月后,pytorch-lightning迎来了一波大的更新,直接将版本号从1.4更新 ...
24年7月进展
第一篇文献
Diffusion Models for Implicit Image Segmentation Ensembles
解决的问题
本文是将扩散模型应用于高层次视觉任务——分割的一次有益尝试,使用了非常简单的训练框架,即可将扩散模型的生成能力应用于医学图像分割任务中。
主要内容
文章其实并没有在框架、算法上有所创新,其使用了非常简单的一种处理方式,将分割模板与待分割的灰度图像直接按通道拼接在一起,然后送入噪声估计器中,直接对模板估计噪声,而图像保持不变。算法上如下式:
{Xt←b⊙xb,txb,t←1αˉt[xb,t−1−αt1−αˉtϵθ(Xt,t)]+σtz\left\{\begin{aligned}
X_t &\leftarrow b\odot x_{b,t}\\
x_{b,t} &\leftarrow \frac{1}{\sqrt{\bar{\alpha}_t}}\left[x_{b,t}-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_\theta\left(X_t,t\right)\right] ...
vscode远程误删除恢复
写在前面
惊险一刻!今天在调试项目的时候,不经意间把一个非常重要的文件夹lunar_crater给误删除了。
里面装的是我整整一个学期的成果啊!!!!!!
非常要命,当时就感觉天塌了。赶紧用远程桌面,怀着最后的一点希望查看回收站……,空空如也。
然后再怀着心如死灰的希望去查看了~/.Trash和~/.local/share/Trash,发现都找不到这两个文件夹,好吧这下完蛋了。
万念俱灰之际,幸好有网友指导,得以找回误删除的文件。
数据记录位置
经此一役才发现,其实在vscode上编辑过的全部文件,都会在其服务器端有备份,该备份就是恢复误删除文件的依据,通常该备份的目录位于:
1~/.vscode-server/data/User/History
里面的文件夹命名、文件命名都是杂乱无章的,直接找是找不回来的,惟一的方法只能是全部恢复,然后再凭着记忆去一点点对比,查找最新的版本。可在该目录下,使用find命令,将全部查找结果写入至本地文件中,以便于批量恢复:
12cd ~/.vscode-server/data/User/Historyfind . lunar_crater > ...
vscode配置cmake和gdb调试C/C++项目程序
开始学习C++
实习让我熟悉了python语言,但是在处理底层源码的时候,总是囿于自己有限的C/C++能力,看不懂代码,就不能深入到底层学习,况且无论怎么样,python程序总是不能有高效的运行,除了深度学习,也找不出第二个它特别适合的应用场景了。(转码也需要了解C++)综上所述,开始学习之。
按我的使用习惯,用惯了vscode再想换其他的编辑器实在有些困难,不如就在vscode上完成这一切吧,于是需要解决的一个重要问题就是,如何使用命令行与vscode自己debugger,对一个较大的C工程文件进行联调,经过一天的摸索,总算实现了。
配置gdb和vscode进行命令行调试
gdb是经典的C/C++调试器,vscode有着美观的断点和调试界面,二者合二为一可以兼得其优点,以便于进行优雅地debug。完成这一切,需要首先安装必需的插件和软件。
前置文件安装
安装MinGW组件:MinGW是为windows系统定制的gcc,g++以及make组件,方便用户在windows系统上完成对C项目的构建与调试,安装可以参考如下链接,建议下载在线下载器(直接下载可执行文件的,可能版本过于老旧,会出 ...