当前位置: 首页 > news >正文

3D Gaussian Splatting for Real-Time Radiance Field Rendering——文章方法精解

SfM → Point-NeRF → 3D Gaussian Splatting 

🟦SfM

Structure-from-Motion(运动恢复结构,简称 SfM)是一种计算机视觉技术,可以:

利用多张从不同角度拍摄的图像,恢复出场景的三维结构和相机的位置。

举个例子:

你拿着手机从不同角度拍一座雕像,然后用 SfM 工具(如 COLMAP)处理这些图片,结果是:

  1. 相机每个拍摄位置的三维坐标(相机轨迹);

  2. 场景中每个被识别出来的点在三维空间中的坐标(称为 SFM points);

  3. 这些点与哪些图片对应(点和图像的关系);

这些恢复出来的三维点,就叫做 SfM点云(或简称 SfM points)。

🟦 Point-NeRF

Point-NeRF 是一种 基于点云的神经辐射场(Neural Radiance Field)渲染方法

它的目标是:

在已有三维点云的基础上,通过神经网络对这些点进行增强,实现高质量的新视角图像合成

这项工作是由 Xu et al., 2022 提出的,论文标题为:

Point-NeRF: Point-based Neural Radiance Fields

你可以这样理解 Point-NeRF:

把点云(比如从 SfM 或深度相机得到的)看作是“粗糙的模型骨架”,然后用神经网络“涂上颜色和光照”,让它从任意角度看起来都非常真实。

🟧 Point-NeRF 的核心流程如下:

1. 输入稀疏点云

  • 可以是通过 SfM、深度相机等方式得到的;

  • 每个点有位置、颜色、可选法向量等属性;

2. 点特征学习

  • 每个点会被加上 learnable 的特征向量;

  • 这些特征会输入到一个神经网络里,学习如何从不同角度“看”这些点;

3. 体积渲染(Volume Rendering)

  • 和 NeRF 类似,它也用体积渲染;

  • 从相机角度发射光线,在光线上采样点;

  • 使用附近的点云点和其特征,通过网络预测颜色和密度;

  • 混合出最终像素值。

🔵 与 3D Gaussian Splatting 有什么不同?

特征Point-NeRF3D Gaussian Splatting
点云来源预先计算的稀疏点云SfM + 优化后的高斯点
渲染方式神经网络 + 体积渲染显式几何 + 高斯渲染
是否训练是(要训练网络)渲染无需网络,训练是为了优化点的参数
实时性不是实时(需推理)支持实时(直接渲染高斯)
易复现性相对复杂,需要训练更容易测试,尤其是预训练模型

✅ 总结一段话

Point-NeRF 是一种将稀疏点云与 NeRF 结合起来的方法,通过给点添加神经特征,并利用体积渲染完成新视角合成;而 3D Gaussian Splatting 则是用可渲染的高斯分布表示场景点,摆脱了神经网络渲染的成本,实现了更高效的实时效果。

🟦 Plenoxels

Plenoxels 是 “Plenoptic Voxels” 的缩写,是一种:

不依赖神经网络、用稀疏体素网格直接存储和优化颜色与密度 的快速 NeRF 替代方法。

它的全名是:

Plenoxels: Radiance Fields without Neural Networks
论文链接:[2112.05131] Plenoxels: Radiance Fields without Neural Networks

Alex Yu 等人于 2022 年 提出。

🟩 用大白话来说:

如果我们把 NeRF 比作用神经网络“慢慢画出照片”的艺术家,
Plenoxels 就是一个“预先把颜色和密度填在三维格子里”的像素工程师。

它不再用神经网络来学习,而是:

直接在一个稀疏的三维体素网格中,把每一个小格子(voxel)里的颜色和体积密度当作参数来优化。

🟨 核心思想:

步骤描述
1. 初始化稀疏体素网格用稀疏数据结构(哈希表)存储有效体素
2. 每个体素里存颜色+密度+SH系数颜色用球谐函数(Spherical Harmonics)建模,提升角度表现力
3. 光线投射 & 渲染和 NeRF 一样,光线穿过场景,在体素网格上采样
4. 反向传播优化参数直接优化每个体素里的值(不用训练神经网络)

🟧 优势与局限

优势局限
不用神经网络,训练速度快(几分钟)占用内存较大(尤其是高分辨率场景)
实现简单,效果媲美NeRF对小物体/细节支持不如高容量神经模型
渲染速度也快(支持实时)需要稀疏数据结构支持和预处理点云

🔵 与 3D Gaussian Splatting 对比:

特征Plenoxels3D Gaussian Splatting
数据结构稀疏体素(Sparse Voxel Grid)3D 高斯点
表示方式每格有颜色密度 + SH每点有位置、朝向、颜色、协方差等
是否神经网络❌ 不用❌ 也不用
渲染方式类似体积渲染(沿光线采样)显式 splatting 渲染(可GPU并行)
实时性较快(可实时)真正实时(更快)
适合场景中等复杂场景动态、密集、真实场景

✅ 总结一段话

Plenoxels 是一种完全抛弃神经网络的 NeRF 变体,用稀疏体素网格表示场景,每个体素中保存颜色与密度等信息,训练和渲染都非常快。它是从“神经渲染”走向“直接优化”的关键过渡点之一,也为后来的 3D Gaussian Splatting 这种“完全可显式渲染”的方法铺平了道路。

 论文具体方法

1.可微的3D高斯splatting

✅ 每个高斯点都包含了哪些核心信息?

论文中,每个 3D 高斯点包含以下 五类信息

