DiffusionDet: Diffusion Model for Object Detection—用于对象检测的扩散模型论文解析
DiffusionDet: Diffusion Model for Object Detection—用于对象检测的扩散模型论文解析
这是一篇发表在CVPR 2023的一篇论文,因为自己本身的研究方向是目标跟踪,之前看了一点使用扩散模型进行多跟踪的论文,里面提到了DiffusionDet因此学习一下。
论文地址:https://arxiv.org/abs/2308.09905
代码地址:https://github.com/ShoufaChen/DiffusionDet
机构作者:1The University of Hong Kong 2Tencent AI Lab 3AI Institute, Fudan University 4Shanghai AI Laboratory
是第一篇应用扩散模型来进行目标检测的论文。核心是:将目标检测任务转化为从噪声框到目标框的去噪扩散过程。
因为自己还不去做实验的原因,对于论文中的实验的部分不做解释 自己在实验训练的时候如何用coco2017数据集来进行训练的话,默认的batchsize大小为16的话需要17G的显存空间。
摘要与整体概括
我们将从摘要中获取到的核心的概念信息来进行总结:
-
这是一个新的框架,它将对象检测表述为从噪声框到对象框的去噪扩散过程
-
在训练阶段,对象框从真实框GT扩散到随机分布,并且模型学习逆转这种噪声过程。恢复到真实框通过损失函数来进行训练。
-
在推理阶段,模型以渐进的方式将一组随机生成的框细化为输出结果。也就是对一张随机加噪通过模型去噪来生成最终的预测框。
-
在从 COCO 到 CrowdHuman 的零样本传输(zero-shot)设置下,使用更多框和迭代步骤进行评估时,DiffusionDet 实现了 5.3 AP 和 4.8 AP 的增益
体现了DiffusionDet的核心思想与其用于目标检测的强大优势。
之后在相关介绍的部分对整个模型进行了整体上的一个概括
- 总结了目标检测的发展流程。
具体来说,大多数检测器通过在经验设计的候选对象上定义代理回归和分类来解决检测任务,例如滑动窗口、区域建议、锚框和参考点。最近,DETR提出了可学习的对象查询,消除了手工设计的组件,建立了端到端的检测,吸引了大量关注。
-
介绍了扩散模型用于分割取得了良好的效果,但是在检测上却没有很好的效果(分割更接近于是一个预测的任务,而检测却看作了是一个集合预测的任务)
-
之后总结了如何进行扩散获取到检测框的(细节)。
- 它通过将检测作为图像中边界框的
位置
(中心坐标)和大小
(宽度和高度)空间上的生成任务
,使用扩散模型
来处理目标检测任务。 - 在训练阶段,将高斯噪声添加到GT框以获得噪声框,然后,这些噪声框用于从主干编码器的输出特征图中裁剪感兴趣区域(RoI)的特征,例如ResNet和Swin Transformer
- 这些RoI特征被发送到检测解码器,该解码器经过训练可以预测无噪声的真实框。通过这个训练目标,DiffusionDet能够从随机框中预测真实框
- 在推理阶段,DiffusionDet通过反转学习的扩散过程来生成边界框,该过程将噪声先验分布调整为边界框上的学习分布。
- 它通过将检测作为图像中边界框的
DiffusionDet的灵活性使其在检测不同场景(例如稀疏或拥挤)的对象时具有巨大优势,而无需额外的微调
相关工作—检测的发展
大多数现代对象检测方法对经验对象先验执行框回归和类别分类,例如建议框 、锚点 、点 。最近,Carion 等人。提出 DETR使用一组固定的可学习查询来检测对象。从那时起,基于查询的检测范式引起了极大的关注,并激发了一系列后续工作。
- 提案方法(Proposal-based Methods):
基本概念:Proposal方法通过在图像中生成大量候选框,然后对这些Proposal进行分类和边界框回归来检测目标。
工作流程:典型的Proposal方法如R-CNN系列,首先使用选择性搜索或区域生成网络(RPN)等技术生成大量候选框。然后,这些提案经过卷积神经网络(CNN)进行特征提取,并送入分类器和回归器以识别目标类别和精确定位目标框。
- 锚框方法(Anchor-based Methods):
基本概念:锚框方法预先定义一组锚框,并在每个锚点上预测目标的类别和边界框。
- 点方法(Point-based Methods):
基本概念:点方法直接在图像的每个像素位置上进行预测,而不依赖于预定义的候选框或锚点。
工作流程:典型的点方法如CornerNet,通过预测图像中每个像素点是否是目标的关键点(如角点或中心点),然后根据这些点进行目标检测。
- 基于可学习查询的方法(Query-based Methods):
基本概念:基于可学习查询的方法,如DETR(Transformers for Detection),使用一组固定的可学习查询来代替传统的候选框或锚点,直接从图像中的特征表示中预测目标的位置和类别。
工作流程:DETR通过Transformer架构,将图像特征映射到查询和键值对上,通过自注意力机制进行全局感知,并直接输出目标框的位置和类别,消除了传统检测方法中的候选框生成和选择过程。
作者提出还有没有更简单的方法来实现这一个检测的功能呢?于是提出了DiffusionDet这是第一个采用扩散模型进行目标检测的工作。
DiffusionDet Approach
对整个算法流程和使用到的方法来进行一个详细的介绍。
预备知识
( x , b , c ) (x, b, c) (x,b,c)
-
(x,b,c),其中是x是输入图像,b,c分别是图像x中的对象的边界框和类别标签。
-
将集合中的第i个框表示为:
b i = ( c x i , c y i , w i , h i ) \boldsymbol{b}^{i}=\left(c_{x}^{i}, c_{y}^{i}, w^{i}, h^{i}\right) bi=(cxi,cyi,wi,hi)
其中
( c x i , c y i ) \left(c_{x}^{i}, c_{y}^{i}\right) (cxi,cyi)
表示第i个框的中心点的xy坐标,(wi,hi)表示第i个框的宽度和高度值。
- 前向噪声的扩散过程:扩散模型的前向噪声过程使用高斯模糊噪声来逐步扰动边界框b
q ( z t ∣ z 0 ) = N ( z t ∣ α ˉ t z 0 , ( 1 − α ˉ t ) I ) , q\left(\boldsymbol{z}_{t} \mid \boldsymbol{z}_{0}\right)=\mathcal{N}\left(\boldsymbol{z}_{t} \mid \sqrt{\bar{\alpha}_{t}} \boldsymbol{z}_{0},\left(1-\bar{\alpha}_{t}\right) \boldsymbol{I}\right), q(zt∣z0)=N(zt∣αˉtz0,(1−αˉt)I),
∏ s = 0 t α s = ∏ s = 0 t ( 1 − β s ) \prod_{s=0}^{t} \alpha_{s}=\prod_{s=0}^{t}\left(1-\beta_{s}\right) s=0∏tαs=s=0∏t(1−βs)
I:代表的就是我们的原始输出图像了。
x t = 1 − α ˉ t × ϵ + α ˉ t × x 0 x_{t}=\sqrt{1-\bar{\alpha}_{t}} \times \epsilon+\sqrt{\bar{\alpha}_{t}} \times x_{0} xt=1−αˉt×ϵ+αˉt×x0
扩散过程公式的细节解读:
其中 z 0 = b , z t 是是经过 t 步扩散后的边界框, α ˉ t 是递归因子。 \text { 其中 } z_{0}=b, z_{t} \text { 是是经过 } t \text { 步扩散后的边界框, } \bar{\alpha}_{t} \text { 是递归因子。 } 其中 z0=b,zt 是是经过 t 步扩散后的边界框, αˉt 是递归因子。
随机噪声生成:在每个时间步 t ,从均值为 0 、标准差为 σ 的高斯分布 N ( 0 , σ 2 I ) 中生成随机噪声 ϵ t ,其中 ϵ t 是形状为 [ B , N , 4 ] 的张量, B 是批量大小, N 是检测框的数量 随机噪声生成:在每个时间步 t ,从均值为 0 、标准差为 \sigma 的高斯分布 N\left(0, \sigma^{2} I\right) 中生成随机噪声 \epsilon_{t} ,其中 \epsilon_{t} 是形状为 [B, N, 4] 的张量, B 是批量大小, N 是检测框的数量 随机噪声生成:在每个时间步t,从均值为0、标准差为σ的高斯分布N(0,σ2I)中生成随机噪声ϵt,其中ϵt是形状为[B,N,4]的张量,B是批量大小,N是检测框的数量
高斯模糊噪声引入:将高斯噪声 ϵ t 乘以 1 − α cumprod ( t ) 并加到通过递归因子缩放后的真实框 p b 上,得到扰动后的检测框 p b : \text { 高斯模糊噪声引入:将高斯噪声 } \epsilon_{t} \text { 乘以 } \sqrt{1-\alpha_{\text {cumprod }(t)}} \text { 并加到通过递归因子缩放后的真实框 } p b \text { 上,得到扰动后的检测框 } p b \text { : } 高斯模糊噪声引入:将高斯噪声 ϵt 乘以 1−αcumprod (t) 并加到通过递归因子缩放后的真实框 pb 上,得到扰动后的检测框 pb :
p b t b , i = α cumprod ( t ) ⋅ p b b , i + 1 − α cumprod ( t ) ⋅ ϵ b , i , t p b_{t_{b, i}}=\sqrt{\alpha_{\text {cumprod }(t)}} \cdot p b_{b, i}+\sqrt{1-\alpha_{\text {cumprod }(t)}} \cdot \epsilon_{b, i, t} pbtb,i=αcumprod (t)⋅pbb,i+1−αcumprod (t)⋅ϵb,i,t
这里 p b b , i = ( x b , i , y b , i , w b , i , h b , i ) 表示批次 b 中的第 i 个检测框。 \text { 这里 } p b_{b, i}=\left(x_{b, i}, y_{b, i}, w_{b, i}, h_{b, i}\right) \text { 表示批次 } b \text { 中的第 } i \text { 个检测框。 } 这里 pbb,i=(xb,i,yb,i,wb,i,hb,i) 表示批次 b 中的第 i 个检测框。
ϵ b , i , t = ( ϵ b , i , t x , ϵ b , i , t y , ϵ b , i , t w , ϵ b , i , t h ) 是从高斯分布中采样的噪声。 \epsilon_{b, i, t}=\left(\epsilon_{b, i, t}^{x}, \epsilon_{b, i, t}^{y}, \epsilon_{b, i, t}^{w}, \epsilon_{b, i, t}^{h}\right) \text { 是从高斯分布中采样的噪声。 } ϵb,i,t=(ϵb,i,tx,ϵb,i,ty,ϵb,i,tw,ϵb,i,th) 是从高斯分布中采样的噪声。
模型训练和损失函数
在训练期间,使用神经网络f θ ( zt , t , x ) 通过最小化ℓ2损失来根据扰动后的边界框zt预测原始边界框b
L train = 1 2 ∥ f θ ( z t , t ) − z 0 ∥ 2 . \mathcal{L}_{\text {train }}=\frac{1}{2}\left\|f_{\theta}\left(\boldsymbol{z}_{t}, t\right)-\boldsymbol{z}_{0}\right\|^{2} . Ltrain =21∥fθ(zt,t)−z0∥2.
z T → z T − Δ → … → z 0 \boldsymbol{z}_{T} \rightarrow \boldsymbol{z}_{T-\Delta} \rightarrow \ldots \rightarrow \boldsymbol{z}_{0} zT→zT−Δ→…→z0
我们旨在通过扩散模型解决目标检测任务。在我们的设置中,数据样本是一组边界框 z0 = b,其中 b ∈ RN ×4 是一组 N 个框。神经网络 fθ (zt, t, x) 被训练来从噪声框 zt 预测 z0,以相应的图像 x 为条件。对应的类别标签c据此产生。
网络结构
建议将整个模型分成两部分,图像编码器
和检测解码器
,其中前者只运行一次以从原始输入图像 x 中提取深度特征
表示,后者以此深度特征
为条件,而不是原始图像,以逐步细化
来自嘈杂框 zt 的框预测。
- 图像编码器从输入图像中提取特征表示。 检测解码器将噪声框作为输入并预测类别分类和框坐标。
- 检测解码器在一个检测头中有 6 个阶段,遵循 DETR 和 Sparse R-CNN。 此外,DiffusionDet可以多次重复使用这个检测头(有6个阶段),这被称为“迭代评估”
图像编码器
本质上就相当于是DERT里面的cnn+enocode产生噪声框
图像编码器将原始图像作为输入,提取其高级特征用于后续检测解码器。
我们使用卷积神经网络(如ResNet)和基于基于Transformer模型(如Swin)实现了扩散。特征金字塔网络用于生成ResNet和Swin骨干网的多尺度特征图
检测解码器
借鉴 Sparse R-CNN的设计,检测解码器接收一组检测框作为输入,从图像编码器生成的特征图中裁剪感兴趣区域(RoI)特征,并将这些 RoI 特征送入检测头以获得框的回归和分类结果。
-
DiffusionDet 从随机框开始,而 Sparse R-CNN 在推理中使用一组固定的学习框;
-
稀疏 R-CNN 将建议框及其相应的建议特征对作为输入,而 DiffusionDet 只需要建议框;
-
DiffusionDet 在迭代采样步骤中重新使用检测器头,并且参数在不同步骤之间共享,每个步骤都通过时间步嵌入 [35、86] 指定到扩散过程,而稀疏 R-CNN 使用检测解码器仅在前向传播中进行一次
训练与推理过程
训练算法流程
在训练过程中,我们首先构建从真实框到噪声框的扩散过程,然后训练模型来反转该过程。算法 1 提供了 DiffusionDet 训练过程的伪代码。
我们简单的对这个训练部分的算法来进行描述。
- 输入参数:
- images: 输入图像数据,形状为[B, H, W, 3],表示批次中的图像数量及其高度、宽度以及通道数。
- gt_boxes: 真实边界框数据,形状为[B, *, 4],表示批次中每个图像所对应的真实边界框数量(可以是不同数量),每个边界框包含四个坐标。
- 算法步骤(动态理解网络的一个核心过程)
-
Encode提取特征
-
将gt_boxes进行填充到同样数量N(proposal boxes的数量)的边界框pb(通过pad_boxes函数),使得每个图像具有相同数量的边界框。
-
对pb进行信号缩放,将其值从[0, 1]范围内映射到[-scale, scale]范围内。
-
随机选择一个时间步长t(从0到T)。生成服从正态分布的噪声eps(均值为0,标准差为1),其维度为[B, N, 4],用于扰动腐蚀(corrupt)gt_boxes。
-
基于当前的时间步长t和信号缩放后的gt_boxes(pb),使用DiffusionDet中的alpha_cumprod函数生成混合因子,对pb和eps进行组合得到扰动的边界框pb_crpt。
-
基于扰动的边界框pb_crpt和特征表示feats,通过检测解码器detection_decoder生成预测的边界框pb_pred。
7.计算损失函数并进行训练。
图片真实框填充(Ground truth boxes padding)
对于现代目标检测基准,感兴趣的实例数量通常因图像而异。因此,我们首先将一些额外的框填充到原始的groundtruth框,使得所有框加起来为固定数量的Ntrain。我们探索了几种填充策略,例如,重复现有的地面实况框、连接随机框或图像大小的框。连接随机框效果最好
Box corruption.
我们将高斯噪声添加到填充的真实框中。噪声尺度由αt控制,αt在不同时间步t中采用单调递减的余弦时间表。值得注意的是,the ground truth box坐标也需要缩放,因为信噪比对扩散模型的性能有显着影响。我们观察到,与图像生成任务相比,目标检测有利于相对较高的信号缩放值。
推理算法流程
DiffusionDet的推理过程是从噪声到目标框的去噪采样过程。从高斯分布中采样的框开始,模型逐步完善其预测,如算法 2 所示。
我们简单的对这个推理部分的算法来进行描述。
- 输入参数:
- images: 输入图像数据,形状为[B, H, W, 3],表示批次中的图像数量及其高度、宽度以及通道数。
- steps: 采样步数,即需要采样多少个时间步长。
- T: 总时间步长。
- 算法步骤:
-
(通过图像编码器)得到特征表示feats。
-
生成服从正态分布的噪声pb_t(均值为0,标准差为1),其维度为[B, N, 4],用于初始化边界框预测。
-
使用linespace生成一个等分线段,其从 -1 开始,到 T 结束,等分成steps份。并且在[0, T]内生成随机时间t_now。
-
对每个时间区间(t_now, t_next)执行如下操作:
- a. 基于当前的时间步长t_now和噪声pb_t,通过检测解码器detection_decoder生成预测的边界框pb_pred
- b. 基于预测边界框pb_pred和当前时间t_now以及向前时间t_next,使用ddim_step函数估计t_next时刻的边界框pb_t
- c. 使用box_renewal函数更新边界框pb_t(指将pb_t中的值限制在[0, 1]内)。
-
返回最终的结果。
采样步骤
在每个采样步骤中,上一个采样步骤的随机框或估计框被发送到检测解码器以预测类别分类和框坐标。获得当前步骤的框后,采用DDIM来估计下一步的框。
Box更新
在每个采样步骤之后,预测框可以粗略地分为两种类型:期望的预测和不需要的预测
。所需的预测包含正确位于相应对象处的框,而不需要的预测则任意分布
。直接将这些不需要的框发送到下一次采样迭代不会带来任何好处,因为它们的分布不是由训练中的框损坏构建的。为了使推理更好地与训练保持一致
,我们提出了框更新策略
,通过用随机框替换这些不需要的框来恢复它们。
具体来说,我们首先过滤掉分数低于特定阈值的不需要的框。然后,我们将剩余的框与从高斯分布中采样的新随机框连接起来。
- 预测框的分类:
- 期望的预测(Desired Predictions):这些是正确定位在相应对象上的预测框。换句话说,这些框准确地包围了图像中的目标对象。
- 不需要的预测(Undesired Predictions):这些是任意分布的预测框,它们并没有正确地定位在目标对象上。这些框可能是由于模型错误地识别了对象的位置,或者是因为它们根本就没有识别到任何对象。
- 不需要的预测的问题:
- 直接将这些不需要的预测框用于下一次采样迭代是无效的,因为它们的分布并不是由训练数据中的框损坏(即,正确的框标注)所构建的。这意味着,这些错误的框不会帮助模型学习如何更好地检测对象。
- 框更新策略:为了解决这个问题,提出了一种框更新策略。这种策略的核心思想是,用随机生成的框替换那些不需要的预测框。这样做的目的是为了让推理过程(即模型的预测)更好地与训练过程保持一致。通过替换不需要的预测框为随机框,可以确保模型在下一次迭代中不会受到错误预测的影响,从而有助于模型学习如何生成更准确的预测框。
总的来说,这种策略是一种正则化手段,旨在减少错误预测对模型训练过程的负面影响,通过引入随机性来模拟训练数据中的分布,从而提高模型的泛化能力。
我们的DiffusionDet用于目标检测的核心原理与基本的流程从论文中就可以得到上面的一些内容,对于我们更为具体的实现也需要通过其代码进行进一步的学习。
采样过程的加速(DDIM)
一种方式是我们可以跨步采样, 也就是一共T个恢复时长, 我们每隔⌈ T / S ⌉ 步采样一次, 这样只需要采样S次
代码中在自己调试的过程中发现其间隔的S默认情况下使用了1可以在断点调试的时候增加一下数值来进一步学习整个过程。
前向的加噪过程:
x t = Π i α i x 0 + 1 − Π i α i ϵ , ϵ ∼ N ( 0 , I ) \mathbf{x}_{t}=\sqrt{\Pi_{i} \alpha_{i}} \mathbf{x}_{0}+\sqrt{1-\Pi_{i} \alpha_{i}} \epsilon, \epsilon \sim \mathcal{N}(0, I) xt=Πiαix0+1−Πiαiϵ,ϵ∼N(0,I)
在噪声恢复过程中,我们以网络预测的噪声et估计加噪过程中加入的噪声,即:
x t = α ˉ t x 0 + 1 − α ˉ t ϵ t \mathbf{x}_{t}=\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \epsilon_{t} xt=αˉtx0+1−αˉtϵt
翻转的过程用x+估计xt-1,将上式的t换成t-1有:
x t − 1 = α ˉ t − 1 x 0 + 1 − α ˉ t − 1 ϵ t − 1 \mathbf{x}_{t-1}=\sqrt{\bar{\alpha}_{t-1}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t-1}} \epsilon_{t-1} xt−1=αˉt−1x0+1−αˉt−1ϵt−1
但我们在xt时刻只能得到该时刻的噪声预测ϵt , 因此对上式做恒等变换:
x t − 1 = α ˉ t − 1 x 0 + 1 − α ˉ t − 1 ϵ t − 1 = α ˉ t − 1 x 0 + 1 − α ˉ t − 1 − σ t 2 ϵ t + σ t ϵ \begin{aligned} \mathbf{x}_{t-1} & =\sqrt{\bar{\alpha}_{t-1}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t-1}} \boldsymbol{\epsilon}_{t-1} \\ & =\sqrt{\bar{\alpha}_{t-1}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t-1}-\sigma_{t}^{2}} \boldsymbol{\epsilon}_{t}+\sigma_{t} \boldsymbol{\epsilon} \end{aligned} xt−1=αˉt−1x0+1−αˉt−1ϵt−1=αˉt−1x0+1−αˉt−1−σt2ϵt+σtϵ
q σ ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; α ˉ t − 1 x 0 + 1 − α ˉ t − 1 − σ t 2 x t − α ˉ t x 0 1 − α ˉ t , σ t 2 I ) q_{\sigma}\left(\mathbf{x}_{t-1} \mid \mathbf{x}_{t}, \mathbf{x}_{0}\right)=\mathcal{N}\left(\mathbf{x}_{t-1} ; \sqrt{\bar{\alpha}_{t-1}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t-1}-\sigma_{t}^{2}} \frac{\mathbf{x}_{t}-\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}}{\sqrt{1-\bar{\alpha}_{t}}}, \sigma_{t}^{2} \mathbf{I}\right) qσ(xt−1∣xt,x0)=N(xt−1;αˉt−1x0+1−αˉt−1−σt21−αˉtxt−αˉtx0,σt2I)
对比形式 q ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; μ ~ ( x t , x 0 ) , β ~ t I ) , 得到 β ~ t = σ t 2 = 1 − α ˉ t − 1 1 − α ˉ t ⋅ β t = 1 − α ˉ t − 1 1 − α ˉ t ⋅ ( 1 − α t ) \begin{array}{l} \text { 对比形式 } q\left(\mathbf{x}_{t-1} \mid \mathbf{x}_{t}, \mathbf{x}_{0}\right)=\mathcal{N}\left(\mathbf{x}_{t-1} ; \tilde{\boldsymbol{\mu}}\left(\mathbf{x}_{t}, \mathbf{x}_{0}\right), \tilde{\beta}_{t} \mathbf{I}\right) \text {, 得到 }\\ \tilde{\beta}_{t}=\sigma_{t}^{2}=\frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_{t}} \cdot \beta_{t}=\frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_{t}} \cdot\left(1-\alpha_{t}\right) \end{array} 对比形式 q(xt−1∣xt,x0)=N(xt−1;μ~(xt,x0),β~tI), 得到 β~t=σt2=1−αˉt1−αˉt−1⋅βt=1−αˉt1−αˉt−1⋅(1−αt)
这一部分给出了参考的资料:
相关文章:

