多模态论文笔记——GLIDE(DALL·E 2模型核心部件)
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍了OpenAI的DALL·E 2模型中重要的组成部分,用于图像生成的GLIDE模型及其论文。
文章目录
- 论文
- 背景
- 扩散模型(Diffusion Models)
- 引导扩散(Guided Diffusion)
- 无分类器引导(Classifier-free guidance 、CFG)
- CLIP 引导(CLIP Guidance)
- 模型架构
- 核心部件
- 训练和推理过程
- 训练细节
- 图像编辑
- 总结
- 历史文章
- 机器学习
- 深度学习
- 多模态论文
之前,我们在DALL·E系列的文章:DALL·E 2模型及其论文详解 中,提到了DALL·E 2 结合了 CLIP 模型 和 GLIDE 模型,使用了 CLIP 提供的图像特征 和 GLIDE 作为基于扩散模型的文本-图像生成方法,通过一个 两阶段生成架构 来生成高质量的图像。在这里,我们详细介绍GLIDE的实现:
在扩散模型经过了一系列发展之后,OpenAI 开始探索基于扩散模型(Diffusion Model)的图像生成和编辑方法,也就是本篇论文(在本篇论文后,才结合了CLIP推出了DALL·E 2)。
在论文中,作者对比了两种不同的 guidance 策略,分别是通过 CLIP 引导和 classifier-free 的引导。验证了 classifier-free 的方式生成的图片更真实,与提示的文本有更好的相关性,后续很多模型,包括SD系列模型都使用了classifier-free guidance。在文中作者还验证了 classifier-free 的引导的 GLIDE 模型在 35 亿参数的情况下优于 120 亿参数的 DALL-E 模型
论文
GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models
背景
GLIDE模型在背景中简要回顾了扩散模型中的几个关键实现点,扩散,无分类器指导和CLIP指导。如下:
扩散模型(Diffusion Models)
阐述DDPM(由Sohl-Dickstein等人引入并由Song和Ermon、Ho等人改进的高斯扩散模型)。
本质上是在原始图片中加入噪声,之后训练模型预测加入的噪声并且去除的过程。详细的加噪和去噪可以参考我在SD系列中的文章:Stable Diffusion的加噪和去噪详解
下面是本论文中的概要介绍:
给定一个来自数据分布的样本 x 0 ∼ q ( x 0 ) x_0 \sim q(x_0) x0∼q(x0),我们通过逐步向样本中添加高斯噪声来产生一个由潜变量 x 1 , . . . , x T x_1, ..., x_T x1,...,xT组成的马尔科夫链:
q ( x t ∣ x t − 1 ) : = N ( x t ; α t x t − 1 , ( 1 − α t ) I ) q(x_t \mid x_{t-1}) := \mathcal{N}(x_t; \sqrt{\alpha_t} x_{t-1}, (1-\alpha_t)\mathcal{I}) q(xt∣xt−1):=N(xt;αtxt−1,(1−αt)I)
参数解释:
- x t x_t xt:扩散过程中的潜变量(在第 t t t步的样本)。这是在步骤 t t t时的样本,逐步加入噪声。
- x t − 1 x_{t-1} xt−1:上一时刻的潜变量。
- α t \alpha_t αt:控制噪声添加幅度的系数,它在每个时间步骤中控制噪声的大小,通常 α t \alpha_t αt 是随时间递减的,意味着初期的样本保留更多信息,而到后期则加入更多噪声。
- N ( x t ; μ , Σ ) \mathcal{N}(x_t; \mu, \Sigma) N(xt;μ,Σ):表示高斯分布,其中 μ \mu μ 和 Σ \Sigma Σ 是均值和协方差。对于每个步骤,这里给出的高斯分布的均值为 α t x t − 1 \sqrt{\alpha_t} x_{t-1} αtxt−1,协方差为 ( 1 − α t ) I (1 - \alpha_t) \mathcal{I} (1−αt)I,即一个逐渐增加的噪声项。
如果每一步加入的噪声幅度 1 − α t 1 - \alpha_t 1−αt足够小,那么后验 q ( x t − 1 ∣ x t ) q(x_{t-1} \mid x_t) q(xt−1∣xt)可以被对角高斯很好地近似。进一步地,如果在整个链中添加的噪声幅度 1 − α 1 , . . . , α T 1 - \alpha_1, ..., \alpha_T 1−α1,...,αT足够大,那么 x T x_T xT可以被 N ( 0 , I ) \mathcal{N}(0, \mathcal{I}) N(0,I)很好地近似。这些性质表明可以学习一个模型 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1} \mid x_t) pθ(xt−1∣xt)来逼近真实后验:
p θ ( x t − 1 ∣ x t ) : = N ( μ θ ( x t ) , Σ θ ( x t ) ) p_\theta(x_{t-1} \mid x_t) := \mathcal{N}(\mu_\theta(x_t), \Sigma_\theta(x_t)) pθ(xt−1∣xt):=N(μθ(xt),Σθ(xt))
参数解释:
- p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1} \mid x_t) pθ(xt−1∣xt):由模型学习的后验分布,用于根据当前的噪声样本 x t x_t xt 预测上一时刻的潜变量 x t − 1 x_{t-1} xt−1。
- μ θ ( x t ) \mu_\theta(x_t) μθ(xt):该模型的预测均值,通常是通过神经网络预测的结果,它是恢复原始样本的核心。
- Σ θ ( x t ) \Sigma_\theta(x_t) Σθ(xt):该模型的预测协方差,通常在训练中被固定为常数,表示噪声的分布。后来的一些工作通过学习 Σ θ \Sigma_\theta Σθ 进一步改进了模型。
其可以被用来产生样本 x 0 ∼ p θ ( x 0 ) x_0 \sim p_\theta(x_0) x0∼pθ(x0),通过从高斯噪声 x T ∼ N ( 0 , I ) x_T \sim \mathcal{N}(0, \mathcal{I}) xT∼N(0,I)开始并以一系列步骤 x T − 1 , x T − 2 , . . . , x 0 x_{T-1}, x_{T-2}, ..., x_0 xT−1,xT−2,...,x0逐渐减少噪声。
虽然 log p θ ( x 0 ) \log p_\theta(x_0) logpθ(x0)存在一个易处理的变分下界(VLB),但通过优化一个重新加权VLB项的代理目标可以得到更好的结果。为了计算这个代理目标,我们通过对 x 0 x_0 x0施加高斯噪声 ϵ \epsilon ϵ来生成样本 x t ∼ q ( x t ∣ x 0 ) x_t \sim q(x_t \mid x_0) xt∼q(xt∣x0),然后使用标准均方误差损失训练一个模型 ϵ θ \epsilon_\theta ϵθ来预测添加的噪声:
L simple : = E t ∼ [ 1 , T ] , x 0 ∼ q ( x 0 ) , ϵ ∼ N ( 0 , I ) [ ∥ ϵ − ϵ θ ( x t , t ) ∥ 2 ] L_{\text{simple}} := \mathbb{E}_{t \sim [1, T], x_0 \sim q(x_0), \epsilon \sim \mathcal{N}(0, \mathcal{I})}[\|\epsilon - \epsilon_\theta(x_t, t)\|^2] Lsimple:=Et∼[1,T],x0∼q(x0),ϵ∼N(0,I)[∥ϵ−ϵθ(xt,t)∥2]
参数解释:
- t ∼ [ 1 , T ] t \sim [1, T] t∼[1,T]:在训练中,时间步 t t t 是随机选择的,表示在扩散过程中采样的每个时间步。
- x 0 ∼ q ( x 0 ) x_0 \sim q(x_0) x0∼q(x0):从数据分布 q ( x 0 ) q(x_0) q(x0) 中采样原始样本 x 0 x_0 x0,通常是从真实数据集中采样。
- ϵ ∼ N ( 0 , I ) \epsilon \sim \mathcal{N}(0, \mathcal{I}) ϵ∼N(0,I):标准高斯噪声,表示向 x 0 x_0 x0 添加的噪声。
- ϵ θ ( x t , t ) \epsilon_\theta(x_t, t) ϵθ(xt,t):由模型预测的噪声。目标是使模型能够精确地预测出添加到 x t x_t xt 中的噪声 ϵ \epsilon ϵ。
Ho等人展示了如何从 ϵ θ ( x t , t ) \epsilon_\theta(x_t, t) ϵθ(xt,t)推导出 μ θ ( x t ) \mu_\theta(x_t) μθ(xt),并将 Σ θ \Sigma_\theta Σθ固定为常数。他们还证明了其与之前基于分数匹配的去噪模型的等价性,其中分数函数为 ∇ x t log p ( x t ) ∝ ϵ θ ( x t , t ) \nabla_{x_t} \log p(x_t) \propto \epsilon_\theta(x_t, t) ∇xtlogp(xt)∝ϵθ(xt,t)。在后续工作中,Nichol和Dhariwal提出了一种学习 Σ θ \Sigma_\theta Σθ的策略,使得模型能够以更少的扩散步骤产生高质量的样本。我们在训练本文的模型时采用了这种技术。
扩散模型还成功应用到了图像超分辨率。根据扩散的标准公式,高分辨率图像 y 0 y_0 y0在一系列步骤中被逐步地施加噪声。然而, p θ ( y t − 1 ∣ y t , x ) p_\theta(y_{t-1} \mid y_t, x) pθ(yt−1∣yt,x)额外地以下采样输入 x x x为条件,通过沿通道维度拼接 x x x(双三次上采样后)提供给模型。这些模型的结果在FID、IS和人工比较的分数上都优于以前的方法。
引导扩散(Guided Diffusion)
Dhariwal和Nicho在论文:Diffusion Models Beat GANs on Image Synthesis中,发现了类别条件扩散模型的样本往往可以使用分类器引导来改善,其中,均值为 μ θ ( x t ∣ y ) \mu_\theta(x_t \mid y) μθ(xt∣y),方差为 Σ θ ( x t ∣ y ) \Sigma_\theta(x_t \mid y) Σθ(xt∣y)的类别条件扩散模型由分类器预测的目标类别 y y y的对数概率 log p ϕ ( y ∣ x t ) \log p_\phi(y \mid x_t) logpϕ(y∣xt)附加地扰动。得到的新的扰动后的均值 μ ^ θ ( x t ∣ y ) \hat{\mu}_\theta(x_t \mid y) μ^θ(xt∣y)为:
μ ^ θ ( x t ∣ y ) = μ θ ( x t ∣ y ) + s ⋅ Σ θ ( x t ∣ y ) ∇ x t log p ϕ ( y ∣ x t ) \hat{\mu}_\theta(x_t \mid y) = \mu_\theta(x_t \mid y) + s \cdot \Sigma_\theta(x_t \mid y) \nabla_{x_t} \log p_\phi(y \mid x_t) μ^θ(xt∣y)=μθ(xt∣y)+s⋅Σθ(xt∣y)∇xtlogpϕ(y∣xt)
系数 s s s称为引导尺度,Dhariwal和Nichol发现增加 s s s会以牺牲多样性为代价提高样本质量。
该论文主要通过对模型结构的改进和引入classifier guidance(分类器)引导方法,显著提升了基于扩散模型的图像生成质量。
通过优化Attention机制和引入多分辨率学习,结合额外训练的分类器来引导生成过程,实现了超越传统生成模型(如StyleGAN2)的效果。
这个论文的主要内容是:
- 验证了无条件图像生成中不同模型结构对效果的影响,进行了大量的消融实验。
- 引入 (分类器引导) 来提升生成质量。
模型结构改进:
- 增加模型深度,降低宽度:保持模型大小不变,但通过增加深度和减少宽度来提升效果。
- 增加 Attention 头的数量。
- 多尺度 Attention:不仅在 16x16 分辨率使用 Attention,还在 32x32 和 8x8 分辨率上使用。
- 采用 BigGAN 的 residual block:在上采样和下采样激活时使用,增强生成能力。
- 调整 residual connection 的缩放因子:使用 1 / 2 1/\sqrt{2} 1/2 的缩放因子。
Classifier Guidance:
- 受到 GAN 的有条件生成启发,将类别信息引入扩散模型中,以提升生成质量。
- 为避免每次类别变化时都需重新训练扩散模型,采用解耦类别信息的方式:额外训练一个分类模型,通过分类器引导生成过程。
- 通过分类器引导,可以提升生成质量并避免频繁的模型重训练。
无分类器引导(Classifier-free guidance 、CFG)
Ho和Salimans在论文:CLASSIFIER-FREE DIFFUSION GUIDANCE中提出了classifier-free引导,一种用于引导扩散模型且不需要训练一个单独的分类器模型的技术。对于classifier-free引导,在训练过程中以固定概率将类别条件扩散模型 ϵ θ ( x t ∣ y ) \epsilon_\theta(x_t \mid y) ϵθ(xt∣y)中的标签 y y y替换为空标签 ∅ \emptyset ∅。在采样过程中,模型的输出沿 ϵ θ ( x t ∣ y ) \epsilon_\theta(x_t \mid y) ϵθ(xt∣y)方向进一步推理,并远离 ϵ θ ( x t ∣ ∅ ) \epsilon_\theta(x_t \mid \emptyset) ϵθ(xt∣∅),如下所示:
ϵ ^ θ ( x t ∣ y ) = ϵ θ ( x t ∣ ∅ ) + s ⋅ ( ϵ θ ( x t ∣ y ) − ϵ θ ( x t ∣ ∅ ) ) \hat{\epsilon}_\theta(x_t \mid y) = \epsilon_\theta(x_t \mid \emptyset) + s \cdot (\epsilon_\theta(x_t \mid y) - \epsilon_\theta(x_t \mid \emptyset)) ϵ^θ(xt∣y)=ϵθ(xt∣∅)+s⋅(ϵθ(xt∣y)−ϵθ(xt∣∅))
其中, s ≥ 1 s \geq 1 s≥1为引导尺度。这种函数形式是受隐式分类器的启发:
p i ( y ∣ x t ) ∝ p ( x t ∣ y ) p ( x t ) p_i(y \mid x_t) \propto \frac{p(x_t \mid y)}{p(x_t)} pi(y∣xt)∝p(xt)p(xt∣y)
其梯度可以用真实分数 ϵ ∗ \epsilon^* ϵ∗来表示:
∇ x t log p i ( y ∣ x t ) ∝ ∇ x t log p ( x t ∣ y ) − ∇ x t log p ( x t ) ∝ ϵ ∗ ( x t ∣ y ) − ϵ ∗ ( x t ) \nabla_{x_t} \log p_i(y \mid x_t) \propto \nabla_{x_t} \log p(x_t \mid y) - \nabla_{x_t} \log p(x_t) \propto \epsilon^*(x_t \mid y) - \epsilon^*(x_t) ∇xtlogpi(y∣xt)∝∇xtlogp(xt∣y)−∇xtlogp(xt)∝ϵ∗(xt∣y)−ϵ∗(xt)
为了使用通用文本提示实现classifier-free引导,我们有时在训练过程中用空序列(我们也称其为 ∅ \emptyset ∅)替换文本描述。然后我们使用修正的预测 ϵ ^ \hat{\epsilon} ϵ^向描述 c c c引导:
ϵ ^ θ ( x t ∣ c ) = ϵ θ ( x t ∣ ∅ ) + s ⋅ ( ϵ θ ( x t ∣ c ) − ϵ θ ( x t ∣ ∅ ) ) \hat{\epsilon}_\theta(x_t \mid c) = \epsilon_\theta(x_t \mid \emptyset) + s \cdot (\epsilon_\theta(x_t \mid c) - \epsilon_\theta(x_t \mid \emptyset)) ϵ^θ(xt∣c)=ϵθ(xt∣∅)+s⋅(ϵθ(xt∣c)−ϵθ(xt∣∅))
classifier-free引导具有两个吸引人的性质:
- 首先,它允许单个模型在引导过程中利用自己的知识,而不是依靠单独的(有时更小的)分类模型的知识。
- 其次,当以那些难以用分类器预测的信息为条件时,它简化了引导(例如文本)。
这篇论文中,提出了一种新的方法,即 Classifier-Free Diffusion Guidance (CFDG),用来改进基于扩散模型的图像生成任务中的指导方法。该方法在扩散模型中引入条件生成信息(如类别标签、特定属性等),通常使用分类器来引导生成过程,但论文提出了不依赖单独训练分类器的 classifier-free 方法,从而简化了模型设计并避免了额外的分类器训练。
CG和CFG的公式推导和背后的逻辑,可以参考SD系列文章中的:Stable Diffusion 3详解
CLIP 引导(CLIP Guidance)
CLIP Guidance 是一种将 CLIP(Contrastive Language-Image Pre-training)模型应用于扩散模型生成过程的技术,用于将文本描述作为条件信息引导生成图像,从而使生成的图像更符合用户定义的文本描述。
核心思想:
CLIP模型通过对比学习训练,能够在图像和文本之间建立联合表示。CLIP模型包含两个部分:
- 图像编码器( f ( x ) f(x) f(x)):将图像映射到一个向量空间。
- 文本编码器( g ( c ) g(c) g(c)):将文本描述映射到相同的向量空间。
在CLIP训练过程中,目标是使图像和对应描述的点积尽可能大,而不匹配的点积尽可能小。
在扩散模型中的应用:
扩散模型生成图像的过程是通过逐步去噪噪声图像来实现的,CLIP提供了图像与描述接近程度的分数,而 CLIP Guidance 通过引导扩散模型生成符合文本描述的图像。具体做法是在分类器引导中用CLIP模型代替分类器。扩散模型的反向过程中,使用CLIP模型来计算图像和文本描述之间的相似度,并将这一相似度的梯度引导图像生成过程。
公式:
μ ^ θ ( x t ∣ c ) = μ θ ( x t ∣ c ) + s ⋅ Σ θ ( x t ∣ c ) ∇ x t ( f ( x t ) ⋅ g ( c ) ) \hat{\mu}_\theta(x_t \mid c) = \mu_\theta(x_t \mid c) + s \cdot \Sigma_\theta(x_t \mid c) \nabla_{x_t} (f(x_t) \cdot g(c)) μ^θ(xt∣c)=μθ(xt∣c)+s⋅Σθ(xt∣c)∇xt(f(xt)⋅g(c))
其中:
- f ( x t ) f(x_t) f(xt) 和 g ( c ) g(c) g(c) 分别是图像和文本的嵌入。
- ∇ x t ( f ( x t ) ⋅ g ( c ) ) \nabla_{x_t} (f(x_t) \cdot g(c)) ∇xt(f(xt)⋅g(c)) 是图像和描述点积的梯度,表示引导方向。
- s s s 是超参数,用来控制引导的强度。
CLIP相关知识可以参考:多模态论文笔记——CLIP、BLIP
模型架构
GLIDE 模型的关键思想是引入了 CLIP Guidance 和 Classifier-Free Guidance,从而使得模型能够在生成过程中实现更好的控制。扩散模型的总体架构是基于UNET模型。核心部件如下:
核心部件
1.扩散模型(Diffusion Model):
- GLIDE基于扩散模型的架构。扩散模型通过逐步添加噪声到数据中,并通过反向过程逐步去除噪声来生成数据。在GLIDE中,模型从纯噪声开始,并通过多步去噪恢复到一个合理的图像。
- 扩散过程:数据逐渐加入噪声,形成一个马尔科夫链。反向过程则逐步从噪声图像中恢复原始数据。GLIDE使用的是去噪扩散概率模型(DDPM),并在此基础上进行了优化。
2.文本编码器(Text Encoder):
- GLIDE使用一个文本编码器(类似于CLIP的模型)来处理输入的文本描述。文本编码器将输入的自然语言转化为一个固定大小的嵌入向量,该向量用于条件化扩散模型。
- CLIP模型:GLIDE引入了CLIP模型,结合图像和文本的联合嵌入空间,使得文本描述能够作为条件信息引导图像生成。具体地,文本通过一个Transformer网络编码,生成的嵌入向量用于与扩散模型的生成过程进行条件化。
3.分类器引导(Classifier-Free Guidance):
- GLIDE采用了无分类器引导(Classifier-Free Guidance)的方法来使生成的图像更符合文本描述。该方法通过在采样过程中调整梯度,使得图像生成更加贴合文本条件,而不依赖于传统的分类器引导。
- 在训练过程中,GLIDE通过将文本描述作为条件信息引导扩散过程,使得生成的图像更加与文本一致。
GLIDE 没有独立的图像编码器
来处理生成的图像。图像生成的过程通过扩散模型实现,生成的图像与文本描述通过扩散模型的条件化机制进行一致性对齐。在每次生成过程中,文本的嵌入与图像的生成过程相结合,确保图像的内容符合输入文本。
训练和推理过程
-
训练过程:
- GLIDE 的训练过程与传统的扩散模型类似,通过最大化变分下界(VLB)来训练模型。与此不同的是,GLIDE 还通过无分类器引导来引导模型生成符合条件的图像。通过优化噪声预测,GLIDE 学会了如何从随机噪声生成符合文本描述的图像。
-
推理过程:
- 在推理时,GLIDE从噪声开始,通过逐步去噪来生成图像。在每一步的去噪过程中,模型使用文本嵌入作为条件,且根据 CLIP 引导或分类器引导调整图像,使得最终的图像符合文本描述。
训练细节
图像编辑
GLIDE 的一大特色是支持图像编辑。用户可以通过文本描述来修改已经生成的图像。例如,用户可以输入“将这张图像中的猫替换为狗”,GLIDE 将利用其扩散模型和 CLIP 引导来编辑图像,保持图像的一致性并实现编辑目标。
以往使用扩散模型的问题:
以往使用扩散模型进行图像修复的工作通常并没有显式地对模型进行针对修复任务的训练。传统方法通常通过从扩散模型中采样,并在每个采样步骤后,用从 q ( x t ∣ x 0 ) q(x_t | x_0) q(xt∣x0) 生成的样本替换图像的已知区域。然而,这种方法有一个缺点:模型无法看到全局上下文,只能依赖噪声版本的图像,可能导致边缘伪影。
为了解决这个问题,本文显式地微调了扩散模型以优化其在修复任务上的表现,类似于Saharia等人的方法。具体做法包括:
- 微调模型:通过随机掩码输入图像的部分区域,并在掩码版本和真实图像上训练模型。
- 模型结构改进:增加了4个新的输入通道:
- 另一个RGB通道,用于提供掩码后的真实图像。
- 一个掩码通道,用于提供修补掩码。
- 在微调前,初始化这些新通道的输入权重为零。
- 上采样模型:对于上采样模型,始终提供完整的低分辨率图像,并仅提供高分辨率图像中未被掩码的部分。
总结
论文证明了文本条件扩散模型能够生成逼真的合成图像,特别是当与classifier-free引导相结合时。
GLIDE论文中还有其他的一些内容,感兴趣的朋友可以自行查看原论文。
历史文章
机器学习
机器学习笔记合集
深度学习
深度学习笔记合集
多模态论文
深度学习笔记——ViT、ViLT
深度学习笔记——DiT(Diffusion Transformer)
深度学习笔记——CLIP、BLIP
多模态论文笔记——BLIP2
深度学习笔记——VQ-VAE和VQ-VAE-2
多模态论文笔记——dVAE(DALL·E的核心部件)
多模态论文笔记——LLaVA
多模态论文笔记——Coca
多模态论文笔记——CogVLM和CogVLM2
多模态论文笔记——U-ViT
相关文章:

