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

【论文阅读】WGSR

0. 摘要

0.1. 问题提出

1.超分辨率(SR)是一个不适定逆问题,可行解众多。

2.超分辨率(SR)算法在可行解中寻找一个在保真度和感知质量之间取得平衡的“良好”解。

3.现有的方法重建高频细节时会产生伪影和幻觉,模型区分图像细节与伪影仍是难题。

0.2. 方法介绍

0.2.1. 损失函数改进

本文表明,使用基于小波域损失函数的生成对抗网络(GAN)超分辨率模型进行训练,可以更好地学习到真正的高频细节与伪影的特征,相比之下,RGB 域或傅里叶空间的损失函数则不然。

损失函数
损失函数定义具体说明
RGB 域

在 RGB(红、绿、蓝)颜色空间中定义的损失函数。

RGB 颜色空间是最常见的用于表示彩色图像的模型,其中每个像素由红、绿、蓝三个通道的值来描述。

包含L2损失函数(均方误差,MSE)、L1损失函数(平均绝对误差,MAE)、感知损失
傅里叶空间

在傅里叶变换后的频域中定义的损失函数。

傅里叶变换将图像从空域(即 RGB 像素空间)转换到频域,其中低频部分表示图像的大致轮廓等基本信息,高频部分表示图像的细节信息。

在频率域中,图像的低频部分主要包含了图像的轮廓和基本形状等信息,高频部分则包含了图像的细节信息。通过在傅里叶空间定义损失函数,可以更好地控制重建图像的频率成分。

公式为$L_{Fourier}=\frac{1}{M}\sum_{j=1}^{M}||F(y)_{j}-F(\hat{y})_{j}||$

F(y)_{j}F(\hat{y})_{j}分别是原始图像y和重建图像\hat{y}的傅里叶变换,其中M是频率域中的采样点数。

小波域

在小波变换后的小波域中定义的损失函数。

小波变换可以将图像分解为不同尺度和方向的小波系数,这些系数能够更好地描述图像的局部特征。

小波变换能够同时提供图像在空间和频率上的局部信息。

在超分辨率重构中,不同尺度的小波系数对应着图像不同层次的细节。大尺度的小波系数主要反映图像的轮廓等低频信息,小尺度的小波系数则反映图像的细节等高频信息。通过在小波域定义损失函数,可以更有针对性地恢复图像的细节。

公式为$L_{Wavelet}=\frac1P\sum_{k=1}^P(W(y)_k-W(\hat{y})_k)^2$

W(y)W(\hat{y})分别是原始图像y和重建图像\hat{y}的小波系数,P是小波系数的总数。

0.2.2. 判别器训练创新

通常情况下,判别器是基于 RGB 图像进行训练的。RGB 图像包含了红、绿、蓝三个颜色通道的信息,是我们常见的图像表示形式。

然而,在本文中,作者提出仅对高频小波子带进行判别器的训练。这样训练的优势是高频小波子带能够更突出地反映图像中的细节和边缘等信息,这些细节对于判断图像的真实性和质量至关重要。例如,在一幅包含人物和背景的图像中,人物的轮廓、发丝以及背景中的树叶纹理等细节信息在高频小波子带中会更加明显。通过在高频小波子带中训练判别器,它可以更专注于这些细节特征,从而更精准地判断生成的细节是真实的还是伪造的,有效地区分图像中的真实细节和伪影,更好地控制细节与幻影伪影。

0.2.3. 生成器训练方式

在训练生成器时,使用小波子带的保真度损失。小波变换(如 SWT)可以将图像分解为不同尺度和方向的子带,每个子带都包含了图像在特定尺度和方向上的信息。通过计算生成图像的小波子带与真实高分辨率图像的小波子带之间的差异(保真度损失),并将这些差异反向传播给生成器,使生成器学习如何调整生成的图像,以减小这种差异。这种训练方式使得生成器在生成图像时,能够更加关注图像结构的尺度和方向信息。例如,在生成建筑物的图像时,生成器可以根据不同小波子带中的信息,准确地还原出建筑物的轮廓(大尺度结构)以及墙壁上的砖块纹理(小尺度结构),并且保证这些结构在不同方向上的正确性,如水平和垂直方向的线条等。这样生成的超分辨率图像在结构和细节上更加逼真,与真实图像的特征更加接近。

0.3. 结果展示