DiffusionDet: Diffusion Model for Object Detection—用于对象检测的扩散模型论文解析
DiffusionDet: Diffusion Model for Object Detection—用于对象检测的扩散模型论文解析 这是一篇发表在CVPR 2023的一篇论文,因为自己本身的研究方向是目标跟踪,之前看了一点使用扩散模型进行多跟踪的论文,里面提到了DiffusionDet因此学习一…...

深度学习基础知识-编解码结构理论超详细讲解
编解码结构(Encoder-Decoder)是一种应用广泛且高效的神经网络架构,最早用于序列到序列(Seq2Seq)任务,如机器翻译、图像生成、文本生成等。随着深度学习的发展,编解码结构不断演变出多种模型变体…...
探讨Java深搜算法的学习笔记
大家好,我是 V 哥。深度优先搜索(DFS)是一种图遍历算法,它优先深入到某条路径的尽头,再回溯到前一个节点继续探索其他路径,直到找到目标或遍历完整个图。DFS的应用场景广泛,可以用于路径搜索、连…...
408——操作系统(持续更新)
文章目录 一、操作系统的概念及特征1.1 计算机系统的概念1.2 操作系统的基本特征 二、操作系统的功能和接口2.1 操作系统作为计算机资源的管理者2.2 操作系统作为用户和计算机硬件系统之间的接口2.3 操作系统实现对计算机资源的扩充 三、操作系统的发展和分类四、操作系统的运行…...
架构师之路-学渣到学霸历程-37
Nginx的热部署实验 本次分享的就是nginx的升级以及降级,实验中其实很多操作都需要理解,实际操作不难,但是需要全面理解这个动作,敲这个命令是用来干什么的?借着这个笔记可以试一下;go~! 1、ng…...

