【LLIE专题】基于 CLIP 的无监督背光增强算法
CLIP-LIT: Iterative Prompt Learning for Unsupervised Backlit Image Enhancement(2023,ICCV)
- 专题介绍
- 一、研究背景
- 二、CLIP-LIT方法
- 三、实验结果
- 四、总结
- 五、思考
本文将对 CLIP-LIT: Iterative Prompt Learning for Unsupervised Backlit Image Enhancement,这篇背光增强算法进行讲解。参考资料如下:
[1] CLIP-LIT 文章
[2] CLIP-LIT 代码
专题介绍
在低光照环境下,传统成像设备往往因画面昏暗、细节丢失而受限。LLIE(低照度暗光增强)技术应运而生,它通过提升图像亮度、对比度,减少噪点并恢复色彩细节,让暗夜变得清晰可见。
LLIE技术从传统方法如直方图均衡化、Retinex模型等起步,近年来借助深度学习,尤其是卷积神经网络(CNN),GAN模型,扩散模型实现了质的飞跃。这些算法能自动学习图像特征,精准处理低光照图像,效果显著优于传统技术。
本专题将聚焦LLIE技术的核心原理、应用案例及最新进展,让我们一起见证LLIE如何点亮暗夜,开启视觉新视界!欢迎一起探讨交流!
系列文章如下
【1】ZeroDCE
【2】HVI
一、研究背景
在计算机视觉领域,逆光图像增强技术一直以来都是研究热点与难点。逆光拍摄所得图像通常存在细节丢失、色彩失真等问题,这不仅影响视觉体验,也对后续图像处理与分析算法的准确性造成干扰。传统手动修正方法费时费力,难以平衡保留正常光照区域与提升欠曝光区域的细节。而现有自动光线增强方法,无论是监督学习还是无监督学习,都存在局限性,或因过度增强导致正常光照区域过曝,或因增强不足使欠光区域依旧昏暗,且对复杂逆光场景的泛化能力欠佳。
(CLIP-LIT)该方法开创性地挖掘对比语言 - 图像预训练(CLIP)模型在像素级图像增强任务中的潜力,巧妙地借助 CLIP 模型丰富的视觉 - 语言先验知识,实现无需成对训练数据的逆光图像高质量增强。
二、CLIP-LIT方法
CLIP 模型凭借其在大规模图像 - 文本数据上学到的知识,在零样本分类等任务中表现出色,具有强大的泛化能力。CLIP-LIT 方法正是受到启发,将 CLIP 模型引入低层次视觉任务,即逆光图像增强。其核心在于设计一个迭代提示学习框架,分为两个主要阶段。
阶段一:
第一阶段是提示词初始化与初始增强网络训练。对逆光图像Backlit Images( I b I_b Ib)和正常光照图像Well-lit Images( I w I_w Iw),随机初始化正提示词Positive( T p T_p Tp)和负提示词Negative( T n T_n Tn),分别代表正常光照和逆光。将这些图像输入 CLIP 的图像编码器,同时将提示词输入文本编码器,利用文本 - 图像相似性约束,在 CLIP 潜在空间中学习初始提示词(提示词是可以学习的,而CLIP网络在训练时候参数是固定的),使得学习到的提示词能够最大化区分逆光与正常光照图像。基于初始提示词,构建增强网络,采用简单 Unet 作为基础模型,估计光照图并生成增强结果。训练时,综合运用 CLIP 增强损失(衡量增强结果与提示词在 CLIP 空间相似性)和自身份损失(鼓励增强结果在内容结构上与原图相似),先进行自我重建训练(即开始先只用身份损失),再联合两种损失共同训练,逐步优化网络参数。
下面我们详细介绍下提示词初始化这个流程:
-
输入图像和提示的编码
首先,将背光图像 I b I_b Ib和正常光照图像 I w I_w Iw 输入到预训练的 CLIP 的图像编码器 Φ i m a g e \varPhi_{image} Φimage中,得到它们的潜在代码。同时,随机初始化一对正负提示 T p T_p Tp 和 T n T_n Tn,并将它们输入到 CLIP 的文本编码器 Φ t e x t \varPhi_{text} Φtext中,提取它们的潜在代码。 -
基于文本-图像相似性的提示学习
在 CLIP 的嵌入空间中,通过最大化正负样本之间的距离来学习初始提示对。具体来说,使用二元交叉熵损失函数来训练提示对,使得正样本(正常光照图像)与正提示之间的相似性更高,而负样本(背光图像)与负提示之间的相似性更高。损失函数定义为:
L i n i t i a l = − y log ( y ^ ) − ( 1 − y ) log ( 1 − y ^ ) {L}_{initial} = -y\log(\hat{y})-(1 - y)\log(1 - \hat{y}) Linitial=−ylog(y^)−(1−y)log(1−y^)
其中, y ^ \hat{y} y^ 是通过以下公式计算的:
y ^ = e cos ( Φ image ( I ) , Φ text ( T p ) ) ∑ i ∈ { n , p } e cos ( Φ image ( I ) , Φ text ( T i ) ) \hat{y} = \frac{e^{\cos(\Phi_{\text{image}}(I), \Phi_{\text{text}}(T_p))}}{\sum_{i \in \{n, p\}} e^{\cos(\Phi_{\text{image}}(I), \Phi_{\text{text}}(T_i))}} y^=∑i∈{n,p}ecos(Φimage(I),Φtext(Ti))ecos(Φimage(I),Φtext(Tp))I I I 表示当前图像, y y y 是图像的标签(0 表示负样本,1 表示正样本)。
-
优化目标
通过上述损失函数的优化,初始提示对能够更好地在 CLIP 的嵌入空间中区分背光图像和正常光照图像。这种基于文本-图像相似性的提示初始化方法为后续的图像增强网络训练提供了基础。 -
总结
Prompt Initialization 的核心在于利用 CLIP 的文本-图像相似性,通过学习一对正负提示来区分背光图像和正常光照图像。这一过程为后续的图像增强网络训练提供了有效的初始提示,使得增强网络能够在 CLIP 的嵌入空间中更好地优化增强结果。
同样的我们详细介绍下初始增强网络训练这个流程:
-
增强网络的结构
文章中使用了一个简单的 U-Net 作为增强网络的基线模型。该网络的目标是估计背光图像的光照图 I i I_i Ii,并通过公式 I t = I b / I i I_t = I_b/I_i It=Ib/Ii 生成最终的增强结果。 -
损失函数设计
训练增强网络时,文章采用了两种损失函数:CLIP-Enhance 损失 ( L clip (L_{\text{clip}} (Lclip和 Identity 损失 L identity L_{\text{identity}} Lidentity,并将其组合为增强网络的总损失函数:
L enhance = L clip + w ⋅ L identity L_{\text{enhance}} = L_{\text{clip}} + w \cdot L_{\text{identity}} Lenhance=Lclip+w⋅Lidentity
其中, w w w 是用于平衡两种损失权重的超参数,实验中设置为 0.9。
CLIP-Enhance 损失
该损失函数基于 CLIP 的文本-图像相似性,通过计算增强结果与初始正提示之间的相似性来优化增强网络。具体公式如下:
L clip = e cos ( Φ image ( I t ) , Φ text ( T p ) ) ∑ i ∈ { n , p } e cos ( Φ image ( I t ) , Φ text ( T i ) ) L_{\text{clip}} = \frac{e^{\cos(\Phi_{\text{image}}(I_t), \Phi_{\text{text}}(T_p))}}{\sum_{i \in \{n, p\}} e^{\cos(\Phi_{\text{image}}(I_t), \Phi_{\text{text}}(T_i))}} Lclip=∑i∈{n,p}ecos(Φimage(It),Φtext(Ti))ecos(Φimage(It),Φtext(Tp))
其中, I t I_t It 是增强后的图像, T p T_p Tp 和 T n T_n Tn 分别是正提示和负提示, Φ i m a g e \varPhi_{image} Φimage和 Φ t e x t \varPhi_{text} Φtext 分别是 CLIP 的图像编码器和文本编码器。
Identity 损失
Identity 损失用于确保增强后的图像在像素空间中与原始背光图像保持一定的相似性,避免过度增强。具体公式如下:
L identity = ∑ l = 0 4 α l ⋅ ∥ Φ image l ( I b ) − Φ image l ( I t ) ∥ 2 L_{\text{identity}} = \sum_{l=0}^{4} \alpha_l \cdot \| \Phi_{\text{image}}^l(I_b) - \Phi_{\text{image}}^l(I_t) \|_2 Lidentity=l=0∑4αl⋅∥Φimagel(Ib)−Φimagel(It)∥2
其中, α l \alpha_l αl 是 CLIP 图像编码器中第 l l l层的权重。在训练过程中,前四层的权重 α l \alpha_l αl 设置为 1.0,最后一层的权重设置为 0.5。 -
训练过程
训练过程分为两个阶段:
自重建阶段(Self-reconstruction):仅使用 Identity 损失进行训练,目的是让增强网络在像素空间中尽可能重建原始背光图像。在这一阶段,所有层的权重 α l \alpha_l αl 均设置为 1.0。
增强阶段(Enhancement):同时使用 CLIP-Enhance 损失和 Identity 损失进行训练,以优化增强效果。 -
总结
通过上述训练过程,初始增强网络能够利用 CLIP 的文本-图像相似性,将背光图像增强为更接近正常光照图像的效果。这一阶段为后续的提示细化(Prompt Refinement)和增强网络的进一步优化奠定了基础。
阶段二:
提示词精炼与增强网络迭代微调。考虑到初始提示词可能无法精准捕捉逆光图像、增强结果和正常光照图像间的细微差异,作者通过设计的损失函数进一步更新提示词,拉大逆光图像与正常光照图像、增强结果在 CLIP 嵌入空间的距离,同时缩小增强结果与正常光照图像的距离。交替迭代提示词精炼与增强网络微调过程,直至获得视觉上令人满意的结果。整个过程中,CLIP 模型保持固定,不引入额外计算负担,仅在提示词初始化和精炼阶段进行学习。
下面我们详细介绍下提示词精炼与增强网络迭代微调这个过程:
- Prompt Refinement(提示细化)
提示细化的目的是通过排序学习(rank learning)进一步优化初始提示对,使其能够更准确地区分背光图像、增强结果和正常光照图像。
相似性计算
首先定义提示对与图像之间的负相似性(negative similarity):
S ( I ) = e cos ( Φ image ( I ) , Φ text ( T n ) ) ∑ i ∈ { n , p } e cos ( Φ image ( I ) , Φ text ( T i ) ) S(I) = \frac{e^{\cos(\Phi_{\text{image}}(I), \Phi_{\text{text}}(T_n))}}{\sum_{i \in \{n, p\}} e^{\cos(\Phi_{\text{image}}(I), \Phi_{\text{text}}(T_i))}} S(I)=∑i∈{n,p}ecos(Φimage(I),Φtext(Ti))ecos(Φimage(I),Φtext(Tn))
其中, I I I 是输入图像, T n T_n Tn 和 T p T_p Tp 分别是负提示和正提示。
排序学习损失
基于上述相似性,定义排序学习损失(margin ranking loss):
L prompt1 = max ( 0 , S ( I w ) − S ( I b ) + m 0 ) + max ( 0 , S ( I t ) − S ( I b ) + m 0 ) + max ( 0 , S ( I w ) − S ( I t ) + m 1 ) \begin{aligned} L_{\text{prompt1}} &= \max(0, S(I_w) - S(I_b) + m_0) \\ &\quad + \max(0, S(I_t) - S(I_b) + m_0) \\ &\quad + \max(0, S(I_w) - S(I_t) + m_1) \end{aligned} Lprompt1=max(0,S(Iw)−S(Ib)+m0)+max(0,S(It)−S(Ib)+m0)+max(0,S(Iw)−S(It)+m1)
其中:
- I w I_w Iw是正常光照图像, I b I_b Ib 是背光图像, I t I_t It 是当前增强结果。
- m 0 m_0 m0是正常光照图像与背光图像之间的间隔,设置为 0.9。
- m 1 m_1 m1 是增强结果与正常光照图像之间的间隔,设置为 0.2。
为了进一步优化,引入上一轮的增强结果 I t − 1 I_{t-1} It−1 作为约束,这种设计避免了增强结果之间的剧烈变化,使得模型能够逐步优化增强效果:
L prompt2 = max ( 0 , S ( I w ) − S ( I b ) + m 0 ) + max ( 0 , S ( I t − 1 ) − S ( I b ) + m 0 ) + max ( 0 , S ( I w ) − S ( I t ) + m 1 ) + max ( 0 , S ( I t ) − S ( I t − 1 ) + m 2 ) \begin{aligned} L_{\text{prompt2}} &= \max(0, S(I_w) - S(I_b) + m_0) \\ &\quad + \max(0, S(I_{t-1}) - S(I_b) + m_0) \\ &\quad + \max(0, S(I_w) - S(I_t) + m_1) \\ &\quad + \max(0, S(I_t) - S(I_{t-1}) + m_2) \end{aligned} Lprompt2=max(0,S(Iw)−S(Ib)+m0)+max(0,S(It−1)−S(Ib)+m0)+max(0,S(Iw)−S(It)+m1)+max(0,S(It)−S(It−1)+m2)
其中, m 2 = m 1 = 0.2 m_2 = m_1 = 0.2 m2=m1=0.2,确保每轮增强结果之间保持平滑的光线和色彩调整。
- Enhancement Tuning(增强网络调整)
增强网络的调整过程与初始训练类似,但使用了细化后的提示来计算 CLIP-Enhance 损失,并生成新的增强训练数据以进一步优化提示。
CLIP-Enhance 损失
使用细化后的提示计算 CLIP-Enhance 损失:
L clip = e cos ( Φ image ( I t ) , Φ text ( T n ) ) ∑ i ∈ { n , p } e cos ( Φ image ( I t ) , Φ text ( T i ) ) L_{\text{clip}} = \frac{e^{\cos(\Phi_{\text{image}}(I_t), \Phi_{\text{text}}(T_n))}}{\sum_{i \in \{n, p\}} e^{\cos(\Phi_{\text{image}}(I_t), \Phi_{\text{text}}(T_i))}} Lclip=∑i∈{n,p}ecos(Φimage(It),Φtext(Ti))ecos(Φimage(It),Φtext(Tn))
其中, I t I_t It 是当前增强结果。
总损失
增强网络的总损失仍然是 CLIP-Enhance 损失和 Identity 损失的加权组合:
L enhance = L clip + w ⋅ L identity L_{\text{enhance}} = L_{\text{clip}} + w \cdot L_{\text{identity}} Lenhance=Lclip+w⋅Lidentity
其中, w w w 是平衡权重。 - 交替迭代
提示细化和增强网络调整是交替进行的。每次迭代中,先优化提示,然后使用新的提示调整增强网络。这一过程重复进行,直到获得视觉上令人满意的结果。 - 总结
通过上述迭代优化过程,模型能够逐步提升对背光图像的增强效果。提示细化通过排序学习损失优化了提示对的区分能力,而增强网络调整则利用细化后的提示进一步优化增强结果。这种交替迭代的方式使得模型能够更好地感知图像中不同亮度区域的细节。
三、实验结果
作者通过一系列实验对比验证了所提出方法的有效性和优越性。以下是实验对比的总结:
- 实验设置
- 数据集:
- 训练集:从 BAID 训练数据集中随机选择 380 张背光图像作为输入图像,从 DIV2K 数据集中选择 384 张正常光照图像作为参考图像。
- 测试集:使用 BAID 测试数据集(包含 368 张背光图像)和新收集的 Backlit300 数据集(包含 305 张背光图像)。
- 训练细节:
- 使用 PyTorch 实现,训练在单个 NVIDIA GTX 3090Ti GPU 上完成。
- 使用 Adam 优化器,学习率分别为 5 × 1 0 − 6 5 \times 10^{-6} 5×10−6(提示初始化/细化)和 2 × 1 0 − 5 2 \times 10^{-5} 2×10−5(增强网络训练)。
- 总训练迭代次数为 50K,其中自重建阶段为 1K 次迭代,提示对初始化学习为 10K 次迭代。
- 对比方法
- 由于公开可用的基于深度学习的背光图像增强方法较少,作者将所提方法与以下代表性方法进行对比:
- 低光图像增强方法:Zero-DCE、Zero-DCE++、SCI、URetinex-Net、SNR-Aware、Zhao et al. 和 EnlightenGAN。
- 曝光校正方法:Afifi et al.。
- 背光增强方法:ExCNet。
- 对于无监督方法,作者在相同的训练数据上重新训练这些方法,以确保评估条件一致。
- 实验结果
定性比较
-
在 BAID 测试数据集和 Backlit300 数据集的典型样本上,作者展示了所提方法与其他方法的视觉比较。
-
所提方法能够一致地生成视觉上令人满意的增强结果,改善颜色和亮度,避免过曝或欠曝。
-
在处理具有挑战性的背光区域时,所提方法能够恢复清晰的纹理细节和满意的亮度,而其他方法可能会失败或产生可见的伪影。
定量比较
-
使用三种全参考图像质量评估(IQA)指标:PSNR、SSIM 和 LPIPS,以及一种无参考 IQA 指标 MUSQ 进行定量评估。
-
在 BAID 测试数据集上,所提方法在所有指标上均优于所有现有的最先进方法。
-
在 Backlit300 测试数据集上,所提方法在增强暗区、避免失真伪影以及在正常光照区域保持更好的颜色对比度和输入输出一致性方面表现出色。
- 消融研究
-
迭代学习的有效性:
- 通过定量比较验证了迭代学习(使用排序学习损失)对增强性能的提升。
- 使用固定提示词(如“backlit”/“well-lit”)时,PSNR 为 14.748,SSIM 为 0.823;而使用所提方法(包含迭代细化)时,PSNR 提升至 21.579,SSIM 提升至 0.883。
-
训练数据的影响:
- 使用不同的参考数据集(如从 DIV2K 和 MTISK 中选择的 1000 张图像)重新训练所提方法时,结果表明不同训练数据对性能的影响较小。
-
CLIP-Enhance 损失与对抗损失的对比:
- 使用对抗损失训练增强网络时,CLIP-Enhance 损失在 PSNR、SSIM、LPIPS 和 MUSQ 等指标上均优于对抗损失。
- 总结
通过广泛的实验对比,文章证明了所提方法在视觉质量和泛化能力方面优于当前最先进的背光图像增强方法。此外,该方法无需配对训练数据,具有更好的实用性和灵活性。
四、总结
这篇文章提出了一种基于CLIP模型的无监督背光图像增强方法(CLIP-LIT),通过迭代优化提示词和增强网络来提升背光图像的增强效果。
优点:
- 无需配对数据:该方法无需配对的背光图像和正常光照图像进行训练,大大降低了数据准备的难度。
- 视觉质量优异:通过迭代优化提示词和增强网络,该方法在视觉效果上显著优于现有的最先进方法,能够更好地恢复背光区域的细节,同时避免过曝或欠曝。
- 创新性:首次将CLIP模型的视觉语言先验引入低级视觉任务,为无监督图像增强提供了新的思路。
缺点:
- 依赖CLIP模型:该方法依赖于预训练的CLIP模型,可能在某些特定场景下受到CLIP模型性能的限制。
- 提示词优化的局限性:虽然通过迭代学习优化了提示词,但在某些复杂光照条件下,提示词的优化可能仍不完全准确。
五、思考
这篇文章在无监督背光图像增强领域提出了一个创新的解决方案,利用CLIP模型的文本-图像对齐能力来优化提示词和增强网络。以下是一些基于这篇文章的思考和可能的扩展方向:
1. 计算效率优化
当前方法的计算复杂度较高,尤其是在提示词优化和增强网络调整的迭代过程中。可以探索更高效的优化算法或模型架构,例如轻量级的增强网络,以减少计算成本并提高实时性。
2. 应用场景拓展
虽然文章主要关注背光图像增强,但这种方法的核心思想(利用CLIP的语义对齐能力优化提示词和网络)可以拓展到其他图像处理任务,如低光照增强、色彩校正、风格迁移、图像复原等。可以探索如何将这种迭代提示学习框架应用于其他视觉任务,以实现更广泛的应用价值。
3. 用户交互
在实际应用中,用户可能对增强效果有特定的偏好。可以考虑引入用户交互机制,例如允许用户通过简单的文本输入或滑块调整来定制增强效果。这不仅可以提升用户体验,还可以进一步优化模型的输出以满足个性化需求。
感谢阅读,欢迎留言或私信,一起探讨和交流。
相关文章:
【LLIE专题】基于 CLIP 的无监督背光增强算法
CLIP-LIT: Iterative Prompt Learning for Unsupervised Backlit Image Enhancement(2023,ICCV) 专题介绍一、研究背景二、CLIP-LIT方法三、实验结果四、总结五、思考 本文将对 CLIP-LIT: Iterative Prompt Learning for Unsupervised Backl…...
深入了解酒店一次性牙刷:材质选择与设计考量全解析
酒店的一次性牙刷是我们住酒店时常见的用品,它方便了很多旅客出行,虽小巧,却对人们口腔清洁有一定作用,扬州卓韵酒店用品在这个领域表现优秀,下面我们就深入了解酒店一次性牙刷。 一次性牙刷的材质相当重要。常见的有…...
[人机交互]理解用户
一.解释什么是认知,以及它对交互设计的重要性 1.1什么是认知 认知是指与knowing相关的能力,行为和过程(考填空) -如何感知物理刺激?如注意、知觉等 -如何认识自我、他人以及环境?如意识、记忆等 -如何…...
css3伸缩盒模型第二章(侧轴相关)
css3伸缩盒模型第二章(侧轴相关) 侧轴对齐方式 侧轴对齐我们需要分两种情况,一种是多行,一种是单行,两种设置方式不同 属性:align-items 单行属性: align-content 多行 单行 align-items flex-start: 侧轴的起点对…...
【WPS】怎么解决“word的复制表格”粘贴到“excel的单元格”变多行单元格的问题
把 word文档复制表格到这个excel表格上面的话,会出现由单个单元格变成多行单元格的情况。 现在,就这个问题怎么解决,提出了一个方案,就是先查找是什么导致了这个换行,然后再将换行的这个字符进行一个整体的替换&#x…...
股指期货深度贴水是什么意思?
如果贴水的幅度特别大,比如股票指数是3000点,但股指期货的价格只有2800点,贴水了200点,这就叫“深度贴水”。简单来说,股指期货贴水就是指股指期货的价格低于其对应的现货指数价格。当这种贴水程度较大时,就…...
GCC编译器安装详细说明(举例arm-2013q3)
比如在官网GNU Arm Embedded Toolchain project files : GNU Arm Embedded Toolchain 下载了一个gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 1 sudo tar -xvf gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 解决了解压 在部署环境,在安装2…...
第十一届蓝桥杯 2020 C/C++组 蛇形填数
目录 题目: 题目描述: 题目链接: 思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: 蛇形填数 - 蓝桥云课 思路: 思路详解: 看图找规律…...
https://juejin.cn/editor/drafts/7262346366541070395
.Net Core从零学习搭建权限管理系统教程 推荐一组WPF自定义控件开源项目。 项目简介 这是基于WPF开发的,为开发人员提供了一组方便使用自定义组件,并提供了各种常用的示例。 包含组件:数据表格、属性列表、树形列表、选色器、单选框列表、…...
STL?string!!!
一、引言 在之前的文章中,我们一同学习了有关类和对象、模板、动态内存管理的相关知识,那么接下来一段时间我们将要趁热打铁,一起来手撕C库中最重要的一个库----STL中的一些容器,在手撕它们之前,我将先介绍一下对应的容…...
CentOS 7 安装指定版本 Docker 及镜像加速/配置优化攻略
摘要 本文详述 CentOS 7 系统下安装指定版本 Docker ,涵盖镜像加速配置(实测最快)、存储位置优化、日志轮转等核心配置。 文章目录 一、安装指定版本Docker1.1 卸载旧版本(如有)1.2 安装依赖包1.3 添加Docker仓库&…...
域名别名(CNAME)解析及域名注册操作步骤
以虚拟主机为例,大多网站空间无独立ip,域名打开以别名解析为主,那域名别名(CNAME)如何解析呢?以下以新网为例,别名解析操作步骤: 1.登录域名管理界面,点击管理解析记录; …...
JVM内存模型深度解剖:分代策略、元空间与GC调优实战
堆 堆是Java虚拟机(JVM)内存管理的核心区域,其物理存储可能分散于不同内存页,但逻辑上被视为连续的线性空间。作为JVM启动时创建的第一个内存区域,堆承载着几乎所有的对象实例和数组对象(极少数通过逃逸分…...
Unity_JK框架【1】 框架导入 对象池示例 (资源管理底层)
一、JK框架介绍 主要功能系统: 对象池系统:重复利用GameObject或普通class实例,并且支持设置对象池容量 事件系统:解耦工具,不需要持有引用来进行函数的调用 资源系统 Resources版本:关联对象池进行资源…...
JDK 发展历史及其版本特性
JDK(Java Development Kit,Java开发工具包)是用于开发Java应用程序的核心工具之一。它由Oracle(最初由Sun Microsystems)提供,包含了Java编译器、Java运行环境(JRE)、Java标准类库等…...
B站视频下载到电脑的方法总结
将B站(哔哩哔哩)视频下载到电脑的方法有多种,以下是几种常见且有效的方法,分为 官方工具 和 第三方工具 两类: 一、官方方法(B站客户端或功能) 哔哩哔哩客户端(UWP/PC版)…...
2025 后端自学UNIAPP【项目实战:旅游项目】2、安装下载引用前端UI框架:uview-plus
1、uview-plus官网地址,有详细介绍,感兴趣的可以深入了解学习 介绍 | uview-plus - 全面兼容nvue/鸿蒙/uni-app-x的uni-app生态框架 - uni-app UI框架 2、Hbuilder X 方式安装下载引入uview-plus ①进入该网址,点击 下载插件并导入Hbuild…...
Vue 的双向绑定原理,Vue2 和 Vue3 双向绑定原理的区别
Vue 的双向绑定原理,Vue2 和 Vue3 双向绑定原理的区别 Vue 的双向绑定(Two-way Data Binding)是其核心特性之一,其本质是通过数据劫持结合发布-订阅模式实现的。以下是 Vue2 和 Vue3 在双向绑定原理上的区别和演进: 文…...
RAG_Techniques:探索GitHub热门RAG技术开源项目
RAG_Techniques:探索GitHub热门RAG技术开源项目 引言项目概述RAG技术简介与重要性核心功能详解1. 分类清晰的技术体系2. 前沿技术解析3. 评估工具与方法 安装和使用教程应用场景和实际价值企业知识库和文档检索教育和研究辅助个性化内容推荐 结论 引言 在当今AI领域…...
Java高频面试之并发编程-12
hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶 面试官:详细说说java的内存模型 Java内存模型(Java Memory Model, JMM)是Java多线程编程的核心&#…...
多线程系列五:面试中常考的单例模式
1.设计模式 在了解单例模式之前我们先要了解设计模式: 设计模式是一种软性规定,遵守了设计模式,代码的下限就被兜住了,类似于棋谱,是大佬设计出来的,让小白程序员也能写出好的代码 设计模式有很多种&#x…...
音视频之H.265/HEVC编解码并处理
H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 4、音视频之H.265/HEVC变换编码 5、音视频之H.265/HEVC量化 6、音视频之H.265/HEVC环路后处理 7、音视频之H.265/HEVC熵编…...
Python入门(一)
目录 一、Python数据类型 1.字面量 2.注释 3.变量 4.数据类型 二、 运算符 1.数据类型之间的相互转换 2 算数运算符 3、逻辑运算符 三、判断语句 if 四、循环 1、while循环 2、for循环 2.1 for...else... 五、格式化字符串 1.字符串 1.1创建字符串的方式&…...
2025年01月09日德美医疗前端面试
目录 vue2 的双向绑定的原理vue3 的双向绑定原理vue 的生命周期vue 子组件为何不能修改父组件的值js delete 删除数组的某一个值会怎么样vue 和 react 的 diff 算法什么是闭包原型链this指向 vue2 的双向绑定的原理 以下是 Vue 2 双向绑定的原理: 1. 核心概念 …...
02 mysql 管理(Windows版)
一、启动及关闭 MySQL 服务器 1.1 通过 “服务” 管理工具 winr打开运行,输入services.msc 找到MySQL80,这个是我们在安装mysql的时候给的服务的名称,具体见文章mysql 安装 右键选择启动或者停止。 1.2 通过命令提示符 1.2.1 关闭命令…...
开发搭载OneNet平台的物联网数据收发APP的设计与实现
一、开发环境与工具准备 工具安装 下载HBuilderX开发版(推荐使用开发版以避免插件兼容性问题)安装Node.js和npm(用于依赖管理及打包)配置Android Studio(本地打包需集成离线SDK)项目初始化 创建uni-app项目,选择“默认模板”或“空白模板”安装必要的UI库(如uView或Van…...
ntdll!LdrpInitializeProcess函数分析之Peb->Ldr和全局变量ntdll!PebLdr的关系
代码部分A: PEB_LDR_DATA PebLdr; //全局变量ntdll!PebLdr NTSTATUS LdrpInitializeProcess ( IN PCONTEXT Context OPTIONAL, IN PVOID SystemDllBase ) { 代码部分B: // // Figure out process name. // Teb NtCurrentTeb…...
如何开始使用 Blender:Blender 3D 初学者指南和简介 怎么下载格式模型
Blender 是一个强大的 3D 创作套件,为动画、视觉效果、艺术等提供了一系列功能。无论您是初学者还是经验丰富的艺术家,Blender 都提供了一个免费的开源平台来释放您的创造力。凭借其内置的视频序列编辑器,Blender 还提供基本的编辑功能&#…...
Nginx安全防护与HTTPS部署
目录 一、Nginx 概述 二、Nginx 核心安全配置 (一)编译安装 Nginx (二)隐藏版本号 (三)限制危险请求方法 (四)请求限制(CC 攻击防御) (五&…...
HTTP 与 HTTPS 的深度剖析:差异、原理与应用场景
HTTP 与 HTTPS 的深度剖析:差异、原理与应用场景 在互联网的世界里,HTTP(超文本传输协议)和 HTTPS(超文本传输安全协议)是数据传输的 “高速公路”,它们承载着我们日常浏览网页、购物支付等各种…...
SMT贴片钢网精密设计与制造要点解析
内容概要 SMT贴片钢网作为电子组装工艺的核心载体,其设计与制造质量直接影响焊膏印刷精度及产品良率。本文系统梳理了钢网全生命周期中的15项关键技术指标,从材料选择、结构设计到工艺控制构建完整技术框架。核心要点涵盖激光切割精度的微米级调控、开口…...
算法每日一题 | 入门-顺序结构-三角形面积
三角形面积 题目描述 一个三角形的三边长分别是 a、b、c,那么它的面积为 p ( p − a ) ( p − b ) ( p − c ) \sqrt{p(p-a)(p-b)(p-c)} p(p−a)(p−b)(p−c) ,其中 p 1 2 ( a b c ) p\frac{1}{2}(abc) p21(abc) 。输入这三个数字,…...
Linux内核视角:线程同步与互斥的原理、实现与锁优化策略
Linux系列 文章目录 Linux系列前言一、前提知识二、线程互斥概念引入三、线程互斥3.1 什么是线程的互斥3.2 线程互斥的实现 四、锁的实现原理 前言 在前两篇文章中,我们已经对线程的相关概念及基本操作进行了深入介绍。在本篇中,我们将深入探讨编写多线…...
【区块链】Uniswap详细介绍
一、前言 本文将结合网上的资料和博主的理解,像大家详细介绍Uniswap,包括其核心概念、工作原理、版本演进、代币经济学以及风险点,适合想深入了解去中心化交易所(DEX)机制的用户。 二、Uniswap是什么 Uniswap 是一个…...
YOLOv8的Python基础--函数篇
1. 文件/目录操作相关函数 这些函数来自 os 和 shutil 模块: 函数/用法作用示例说明os.listdir(dir)列出目录下所有文件名os.listdir("./images")返回文件名列表(不包含路径)os.path.join()拼接路径os.path.join("dir"…...
vue源代码采用的设计模式分解
No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…...
强化学习是AI Agent的进化引擎还是技术枷锁呢?
第一章 强化学习:Agent的“灵魂”觉醒之路 1.1 AlphaGo的启示:从规则到目标驱动的范式革命 2016年AlphaGo击败李世石的事件,标志着RL首次在复杂决策场景中展现其颠覆性价值。通过深度神经网络与RL的结合,AlphaGo无需依赖人类棋谱…...
python简易实现勒索病毒
python简易实现勒索病毒 1.首先介绍Crypto库1.1首先是对称加密1.2 非对称加密1.3 哈希 2.生成RSA密钥并保存3.文件加密4.文件解密1. 导入必要的模块2. 定义解密函数3. 设置私钥的密码4. 打开并读取文件5. 导入私钥6. 读取加密数据7. 解密会话密钥8. 创建 AES 解密器9. 解密数据…...
Nacos源码—4.Nacos集群高可用分析三
大纲 6.CAP原则与Raft协议 7.Nacos实现的Raft协议是如何写入数据的 8.Nacos实现的Raft协议是如何选举Leader节点的 9.Nacos实现的Raft协议是如何同步数据的 10.Nacos如何实现Raft协议的简版总结 6.CAP原则与Raft协议 (1)CAP分别指的是什么 (2)什么是分区以及容错 (3)为…...
AWS WebRTC如何实现拉流?内部是这样实现的
当我们通过手机上的app选择某一个Iot设备,例如,摄像头,想看实时视频的时候,aws都做了什么?最近在搞自研Iot项目,借机整理一下相关流程。 App通过 AWS SDK 发起拉流请求的内部机制是AWS Kinesis Video Streams (KVS) WebRTC 模式中一个非常关键的问题。 一、KVS WebRTC …...
NGINX `ngx_http_browser_module` 深度解析与实战
1. 模块定位 ngx_http_browser_module 在 HTTP 头 User-Agent 解析的基础上,给出三个内置变量: 变量作用典型值$modern_browser当 UA 被判定为 现代浏览器 时取 modern_browser_value 指定的值;否则为空modern. / 1$ancient_browser当 UA 被…...
Elasticsearch知识汇总之 ElasticSearch高可用方案
六 ElasticSearch高可用方案 6.1 高可用架构 请求协调节点根据负载均衡,转发给主分片节点,主分片同步复制给从节点,主从节点都写入完成返回客户端请求成功。对于读请求,协调负载到任意节点数据节点,数据节点把各自符合…...
多线程2-多线程编程
引入 当我们想要代码能够实现并发执行时,我们可以使用多进程进行并发编程(在Java中并不推荐这种方式,许多API在Java标准库中都没有提供),也可以使用多线程进行并发编程(系统提供了相关的API,Ja…...
电商系统中单商户和多商户的区别
在电商的商业版图上,单商户与多商户模式如同两条并行的发展脉络,各自构建起独特的商业生态。它们在运营逻辑、商业模式等多方面存在显著差异,这些差异不仅塑造了不同的平台特性,也深刻影响着企业的发展路径。接下来,我…...
【东枫科技】代理英伟达产品:智能网卡的连接线
文章目录 总览详细:NVIDIA 400Gb/s QSFP-DD 线缆详细:NVIDIA 400Gb/s OSFP 线缆详细:NVIDIA 200Gb/s QSFP56 线缆详细:NVIDIA 100Gb/s QSFP28 线缆 总览 详细:NVIDIA 400Gb/s QSFP-DD 线缆 详细:NVIDIA 400…...
使用ip池后,爬虫还被封,是什么原因呢?
嘿,亲爱的小伙伴们!今天我们聊一个让很多爬虫工程师抓狂的问题:明明用上了IP池,结果爬虫还是被封了!怎么回事呢?如果你也曾在爬虫与反爬的“猫鼠游戏”里痛苦“翻车”,别着急,这篇文…...
C++23 新利器:深入解析栈踪迹库 (P0881R7)
文章目录 为何需要标准化的栈踪迹?P0881R7 的核心组件与使用基本用法示例与异常处理的集成优势与价值潜在的考量总结 对于 C 开发者而言,调试和错误诊断一直是开发周期中不可或缺但又充满挑战的一环。当程序崩溃或发生未预期行为时,获取清晰、…...
2025-05-06 事业-独立开发项目-记录
摘要: 2025-05-06 事业-独立开发项目-记录 独立开发项目记录 Product Hunt | InDev 独立开发者导航站https://www.producthunt.com/ Nomads.com - Best Places to Live for Digital Nomads (formerly Nomad List)https://nomads.com/ InDev 独立开发者导航站https://indev.bei…...
【Linux系统】探索进程等待与程序替换的奥秘
文章目录 前言一、重谈进程创建1.1 fork 函数1.2 写时拷贝1.3 fork 的常规用法1.4 fork 调用失败的原因1.5 创建一批进程 二、进程终止2.1 进程退出场景2.2 strerror 函数的作用2.3 errno 全局变量2.4 程序异常机制2.5 进程退出方式 三、进程等待3.1 进程等待必要性3.2 进程等待…...
Github 2025-05-06Python开源项目日报 Top10
根据Github Trendings的统计,今日(2025-05-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10C++项目2TypeScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…...