类别具体字段作用
几何信息位置 𝜇协方差矩阵 Σ决定点的在哪里形状和朝向
外观信息颜色(通过球谐函数表示)决定点的颜色随视角如何变化
透明度不透明度 α决定点的遮挡/透明程度
辐射函数球谐函数系数(SH)表示颜色的方向依赖性(类似 NeRF)
附加参数缩放因子、梯度优化量等用于训练阶段微调点属性

🟦 1. 点的位置 μ(Mu)

  • 就是这个高斯点在三维空间里的中心坐标

  • 表示的是:这个点在哪儿。

  • 数学形式:一个三维向量 (x, y, z)。

📌 作用:

  • 决定点投影到相机时在画面上的位置;

  • 决定光线经过它的可能性。

点云中的点是“没有体积、没有方向、没有属性的几何点”,而高斯点是“有形状、有方向、有颜色函数的可渲染单位”。


🟦 1. 定义上的区别

项目点云中的点(Point Cloud Point)高斯点(Gaussian Point)
本质一个空间中的三维坐标点一个有体积/形状的 3D 高斯分布
表示(x, y, z) 可能加颜色(位置, 协方差, α, 颜色SH)
形状没有形状,是一个数学点是一个模糊、椭球形的体积分布

🟨 2. 属性上的区别

属性点云中的点高斯点
位置✅ 有✅ 有
颜色可能有✅ 有(且是方向相关颜色)
形状/大小❌ 没有✅ 有(由协方差矩阵控制)
透明度❌ 没有✅ 有(α 参数)
视角依赖性❌ 没有✅ 有(球谐函数 SH)
可渲染性⛔️ 不可直接渲染✅ 可直接 GPU splatting 渲染

🟧 3. 数据来源和用途

项目点云中的点高斯点
来源SfM / 深度相机 / 激光雷达等初始化自点云 + 优化生成
用途建图、建模、几何分析实时渲染、新视角图像合成
优化通常静态,不参与优化可微优化,参数是可学习的
表达力稀疏且无纹理稠密且能模拟真实外观

🧠 更形象的理解:

类比点云点高斯点
类比为“点”像一颗小钉子像一个会发光、可调大小的彩色气泡
是否能直接用于图像合成?❌ 不行✅ 可以
是否能表示视角变化?❌ 不行✅ 可以(SH系数)
是否能学习优化?❌ 一般不行✅ 是可微优化的参数点

🔵 举个具体例子:

假设你用 COLMAP 重建了一个场景,有一万个 SfM 点(也就是点云):

  • 每个点只有位置 (x, y, z),加个平均颜色 (r, g, b)

  • 如果你把这些点直接画在屏幕上,就是一个稀稀疏疏的点状模型,没法真实地渲染。

然后你把这些点转为 3D Gaussian points

  • 每个点会变成一个椭球体;

  • 会被赋予方向、大小、透明度;

  • 颜色也不再是固定的,而是跟视角相关;

  • 这些点还可以被训练优化,变成真实照片般的合成图像。

✅ 总结一句话:

点云点是原始几何信息,高斯点是带有可学习外观与空间结构的“可渲染光斑”,它把三维重建变成了一种实时图像生成方式。


🟨 2. 协方差矩阵 Σ(Sigma)

  • 决定这个高斯点的形状和方向

  • 是一个 3x3 对称正定矩阵,但论文中为了简化通常只优化一个对角矩阵或通过旋转矩阵和缩放矩阵表示。

📌 作用:

  • 控制这个点在空间中是像球一样、椭球一样,还是拉长的;

  • 决定它投影到图像上是小圆点还是长条形;

  • 实现方向感和空间覆盖,提升细节表达能力。


🟩 3. 不透明度 α(Alpha)

  • 表示该点的透明程度,0 = 完全透明,1 = 完全不透明。

  • 在渲染时用于 alpha blending(α混合)。

📌 作用:

  • 控制该点对最终图像的影响程度;

  • 表示遮挡、深度的“参与度”;

  • 用于模拟材质、边缘的模糊感。


🟧 4. 球谐函数系数(Spherical Harmonics, SH)

  • 用于模拟点的颜色如何随视角变化

  • 因为一个物体从不同角度看,颜色/亮度会变化(如镜面高光、阴影等);

  • 所以每个点不只是一个 RGB 颜色,而是一个 方向相关的颜色函数,用 球谐函数(SH) 来表达。

📌 作用:

  • 模拟视角依赖的外观

  • 替代 NeRF 中的 MLP 输出颜色;

  • 使得渲染时可以直接用 SH 快速计算颜色(比 MLP 快很多)。

数学形式:

  • 通常用 02 阶球谐函数,每个通道大概 916 个系数。


🔵 总结一下用类比帮助你记住:

参数像什么?决定什么?
位置 μ这个点在哪空间位置
协方差 Σ点长成啥样尺寸与方向(变成椭圆)
α 不透明度点有多实在遮挡与透明效果
SH 系数从哪个角度看变什么颜色模拟视角依赖的颜色
颜色函数RGB颜色被“编码”成一个方向函数快速渲染

🧠 总结一段话

在 3D Gaussian Splatting 中,每个点不是一个死板的小球,而是一个“活”的、高斯形状的、带有方向感和颜色变化规律的“发光斑点”。它包含位置、形状(协方差)、透明度、球谐函数颜色表达等参数,这些使得渲染过程可以高度并行且实时,同时保留丰富细节与真实感。

3D 高斯的公式

🟦 为什么用高斯?

论文的核心思想是:

用一个个 3D 高斯分布(椭球形状) 来表示场景中能“发光”的点,再将它们投影到图像上进行 快速渲染(splatting)