大量的实验结果表明,根据多个客观指标和视觉评估,我们的模型实现了更好的感知失真权衡。

1. 引言

1.1. 单幅图像超分辨率

卷积神经网络CNN,通过像素级l_{1}l_{2}保真度损失进行训练。

随后出现了更好的模型,采用了残差连接和稠密连接。

后来,空间注意力、通道注意力和Transformer网络在峰值信噪比PSNR和结构相似度SSIM方面表现出了令人印象深刻的性能。

然而,平均误差最小化倾向于所有可行SR输出的概率加权平均;因此,仅基于保真度损失进行优化的模型会产生过于平滑的图像,缺乏HF细节。

1.2. 生成超分辨率模型

为了感知质量更好的结果,提出了生成超分辨率模型,如生成对抗网络GANs 、流模型和扩散模型。生成超分辨率模型旨在从类似于真实图像的分布中采样预测的超分辨率图像。 然而,众所周知,它们会产生高频细节的幻觉和结构性伪影。

流和扩散模型在某种意义上执行随机采样,即单个模型可以生成许多样本。因此,它们对每个样本在学习细节与伪影之间的控制较少。

在本文中,我们专注于条件生成对抗网络超分辨率模型,即单个训练模型生成单个超分辨率图像样本。生成对抗网络模型通过像素级保真度和对抗(判别器)损失的加权和进行训练。此外,还提出了额外的感知损失,如VGG损失、纹理匹配损失和内容损失,以强制超分辨率和GT 图像之间的特征级相似性,从而减轻幻觉和伪影。然而, 感知损失在控制幻觉和失真方面并不足够有效。

1.3. 感知失真权衡

感知失真权衡假设指出,存在一个界限,超过这个界限,任何感知质量的提升(通过无参考度量来衡量)都会以失真的增加(通过全参考度量来衡量) 为代价。在保真度和感知质量之间找到最佳权衡不是一 个定义明确的优化问题,主要是因为没有一种定量的感知图像质量度量与人类偏好有良好的相关性。认识到这 一点,最近的超分辨率挑战要求超分辨率重建在正向退化模型下与低分辨率观测结果一致(也称为可行解), 并对视觉质量进行人类评估。然而,可行解集合的大小非常庞大,即使对于人类来说,确定哪些可行解包含真实的图像细节,哪些包含伪影或幻觉也是极其困难的。

1.5. 框架介绍

GAN-SR,利用小波域损失来抑制幻影和伪影,以实现更好的峰值信噪比(PD)权衡。

1.5.1. SWT子带

SWT 是一种将图像分解为多个子带的技术。

在本文提出的 GAN - SR 框架中,利用 SWT 子带的特性来定义保真损失和对立损失。

1.5.2. 保真损失

计算I_{SR}经过 SWT 分解后的子带的l_{1}损失加权组合I_{HR}经过 SWT 分解后的子带的l_{1}损失加权组合,再比较它们之间的差异(这里采用的不是传统的 RGB 域l_{1}损失)

1.5.3. 对立损失

I_{HR}的高频子带连接后输入判别器得到一个结果,同时将I_{SR}的高频子带连接后输入判别器得到另一个结果,然后根据这两个结果计算对立损失。

1.5.4. 不进行子采样

在一般的小波变换(如 DWT)过程中,子采样是指在对图像进行分解时,在某个方向(通常是水平或垂直方向)上每隔一定数量的像素点选取一个像素点,从而降低图像在该方向上的分辨率。例如,在水平方向上进行 2 倍子采样,就是每隔一个像素选取一个像素,这样图像的宽度就会变为原来的一半。子采样的目的是减少数据量,加快计算速度,但同时也会损失一定的信息。SWT 在分解图像时不进行子采样,这使得它能够提供低频(LF)和高频(HF)子带的独特局部特征。因为没有子采样带来的信息丢失,SWT 分解后的子带能够更准确地反映图像在不同尺度和方向上的特征,图像的尺度和频率信息与空间位置内在地耦合在一起。例如,对于一幅包含精细纹理和复杂结构的图像,SWT 可以完整地保留这些细节在各个子带中的信息,使得模型在处理图像时能够更好地捕捉到图像的局部特征,从而在定义保真损失和对立损失时,能够更精准地控制图像重建过程,有助于抑制幻影和伪影,实现更好的峰值信噪比权衡,提高超分辨率图像的质量。