CSRF与SSRF
csrf(跨站请求伪造)的原理: csrf全称是跨站请求伪造(cross-site request forgery),也被称为one-click attack 或者 session riding scrf攻击利用网站对于用户网页浏览器的信任,劫持用户当前已登录的web应用程序,去执行分用户本意的操作。 利…...

RabbitMQ 存储机制
一、消息存储机制 不管是持久化的消息还是非持久化的消息都可以被写入到磁盘。持久化的消息在到达队列时就被写入到磁盘,非持久化的消息一般只保存在内存中,在内存吃紧的时候会被换入到磁盘中,以节省内存空间。这两种类型的消息的落盘处理都…...
【Java SE】类型转换
类型转换是将一个值从一种类型转换为另一种类型的过程。该过程如果从低精度数据类型转为高精度数据类型,则不会发生溢出并且总能成功,如果从高精度数据类型转为低精度数据类型,则会有信息丢失且可能失败。类型转换又可分为隐式转换和显式转换…...

JAVA:常见 JSON 库的技术详解
1、简述 在现代应用开发中,JSON(JavaScript Object Notation)已成为数据交换的标准格式。Java 提供了多种方式将对象转换为 JSON 或从 JSON 转换为对象,常见的库包括 Jackson、Gson 和 org.json。本文将介绍几种常用的 JSON 处理…...
Redis缓存击穿、雪崩、穿透解决方案
Redis 缓存击穿、雪崩、穿透解决方案 1、首先看看逻辑方面是否还有优化空间,正常流程查询redis中获取不到数据,则去数据库获取,但数据库查询并返回时,调用异步方法,将该数据存储进redis中,并设置一个较短的…...