这个“高斯”其实不是指概率分布,而是作为一个模糊、可渲染的小体积单位,具有空间形状和方向。


🟩 高斯的核心公式概念(3D场景中的分布)

论文中使用的 3D 高斯是一个各向异性的三维分布(可以是椭球),它的密度函数如下:

✅ 高斯密度函数:

符号含义中文说明
x查询点坐标你想看看“某个位置”的值
μ高斯中心点的位置就是这个点的位置(中心)
Σ协方差矩阵控制高斯的大小、方向、拉伸形状
Σ−1协方差的逆控制点周围的“下降速度”
exp()指数函数构成了高斯“钟形”结构

这个函数值越大,表示离中心越近,点的贡献越大。

🟨 如何从 3D 高斯投影到 2D 图像?

论文做的事情不是在 3D 空间看高斯密度,而是把它 投影到图像平面,然后做“splatting 渲染”。

📌 步骤是这样的:

  1. 把 3D 高斯点的位置 μ 投影到图像上,得到 2D 中心坐标。

  2. 把协方差矩阵 Σ 也投影到图像上,得到图像平面上的椭圆大小与方向。

这个投影涉及一个公式:

✅ 投影协方差公式:

解释:

  • J:是相机投影的雅可比矩阵(Jacobian),描述 3D 到 2D 的变换;

  • Σ3D:原始高斯点的 3D 协方差;

  • Σ2D:高斯投影到图像后形成的椭圆外观。

🟧 渲染公式核心:颜色混合

每个高斯点投影到图像上后,会在其椭圆区域“撒”出颜色值,叠加形成最终图像。

论文中提出了一种基于 alpha blending(α 混合)的公式:

✅ 前向混合(Front-to-Back Compositing):

符号含义
ci第 i 个高斯的颜色(通过球谐函数计算)
αi不透明度,控制遮挡
Ti前面所有高斯点“没遮住”的透明传输量
C渲染出的最终像素颜色

它模拟了“雾”的效果:前面透明就继续看后面,前面不透明就遮住了。

🟦 球谐函数(SH)上场:

高斯点的颜色不是一个固定 RGB,而是一个 方向相关函数

成分含义
d观察方向
Ylm球谐基函数(方向函数)
alm系数,控制每个方向的颜色强度

👉 也就是说,从不同角度看,高斯点会呈现出不同的颜色,这就是为什么能产生立体真实感的原因。

🔵 整体流程回顾:

  1. 初始化一堆带位置/大小/颜色/透明度的高斯点;

  2. 把它们从 3D 空间投影到图像(2D)上,得到一个个椭圆;

  3. 每个点按不透明度 & 球谐颜色对图像贡献;

  4. 多个点用前向混合累加,得到最终图像。


✅ 最终一句总结

论文中使用了一个 可微、可投影的 3D 高斯模型,每个点具有形状(协方差)、透明度(α)和方向相关颜色(SH系数),渲染时投影成椭圆,用快速的 splatting 和前向混合方式生成图像,既能保真又能加速训练和推理。

2.优化与自适应密度控制

✅ (1)随机梯度下降(SGD)优化:训练方法

在训练过程中,3DGS 不使用神经网络权重,而是对 每个高斯点的参数(位置、协方差矩阵、颜色 SH、α等)直接进行优化。

优化目标:

  • 最小化训练图像与渲染图像之间的 重建损失,比如 MSE 或 PSNR loss。

被优化的参数:

  • 点的位置 μ

  • 协方差 Σ(变成缩放参数 + 旋转)

  • 不透明度 α

  • 颜色的球谐系数(SH)

优化方式:

使用 Adam 优化器(比 SGD 更平稳)——

optimizer = torch.optim.Adam(gaussian_params, lr=0.001)

每次迭代会:

  • 对一小批图像 patch 进行前向渲染;

  • 计算损失;

  • 对上述所有参数进行反向传播;

  • 用 Adam 更新。

✅ (2)CUDA 核心 & 快速光栅化(Fast Rasterization)

问题:

你可能会想:“渲染图像不是慢吗?”

论文提出了一个 专门用 CUDA 编写的、高度并行的 rasterizer(光栅器),来替代传统慢速渲染。

它做了什么:

  • 高斯点在图像上的投影 → 转换成屏幕上的椭圆

  • 每个像素仅处理那些覆盖它的高斯点(通过层级 bounding box + early Z-culling)

  • 在 CUDA 上用一个核心模块实现并行累加(类似光栅化)

🔧 这一部分关键优势是:

  • 所有操作都是 tensor 化的,可微分;

  • 实现极高的训练 & 渲染效率;

  • 每一步都可以 GPU 上做。

✅ (3)自适应密度控制(Adaptive Densification)

这是论文中最令人惊艳的机制之一。

问题:

刚开始初始化的点数量不够、太稀疏,会影响渲染质量。

解决办法:动态添加高斯点

论文提出了 在训练过程中自动新增点 的机制,称为:

Adaptive Densification(自适应加密)

机制逻辑如下:

  • 每隔 N 步检查一次点云中的点:

    • 如果某个点的梯度非常大 ➜ 说明它需要学习更多细节 ➜ 就从它周围复制出新点

    • 如果某个点的透明度 α 非常低 ➜ 没啥贡献 ➜ 就删除它

判据:

使用两个 激活函数(activation functions):

  • 用于 控制点的透明度 α 的优化行为

具体是:

  • 论文中使用了两个非线性函数:

    • softplus:用于保持透明度 α 始终为正值

  • sigmoidtanh:用于压缩协方差参数、尺度参数等到合理范围