1.6. 优越性和贡献

我们提出了一种小波域保真度损失(不同小波子带的l_{1}损失的加权组合,而非传统的RGB域l_{1}损失), 它在 SWT 子带中能更好地观察到图像局部结构的尺度和方向,对局部结构的尺度和方向更敏感。

我们提议在对抗训练中使用 SWT 域判别器,以控制高频失真。我们表明,与传统的 RGB 域判别器相比,在高频小波子带上训练判别器,能够更好地控制优化景观,将失真与真实的图像细节分离出来。

我们表明,将我们提出的小波引导训练方案与 RGB 域的 DISTS 感知损失(而非传统的基于 VGG 的 LPIPS 损失)相结合,显著提高了保真度(在峰值信噪比中高达 0.5 分贝),同时感知质量的损失极小 (不到 1%)。

2. 相关工作

GAN-based SR.基于生成对抗网络的超分辨率。

Training GANs by Frequency Domain Losses.通过频域损失训练生成对抗网络。

Modeling SR in the Wavelet Domain.在小波域中对超分辨率进行建模。

3. WGSR: Wavelet-Guided SR Framework

WGSR框架通过以下方式抑制高频幻影和失真,以实现更好的PD平衡:

  1. 仅在高频 子带上训练判别器
  2. 引入小波域失真损失来引导生成器
  3. 选择更合适的感知损失,使其与我们的优化目标更好地耦合

3.1. 使用小波域损失的原因

平稳小波变换(SWT)允许将图像进行多尺度分解,分解为一个被称为 LL 的低频子带和几个高频(例如,LH、HL、HH)子带。

LL 子带的分解级别决定了分别在水平、垂直和对角方向传输详细信息的高频子带的数量。

需要注意的是,由于在超分辨率任务中分辨率至关重要,我们使用 SWT 而不是经典的离散小波变换DWT。SWT与DWT的主要区别在于SWT去除了 DWT 中的子采样,因此,SWT 方法将尺度和频率信息与空间位置内在地耦合在一起。

LL 子带的重要性:SWT 把图像分解后,LL 子带就像是图像的 “根基”,对重建图像的好坏(保真度)影响很大。如果这个 “根基” 的频率被改变了,那整个图像就可能变得不像原来的样子,也就是失真了。所以要保证 LL 子带的频率稳定不变。同时,图像中那些和 LL 空间内容能对应得上的高频部分(比如一些边缘、纹理等细节)也得重建好,这样图像看起来才真实。

通过对比 ESRGAN + 和 WGSR 方法在 SWT 分解下的情况,能看出 SWT 引导对抗训练的好处。

ESRGAN + 的问题:拿 ESRGAN + 这个方法来说,它在训练的时候没有小波域损失的引导,就像走路没有地图一样。它生成的图像有很明显的夸大的伪影,就好像图像上多了一些不该有的东西。特别是 HL 子带,因为图像里结构的方向等原因,这个子带里有更多的幻影,也就是看起来不真实的东西,它的失真程度更高,在和其他子带比较时,峰值信噪比(PSNR)分数最低。这就说明这个区域(HL 子带)需要改进。但是如果从普通的 RGB 图像里去找这些问题并改进,对判别器网络来说太难了,它根本发现不了图像里这些不自然的伪影。

WGSR 的优势:而我们提出的 WGSR 方法就不一样了。我们通过只把高频(HF)子带输入到判别器网络里,而不是整个 RGB 图像,这样就能更容易地把图像的细节和那些不好的伪影分开。经过这样的优化,不管是在各个子带,还是最后得到的超分辨率(SR)图像,都有很大的进步,图像变得非常逼真,里面都是真实的图像细节,而不是那些假的幻影和伪影。所以说,SWT 引导的对抗训练是很有优势的,可以让我们的模型生成更好的超分辨率图像。

3.2. 结构

如图所示的所提出的框架由一个RGB域生成器和一个SWT 域判别器组成,它们使用 SWT 引导的保真度和对抗性以及像素域感知损失进行联合训练。该框架具有通用性,任何生成器和任何判别器模型都可以轻松地插入到这个框架中。

3.2.1. SWT域判别器

SWT 域判别器旨在判断生成图像的高频细节与真实高频细节的相似程度,通过特定的训练流程和架构,使其专注于评估水平、垂直和对角方向的细节,以稳定训练并有效防止幻觉与消除失真。

