
Video and 3D Vision in maths-cs-ai-compendium从光流、慢快网络到 3D 高斯溅射与 SLAM 的完整技术路线【免费下载链接】maths-cs-ai-compendiumBecome a cracked AI/ML researcher/engineer with this unconventional textbook covering maths, computing, and ML with intuition.项目地址: https://gitcode.com/GitHub_Trending/mat/maths-cs-ai-compendium本篇技术指南基于开源教材 maths-cs-ai-compendium 第 08 章的最后一节 Video and 3D Vision 展开。它回答一个核心问题当视觉从单帧快照扩展到时间轴视频与第三维3D 空间时模型如何理解运动、跟踪物体、估计深度并重建场景。读完后你将掌握光流方程的完整推导、Lucas-Kanade 从零实现、主流视频理解架构C3D/I3D/SlowFast/TimeSformer的复杂度取舍、SORT/DeepSORT/ByteTrack 跟踪的卡尔曼滤波与匈牙利匹配细节、立体/单目深度原理、NeRF 体积渲染公式与 3D 高斯溅射的光栅化加速、ORB-SLAM 三线程体系以及三套可直接运行的 JAX 编码实现光流、卡尔曼滤波、NeRF 风格体积渲染。1. 视频理解的出发点时间维建模第 08 章的前四节图像基础、卷积网络、目标检测与分割、视觉 Transformer 与生成处理的是孤立图像快照。但真实视觉世界是连续的物体在运动、场景在变化、深度真实存在。本节把计算机视觉从空间域扩展到两个新维度时间域视频视频是随时间采集的图像帧序列。以 30 FPS 计一个 10 秒的片段包含 300 帧。核心挑战是建模时间维——物体如何运动、场景如何演化、帧间信息如何关联。空间域3D恢复 2D 图像投影参见 图像基础 中的针孔相机模型与内外参中丢失的第三维得到深度、点云与场景重建。整章的技术地图可以概括为主题核心方法关键数学/机制光流Lucas-Kanade、Farneback、RAFT亮度恒常约束方程、结构张量最小二乘、4D 相关体视频理解Two-Stream、C3D、I3D、SlowFast、TimeSformer3D 卷积膨胀、双速率并行、divided attention动作识别/检测Kinetics 系基准、ActionFormer时序边界预测目标跟踪SORT、DeepSORT、ByteTrack卡尔曼滤波、匈牙利算法、外观嵌入深度估计立体匹配、MiDaS、Depth Anything$Z fb/d$ 视差几何、尺度不变损失点云PointNet、PointNet共享 MLP 最大池化置换不变性神经渲染NeRF、3D Gaussian Splatting体积渲染积分、2D splat 光栅化SLAM视觉里程计、ORB-SLAM、LOAM、VIO本质矩阵、PnP RANSAC、ICPVR/AROpenPose、MediaPipe关键点热图回归、注视点渲染2. 光流从约束方程到现代深度模型2.1 光流定义与亮度恒常假设光流Optical Flow估计两个连续帧之间像素的表观运动。对第 $t$ 帧的每个像素光流输出一个 2D 位移向量 $(u, v)$指向该像素在第 $t1$ 帧移动到的位置。结果是一张与图像同尺寸的稠密运动场dense motion field。光流的经典算法建立在亮度恒常假设Brightness Constancy上像素在运动过程中亮度不变。若第 $t$ 帧位置 $(x, y)$ 的像素强度为 $I(x, y, t)$在微小时间间隔 $\delta t$ 内移动了 $(u, v)$$$I(x u\delta t, , y v\delta t, , t \delta t) I(x, y, t)$$对其做一阶泰勒展开泰勒展开的完整背景见 函数近似再除以 $\delta t$得到光流约束方程$$I_x u I_y v I_t 0$$其中 $I_x, I_y$ 是空间梯度由 Sobel 算子计算见 图像基础 中的边缘检测一节$I_t$ 是时间梯度相邻两帧的差分。这是一个一个方程、两个未知数$u, v$的不定系统必须引入额外约束才能求解。2.2 Lucas-Kanade窗口最小二乘与结构张量Lucas-Kanade 方法假设光流在一个小窗口内如 5×5 像素保持恒定。窗口内每个像素都给出一个约束方程25 个像素产生 25 个方程、2 个未知数——这是一个超定系统用最小二乘求解正态方程见 梯度机器学习 中的线性回归一节\begin{bmatrix} u \\ v \end{bmatrix} \begin{bmatrix} \sum I_x^2 \sum I_x I_y \\ \sum I_x I_y \sum I_y^2 \end{bmatrix}^{-1} \begin{bmatrix} -\sum I_x I_t \\ -\sum I_y I_t \end{bmatrix}左边的 2×2 矩阵正是 图像基础 中Harris 角点检测所用的结构张量——同一个矩阵在角点检测和光流估计中各司其职矩阵满秩两个特征值都大纹理丰富光流可稳定求解矩阵秩亏平坦区域或纯边缘即孔径问题矩阵奇异或接近奇异窗口内无法约束运动方向求解失败。从源码实现看见本文第 9 节任务 1 的代码这正是代码里检查det ATA[0,0] * ATA[1,1] - ATA[0,1] * ATA[1,0]并仅在|det| 1e-6时才调用jnp.linalg.solve的原因——它在显式跳过病态窗口。Lucas-Kanade 对小运动效果好但当物体在帧间移动超过几个像素时即失效工程上通常配合光流金字塔多尺度降采样逐级细化来扩展大运动的处理能力。2.3 Farneback 与深度光流RAFTFarneback 方法对每个像素邻域拟合多项式展开估计出最能解释两帧变化的位移场。它输出稠密光流每个像素一个向量并能处理比 Lucas-Kanade 更大的运动。现代深度学习光流方法从帧对端到端地学习预测光流。RAFTRecurrent All-Pairs Field TransformsTeed and Deng, 2020的做法是用共享编码器提取两帧特征计算两帧所有像素对之间的4D 相关体correlation volume以 GRU 为更新算子迭代地把当前光流估计作为查询从相关体中读取对应位置的特征并修正光流迭代精化。RAFT 取得了当时 SOTA 精度并成为后续视频理解模型的标准光流骨干。3. 视频理解架构从双流网络到分治注意力3.1 Two-Stream 网络Two-Stream NetworksSimonyan and Zisserman, 2014是视频理解的早期范式一条流处理单张 RGB 帧外观流另一条处理光流帧堆叠运动流两条流在末端融合平均或拼接。其价值在于显式地把物体长什么样与物体如何运动解耦。3.2 3D 卷积C3D 与 I3D3D 卷积网络把 2D 卷积扩展到时间维卷积核尺寸变为 $k \times k \times k_t$同时跨越空间与时间维度直接学习时空特征。C3DTran et al., 2015堆叠 3D 卷积3×3×3 核证明了时间卷积无需显式光流就能学到运动特征。代价高与 2D 版相比参数量和计算量都放大 $k_t$ 倍——从参数量看一个 $k \times k$ 的 2D 核有 $k^2$ 个权重不含通道维膨胀为 $k \times k \times k_t$ 后恰好是 $k_t$ 倍。I3DInflated 3DCarreira and Zisserman, 2017走更务实的路线取预训练的 2D CNN如 Inception、ResNet把所有 2D 核膨胀成 3D——沿时间维复制权重并除以 $k_t$2D 的 $k \times k$ 核变成 3D 的 $k \times k \times k_t$ 核初始化为 $W_{\text{3D}}[:,:,j] W_{\text{2D}} / k_t$对所有时间位置 $j$。这样既把 ImageNet 预训练迁移到视频任务又补上了时间建模能力除以 $k_t$ 使各时间切片的权重总和不变保持激活方差稳定。3.3 SlowFast 网络SlowFast NetworksFeichtenhofer et al., 2019用两条不同时间分辨率的并行通路Slow 通路低帧率如每 16 帧取 1 帧处理空间分辨率高、通道多捕捉精细空间细节Fast 通路高帧率每 2 帧取 1 帧处理空间分辨率低、通道少通常只有 Slow 通路的 $1/8$捕捉快速时序变化横向连接用跨层lateral步幅卷积把 Fast 的信息融合进 Slow。设计洞察空间信息与时间信息的带宽需求不同——物体外观变化缓慢但运动可以非常快SlowFast 用双速率结构显式匹配这种不对称性。3.4 TimeSformer把注意力成本从 $O(T^2 N^2)$ 降到 $O(T^2 N^2)$TimeSformerBertasius et al., 2021把 Vision Transformer 用到视频上。直接做全时空注意力的成本不可接受$T$ 帧、每帧 $N$ 个 patch 时token 总数为 $T \times N$自注意力复杂度为 $O((T N)^2) O(T^2 N^2)$。TimeSformer 的解法是divided attention分治注意力每个 Transformer 块交替执行两种注意力——时间注意力每个 patch 只在与它相同空间位置、跨时间的 token 之间做注意力空间注意力每个 patch 只在同一帧内的空间 token 之间做注意力。两种注意力各为 $O(T^2 N)$ 与 $O(T N^2)$合计把每块成本从 $O(T^2 N^2)$ 降到 $O(T^2 N^2)$ 量级。3.5 VideoMAE 与动作识别任务VideoMAETong et al., 2022把掩码自编码器MAE见 视觉 Transformer 与生成扩展到视频。关键点是使用极高掩码比例90–95%视频的时间冗余极高相邻帧几乎相同即使掩掉大部分 patch剩余信息仍足以重建被掩部分。VideoMAE 在无标签视频上预训练 ViT 骨干再迁移到下游任务。动作识别Action Recognition是视频版的图像分类把一个片段分类到若干动作类别如跑步做饭弹吉他。标准基准包括Kinetics-400400 个动作类别约 30 万个片段Something-Something174 个细粒度动作强调时序推理把东西放上去vs从东西上拿走这类区别只有看运动才能分辨ActivityNet200 类长且未裁剪untrimmed的视频。时序动作检测Temporal Action Detection更进一步给定长未裁剪视频找出每个动作的起始时间、结束时间和类别——相当于时间域的目标检测。ActionFormer 等方法用 Transformer 处理时序特征并预测动作边界。4. 视频目标跟踪SORT、DeepSORT 与 ByteTrack视频目标跟踪在首帧识别出某个对象后让它跨帧持续跟随。4.1 SORT检测 卡尔曼滤波 匈牙利匹配SORTSimple Online and Realtime TrackingBewley et al., 2016 检测器逐帧独立检测物体卡尔曼滤波运动预测匈牙利算法匹配卡尔曼滤波为每个被跟踪对象维护状态估计位置、速度、尺寸用线性运动模型预测其在下一帧的位置。新检测到达时滤波器把预测值与观测值按各自不确定性加权组合来更新估计——这正是把 贝叶斯方法 应用到跟踪。其预测/更新两步为预测$\hat{x}^- F\hat{x}^{(k-1)}$$P^- F P^{(k-1)} F^\top Q$更新$K P^- H^\top (H P^- H^\top R)^{-1}$$\hat{x} \hat{x}^- K(z - H\hat{x}^-)$$P (I - K H)P^-$其中 $F$ 为状态转移矩阵、$H$ 为观测矩阵、$Q/R$ 分别为过程噪声与观测噪声协方差$K$ 为卡尔曼增益。匈牙利算法求解双线性分配问题给定 $M$ 个已有轨迹和 $N$ 个新检测找总代价最小的一对一最优匹配代价用 IoU 距离 度量。未匹配的检测开启新轨迹未匹配的轨迹经过一段宽限期grace period后终止。4.2 DeepSORT加入外观嵌入处理遮挡DeepSORT在 SORT 基础上为每个检测提取深度外观特征小 CNN 把检测框内的图像编码成外观嵌入向量。匹配代价改为 IoU 距离与嵌入空间中余弦距离余弦距离定义见 向量性质的组合。这带来遮挡恢复与重识别re-identification能力即使对象被遮挡数帧消失其外观嵌入仍允许它在重现时被重新匹配。4.3 ByteTrack利用低置信度检测ByteTrackZhang et al., 2022的改进在于使用全部检测包括低置信度的。多数跟踪器丢弃置信度低于阈值的检测ByteTrack 则分两阶段匹配第一阶段高置信度检测与已有轨迹匹配第二阶段剩余的低置信度检测与未匹配的轨迹匹配。这样能找回暂时被遮挡或模糊因而检测置信度低的物体显著提升跟踪的连续性。5. 3D 视觉深度估计与点云3D 视觉恢复 2D 图像投影中丢失的第三维。深度估计Depth Estimation预测相机到场景中每一点的距离。5.1 立体深度与视差几何立体深度Stereo Depth用两台已知基线 $b$baseline间隔的相机。同一空间点在左右图像中的水平位置不同这个偏移量称为视差disparity$d$。深度与视差成反比$$Z \frac{f \cdot b}{d}$$其中 $f$ 是焦距$b$ 是基线距离。注意这个公式的工程含义近处物体视差大、远处物体视差趋近于零所以远处的深度估计误差被急剧放大更大的基线 $b$ 或焦距 $f$ 会提高近处精度。计算视差需要立体匹配stereo matching——在两幅图中寻找对应点。由于两相机水平对齐同一 3D 高度投影到两图同一行因此匹配退化为沿水平扫描线的1D 搜索。5.2 单目深度估计单目深度估计Monocular Depth Estimation从单张图像预测深度这是一个本质病态ill-posed问题无穷多个不同的 3D 场景可以产生同一张 2D 图像。人类之所以能 effortlessly地做到是靠相对大小、纹理梯度、遮挡、大气雾等线索深度网络则从训练数据中学到这些线索。MiDaS与Depth Anything等模型从单图预测相对深度图判断哪个物体更近而非绝对米数用尺度不变损失scale-invariant loss在多数据集上训练——虽然理论上存在歧义实测效果依然非常准确。5.3 点云与 PointNet 族点云Point Cloud是 3D 点 $(x, y, z)$ 的集合可附带颜色等属性由 LiDAR 或立体重建获取。与图像不同点云无序且间距不规则。PointNetQi et al., 2017直接处理点云对每个点独立施加共享 MLP然后用最大池化聚合。最大池化对点的排列顺序不敏感置换不变从而解决了点云无自然顺序的根本问题。PointNet增加层次化分组hierarchical grouping在多个尺度上捕捉局部结构。6. 神经渲染NeRF 与 3D Gaussian Splatting6.1 NeRF用 MLP 参数化整个场景Neural Radiance FieldNeRFMildenhall et al., 2020把 3D 场景表示为一个连续函数输入 3D 位置 $(x, y, z)$ 与观察方向 $(\theta, \phi)$输出颜色 $(r, g, b)$ 与密度 $\sigma$用 MLP 参数化$$F_\theta: (x, y, z, \theta, \phi) \to (r, g, b, \sigma)$$渲染一个像素时从相机穿过该像素向场景中投一条光线ray在光线上采样一系列点MLP 预测每个点的颜色与密度像素颜色由体积渲染Volume Rendering积分得到——沿光线对颜色按密度加权积分$$C(\mathbf{r}) \int_{t_n}^{t_f} T(t) \cdot \sigma(\mathbf{r}(t)) \cdot \mathbf{c}(\mathbf{r}(t), \mathbf{d}) , dt$$其中 $T(t) \exp(-\int_{t_n}^{t} \sigma(\mathbf{r}(s)) , ds)$ 是累积透射率光走到该点前被吸收了多大比例。实际实现中用沿光线采样的 $N$ 个点求和来近似该积分$$\hat{C} \sum_{i1}^{N} T_i \cdot (1 - \exp(-\sigma_i \delta_i)) \cdot c_i$$这里 $(1 - \exp(-\sigma_i \delta_i))$ 是第 $i$ 个采样小段的局部不透明度alpha。NeRF 的训练目标是渲染像素与一组已知位姿照片的 Ground Truth 像素之间的 MSE。训练完成后可以从任意相机位姿渲染照片级真实感的新视角。其瓶颈是速度每个像素要评估 MLP 数百万次每像素每个采样点一次实时渲染困难。6.2 3D Gaussian Splatting把光线行进换成光栅化3D Gaussian SplattingKerbl et al., 2023用显式的3D 高斯基元集合代替 NeRF 的连续体函数直接针对 NeRF 的速度短板属性每个高斯携带的参数作用位置3D 均值 $\mu$高斯中心形状3D 协方差矩阵控制形状与朝向不透明度标量控制溅射的透明程度颜色球谐函数SH系数支持视角相关view-dependent颜色渲染流程是纯光栅化把每个 3D 高斯投影到图像平面得到一个 2D 高斯 splat按深度排序从前到后用 alpha 混合合成。整个过程在 GPU 上实时运行100 FPS比 NeRF 的光线行进ray marching快几个数量级且画质达到甚至超过 NeRF。7. SLAM定位与建图一体SLAMSimultaneous Localisation and Mapping同时完成两件事构建未知环境的地图并跟踪相机在其中的位置。它是机器人、自动驾驶与 AR 的基础能力。7.1 视觉里程计视觉里程计Visual Odometry逐帧估计相机运动在图像间跟踪特征点SIFT、ORB见 图像基础 的特征描述子一节从特征对应关系中通过本质矩阵Essential Matrix估计相机的旋转与平移——本质矩阵编码两视图间的几何关系由相机的内参与外参同样见 图像基础 的相机模型一节导出。7.2 特征点 SLAMORB-SLAM 的三线程ORB-SLAMMur-Artal et al., 2015是应用最广的特征点 SLAM 系统维持持久地图并运行三个并行线程Tracking跟踪把每帧新图像中的 ORB 特征与地图匹配用PnPPerspective-n-Point RANSAC估计相机位姿Local Mapping局部建图从匹配特征三角测量出新的地图点并用束调整Bundle Adjustment优化其位置——最小化所有观测到该点的视图的重投影误差Loop Closure回环检测用视觉词袋Bag of Visual Words检测相机是否回到已建图区域然后全局优化地图以校正累积漂移。7.3 LiDAR SLAM 与视觉-惯性 SLAMLiDAR SLAM用 LiDAR 的 3D 点云而非相机或作为补充。LiDAR 直接提供深度测量几何估计更鲁棒但硬件成本更高。LOAMLiDAR Odometry and Mapping类方法用迭代最近点ICP对齐相邻两次扫描的点云。视觉-惯性 SLAMVIO把相机数据与 IMU加速度计 陀螺仪融合。IMU 提供高频的旋转与加速度估计能在相机帧之间搭桥并在快速运动或视觉特征暂时丢失时维持定位。8. VR/AR人体姿态估计与实时渲染约束VR/AR是计算机视觉中最苛刻的消费场景之一。8.1 人体姿态估计姿态估计Pose Estimation从图像确定人体或面部、手部的位置与朝向。人体姿态通常表示为一组 2D 或 3D 关键点关节肩、肘、腕、髋、膝、踝。OpenPose与MediaPipe等模型用热图回归预测关键点每个关节输出一张热图峰值位置即关节位置。Top-down方法先用目标检测器检测框架见 目标检测与分割框出每个人再在每个框内估计姿态Bottom-up方法先在整图中检测所有关键点再用**部件亲和场Part Affinity Fields编码相连关节间关联关系的向量场**把关键点分组到具体个人。8.2 场景重建与实时渲染约束场景重建Scene Reconstruction从传感器数据构建环境的 3D 模型。在 AR 中它支撑把虚拟物体放置到真实表面上、让真实物体遮挡虚拟物体、投射虚拟阴影。实时方法如 ARKit/ARCore 的深度传感器系统构建环境的稀疏网格并随用户移动不断更新。VR 的实时渲染约束极其严格双眼各需独立渲染、90 FPS否则引起运动不适从头部运动到屏幕刷新的延迟必须低于 20 毫秒。关键支撑技术注视点渲染Foveated Rendering借助眼动追踪只在用户注视区域用高分辨率渲染重投影Reprojection在下一帧渲染完成前按新的头部位姿对上一帧做变形warping来填补空档。实时神经渲染3D Gaussian Splatting、鲁棒跟踪视觉-惯性 SLAM与高效姿态估计的收敛正在让照片级真实感、可交互的 AR/VR 体验变得日益可行。9. 编码任务三套可直接运行的 JAX 实现原文档附带三个从零实现任务建议在 CoLab 或 notebook 中运行依赖jax与matplotlib。以下完整保留其代码并补充关键实现细节的对照说明。9.1 从零实现 Lucas-Kanade 光流对两幅合成帧向右移动的白色方块计算光流并验证移动区域内的平均水平光流import jax.numpy as jnp import matplotlib.pyplot as plt def lucas_kanade(frame1, frame2, window_size5): Lucas-Kanade optical flow. # Compute gradients Ix jnp.zeros_like(frame1) Iy jnp.zeros_like(frame1) It frame2 - frame1 # Sobel-like gradients Ix Ix.at[1:-1, :].set((frame1[2:, :] - frame1[:-2, :]) / 2) Iy Iy.at[:, 1:-1].set((frame1[:, 2:] - frame1[:, :-2]) / 2) H, W frame1.shape half_w window_size // 2 u jnp.zeros_like(frame1) v jnp.zeros_like(frame1) for i in range(half_w, H - half_w): for j in range(half_w, W - half_w): Ix_win Ix[i-half_w:ihalf_w1, j-half_w:jhalf_w1].ravel() Iy_win Iy[i-half_w:ihalf_w1, j-half_w:jhalf_w1].ravel() It_win It[i-half_w:ihalf_w1, j-half_w:jhalf_w1].ravel() A jnp.stack([Ix_win, Iy_win], axis1) ATA A.T A ATb -A.T It_win # Check if the system is well-conditioned det ATA[0,0] * ATA[1,1] - ATA[0,1] * ATA[1,0] if jnp.abs(det) 1e-6: flow jnp.linalg.solve(ATA, ATb) u u.at[i, j].set(flow[0]) v v.at[i, j].set(flow[1]) return u, v # Create two frames: a white square that moves right frame1 jnp.zeros((64, 64)) frame1 frame1.at[20:40, 15:35].set(1.0) frame2 jnp.zeros((64, 64)) frame2 frame2.at[20:40, 20:40].set(1.0) # shifted 5 pixels right u, v lucas_kanade(frame1, frame2, window_size7) # Visualise fig, axes plt.subplots(1, 3, figsize(14, 4)) axes[0].imshow(frame1, cmapgray); axes[0].set_title(Frame 1); axes[0].axis(off) axes[1].imshow(frame2, cmapgray); axes[1].set_title(Frame 2); axes[1].axis(off) # Quiver plot of flow (subsample for clarity) step 4 Y, X jnp.mgrid[0:64:step, 0:64:step] axes[2].imshow(frame1, cmapgray, alpha0.5) axes[2].quiver(X, Y, u[::step, ::step], v[::step, ::step], color#e74c3c, scale50, width0.005) axes[2].set_title(Optical Flow); axes[2].axis(off) plt.tight_layout(); plt.show() # Check average flow in the moving region region_u u[20:40, 15:35] print(fAverage horizontal flow in object region: {region_u[region_u ! 0].mean():.2f} pixels)实现与原理的对照点梯度用中心差分 $(I[x1] - I[x-1])/2$ 近似注释中标为 Sobel-like$I_t$ 直接取帧差每个窗口内构造设计矩阵 $A$每行 $[I_x, I_y]$ATA A.T A与ATb -A.T It_win正是 2.2 节最小二乘解中的两个因子行列式检查|det| 1e-6即结构张量奇异性的显式防护——平坦背景本例中黑色区域的窗口会被跳过这正是光流结果只出现在方块及边缘附近的原因5×5 窗口window_size7时 half_w3足以覆盖 5 像素的平移移动区域的平均水平光流应接近 5 像素。9.2 卡尔曼滤波跟踪噪声轨迹模拟一段带噪声的圆形运动轨迹展示卡尔曼滤波对观测的平滑效果import jax import jax.numpy as jnp import matplotlib.pyplot as plt def kalman_predict(x, P, F, Q): Kalman filter prediction step. x_pred F x P_pred F P F.T Q return x_pred, P_pred def kalman_update(x_pred, P_pred, z, H, R): Kalman filter update step. y z - H x_pred # innovation S H P_pred H.T R # innovation covariance K P_pred H.T jnp.linalg.inv(S) # Kalman gain x_updated x_pred K y P_updated (jnp.eye(len(x_pred)) - K H) P_pred return x_updated, P_updated # State: [x, y, vx, vy] dt 1.0 F jnp.array([[1, 0, dt, 0], # state transition [0, 1, 0, dt], [0, 0, 1, 0], [0, 0, 0, 1]]) H jnp.array([[1, 0, 0, 0], # observation: we measure x, y [0, 1, 0, 0]]) Q jnp.eye(4) * 0.01 # process noise R jnp.eye(2) * 4.0 # measurement noise (noisy detector) # Simulate ground truth: circular motion n_steps 50 t jnp.linspace(0, 2 * jnp.pi, n_steps) true_x 10 * jnp.cos(t) 20 true_y 10 * jnp.sin(t) 20 # Noisy observations key jax.random.PRNGKey(42) noise jax.random.normal(key, (n_steps, 2)) * 2.0 obs_x true_x noise[:, 0] obs_y true_y noise[:, 1] # Run Kalman filter x jnp.array([obs_x[0], obs_y[0], 0.0, 0.0]) # initial state P jnp.eye(4) * 10.0 # initial uncertainty kalman_x, kalman_y [], [] for i in range(n_steps): x, P kalman_predict(x, P, F, Q) z jnp.array([obs_x[i], obs_y[i]]) x, P kalman_update(x, P, z, H, R) kalman_x.append(x[0]) kalman_y.append(x[1]) kalman_x jnp.array(kalman_x) kalman_y jnp.array(kalman_y) # Visualise plt.figure(figsize(8, 8)) plt.plot(true_x, true_y, k-, linewidth2, labelGround Truth) plt.scatter(obs_x, obs_y, c#e74c3c, s20, alpha0.5, labelNoisy Observations) plt.plot(kalman_x, kalman_y, #3498db, linewidth2, labelKalman Filter) plt.legend(); plt.grid(alpha0.3) plt.title(Kalman Filter Tracking) plt.xlabel(x); plt.ylabel(y) plt.axis(equal); plt.show() obs_error jnp.mean(jnp.sqrt((obs_x - true_x)**2 (obs_y - true_y)**2)) kalman_error jnp.mean(jnp.sqrt((kalman_x - true_x)**2 (kalman_y - true_y)**2)) print(fObservation RMSE: {obs_error:.2f}) print(fKalman filter RMSE: {kalman_error:.2f}) print(fError reduction: {(1 - kalman_error/obs_error) * 100:.1f}%)关键实现细节状态向量是 4 维 $[x, y, v_x, v_y]$$F$ 是恒速运动模型匀速直线假设观测矩阵 $H$ 只测量位置不测量速度——这是 SORT 中典型的设定Q 0.01 * I4与R 4.0 * I2的比值决定了滤波器的信任偏好$R$ 相对 $Q$ 越大更新步中卡尔曼增益越小输出越平滑但跟踪滞后越大每步先predict预测再update更新与 4.1 节推导的两步递推一一对应末尾打印的 RMSE 对比是验证滤波确实降低了误差的定量依据。9.3 NeRF 风格体积渲染管线对已知颜色与密度的球体场景投射光线沿每条光线积分得到渲染图像——这是 6.1 节离散化公式 $\hat{C} \sum_i T_i (1 - e^{-\sigma_i \delta_i}) c_i$ 的直接实现import jax import jax.numpy as jnp import matplotlib.pyplot as plt def render_ray(origin, direction, spheres, n_samples64, t_near1.0, t_far6.0): Volume render a single ray through a scene of spheres. t_vals jnp.linspace(t_near, t_far, n_samples) deltas jnp.concatenate([jnp.diff(t_vals), jnp.array([1e-3])]) colour jnp.zeros(3) transmittance 1.0 for i in range(n_samples): point origin t_vals[i] * direction # Compute density and colour at this point density 0.0 point_colour jnp.zeros(3) for center, radius, col, sigma in spheres: dist jnp.linalg.norm(point - center) # Soft sphere: density falls off with distance from surface d jnp.exp(-jnp.maximum(0, dist - radius) * sigma) * sigma density d point_colour d * jnp.array(col) # Normalise colour by total density point_colour jnp.where(density 1e-6, point_colour / density, point_colour) # Volume rendering equation alpha 1.0 - jnp.exp(-density * deltas[i]) colour transmittance * alpha * point_colour transmittance * (1.0 - alpha) return colour # Scene: three coloured spheres spheres [ (jnp.array([0.0, 0.0, 4.0]), 0.8, [1.0, 0.2, 0.2], 5.0), # red (jnp.array([1.5, 0.5, 5.0]), 0.6, [0.2, 1.0, 0.2], 5.0), # green (jnp.array([-1.0, -0.5, 3.5]), 0.5, [0.2, 0.2, 1.0], 5.0), # blue ] # Camera setup img_h, img_w 64, 64 focal 60.0 origin jnp.array([0.0, 0.0, 0.0]) image jnp.zeros((img_h, img_w, 3)) for i in range(img_h): for j in range(img_w): # Compute ray direction px (j - img_w / 2) / focal py -(i - img_h / 2) / focal direction jnp.array([px, py, 1.0]) direction direction / jnp.linalg.norm(direction) colour render_ray(origin, direction, spheres) image image.at[i, j].set(jnp.clip(colour, 0, 1)) plt.figure(figsize(6, 6)) plt.imshow(image) plt.title(NeRF-style Volume Rendering\n(3 spheres)) plt.axis(off) plt.tight_layout(); plt.show() print(fImage shape: {image.shape}) print(fRendered {img_h * img_w} rays with 64 samples each)实现与原理的对照点软球体密度模型d exp(-max(0, dist - radius) * sigma) * sigma只在与球面外侧有关——密度随离表面距离指数衰减这正是 NeRF 中表面是连续密度的简化版透射率递推transmittance * (1.0 - alpha)即 $T_{i1} T_i \cdot e^{-\sigma_i \delta_i}$ 的离散形式保证越靠后的采样点权重越小被前面的球挡住了针孔投影px (j - w/2) / focal、py -(i - h/2) / focal是标准针孔相机射线方向y 向下取负与 图像基础 的相机模型一致64×64 像素 × 每射线 64 个采样点 262,144 次密度求值——把像素数与采样数各放大 16 倍计算量就会放大 256 倍这正是 6.1 节所说 NeRF实时渲染困难的具体来源也是 3D Gaussian Splatting 改用光栅化的动机。10. 小结与延伸阅读本文按 Video and 3D Vision 的原始脉络完整覆盖了九条主线核心结论可以收敛为三组问题 → 方案 → 代价运动建模约束方程一个方程两个未知数 → Lucas-Kanade 用窗口假设 最小二乘补全约束受限于小运动→ RAFT 用 4D 相关体 GRU 迭代学习视频表示全时空注意力 $O(T^2 N^2)$ 不可承受 → TimeSformer 分治注意力降为 $O(T^2 N^2)$3D 卷积 $k_t$ 倍参数代价 → I3D 用 2D 权重膨胀换取预训练迁移3D 恢复NeRF 照片级新视角渲染但光线行进过慢 → 3D Gaussian Splatting 用显式高斯基元 GPU 光栅化拿到 100 FPSSLAM 中视觉与 LiDAR、IMU 的组合在精度、鲁棒性与硬件成本之间取舍。结合本仓库的其他章节可以沿以下路径继续深入光流的梯度与角点工具来自 图像基础Sobel、Harris、SIFT/ORB、针孔模型与内外参视频理解骨干ViT、MAE来自 视觉 Transformer 与生成目标检测与 IoU/mAP 来自 目标检测与分割跟踪中卡尔曼滤波的贝叶斯更新背景见 贝叶斯方法最小二乘正态方程见 梯度机器学习泰勒展开见 函数近似SLAM 与感知的下游应用BEV 融合、LiDAR 测距、自动驾驶感知栈在 自主系统·感知 中继续展开视频 tokenization3D VQ-VAE 等则属于 多模态学习·图像与视频 tokenization 的范畴。【免费下载链接】maths-cs-ai-compendiumBecome a cracked AI/ML researcher/engineer with this unconventional textbook covering maths, computing, and ML with intuition.项目地址: https://gitcode.com/GitHub_Trending/mat/maths-cs-ai-compendium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考