多模态论文笔记——GLIDE(DALL·E 2模型核心部件)
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍了OpenAI的DALLE 2模型中重要的组成部分,用于图像生成的GLIDE模型及其论文。 文章目录 论文背景扩散模型(Diffusion Models&…...

mybatisPlus动态sql语句 ${ew.sqlSegment}
mybatis-plus的${ew.sqlSegment},${ew.sqlSelect},${ew.customSqlSegment} ew是mapper方法里的Param(Constants.WRAPPER) Wrapper queryWrapper对象 简答介绍: ${ew.sqlSelect}:拼接select SQL主体 Select("select ${ew.…...
【工具】HTML自动识别用户正在讲话 以及停止讲话
【工具】HTML自动识别用户正在讲话 以及停止讲话 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>语…...
小程序与内嵌网页的数据通信
小程序与内嵌网页的数据通信 前言 微信小程序提供了web-view组件,允许开发者在小程序中嵌入网页。然而,由于小程序和网页运行在不同的环境中,它们之间的通信就需要依赖特定的机制来实现。然而我们日常的需求中,很多的时候都涉及…...

Android - NDK:编译可执行程序在android设备上运行
在android开发中,调试时会把C代码直接编译成可执行程序,运行在android设备上以确认其功能是否正常。 1、基于NDK编译可执行文件 2、push到 /data/local/tmp目录下 3、设置权限,执行。 ndk工程中build.gradle设置 groovy plugins {id com.a…...

快速上手:采用Let‘sEncrypt免费SSL证书配置网站Https (示例环境:Centos7.9+Nginx+Let‘sEncrypt)
1 关于Let’s Encrypt与Cerbot DNS验证 Let’s Encrypt 是一个提供 免费证书 的 认证机构。 Cerbot 是 Let’s Encrypt 提供的一个工具,用于自动化生成、验证和续订证书。 DNS验证是 Cerbot 支持的验证方式之一。相比 HTTP 验证或 TLS-ALPN 验证,DNS …...
shell技能树-扩展变量
扩展变量是指在shell脚本中用于实现条件判断和变量操作的特殊语法。 表格总结: 前三个 存在或者非空时,优先使用待测变量,否则使用默认值(或报错)。 最后一个 存在或者非空时,优先使用默认值,…...

基于RedHat9部署WordPress+WooCommerce架设购物网站
系统版本信息:Red Hat Enterprise Linux release 9.2 (Plow) WordPress版本信息:wordpress-6.6.2-zh_CN WooCommerce版本信息:woocommerce.9.5.1 环境架构:LNMP(RedHat9nginx1.20.1PHP 8.0.27MySQL8.0.30) …...

LabVIEW瞬变电磁接收系统
利用LabVIEW软件与USB4432采集卡开发瞬变电磁接收系统。系统通过改进硬件配置与软件编程,解决了传统仪器在信噪比低和抗干扰能力差的问题,实现了高精度的数据采集和处理,特别适用于地质勘探等领域。 项目背景: 瞬变电磁法是探…...

Docker入门篇[SpringBoot之Docker实战系列] - 第534篇
历史文章(文章累计530) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…...
Linux系统扩容根 (/) 文件系统空间
[rootlocalhost ~]# df -Th / # 查看当前根文件系统使用情况 [rootlocalhost ~]# lsblk # 查看设备的挂载情况 [rootlocalhost ~]# lvdisplay # 查看逻辑卷使用情况 # 操作磁盘分区表 [rootlocalhost ~]# fdisk /dev/nvme0n1 欢迎使用 fdisk (util-linux 2.37.4…...

JavaScript之JQuery
JQuery W3C 标准给我们提供了⼀系列的函数, 让我们可以操作: jQuery是⼀个快速、简洁且功能丰富的JavaScript框架,原⽣的JavaScript提供的API操作DOM元素时, 代码⽐较繁琐, 冗⻓. 我们学习使⽤JQuery来操作⻚⾯对象,如 • ⽹⻚内容 • ⽹⻚结构 …...

JAVA学习记录2
文章为个人学习记录,仅供参考,如有错误请指出。 如何开发第一个JAVA程序? 开发java程序主要分为三个步骤: 1.编写代码 2.编译代码 3.运行代码 1.编写代码 编写java的工具有很多,文本编辑器、Notepad、Visual Stu…...
计算机网络、嵌入式等常见问题简答
1.嵌入式系统中经常要用到无限循环,如何用C编写死循环 答:while(1){}或者for(;;) 2.程序的局部变量存在于哪里,全局变量存在于哪里,动态申请数据存在于哪里。 答:程序的局部变量存在于栈区;全局变量存在…...
中华人民共和国预算法实施条例
(1995年11月2日国务院第37次常务会议通过 1995年11月22日中华人民共和国国务院令第186号发布 自发布之日起施行) 第一章 总则 第一条 根据《中华人民共和国预算法》(以下简称预算法),制定本条例。 第二条 县级以上地方政府的派出机关,根据本级政…...
【养生--果蔬汁】
果蔬汁: 1、甜菜根苹果柠檬菠萝 2、羽衣甘蓝苹果菠萝番石榴 3、番茄蓝莓苹果 4、胡萝卜、番茄、菠菜、西芹、西蓝花、甘蓝、花菜、南瓜、甜椒 5、火龙果香蕉 6、黄瓜香蕉 7、黄瓜雪梨 8、番茄苹果 9、黄瓜生菜 10、柚子雪梨 11、胡萝卜苹果黄瓜 12、黄瓜…...

LLM架构从基础到精通之词向量1
自然语言处理中的词嵌入:从基础到应用 在自然语言处理(NLP)领域,词嵌入是一个极为关键的概念。它本质上是一种将单词转换为连续向量空间中的数值表示(即向量)的方法,旨在捕捉单词的语义信息&am…...

【SQL】Delete使用
目录 语法 需求 示例 分析 代码 语法 DELETE删除表中所需内容 删除表中满足特点条件的行:DELETE FROM 表名 WHERE 条件; 删除表中所有行:DELETE FROM 表名; WHERE子句 WHERE子句用于指定从表中选取记录的条件。允许筛选数据,只返回满足…...

KBQA前沿技术
文章目录 KBQA面临的挑战基于模板的方法基于语义解析的方法基于深度学习的传统问答基于深度学习的端到端问答模型KBQA面临的挑战 目前还存在两个很大的困难阻碍着KBQA系统被广泛应用。一个困难是现有的自然语言理解技术在处理自然语言的歧义性和复杂性方面还显得比较薄弱。例如…...

跨年烟花C++代码
嘿,朋友们!今天来给大家讲讲一段挺有意思的C代码呀,这段代码主要是用来实现一个烟花效果展示的程序哦,下面咱们一点点来看哈。 效果 1. 开头包含的那些头文件 #include <graphics.h> #include <conio.h> #include &…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...