判别器任务

判别器就像一个 “裁判”,它的工作是判断生成图像中的高频细节(包括低频、高频和中频子带中的高频部分)和真实图像的高频细节相比,有多像真的。它只关注图像在水平、垂直和对角方向上的细节,而不是直接看整个 RGB 图像。因为这些方向的细节对于控制图像中真正的细节和那些不好的幻影、伪影特别重要。比如说,一张照片里建筑物的边缘(水平和垂直方向细节)、树叶的脉络(对角方向细节)等,判别器要能判断生成图像里这些地方和真实图像的差别。

子带信息与训练简化

低频(LL)、高频水平(LH)、高频垂直(HL)和高频对角(HH)子带传递的是稀疏信息。这就好比给判别器提供了一份简化的 “线索清单”,让它的任务变得更容易,训练也能更稳定。例如,在一幅风景图像中,LL 子带可能给出了大致的地形轮廓(低频信息),LH 子带突出了水平方向的纹理(如河流、地平线等),HL 子带强调了垂直方向的元素(如树木、电线杆等),HH 子带则体现了对角方向的细节(如山坡的斜边、建筑物的棱角等)。这些信息不像完整的 RGB 图像那么复杂,判别器可以更轻松地根据这些子带信息来判断图像的好坏。

训练流程

首先,要对生成的图像进行 YCbCr 转换,这就像是把图像的 “语言” 翻译成判别器能听懂的形式。然后,只取其中的 Y 通道,把 Cb 和 Cr 通道扔掉,再对 Y 通道应用 SWT 分解,这样就能得到我们需要的低频、高频水平、高频垂直和高频对角子带。在训练判别器的时候,只用 LH、HL、HH 这些细节子带。

判别器架构

判别器的内部结构像一个 “加工厂”,有9个卷积层,这些卷积层的核大小在3\times 34\times 4之间交替变化。

卷积层后面跟着二维批量归一化,就像对加工过程中的数据进行 “整理”,让数据更规范。

在卷积层和批量归一化之间还有 ReLU 激活函数,它就像一个 “开关”,决定哪些信息可以继续传递下去。

每个卷积层输出的特征数量从 64 慢慢增加到 512,最后通过两个具有 LeakyReLU 激活的线性层,输出一个二维数组。这个数组就是判别器给出的 “判决结果”,告诉我们生成图像的高频子带和真实图像的高频子带是否相似。

通过这样的架构,判别器能够把注意力集中在生成图像的高频细节上,尤其是那些能清楚区分伪造细节和真实细节的地方,从而防止图像中出现幻觉(看到不存在的东西),并消除失真(让图像看起来更真实)。

3.2.2. RGB域生成器

选择RRDB架构作为骨干生成器网络,其由 23 个不含批量归一化的残差密集块组成。

除了输出层,所有卷积层都使用具有64个特征的3\times 3核,并选择 Leaky ReLU 作为激活函数。

由于生成器网络在训练期间随机裁剪 RGB 块,我们将其称为 RGB 域生成器。

值得 一提的是,我们提出的具有小波域损失和小波变换域判别器的训练方案可以与任何生成器网络架构相结合。

3.3. 通过 SWT 域损失进行训练

SWT 域保真损失L_{SWT}

与传统GAN-SR 方法使用 RGB 域保真损失不同,本文定义了 SWT 域保真损失L_{SWT},并带有相应的调优参数\lambda _{j}。其计算方式是先对生成图像I_{SR}和真实图像I_{HR}进行 SWT 分解,然后计算它们在各个子带j上的l_{1}保真损失,乘以对应的缩放因子\lambda _{j}后求和,再对小批量数据求平均。

例如,对于图像中的线条(如窗户边缘、建筑物轮廓等)和细节(如树叶纹理、字母形状等),通过调整不同子带的权重,可以控制生成图像在这些区域的高频细节,避免出现幻影或伪影,使生成图像更接近真实图像,从而调整保真度和感知质量的平衡。

对抗损失L_{adv,G}