✅ 它们起到了两个作用:

  • 限制不合理值(如负值、过大数值);

  • 保持参数空间光滑可导,便于梯度传播。

✅ 4. 总结表格

机制用途技术细节优势
随机梯度下降优化点参数Adam 优化器,最小化渲染损失可微训练,无需 MLP
CUDA 光栅化快速渲染椭圆 bounding box + 并行累加GPU 加速,超快
自适应加密增加点密度梯度判据 + α 删除机制自动精细化、节省显存
激活函数控制数值范围softplus、sigmoid、tanh保持参数稳定可导

总结一句话:

论文提出了一种 无需神经网络,仅优化可微高斯点 的训练方法,配合 CUDA 加速和自动加密机制,使得整个系统能在训练初期迅速提升质量,在训练后期精雕细琢,真正实现了“即快又精”。

 🔧 核心目标:控制点云质量和密度

论文中指出,如果点云不加管理:

  • 会出现 冗余、高重叠、漂浮点(floaters)

  • 也会出现 某些区域采样不足、重建质量差

因此作者提出了一系列 周期性清理与重建补充机制,在训练过程中自动进行。

✅ 机制一:每 100 步迭代移除不透明度低的点

目的:剔除对图像贡献很小的无效点,释放内存 & 加快训练

做法

每隔 100 步,检查所有点的 α(不透明度),小于阈值(如 0.005)的点将被直接移除。

这种点通常:

  • 被 occlusion 遮挡

  • 或处于背景、没被用上

  • 或不再有优化价值

🔎 论文中原文描述(意译):

“We periodically remove Gaussians with low opacity (α < 0.005), typically every 100 steps.”


✅ 机制二:周期性将部分点的不透明度重置为 0 —— 去除 floaters(漂浮点)

目的:自动检测那些 似乎没用但还留在点云中 的点

做法

定期将一部分点的 α 设置为 0,让它们“失效”,观察是否还会通过训练自动恢复(即重新变为有效点)。

如果:

  • 某点在 reset 后又因 loss 梯度重新激活 ➜ 它就是有用的 ➜ 保留

  • 否则 ➜ 它可能是漂浮点 ➜ 后续会被清除

📌 这种机制是对不透明度的一种“软清理”,允许模型自我恢复真正有价值的点。


✅ 机制三:周期性移除“太大”的高斯点(避免重叠)

目的:控制协方差过大的点,避免大高斯“笼罩一大片”,导致视觉模糊 & 冗余重叠

做法

设定一个高斯尺度阈值(如 σ > max_threshold),定期清理掉过大的高斯点。

这些大点可能来源于:

  • 初始化时设置太宽

  • 或未被有效优化收缩

📌 太大的高斯点容易遮挡多个像素,降低图像清晰度,因此需要定期清理。


✅ 机制四:重建不足区域会有较大的梯度 —— 用于新点插入(densification)

目的:自动补充点云中“稀疏”的区域

做法

在每次训练中,记录每个点参数的梯度,如果某些区域的梯度大 ➜ 表示这些点想学更多内容 ➜ 从这些点复制出新点(克隆 + 添加扰动)

📌 梯度大 = 模型对这区域不满意 ➜ 自动 densify

这就是论文提出的:

gradient-based point splitting / cloning for adaptive densification


📋 总结

机制描述周期目的
✅ 删除低 α 点移除透明度很低的点每 100 步清理无用点
✅ α 重置机制周期性将部分 α 设为 0若干轮迭代检测漂浮点
✅ 移除超大高斯删除 σ 超过阈值的点周期性检查控制点形状合理
✅ 高梯度密度控制根据梯度增密点连续监控补足细节区域

🔧 技术背后价值:

这些机制共同实现了:

  • 结构紧凑:只保留最有用的点

  • 自我优化:通过梯度反馈判断区域是否需要更多点

  • 训练稳定性:避免 α 爆炸或协方差崩坏

  • 高效可视化:点少、图像清晰、渲染速度快

3.快速可微光栅化

✳️ 背景理解:什么是“光栅化”(Rasterization)?

在传统图形学中,光栅化是指将几何图元(如点、线、三角形)转换为图像像素的过程。NeRF 使用体积渲染(体积积分,慢),而3DGS则“抛弃了积分”,改为用 2D 椭圆 + 屏幕空间 splatting 实现显式投影。

这也是为什么3DGS 不再需要 ray marching,速度极快


🌟 Tile-based Rasterization 的五个关键步骤详解


✅ 步骤 1:将图像划分为 16×16 的 tiles(图像块)

目的:减少计算量 + 并行处理

整个图像被切割成许多小块(tiles),每个 tile 大小为 16×16 像素。

  • 每个 tile 单独处理 ➜ 易于 GPU 并行化

  • 每个 tile 只处理覆盖它的高斯点 ➜ 避免无关计算

🔧 类似 CUDA block/thread 的思想,一 tile 一批线程。


✅ 步骤 2:筛选置信度大于 99% 的高斯 + 按深度排序

目的:只处理“有效”的高斯点,并确保渲染顺序正确

✔️ 什么是“置信度”?

每个高斯点投影到图像空间后,会形成一个椭圆覆盖若干像素。论文中使用高斯分布函数(probability > 99%)裁剪椭圆边界范围,减少多余像素。

即:

高斯点在图像上只影响置信度 > 99% 的像素范围。

✔️ 为什么要按深度排序?

因为:

  • 多个点会“splat”在同一个像素上

  • 为了模拟遮挡关系,需要从 远 → 近 的顺序渲染(先画远处,再叠加近处)


✅ 步骤 3:每个 tile 中并行执行 splatting(点到像素渲染)