C++ 优先算法——盛最多水的容器(双指针)
目录 题目:盛最多水的容器 1. 题目解析 2. 算法原理 3. 代码实现 题目:盛最多水的容器 1. 题目解析 题目截图: 如图所示: 水的高度一定是由较低的那条线的高度决定的:例1图中,是由7决定的,然后求出…...

blender 小车建模 建模 学习笔记
一、学习blender视频教程链接 案例4:狂奔的小车_建模_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Bt4y1E7qn?p14&spm_id_from333.788.videopod.episodes&vd_sourced0ea58f1127eed138a4ba5421c577eb1 二、开始建模 (1)创…...
导出列表数据到Excel并下载
Java导出查询到的数据列表为Excel并下载 1.背景 工作中经常有需求,需要把列表的数据导出为Excel并下载。EasyExcel工具可以很好的实现这一需求。 2.实现流程 1.引入EasyExcel依赖包 <dependency><groupId>com.alibaba</groupId><artifactId…...

基于NVIDIA NIM平台实现盲人过马路的demo(一)
前言:利用NVIDIA NIM平台提供的大模型进行编辑,通过llama-3.2-90b-vision-instruct模型进行初步的图片检测 step1: 部署大模型到本地,引用所需要的库 import os import requests import base64 import cv2 import time from datetime import datetimestep2: 观看官方使用文…...

