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

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)

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


http://www.kler.cn/a/376470.html

相关文章:

  • 【Oracle APEX开发小技巧10】CSS样式控制交互式报表列宽和自动换行效果
  • 数据结构,问题 F: 括弧匹配检验
  • vue系列=计算属性
  • 前端 react 面试题(二)
  • SSM学习 day02
  • 如何实现图片懒加载,原生 + React 实现方式
  • Vite常用插件配置
  • R学习笔记-单因素重复测量方差分析
  • 032_Tiledlayout_in_Matlab中的分块图布局
  • C++/Opengl编程实践
  • 代码随想录一刷——350.两个数组的交集II
  • 024集——CAD 动态显示图形——ed.Redraw(ent)实现(CAD—C#二次开发入门)
  • 初探Flink的序列化
  • centos7 zabbix监控nginx的pv和uv和status_code
  • 无法启动此程序win10玩游戏找不到d3dx9_43.dll缺失的五种常用有效解决方法
  • el-table 修改高亮行样式
  • 基于 Flask 的 Python 应用程序,主要功能包括用户认证、文件上传(CSV 和图片)、图像文字识别(OCR)以及根据识别结果进行一些数据处理和比对
  • [MySQL]DQL语句(一)
  • SRS:构建实时免费视频服务器的全方位指南
  • 使用Nginx作为Web服务器和反向代理
  • Webserver(2.4)进程控制
  • 2024 手机解压缩软件评测与推荐
  • 【ROS2】文档、教程、源码汇总
  • Android——横屏竖屏
  • 视频怎么进行格式转换?6款视频转换MP4格式的免费软件!
  • 【sqlmap使用手册-持续更新中】