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的显存空间。

摘要与整体概括

我们将从摘要中获取到的核心的概念信息来进行总结:

  1. 这是一个新的框架,它将对象检测表述为从噪声框到对象框的去噪扩散过程

  2. 在训练阶段,对象框从真实框GT扩散到随机分布,并且模型学习逆转这种噪声过程。恢复到真实框通过损失函数来进行训练。

  3. 在推理阶段,模型以渐进的方式将一组随机生成的框细化为输出结果。也就是对一张随机加噪通过模型去噪来生成最终的预测框。

  4. 在从 COCO 到 CrowdHuman 的零样本传输(zero-shot)设置下,使用更多框和迭代步骤进行评估时,DiffusionDet 实现了 5.3 AP 和 4.8 AP 的增益

体现了DiffusionDet的核心思想与其用于目标检测的强大优势。

在这里插入图片描述

之后在相关介绍的部分对整个模型进行了整体上的一个概括

  • 总结了目标检测的发展流程。

具体来说,大多数检测器通过在经验设计的候选对象上定义代理回归和分类来解决检测任务,例如滑动窗口区域建议锚框参考点。最近,DETR提出了可学习的对象查询,消除了手工设计的组件,建立了端到端的检测,吸引了大量关注。

在这里插入图片描述

  • 介绍了扩散模型用于分割取得了良好的效果,但是在检测上却没有很好的效果(分割更接近于是一个预测的任务,而检测却看作了是一个集合预测的任务

  • 之后总结了如何进行扩散获取到检测框的(细节)

    • 它通过将检测作为图像中边界框的位置(中心坐标)和大小(宽度和高度)空间上的生成任务,使用扩散模型来处理目标检测任务。
    • 在训练阶段,将高斯噪声添加到GT框以获得噪声框,然后,这些噪声框用于从主干编码器的输出特征图中裁剪感兴趣区域(RoI)的特征,例如ResNet和Swin Transformer
    • 这些RoI特征被发送到检测解码器,该解码器经过训练可以预测无噪声的真实框。通过这个训练目标,DiffusionDet能够从随机框中预测真实框
    • 在推理阶段,DiffusionDet通过反转学习的扩散过程来生成边界框,该过程将噪声先验分布调整为边界框上的学习分布。

在这里插入图片描述
DiffusionDet的灵活性使其在检测不同场景(例如稀疏或拥挤)的对象时具有巨大优势,而无需额外的微调

在这里插入图片描述

相关工作—检测的发展

大多数现代对象检测方法对经验对象先验执行框回归和类别分类,例如建议框 、锚点 、点 。最近,Carion 等人。提出 DETR使用一组固定的可学习查询来检测对象。从那时起,基于查询的检测范式引起了极大的关注,并激发了一系列后续工作。

  1. 提案方法(Proposal-based Methods):

基本概念:Proposal方法通过在图像中生成大量候选框,然后对这些Proposal进行分类和边界框回归来检测目标。

工作流程:典型的Proposal方法如R-CNN系列,首先使用选择性搜索或区域生成网络(RPN)等技术生成大量候选框。然后,这些提案经过卷积神经网络(CNN)进行特征提取,并送入分类器和回归器以识别目标类别和精确定位目标框。

  1. 锚框方法(Anchor-based Methods):

基本概念:锚框方法预先定义一组锚框,并在每个锚点上预测目标的类别和边界框。

  1. 点方法(Point-based Methods):

基本概念:点方法直接在图像的每个像素位置上进行预测,而不依赖于预定义的候选框或锚点。

工作流程:典型的点方法如CornerNet,通过预测图像中每个像素点是否是目标的关键点(如角点或中心点),然后根据这些点进行目标检测。

  1. 基于可学习查询的方法(Query-based Methods):

基本概念:基于可学习查询的方法,如DETR(Transformers for Detection),使用一组固定的可学习查询来代替传统的候选框或锚点,直接从图像中的特征表示中预测目标的位置和类别。

工作流程:DETR通过Transformer架构,将图像特征映射到查询和键值对上,通过自注意力机制进行全局感知,并直接输出目标框的位置和类别,消除了传统检测方法中的候选框生成和选择过程。

在这里插入图片描述

作者提出还有没有更简单的方法来实现这一个检测的功能呢?于是提出了DiffusionDet这是第一个采用扩散模型进行目标检测的工作。

DiffusionDet Approach

对整个算法流程和使用到的方法来进行一个详细的介绍。

预备知识

( x , b , c ) (x, b, c) (x,b,c)

  1. (x,b,c),其中是x是输入图像,b,c分别是图像x中的对象的边界框和类别标签。

  2. 将集合中的第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个框的宽度和高度值。

  1. 前向噪声的扩散过程:扩散模型的前向噪声过程使用高斯模糊噪声来逐步扰动边界框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(ztz0)=N(ztαˉt z0,(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=0tαs=s=0t(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 =21fθ(zt,t)z02.

z T → z T − Δ → … → z 0 \boldsymbol{z}_{T} \rightarrow \boldsymbol{z}_{T-\Delta} \rightarrow \ldots \rightarrow \boldsymbol{z}_{0} zTzTΔz0

我们旨在通过扩散模型解决目标检测任务。在我们的设置中,数据样本是一组边界框 z0 = b,其中 b ∈ RN ×4 是一组 N 个框。神经网络 fθ (zt, t, x) 被训练来从噪声框 zt 预测 z0,以相应的图像 x 为条件。对应的类别标签c据此产生。

在这里插入图片描述

网络结构

建议将整个模型分成两部分,图像编码器检测解码器,其中前者只运行一次以从原始输入图像 x 中提取深度特征表示,后者以此深度特征为条件,而不是原始图像,以逐步细化来自嘈杂框 zt 的框预测

在这里插入图片描述

  1. 图像编码器从输入图像中提取特征表示。 检测解码器将噪声框作为输入并预测类别分类和框坐标。
  2. 检测解码器在一个检测头中有 6 个阶段,遵循 DETR 和 Sparse R-CNN。 此外,DiffusionDet可以多次重复使用这个检测头(有6个阶段),这被称为“迭代评估”

图像编码器

本质上就相当于是DERT里面的cnn+enocode产生噪声框

图像编码器将原始图像作为输入,提取其高级特征用于后续检测解码器。
我们使用卷积神经网络(如ResNet)和基于基于Transformer模型(如Swin)实现了扩散。特征金字塔网络用于生成ResNet和Swin骨干网的多尺度特征图

检测解码器

借鉴 Sparse R-CNN的设计,检测解码器接收一组检测框作为输入,从图像编码器生成的特征图中裁剪感兴趣区域(RoI)特征,并将这些 RoI 特征送入检测头以获得框的回归和分类结果。

在这里插入图片描述

  1. DiffusionDet 从随机框开始,而 Sparse R-CNN 在推理中使用一组固定的学习框;

  2. 稀疏 R-CNN 将建议框及其相应的建议特征对作为输入,而 DiffusionDet 只需要建议框;

  3. DiffusionDet 在迭代采样步骤中重新使用检测器头,并且参数在不同步骤之间共享,每个步骤都通过时间步嵌入 [35、86] 指定到扩散过程,而稀疏 R-CNN 使用检测解码器仅在前向传播中进行一次

在这里插入图片描述

训练与推理过程

训练算法流程

在训练过程中,我们首先构建从真实框到噪声框的扩散过程,然后训练模型来反转该过程。算法 1 提供了 DiffusionDet 训练过程的伪代码。

在这里插入图片描述

我们简单的对这个训练部分的算法来进行描述。

  • 输入参数:
  1. images: 输入图像数据,形状为[B, H, W, 3],表示批次中的图像数量及其高度、宽度以及通道数。
  2. gt_boxes: 真实边界框数据,形状为[B, *, 4],表示批次中每个图像所对应的真实边界框数量可以是不同数量),每个边界框包含四个坐标
  • 算法步骤(动态理解网络的一个核心过程
  1. Encode提取特征

  2. 将gt_boxes进行填充到同样数量N(proposal boxes的数量)的边界框pb(通过pad_boxes函数),使得每个图像具有相同数量的边界框。

  3. 对pb进行信号缩放,将其值从[0, 1]范围内映射到[-scale, scale]范围内。

  4. 随机选择一个时间步长t(从0到T)。生成服从正态分布的噪声eps(均值为0,标准差为1),其维度为[B, N, 4],用于扰动腐蚀(corrupt)gt_boxes。

  5. 基于当前的时间步长t和信号缩放后的gt_boxes(pb),使用DiffusionDet中的alpha_cumprod函数生成混合因子,对pb和eps进行组合得到扰动的边界框pb_crpt。

  6. 基于扰动的边界框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 所示。

在这里插入图片描述
我们简单的对这个推理部分的算法来进行描述。

  • 输入参数:
  1. images: 输入图像数据,形状为[B, H, W, 3],表示批次中的图像数量及其高度、宽度以及通道数。
  2. steps: 采样步数,即需要采样多少个时间步长。
  3. T: 总时间步长。
  • 算法步骤:
  1. (通过图像编码器)得到特征表示feats

  2. 生成服从正态分布的噪声pb_t(均值为0,标准差为1),其维度为[B, N, 4],用于初始化边界框预测。

  3. 使用linespace生成一个等分线段,其从 -1 开始,到 T 结束,等分成steps份。并且在[0, T]内生成随机时间t_now。

  4. 对每个时间区间(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]内)。
  5. 返回最终的结果。

采样步骤

在每个采样步骤中,上一个采样步骤的随机框或估计框被发送到检测解码器以预测类别分类和框坐标。获得当前步骤的框后,采用DDIM来估计下一步的框。
在这里插入图片描述

Box更新

在每个采样步骤之后,预测框可以粗略地分为两种类型:期望的预测和不需要的预测。所需的预测包含正确位于相应对象处的框,而不需要的预测则任意分布。直接将这些不需要的框发送到下一次采样迭代不会带来任何好处,因为它们的分布不是由训练中的框损坏构建的。为了使推理更好地与训练保持一致,我们提出了框更新策略,通过用随机框替换这些不需要的框来恢复它们。

具体来说,我们首先过滤掉分数低于特定阈值的不需要的框。然后,我们将剩余的框与从高斯分布中采样的新随机框连接起来。

在这里插入图片描述

  • 预测框的分类:
  1. 期望的预测(Desired Predictions):这些是正确定位在相应对象上的预测框。换句话说,这些框准确地包围了图像中的目标对象。
  2. 不需要的预测(Undesired Predictions):这些是任意分布的预测框,它们并没有正确地定位在目标对象上。这些框可能是由于模型错误地识别了对象的位置,或者是因为它们根本就没有识别到任何对象。
  • 不需要的预测的问题:
  1. 直接将这些不需要的预测框用于下一次采样迭代是无效的,因为它们的分布并不是由训练数据中的框损坏(即,正确的框标注)所构建的。这意味着,这些错误的框不会帮助模型学习如何更好地检测对象。
  2. 框更新策略:为了解决这个问题,提出了一种框更新策略。这种策略的核心思想是,用随机生成的框替换那些不需要的预测框。这样做的目的是为了让推理过程(即模型的预测)更好地与训练过程保持一致。通过替换不需要的预测框为随机框,可以确保模型在下一次迭代中不会受到错误预测的影响,从而有助于模型学习如何生成更准确的预测框。

总的来说,这种策略是一种正则化手段,旨在减少错误预测对模型训练过程的负面影响,通过引入随机性来模拟训练数据中的分布,从而提高模型的泛化能力。

我们的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αi x0+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=αˉt x0+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} xt1=αˉt1 x0+1αˉt1 ϵt1

但我们在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} xt1=αˉt1 x0+1αˉt1 ϵt1=αˉt1 x0+1αˉt1σ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σ(xt1xt,x0)=N(xt1;αˉt1 x0+1αˉt1σt2 1αˉt xtαˉt x0,σ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(xt1xt,x0)=N(xt1;μ~(xt,x0),β~tI)得到 β~t=σt2=1αˉt1αˉt1βt=1αˉt1αˉt1(1αt)

在这里插入图片描述
这一部分给出了参考的资料:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/906917.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea 配置tomcat 服务

选择tomcat的安装路径 选到bin的文件夹的上一层就行

opencv 图像预处理

图像预处理 ​ 在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法,以下是一些常见的图像预处理操作&…

初始JavaEE篇——多线程(4):wait、notify,饿汉模式,懒汉模式,指令重排序

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 wait、notify 方法 多线程练习 单例模式 饿汉模式 懒汉模式 指令重排序 wait、notify 方法 wait 和 我们前面学习的sleep…

新工具可绕过 Google Chrome 的新 Cookie 加密系统

一位研究人员发布了一款工具,用于绕过 Google 新推出的 App-Bound 加密 cookie 盗窃防御措施并从 Chrome 网络浏览器中提取已保存的凭据。 这款工具名为“Chrome-App-Bound-Encryption-Decryption”,由网络安全研究员亚历山大哈格纳 (Alexander Hagenah…

JavaSE笔记4】API、包、String类、Object类

目录 一、API 二、包 2.导入不同包下的同名程序 三、String 1. String类是什么? 2. 如何创建String对象?(常用的四种方法) 3. String API a. 遍历字符串 b. 判断字符串内容是否相等: c. 截取子串 d. 替换部分内容 e. 匹配子串 f. 匹配开头字…

【含文档】基于ssm+jsp的超市订单后台理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: apache tomcat 主要技术: Java,Spring,SpringMvc,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统有两个主…

雷军救WPS“三次”,WPS注入新生力量,不再“抄袭”微软

救WPS“三次” 1989年,求伯君用128万行代码编写出了WPS1.0,宣告了中国自主办公时代的开启。 那时候,雷军还在武汉大学深造,他早就把求伯君当成了自己的榜样,这一来二去的,雷军和WPS之间也就结下了不解之缘…

MySQL中,如何定位慢查询?定位到的慢SQL如何分析?

目录 1. 慢查询发生的场景? 2. MySQL中,如何定位慢查询? 2.1 详细解释 3. 定位到的慢SQL如何分析? 3.1 详细说明 1. 慢查询发生的场景? 2. MySQL中,如何定位慢查询? 介绍一下当时产生问题…

Java基于微信小程序的私家车位共享系统(附源码,文档)

博主介绍:✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…

MiniPCIe 接口 CANFD卡

概述 基于MiniPCIe高性能接口CANFD卡采用标准MiniPCIe接口尺寸设计,方便PC机或嵌入式设备快速拓展出CANFD接口,实现数据采集与数据处理。 兼容高速CAN和CANFD两种通信需求、支持CAN2.0A、CAN2.0B协议,符合ISO11898-1规范。 规格 PC接口&…

kafka实时返回浏览数据

在安装完kafka(Docker安装kafka_docker 部署kafka-CSDN博客),查看容器是否启动: docker ps | grep -E kafka|zookeeper 再用python开启服务 from fastapi import FastAPI, Request from kafka import KafkaProducer import kafka import json import …

Docker Compose一键部署Spring Boot + Vue项目

目录 前提条件 概述 Compose简介 Compose文件 Compose环境 Compose命令 帮助命令 关键命令 Compose部署项目 初始化环境 查看代码文件 sql数据准备 nginx配置文件准备 创建 compose.yaml 一键启动compose多个容器 浏览器访问虚拟机ip:80(可省略默认的80端口) …

Android——横屏竖屏

系统配置变更的处理机制 为了避免横竖屏切换时重新加载界面的情况,Android设计了一中配置变更机制,在指定的环境配置发生变更之时,无需重启活动页面,只需执行特定的变更行为。该机制的视线过程分为两步: 修改 Androi…

【前端基础】CSS进阶

目标:掌握复合选择器作用和写法;使用background属性添加背景效果 01-复合选择器 定义:由两个或多个基础选择器,通过不同的方式组合而成。 作用:更准确、更高效的选择目标元素(标签)。 后代选…

Chrome与火狐的安全功能全面评估

在当今数字化时代,网络安全已成为用户最为关注的问题之一。作为两款广受欢迎的浏览器,Chrome和火狐(Firefox)都提供了多种安全功能来保护用户的在线隐私和数据安全。本文将全面评估这两款浏览器的安全功能,帮助用户更好…

动态代理:面向接口编程,屏蔽RPC处理过程

RPC远程调用 使用 RPC 时,一般的做法是先找服务提供方要接口,通过 Maven把接口依赖到项目中。在编写业务逻辑的时候,如果要调用提供方的接口,只需要通过依赖注入的方式把接口注入到项目中,然后在代码里面直接调用接口…

VsCode中搭建 Rt-Thread 开发环境(编译,调试,下载)

VsCode中搭建 Rt-Thread 开发环境(编译,调试,下载) 文章目录 VsCode中搭建 Rt-Thread 开发环境(编译,调试,下载)一 . 下载rt-thread源码二. 安装env脚本环境三 . 配置工具链3.1 使用…

Node.js:Express 中间件 CORS 跨域资源共享

Node.js:Express 中间件 & CORS 中间件全局中间件局部中间件分类错误级中间件内置中间件 CORS原理预检请求 中间件 中间件是不直接接收请求,也不直接发送响应,而是在这之间处理一个中间过程的组件。 当一个请求到来,会经过多…

OPENAI官方prompt文档解析

官方文档地址:https://platform.openai.com/docs/guides/gpt-best-practices 文档中文版来源:OpenAI 官方提示工程指南 [译] | 宝玉的分享 (baoyu.io) 1.写清楚说明 如果prompt给的范围十分模糊或是过于宽泛,那么GPT就会开始猜测您想要的内容,从而导致生成的结果偏离预期. …

ubuntu安装与配置Nginx(1)

在 Ubuntu 上安装和配置 Nginx 是相对简单的。以下是一个逐步指南: 1. 更新系统包 首先,确保你的系统是最新的。打开终端并运行: sudo apt update sudo apt upgrade2. 安装 Nginx 使用以下命令安装 Nginx: sudo apt install …