美格智能5G车规级通信模组:以连接+算力驱动智能化进阶
2023年3月,基于高通公司第二代骁龙汽车5G调制解调器及射频系统平台SA522M/SA525M,美格智能在德国纽伦堡嵌入式系统展上正式发布全新一代5G车规级C-V2X通信模组MA922系列,迅速引起行业和市场关注。随着5G高速网联逐步成为智能汽车标配…...

[MRCTF2020]PYWebsite1
如果输入的密钥是对的那么我们就直接跳转到flag.php页面 那么我们直接访问😎,他不带我们去我们自己去. 那就用XFF呗. 知识点: 定义:X-Forwarded-For是一个HTTP请求头字段,用于识别通过HTTP代理或负载均衡方式连接到W…...
无源元器件-磁珠选型参数总结
🏡《总目录》 目录 1,概述2,磁珠选型参数2.1,电学参数2.1.3,阻抗(Impedance)2.1.2,额定电流(Rated Current)2.1.3,直流电阻(DC Resistance)2.2,机械性能参数2.2.1,外观和尺寸(Appearance and Dimensions)2.2.2,粘接强度( Bonding Strength)2.2.3,弯曲强度…...

宝顶白芽,慢生活的味觉盛宴
在快节奏的生活中,人们愈发向往那种悠然自得、返璞归真的生活方式。白茶,以其独特的韵味和清雅的风格,成为了现代人追求心灵宁静与生活品质的象征。而在众多白茶之中,竹叶青茶业出品的宝顶白芽以其甘甜醇爽的特质,成为…...
已知三角形三边长求面积用仓颉语言作答
仓颉语言 https://cangjie-lang.cn/ linux和win和mac均有sdk,在本机deepinlinuxv23下载到本地解压缩到目录下设置环境变量 source envsetup.sh 比java方便太多了,java每次都是要自己搞很久,当然,打开看一下envsertup.sh,和我们…...
【JavaScript】匿名函数及回调函数总结
JavaScript 匿名函数 匿名函数没有显式的名称, 被视为一个函数表达式,可以在不需要额外命名的情况下进行定义和使用, 通常被用作回调函数, 即将函数作为参数传递给其他函数。 回调函数是在特定事件或条件发生时被调用的函数,回调函数通常用于异步编程中…...