为避免改变现有频率或引入新频率,对抗损失L_{adv,G}仅在细节子带(LH、HL 和 HH)上计算。其计算涉及判别器模型D,通过比较生成图像和真实图像在 SWT 域的细节子带连接后的情况来确定损失。具体来说,公式中的两项分别计算了真实图像和生成图像经过判别器后的对数损失,两者相加得到对抗损失。判别器的任务是区分真实和生成的细节子带,生成器则要尽量 “欺骗” 判别器,使生成的细节子带被判别为真实的,从而促使生成器生成更逼真的高频细节。

生成器总体损失$L_G$
生成器的总体损失$L_G$由三部分组成:SWT 域保真损失$L_{SWT}$ 、对抗损失$L_{adv,G}$乘以权重因子$\lambda_{adv}$、感知损失$L_{perc}$乘以权重因子$\lambda_{perc}$
感知损失用于衡量图像质量评估指标(如DISTS)所提供的特征空间中的误差。通过调整这些损失项的权重,可以灵活地调整生成的超分辨率图像的保真度和感知质量之间的平衡。

例如,如果希望生成的图像更注重细节保真度,可以增加$\lambda_{SWT}$的权重;如果更看重感知质量,可以适当增加$\lambda_{perc}$的权重。

在实验中,通过经验搜索确定了各参数的最佳值,如$\lambda_{LL}=0.1$,$\lambda_{LH}=\lambda_{HL}=0.01$,$\lambda_{HH}=0.05$,$\lambda _{adv}= 0. 005$$\lambda_{perc}=1$,以实现最佳的感知失真权衡。

判别器损失$L_D$

判别器的损失$L_D$计算方式与对抗损失相关,其输入仅为高频细节子带。它同样通过比较真实图像和生成图像经过判别器后的对数损失来确定,目的是使判别器能够准确地区分真实和生成的高频细节子带,从而引导生成器生成更逼真的图像,减少伪影和失真。

4. 实验

4.1.  实验设置

训练细节

训练集:DIV2K的800张I_{LR},这些图像是使用 MATLAB 双三次下采样核以 4 倍缩放因子生成的。在一个大小为 16 的小批量中,随机裁剪32\times 32像素的RGBI_{LR}块并提供给生成器。然后,在对生成图像的 Y 通道应用平稳小波变换(SWT)后计算损失项。

优化过程:使用默认设置为\beta _{1}=0.9\beta _{2}=0.999以及\epsilon =10^{-8}的 ADAM 优化器。

初始化生成器:我们使用预训练的 RRDB权重初始化生成器的训练参数,然后进行60k 次迭代,初始学习率为10^{-4},在50k次迭代后减半。

由于小波损失是在训练期间计算的,它不影响运行时间,因此 WGSR 的推理时间与 RRDB 的推理时间相同。

4.2.  对比试验

定量比较

针对\times 4 超分辨率任务,所提出的基于小波分解的优化目标与其他现有最佳方法的定量比较。最佳和次佳结果分别以粗体和下划线标记。

定性比较

SWT分解层级

层级作用:SWT 分解层级影响真实细节与伪影控制及 SR 性能,最佳层级取决于 LR 图像结构尺度和方向。

实验分析:以 Urban100 数据集中包含不同方向和空间频率线条的图像为例,如 img - 92,FxSR 和 SROOE 无法恢复正确结构,WGSR 使用 1 级 SWT 可恢复线条方向但有混叠,使用 2 级 SWT(将 1 级 SWT 的 LL 子带进一步分解为 4 个子带并保持细节子带不变,共 7 个子带)可更好恢复结构,通过对 2 级分解的不同子带设置权重(如$\lambda_{L-LL}=0.1,\lambda_{L-LH}=\lambda_{L-HL}=0.01$, $\lambda _{L- HH}= 0. 05$, $\lambda _{LH}= \lambda _{HL}= 0. 1$, $\lambda _{HH}= 0. 05$),对 2 级高频子带在保真损失中加重惩罚可恢复更多真实细节和结构。

小波基的选择

选择方法:实验研究了 haar、db7、db19、sym7、sym19、bior2.6、bior4.4 等小波滤波器对 WGSR 模型在 BSD100 基准上的影响。

结果分析:不同小波家族的 PD 权衡性能不同,Symlet “sym19” 提供最佳客观质量,Daubechies “db7” 实现最佳感知质量,“sym7” 滤波器达到最佳权衡点,因此实验选用 “sym7” 小波滤波器。

4.3. 消融实验

实验目的