目的:GPU 并行投影高斯点

✔️ splatting 是什么?

Splat = “抛洒”:将一个 3D 高斯点投影成一个 2D 椭圆,并分布其 RGB/α 值到影响的像素上,按高斯核函数分权平均。

✔️ 如何实现?

每个像素接收多个高斯的颜色 + 不透明度,使用类似 alpha blending 的合成方法:

这种操作适合大规模并行,每个 tile 中线程可以独立执行。

✅ 步骤 4:早停机制(Early Termination)节省计算

目的:若像素已经完全不透明,就不再继续渲染更多高斯点

比如某个像素已经叠加了多个高斯的 α 值,达到完全遮挡(如 α ≈ 1.0),后面再画更多点其实是浪费计算。

所以采用:

  • 如果像素 α 累加 > 某阈值 ➜ 终止对应线程 ➜ 节省资源

这个类似于 NeRF 中的 ray early termination

✅ 步骤 5:反向传播(backward)——块索引 + 高效梯度计算

目的:训练时也要让高斯点支持梯度更新

  • 每个 tile 保留其影响的高斯点列表

  • 当需要计算损失对高斯点参数的梯度时,只需反向传播到这些点 ➜ 避免全图参与

  • 可以高效更新:

    • 点的位置(μ)

    • 协方差(控制椭圆形状)

    • 不透明度 α

    • 球谐系数(颜色)

这一过程也是 可微的,所以整个 pipeline 是“端到端训练友好”的。


🎯 可视化流程图(逻辑)

              全图划分为 tile(16×16)↓每 tile 找出覆盖它的高斯点(置信度 > 99%)↓对这些点按深度排序(远→近)↓并行 splatting 到像素(高斯投影、加权和)↓若某像素 α > 1.0,可提前停止渲染↓保存哪些高斯影响了哪些 tile↓训练时从这些 tile 反向传播,更新参数

🧠 总结

步骤技术关键词目的
1图像分块 tile加速并行处理
2高斯筛选 + 深度排序避免冗余、支持遮挡
3splatting 渲染显式可微、像素合成
4提前终止线程减少无效计算
5块索引梯度反传高效训练、可微优化

整体流程一览图

📸 多视角照片(输入)↓
📌 SfM / COLMAP → 生成稀疏点云 + 相机位姿↓
📌 初始化:将点云转为3D高斯点(位置、颜色、透明度、协方差等)↓
🔁 训练阶段(优化高斯参数)- 每次从不同角度渲染(3D高斯 → 2D 图像)- 与真实照片进行比对(像素级 loss)- 反向传播优化高斯点参数↓
🎬 渲染阶段(inference)- 给定任意视角- 将优化好的3D高斯实时投影生成2D图像✅ 最终输出:**任意视角下的2D图像(非常逼真、几乎是照片)**

相关文章:

3D Gaussian Splatting for Real-Time Radiance Field Rendering——文章方法精解

SfM → Point-NeRF → 3D Gaussian Splatting &#x1f7e6;SfM Structure-from-Motion&#xff08;运动恢复结构&#xff0c;简称 SfM&#xff09;是一种计算机视觉技术&#xff0c;可以&#xff1a; 利用多张从不同角度拍摄的图像&#xff0c;恢复出场景的三维结构和相机的…...

RestTemplate 发送的字段第二个大写字母变成小写的问题探究

在使用RestTemplate 发送http 请求的时候&#xff0c;发现nDecisonVar 转换成了ndecisonVar ,但是打印日志用fastjson 打印的没有问题&#xff0c;换成jackson 打印就有问题。因为RestTemplate 默认使用的jackson 作为json 序列化方式&#xff0c;导致的问题&#xff0c;但是为…...

第二次中医知识问答微调

由于昨天微调效果并不理想&#xff0c;因此更换数据集和参数进行重新进行了微调 本次微调参数如下&#xff1a; llamafactory-cli train \ --stage sft \ --do_train True \ --model_name_or_path /home/qhyz/zxy/LLaMA-Factory/model \ --preprocessing_num_workers 16 \ --…...

Linux查 ssh端口号和服务状态

一、检查SSH服务运行状态 通过进程查看命令验证服务是否启动&#xff1a; ps -ef | grep ssh当输出包含sshd进程时&#xff0c;表示SSH服务正在运行。示例输出&#xff1a; root 1234 1 0 10:00 ? 00:00:00 /usr/sbin/sshd二、查看服务监听端口 使用网络…...

C++ 11(1):

C11的发展史&#xff1a; C11中的{}&#xff1a; 看这个图片&#xff0c;我们的C11是所有的对象都可以使用{}来进行初始化&#xff0c;之前我们的int类型的数据要使用赋值符号来进行初始化&#xff0c;现在的话我们可以直接使用花括号来进行&#xff0c;并且连赋值符号都可以去…...

数据结构(4)线性表-链表-双链表

一、链表的分类 迟来的分类&#xff0c;主要如果在学习单链表前去讲分类&#xff0c;可能就云里雾里的&#xff0c;所以放在讲完单链表后讲。 划分链表的标准如下&#xff1a; 有没有头结点、指针的方向、循环与否 头结点就是一个占位结点&#xff0c;也被叫做哨兵位&#x…...

Spring Framework 的 spring-core 和 Spring Security 兼容版本

Spring Framework 的 spring-core 和 Spring Security 兼容版本 Spring Framework 的 spring-core 和 Spring Security 的版本需要保持兼容性&#xff0c;尤其是在旧版本&#xff08;如 Spring 4.x&#xff09;中。以下是它们的版本对应关系&#xff1a; Spring 4.x (spring-c…...