HTML鼠标移动的波浪线动画——页面将会初始化一个Canvas元素,并使用JavaScript代码在Canvas上绘制响应鼠标移动的波浪线动画
代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Wave Animation</title><style&…...

树莓派开发相关知识八-其他传感器
1、蜂鸣器 #!/usr/bin/env python #coding:utf-8import RPi.GPIO as GPIO import time OUT5 def init():GPIO.setwarnings(False)GPIO.setmode(GPIO.BCM)GPIO.setup(OUT,GPIO.OUT)#蜂鸣器鸣叫函数 def beep(seconds):GPIO.output(OUT,GPIO.HIGH)time.sleep(seconds)GPIO.output…...

ComfyUI - ComfyUI 工作流中集成 SAM2 + GroundingDINO 处理图像与视频 教程
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/143359538 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 SAM2 与…...

STM32G4 双ADC模式之常规同步模式独立注入模式
目录 概述 1 认识双ADC模式 2 功能实现 2.1 原理介绍 2.2 实现方法 概述 本文主要介绍STM32G4 双ADC模式之常规同步模式&独立注入模式相关内容,包括ADC模块的功能介绍,实现框架结构,以及常规同步模式&独立注入模式ADC的转换的实…...
深入理解网络协议:OSPF、VLAN、NAT与ACL详解
OSPF工作过程与基础配置 一、OSPF的工作过程 OSPF(开放最短路径优先)是一个广泛使用的路由协议,它的工作过程可以总结为以下几个步骤: 启动与邻居发现 OSPF在配置完成后,会通过本地组播地址224.0.0.5发送HELLO包。HE…...