探究 WGSR 方法中每个损失项 (保真度$l_1$、对抗损失$L_{adv, G}$和感知损失$L_{perc}$的作用。

实验设置与对比基准

以 ESRGAN为基线 ($\#0$),其$l_1$$L_{adv, G}$在 RGB 域计算,$L_{perc}$采用$LPIPS$
依次改变损失项的计算方式或类型,设置不同实验条件进行对比:

$\#1$$L_{perc}$从LPIPS改为DISTS;

\#2在SWT 域计算$l_{1}$保真损失;

\#3在SWT域计算$L_{adv}$;

\#4在 SWT 域计算$l_1$$L_{adv, G}$$L_{perc}$为 LPIPS;

\# 5(WGSR)在SWT 域计算$l_{1}$$L_{adv,G}$$L_{perc}$为 DISTS。

实验结果分析

感知损失类型影响:$\#1$中改变$L_{perc}$为 DISTS 后,客观和感知性能分别提高,表明 DISTS 有助于模型达到更好的 PD 点。

保真损失计算域影响:\#2在 SWT 域计算$l_1$保真损失,客观质量提升约 1 dB 且感知质量不变,说明在 SWT 子带执行保真度能更好控制生成细节。

对抗损失计算域影响:\#3在 SWT 域计算$L_{adv}$有利于感知质量提升。

综合影响:\# 5结合所有 SWT 域损失实现了客观和感知质量的最佳权衡。

4.4. 局限性

1.PSNR 和定量感知分数不是视觉失真的良好评估指标。WGSR在抑制视觉失真方面是有效的。然 而,这种视觉性能并未在定量测量中得到体现。

2.确定不同 SWT 域损失项的最佳权重是困难的,因为在搜索最佳权重过程中发现,改变不同子带保真损失权重会影响保真分数和感知质量。

如降低 LH 和 HL 子带保真损失权重会使保真分数下降,增加 HH 子带保真项权重会降低感知质量,同时较高的$L_{adv,G}$$L_{perc}$虽能提升感知质量但会牺牲保真度。

权重选择导致不同的感知 - 失真权衡点,虽然使用小波域损失训练能使模型趋向更好的 PD 点,但在区分真实图像细节和伪影方面仍有改进空间。

5. 结论

WGSR:一种新的基于生成对抗网络(GAN)的超分辨率(SR)模型训练方法;该方法利用了小波域损失的加权组合;通过根据不同子带中图像特征的尺度和方向控制保真度和对抗损失的强度,我们的模型能够以高重建精度学习真实的图像细节,同时避免高频伪影和幻觉;从而实现了更好的PD权衡。

本文提出的对抗训练方法具有通用性,即任何现成的GAN - SR模型都可以轻松插入此框架以受益于小波引导。

相关文章:

【论文阅读】WGSR

0. 摘要 0.1. 问题提出 1.超分辨率(SR)是一个不适定逆问题,可行解众多。 2.超分辨率(SR)算法在可行解中寻找一个在保真度和感知质量之间取得平衡的“良好”解。 3.现有的方法重建高频细节时会产生伪影和幻觉,模型区分图像细节与伪影仍是难题。 0.2. …...

打造智能化在线教育平台详解:教培网校APP的架构设计与实现

本篇文章,小编将以教培网校APP的架构设计与实现为核心,深入探讨如何打造一套智能化的在线教育平台,为企业和教育机构提供落地参考。 一、在线教育平台的核心功能需求 构建一个高效的教培网校APP,首先需要明确其核心功能需求。一…...

使用同一个链接,如何实现PC打开是web应用,手机打开是一个H5应用

当我们希望通过同一个 URL,根据访问设备展示不同的页面时,可以选择以下几种方法: 方法一:通过 User-Agent 前端判断设备类型并跳转 利用前端 JavaScript 获取浏览器的 User-Agent 字符串,判断设备类型,跳转…...

STM32-- 调试 -日志输出

在调试嵌入式程序时,输出日志是非常重要的环节,可以帮助开发者定位问题、监控程序状态和性能。以下是几种常见的日志输出方式及其适用场景: 1. 使用串口(UART)输出日志 实现方式: 通过串口将日志输出到主…...

Python爬虫案例八:抓取597招聘网信息并用xlutils进行excel数据的保存

excel保存数据的三种方式: 1、pandas保存excel数据,后缀名为xlsx; 举例: import pandas as pddic {姓名: [张三, 李四, 王五, 赵六],年龄: [18, 19, 20, 21],住址: [广州, 青岛, 南京, 重庆] } dic_file pd.DataFrame(dic) dic_file…...

小试牛刀-Anchor安装和基础测试

目录 一、编写目的 二、安装步骤 2.1 安装Rust 设置rustup镜像 安装Rust 2.2 安装node.js 2.3 安装Solana-CLI 2.4 安装Anchor CLI 三、Program测试 四、可能出现的问题 Welcome to Code Blocks blog 本篇文章主要介绍了 [Anchor安装和基础测试] 博主广交技术好友&…...

51单片机基础01 单片机最小系统

目录 一、什么是51单片机 二、51单片机的引脚介绍 1、VCC GND 2、XTAL1 2 3、RST 4、EA 5、PSEN 6、ALE 7、RXD、TXD 8、INT0、INT1 9、T0、T1 10、MOSI、MISO、SCK 11、WR、RD 12、通用IO P0 13、通用IO P1 14、通用IO P2 三、51单片机的最小系统 1、供电与…...

RocketMQ文件刷盘机制深度解析与Java模拟实现

引言 在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、…...

python语言基础-5 进阶语法-5.3 流式编程

声明:本内容非盈利性质,也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站,会尽量附上原文链接,并鼓励大家看原文。侵删。 5.3 流式编程(参考链接:https://www.zhihu.com/question/59062…...

JVM性能分析工具JProfiler的使用

一、基本概念 JProfiler:即“Java Profiler”,即“Java分析器”或“Java性能分析工具”。它是一款用于Java应用程序的性能分析和调试工具,主要帮助开发人员识别和解决性能瓶颈问题。 JVM:即“Java Virtual Machine”&#xff0c…...

面试题: Spring中的事务是如何实现的?

Spring中的事务是如何实现的? 背景个人原因的背景正规一点的背景 答案一些思绪和灵感个人理解程度拓展知识Spring的事务管理主要涉及哪几个类?在Spring中,事务管理的流程是怎样的? 背景 个人原因的背景 想换工作, 刷面试题看到的问题, 简单记录一下, 算是个人…...

vue2-代理服务器插槽

解决跨域问题 配置代理服务器 代理服务器位于前端应用(客户端)和真实的后端服务器之间。当配置了代理服务器后,前端应用的请求不再直接发送到后端服务器,而是发送到代理服务器。代理服务器在接收到请求后,会根据预先配置的规则将请求转发到真…...

(python)unittest框架

unittest unnitest介绍 TestCase测试用例 书写真正的用例脚本...

网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务

网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务 IDS入侵检测系统 Intrusion Detection System 安全检测系统,通过监控网络流量、系统日志等信息,来检测系统中的安全漏洞、异常行为和入侵行为。 分为&am…...

面试小结(一)

1、hashmap的底层设计原理以及扩容规则,是否线程安全,如何线程安全。 底层原理:数组 链表 红黑树。HashMap 的底层实现是一个数组,数组中的每个元素是一个链表或红黑树(JDK 1.8 以后,当链表长度超过一定…...

笔试-笔记2

1.设存在函数int max(int,int)返回两参数中较大值,若求22,59,70三者中最大值,下列表达式不正确的是() A.int mmax(22,59,70); B.int mmax(22,max(59,70)); C.int mmax(max(22,59),70); D.int mmax(59,max(22,70)); 解析&#xf…...

html5复习二

知识点&#xff1a; 1、音频标签 <audio controls"controls" loop"loop" preload"auto" src"张恒远 - 追梦赤子心.mp3" muted"muted" > </audio> controls:显示控件 必须写 loop&#xff1a;循环播放&#x…...

大模型呼入机器人系统如何建设?

大模型呼入机器人系统如何建设&#xff1f; 作者&#xff1a;开源呼叫中心系统 FreeIPCC, Github地址&#xff1a;https://github.com/lihaiya/freeipcc 大模型呼叫中心呼入机器人系统的建设是一个涉及多个环节和领域的综合性工程。以下是一个详细的步骤指南&#xff0c;涵盖了…...

docker 部署 kvm 图形化管理工具 WebVirtMgr

镜像构建 官方最后一次更新已经是 2015年6月22日 了&#xff0c;官方也没有 docker 镜像&#xff0c;这边选择咱们自己构建如果你的服务器有魔法&#xff0c;可以直接 git clone 一下 webvirtmgr 的包&#xff0c;没有的话&#xff0c;可以和我一样&#xff0c;提前从 github 上…...

【Unity How】Unity中如何实现物体的匀速往返移动

直接上代码 using UnityEngine;public class CubeBouncePingPong : MonoBehaviour {[Header("移动参数")][Tooltip("移动速度")]public float moveSpeed 2f; // 控制移动的速度[Tooltip("最大移动距离")]public float maxDistance 5f; // 最大…...

Block Successive Upper Bound Minimization Method(BSUM)算法

BSUM优化方法学习 先验知识参考资料1 A Unified Convergence Analysis of Block Successive Minimization Methods for Nonsmooth OptimizationSUCCESSIVE UPPER-BOUND MINIMIZATION (SUM) 连续上限最小化算法THE BLOCK SUCCESSIVE UPPER-BOUND MINIMIZATION ALGORITHM 块连续上…...

力扣2388. 将表中的空值更改为前一个值

一、数据 2388. 将表中的空值更改为前一个值 表: CoffeeShop ---------------------- | Column Name | Type | ---------------------- | id | int | | drink | varchar | ---------------------- id 是该表的主键&#xff08;具有唯一值的列&#xf…...

【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量

给你两个 正整数 l 和 r。对于任何数字 x&#xff0c;x 的所有正因数&#xff08;除了 x 本身&#xff09;被称为 x 的 真因数。 如果一个数字恰好仅有两个 真因数&#xff0c;则称该数字为 特殊数字。例如&#xff1a; 数字 4 是 特殊数字&#xff0c;因为它的真因数为 1 和…...

Redis配置主从架构、集群架构模式 redis主从架构配置 redis主从配置 redis主从架构 redis集群配置

Redis配置主从架构、集群架构模式 redis主从架构配置 redis主从配置 redis主从架构 redis集群配置 1、主从模式1.1、主节点配置1.2、从节点配置1.3、测试 2、集群模式 1、主从模式 1.1、主节点配置 # 监听所有网络接口 bind 0.0.0.0# cluster-enabled表示为集群模式&#xff…...

2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略 完整参考论文(2)

5.2 问题一模型的建立与求解 5.2.1 分析发展情况 为了更好地理解数据的变化趋势,利用matlab通过六个子图对宠物行业中的关键变量进行了可视化展示。 图 1. 宠物数量变化展示了 猫数量、狗数量 和 总宠物数量 在 2019-2023 年间的变化趋势。结果显示:猫的数量呈逐年上升的趋…...

HTML实现 扫雷游戏

前言&#xff1a; 游戏起源与发展 扫雷游戏的雏形可追溯到 1973 年的 “方块&#xff08;cube&#xff09;” 游戏&#xff0c;后经改编出现了 “rlogic” 游戏&#xff0c;玩家需为指挥中心探出安全路线避开地雷。在此基础上&#xff0c;开发者汤姆・安德森编写出了扫雷游戏的…...

day03(单片机高级)RTOS

目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台&#xff08;中断方式&#xff09; 改进&#xff08;前后台&#xff08;中断&#xff09;&#xff09;定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…...

【mongodb】社区版8:改变配置bindip和授权

更改配置 sudo systemctl restart mongod (base) root@k8s-master-pfsrv:/home/zhangbin# sudo tail -n 20 /var/log/mongodb/mongod.log 日志感觉是成功了:{"t":{"$date":"2024-11-19T19:57:47.076+08:00"...

泥石流灾害风险评估与模拟丨AI与R语言、ArcGIS、HECRAS融合,提升泥石流灾害风险预测的精度和准确性

目录 第一章 理论基础 第二章 泥石流风险评估工具 第三章 数据准备与因子提取 第四章 泥石流灾害评价 第五章 HECRAS软件的应用 第六章 操作注意事项与模型优化 泥石流灾害的频发与严重后果&#xff0c;已成为全球范围内防灾减灾工作的重大挑战。随着科技的不断进步&…...

一线大厂面试集锦

String 为什么要设计成不可变的 String被设计成不可变的有以下几个原因: 线程安全:由于String是不可变的,多个线程可以同时访问同一个String对象而无需担心数据被修改。这使得String在多线程环境下是线程安全1. 的。 2.缓存Hash值:由于String是不可变的,它的hashcode可以…...