《国家职业教育平台:点亮职业教育新灯塔》

职教新航标&#xff1a;平台诞生记 国家职业教育智慧教育平台 在科技飞速发展的今天&#xff0c;数字化浪潮席卷全球&#xff0c;深刻地改变着我们生活的方方面面&#xff0c;教育领域也不例外。随着信息技术的不断进步&#xff0c;教育数字化已成为当今世界教育发展的重要趋势…...

Java多线程深度解析:从核心机制到高阶实战

Java多线程深度解析&#xff1a;从核心机制到高阶实战 摘要&#xff1a;本文系统解析Java多线程全体系知识&#xff0c;涵盖线程实现原理、并发工具实战、锁机制底层实现、线程池参数调优策略&#xff0c;并提供20可运行代码片段。附内存模型原理与性能优化指南。 目录 线程基…...

大量程粗糙度轮廓仪适用于哪些材质和表面?

大量程粗糙度轮廓仪是一种能够在广泛的测量范围内对工件表面进行粗糙度分析的精密仪器。它通常采用接触式或非接触式传感器&#xff0c;通过对工件表面的扫描&#xff0c;捕捉表面微观的起伏和波动&#xff0c;从而获取粗糙度数据。该仪器不仅能测量微小的表面细节&#xff0c;…...

NC028NQ472美光固态颗粒NQ484NQ485

深度解析&#xff1a;NC028NQ472、NQ484与NQ485美光固态颗粒 技术架构解析&#xff1a;堆叠式存储与算法优化 美光NC028NQ472、NQ484及NQ485系列固态颗粒均采用自研3D TLC NAND闪存技术&#xff0c;其核心架构通过垂直堆叠存储单元实现高密度集成。以NQ472为例&#xff0c;采…...

Cursor神一样的存在,核心能力codebase是如何工作的?

最近宣布达到 3 亿美元年度经常性收入&#xff0c;已经成为vibe coding标配。核心能力来自于Codebase。根据官方说法&#xff0c;codebase实现是依赖使用 Merkle 树来快速索引代码。但是没有竞品模仿这种方法。 Merkle是如何工作的那&#xff1f; Merkle 树简单解释 Merkle …...

python代码绘制某只股票最近90天的K线图、均线、量能图

运行代码&#xff0c;要求输入股票代码和名称&#xff0c;其他参数可省略 import akshare as ak import matplotlib.pyplot as plt import pandas as pd import mplfinance as mpf import matplotlib.dates as mdates import numpy as np import os from datetime import date…...

upload-labs通关笔记-第15关 文件上传之getimagesize绕过(图片马)

目录 一、图片马 二、文件包含 三、文件包含与图片马 四、图片马制作方法 五、源码分析 六、制作图片马 1、创建脚本并命名为test.php 2、准备制作图片马的三类图片 3、 使用copy命令制作图片马 七、渗透实战 1、GIF图片马渗透 &#xff08;1&#xff09;上传gif图…...

反弹shell

shell了解 shell其xxxx是交互&#xff0c;点鼠标敲键盘与计算机进行交互&#xff0c;还有常见的shell&#xff08;cmd&#xff0c;powershell&#xff09; shell反弹 当远程连接shell&#xff08;windows远程桌面&#xff0c;linux有SSH之类&#xff09;&#xff0c;从外面远…...

【动手学深度学习】1.3. 各种机器学习问题

目录 1.3. 各种机器学习问题1&#xff09;监督学习&#xff08;supervisedlearning&#xff09;&#xff08;1&#xff09;回归&#xff08;regression&#xff09;&#xff08;2&#xff09;分类&#xff08;classification&#xff09;&#xff08;3&#xff09;标记问题&…...

OS进程调度

tss Q1&#xff1a;你是如何保证两个进程不能同时访问共享资源的&#xff1f; ✅ 推荐回答&#xff1a; 我实现了基于结构体的互斥锁&#xff0c;使用 mutex_lock() 来加锁资源。如果已有任务持有锁&#xff0c;则当前任务会被阻塞并加入等待队列&#xff0c;直到被唤醒。解锁…...

MCP和 AI agent 有什么区别和联系

MCP 是什么&#xff1f; MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是一种开源通信协议&#xff0c;旨在为大型语言模型&#xff08;LLM&#xff09;与外部数据源、工具或服务之间建立标准化、安全且灵活的双向连接。它类似于“AI 的 USB-…...

用Recommenders,实现个性化推荐

文章目录 引言一、Recommenders简介二、选择Recommenders的原因三、智能推荐系统的设计与实现四、总结 引言 在这个信息如洪流般涌来的时代&#xff0c;你是否常常在茫茫的信息海洋中迷失方向&#xff0c;为找不到自己心仪的内容而苦恼&#xff1f;今天咱们就来聊聊基于Micros…...

MCP-1:MCP组件与工作流程