idea 配置tomcat 服务
选择tomcat的安装路径 选到bin的文件夹的上一层就行...

.net core 接口,动态接收各类型请求的参数
[HttpPost] public async Task<IActionResult> testpost([FromForm] object info) { //Postman工具测试结果: //FromBody,Postman的body只有rawjson时才进的来 //参数为空时,Body(form-data、x-www-form-urlencoded)解析到的数据也有所…...

关注!这些型号SSD有Windows蓝屏问题需要修复
近期,在闪迪官方有一个SSD FW升级提醒,主要是为了解决Windows 11 24H2系统蓝屏的问题: Fix问题:这些SSD的主机内存缓冲区(Host Memory Buffer,简称HMB)功能可能会导致系统出现蓝屏死机ÿ…...
go语言gin框架平滑关闭——思悟项目技术2
目录 前言 直接关闭的缺陷 平滑关闭的使用场景 例子 思悟项目: golang qq邮件发送验证码——思悟项目技术1 前言 平滑关闭(graceful shutdown)是指在停止服务时,能够让现有的连接、任务或者操作优雅地完成,而不是…...

K8S flannel网络模式对比
K8S flannel网络模式对比 VXLAN 模式Host-GW 模式如何查看 Flannel 的网络模式?如何修改 Flannel 的网络模式?如何修改flannel vxlan端口?Flannel 是一个 Kubernetes 中常用的网络插件,用于在集群中的节点之间提供网络连接。Flannel 提供了多种后端实现方式,vxlan 和 host…...