MCP-1:MCP组件与工作流程 1.什么是MCP2.MCP架构组件​​2.1.MCP Hosts2.2.MCP Client​​2.3.MCP Server3.交互流程3.1.用户提问3.2.LLM 推理选择MCP Server(大模型规划)3.3.调用 MCP Tool3.4.返回结果3.5.数据清洗3.6.反馈信息给用户1.什么是MCP MCP(Model Context Proto…...

NVIDIA GPU 性能调优与诊断完全指南

本文为多 GPU 用户&#xff08;如 3*RTX A4000 系统&#xff09;提供一份全面的调优与诊断手册&#xff0c;涵盖功率限制、风扇控制、频率锁定、缓存清理、GPU 重置与性能测试工具等操作命令&#xff0c;适合开发者与研究人员在部署前进行系统级优化与验证。 &#x1f4cc; 目录…...

从运维告警到业务决策:可观测性正在重新定义企业数据基础设施

可观测性&#xff08;Observability&#xff09;与传统监控&#xff08;Monitoring&#xff09;的核心差异&#xff0c;本质上是一种数据维度的主动暴露与被动采集的范式转变。传统监控就像在黑暗森林中设置有限的探照灯&#xff0c;运维人员必须预先假设可能的故障路径&#x…...

配电网运行状态综合评估方法研究

1评估指标体系的构建 [1]冷华,童莹,李欣然,等.配电网运行状态综合评估方法研究[J].电力系统保护与控制,2017,45(01):53-59. 1.1评估范围 图1为配电系统组成示意图&#xff0c;其中A、B、C分别表示高、中、低压配电系统。高压配变(也称主变)将35kV或110kV的电压降到10kV&#…...

Linux中I/O复用机制epoll

1. 为什么会出现 epoll&#xff1f; 在早期的网络编程中&#xff0c;select 是一个非常常用的 I/O 复用机制&#xff0c;用于在多个文件描述符&#xff08;如套接字&#xff09;上进行 I/O 操作的检测。select 会将多个文件描述符传入&#xff0c;轮询检查它们的状态&#xff…...

数据库表关系详解

一、一对多关系 特征&#xff1a;表A的一条记录对应表B的多条记录&#xff0c;表B的一条记录仅对应表A的一条记录 示例&#xff1a; 学生表&#xff08;子表&#xff09; | id | name | class_id | |-----|------|----------| |1001| 张三 | 111 | |1002| 张四 | 222 | 班级表…...

Agentic Loop与MCP:大模型能力扩展技术解析

一、什么是MCP MCP&#xff08;Model Context Protocol&#xff09;是一种用于大语言模型与外部工具交互的协议框架。它允许大语言模型能够调用各种外部工具来扩展其能力边界&#xff0c;如访问文件系统、搜索引擎、数据库等。 MCP的核心价值 能力扩展&#xff1a;使大语言模…...

贪心算法 Part04

总结下重叠区间问题 LC 452. 用最少数量的箭引爆气球 和 LC 435. 无重叠区间 本质上是一样的。 LC 452. 用最少数量的箭引爆气球 是求n个区间当中 &#xff0c; 区间的种类数量 k。此处可以理解为&#xff0c;重叠在一起的区间属于同一品种&#xff0c;没有重叠的区间当然…...

Spring事务简单操作

什么是事务&#xff1f; 事务是一组操作的集合&#xff0c;是一个不可分割的操作 事务会把所有的操作作为⼀个整体, ⼀起向数据库提交或者是撤销操作请求. 所以这组操作要么同时 成功, 要么同时失败. 事务的操作 分为三步&#xff1a; 1. 开启事start transaction/ begin …...

04算法学习_209.长度最小的子数组

04算法学习_209.长度最小的子数组题目描述&#xff1a;个人代码&#xff1a;学习思路&#xff1a;第一种写法&#xff1a;题解关键点&#xff1a; 第二种写法&#xff1a;题解关键点&#xff1a; 个人学习时疑惑点解答&#xff1a; 04算法学习_209.长度最小的子数组 力扣题目链…...

./build/mkfs.jffs2: Command not found

参考文章&#xff1a;https://blog.csdn.net/FLM19990626/article/details/132070195 sudo apt-get install lib32stdc6 sudo apt-get install lib32z1 sudo apt-get install mtd-utils sudo apt-get install man-db sudo apt-get install liblzo2-dev:i386sudo ldconfig...

从零基础到最佳实践:Vue.js 系列(4/10):《Vue Router 路由管理:深入探索与实战应用》

引言 在现代前端开发中&#xff0c;单页应用&#xff08;SPA&#xff09;凭借其流畅的用户体验和高性能成为主流。Vue Router 作为 Vue.js 的官方路由管理工具&#xff0c;为开发者提供了强大的路由管理能力&#xff0c;帮助实现页面导航、权限控制和动态内容加载。本文将从基…...

深入解析C++静态成员变量与函数

当然可以&#xff01;下面是对这段 C 代码的逐行详细注释说明和解释&#xff0c;帮助你理解静态成员变量和静态成员函数的使用。 &#x1f9f1; 类定义部分&#xff1a;MyClass cpp 深色版本 #include <iostream> 说明&#xff1a;包含标准输入输出流库&#xff0c;用于…...

基于JDBC的信息管理系统,那么什么是JDBC呢?什么又是DAO类?

1.JDBC JDBC 即 Java Database Connectivity&#xff0c;是 Java 语言中用于与数据库进行交互的一套 API。它提供了一种标准的方式&#xff0c;让 Java 程序能够连接到各种不同类型的数据库&#xff0c;并执行 SQL 语句来实现对数据库的查询、插入、更新和删除等操作。 主要功…...

Java虚拟机 -虚拟机栈

虚拟机栈详解 虚拟机栈概述案例常见的跟虚拟栈异常相关的异常StackOverflowError异常OutOfMemoryError异常 栈的基本存储单位局部变量表IDEA Jclasslib Bytecode Viewer插件slot 操作数栈方法调用&#xff08;待后续补充&#xff09; 虚拟机栈 上一篇文章&#xff0c;我们简单…...

【AI News | 20250521】每日AI进展

AI Repos 1、OpenHands OpenHands&#xff08;前身为OpenDevin&#xff09;是一个由AI驱动的软件开发代理平台&#xff0c;它能够像人类开发者一样修改代码、运行命令、浏览网页、调用API&#xff0c;甚至从StackOverflow复制代码片段。用户可以通过OpenHands Cloud轻松上手&a…...

RAG 挑战赛冠军方案解析:从数据解析到多路由器检索的工程实践,推荐阅读!

多路由器 动态知识库&#xff1a;RAG 冠军方案的核心技术揭秘 源码地址&#xff1a;https://github.com/IlyaRice/RAG-Challenge-2/tree/main 公司年报智能问答比赛任务简介 比赛的任务是基于公司年度报告构建一个问答系统。简单来说&#xff0c;比赛当天的流程如下&#xff…...

Java基础 Day17

一、递归 方法直接或者间接调用本身 将大问题, 层层转化为一个与原问题相似的、规模更小的问题来解决 二、异常 程序在编译或执行过程中&#xff0c;出现的非正常的情况 (错误) 语法错误不是异常 1、阅读异常信息 从下往上看&#xff1a;发生异常的位置、异常名称、发生异…...

系分论文《论软件系统安全分析和应用》

系统分析师论文范文系列 【摘要】 2023年3月&#xff0c;我司承接了某知名电商企业“智能化供应链管理系统”的开发任务&#xff0c;我作为系统分析师负责全面的安全分析与设计工作。该系统以提升电商供应链效率为核心&#xff0c;整合仓储、物流、支付等模块&#xff0c;并需应…...

蓝耘Ubantu服务器测试最新 PP-StructureV3 教程

一、服务器配置 二、安装Anaconda3 进入云服务器后删除minconda文件夹 官网&#xff1a; https://repo.anaconda.com/archive/ 在里面找到自己系统的安装包&#xff0c;然后右击复制链接安装。 一定要选择Anaconda,因为很多依赖问题用Minconda容易报错。 wget https://repo…...

File文件

路径&#xff1a; 相对路径&#xff1a;以 当前工作目录&#xff08;或指定的基准目录&#xff09;为起点&#xff0c;描述目标文件或目录的位置&#xff0c;不包含根目录信息&#xff0c;仅表示与基准目录的相对位置关系。绝对路径&#xff1a;从文件系统的 根目录 开始&…...

Wireshark抓包分析小程序接口请求教程

## 1. 准备工作 ### 1.1 安装Wireshark - 访问Wireshark官网 (https://www.wireshark.org/) 下载最新版本 - 按照安装向导完成安装 - 确保安装时选择安装WinPcap或Npcap&#xff08;用于网络数据包捕获&#xff09; ### 1.2 配置环境 - 确保电脑已连接网络 - 如果使用手机…...

C++之模板进阶(探索C++模板:非类型参数与特化技巧)

本节目标&#xff1a; 1.非类型模板参数 2.类模板的特化 3.类模板特化的应用之类型萃取 4.模板的分离编译 非类型模板参数 模板参数分 类型形参与非类型形参 类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称 非类型形…...

【项目记录】准备工作及查询部门

1 开发规范 1.1 前后端分离开发 现在的企业项目开发有2种开发模式&#xff1a;前后台混合开发和前后台分离开发。 前后台混合开发&#xff0c;顾名思义就是前台后台代码混在一起开发 这种开发模式有如下缺点&#xff1a; 1. 沟通成本高&#xff1a;后台人员发现前端有问题&a…...

chromedp -—— 基于 go 的自动化操作浏览器库

chromedp chromedp 是一个用于 Chrome 浏览器的自动化测试工具&#xff0c;基于 Go 语言开发&#xff0c;专门用于控制和操作 Chrome 浏览器实例。 chromedp 安装 go get -u github.com/chromedp/chromedp基于chromedp 实现的的简易学习通刷课系统 目前实现的功能&#xff…...

企业级调度器LVS

访问效果 涉及内容&#xff1a;浏览拆分、 DNS 解析、反向代理、负载均衡、数据库等 1 集群 1.1 集群类型简介 对于⼀个业务项⽬集群来说&#xff0c;根据业务中的特性和特点&#xff0c;它主要有三种分类&#xff1a; 高扩展 (LB) &#xff1a;单个主机负载不足的时候&#xf…...

MySQL中的重要常见知识点(入门到入土!)

基础篇 基础语法 添加数据 -- 完整语法 INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);-- 示例 insert into employee(id,workno,name,gender,age,idcard,entrydate) values(1,1,Itcast,男,10,123456789012345678,2000-01-01) 修改数据 -- 完整语法 UPDA…...

29.第二阶段x64游戏实战-技能冷却

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;28.第二阶段x64游戏实战-代码实现遍历技能 找技能冷却要通过一个技能cd长点的&…...

第19天-Python自动化生成PPT图文教程(基于python-pptx)

环境准备 pip install python-pptx Pillow 基础示例:批量插入图片 from pptx import Presentation from pptx.util import Inches import os from PIL import Image def create_image_slides(): # 初始化演示文稿 prs = Presentation() # 获取当前目录所…...

基于STM32的骑行语音播报系统

目录 一、前言 二、项目功能说明 三、主要元器件 四、原理图与PCB 五、手机APP 六、完整资料 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; 咸鱼商品链接&#xff1a; 基于STM32的骑行语音播报系统 二、项目功能说明 基础功能&#xff1a; 1&…...

springboot链接nacos测试

代码资料链接&#xff1a;https://download.csdn.net/download/ly1h1/90881498 场景说明&#xff1a;本次测试是springboot项目&#xff0c;可以链接上ncaos&#xff0c;将对应命名空间下的配置信息读取出俩&#xff0c;然后可以在接口进行返回显示。 0.环境配置 1.代码结构 …...