【论文阅读】PGAN

1. WHY

问题

图像超分辨率一直是一个热门研究课题,具有重要的应用价值。基于生成对抗网络GAN的单幅图像超分辨率方法显示重建图像与人类视觉特征更一致。因此,基于 GAN 的网络优化已成为图像超分辨率的主流。然而,一些最新研究表明,基于GAN的图像超分辨率方法会导致结构失真


结构失真

含义:结构失真指的是在使用某些图像超分辨率方法时,生成的高分辨率图像虽然分辨率提高了,但是图像中的物体结构发生了不应该有的变形、扭曲或者模糊等问题,导致图像看起来不自然,甚至影响对图像内容的准确理解。

产生原因:以基于 GAN 的图像超分辨率方法为例,常见的图像级生成对抗训练方式只是对整个图像进行二分类判断真假,没有考虑图像内部每个像素或者局部区域的结构关系。这就好比只看整栋房子的外观是否好看,却不关心房子内部的墙壁是否歪了、门窗是否变形。在这种情况下,生成的图像可能会出现局部结构混乱,比如原本是圆形的物体变成了椭圆形,直线变得弯曲,物体的边缘变得模糊不清等问题,使得图像的结构信息与原始图像相比出现了偏差和错误,也就是产生了结构失真。

现有方法

通过增强结构生成来缓解结构失真问题。但这种方法无法从根本上解决对抗训练导致的结构失真问题。


增强结构生成

含义:在图像超分辨率技术中,增强结构生成就是采取一系列措施,让生成的高分辨率图像能够更好地保留或恢复出原始低分辨率图像中物体的形状、轮廓、纹理等结构信息,使图像看起来更清晰、自然,接近真实的高分辨率图像。

方法举例:比如有些方法会专门设计一个独立的分支来生成高分辨率图像的梯度图(GM),这个梯度图就像是图像结构的一种指引。通过这个梯度图来指导整个超分辨率的过程,让生成的图像在细节和结构上更合理。就好像盖房子时,先有一个建筑结构的蓝图,然后按照这个蓝图来施工,确保房子的结构稳固、布局合理。在图像超分辨率里,这个梯度图就是那个 “蓝图”,引导着生成图像的结构朝着更好的方向发展。


于是本文提出了像素级生成对抗训练来解决结构失真问题,该方法在对抗训练过程中细致地约束图像的结构。此外,为了更好地生成图像的结构和细节,并充分利用图像中的相似纹理细节,我们构建了一个结构感知的图像超分辨率网络,该网络不仅通过梯度引导增强结构生成,还以多层次的方式有效整合非局部自相似模块。

2. WHAT

2.1. 结构感知DN

这个网络就像是一个智能的图像加工厂,有两个重要的 “车间”:一个是结构感知梯度生成分支,另一个是结构感知超分辨率分支。

梯度生成分支就像是一个 “结构分析员”,它会仔细研究低分辨率图像的梯度图(GM),这个 GM 就像是图像的 “结构草图”,包含了图像中物体的形状、边缘等结构信息。它还会结合超分辨率分支的各种特征信息,然后精心绘制出高分辨率图像的 GM,为超分辨率分支提供一个精确的 “结构蓝图”。

超分辨率分支则像是一群 “巧匠”,它们根据这个 “蓝图”,利用一种特殊的非局部自相似性模块,这个模块可以让图像中的各个部分互相参考、学习,就像工匠们互相交流经验一样,从而更好地理解图像的整体结构,进而生成高质量的高分辨率图像,让图像的细节更加丰富、清晰。

首先,在结构感知非局部自相似性模块中,有一套独特的计算方法来衡量图像中不同位置特征的相似性,就像在人群中找到志同道合的伙伴一样,把相似的特征联系起来,然后通过学习这些相似特征来优化图像的结构。

接着,结构感知梯度生成分支利用巧妙的计算方式从低分辨率图像中提取出 GM,再结合超分辨率分支的信息,经过一系列复杂的操作,如卷积、融合、上采样等,就像精心雕琢一件艺术品一样,逐步构建出高分辨率图像的 GM。

最后,结构感知超分辨率分支根据这个 GM,利用自身的网络结构和非局部自相似性模块,把低分辨率图像逐步提升为高质量的高分辨率图像,让图像的结构更加合理,细节更加逼真。

2.1.1. 非局部自相似模块

该模块基于独特的非局部均值操作定义,公式为$y_i=\frac1{e(x)}\sum_{\forall j}f(x_i,x_j)g(x_j)$

其中,$i$为输出信号$y$的位置索引,$j$为输入信号$x$的任意位置索引。函数$f$承担着测量$x_i$$x_j$相似性的重任,$g(x_j)$代表输入信号$x$在位置$j$的特征图,$e(x)$则为归一化函数。这种机制使得任意位置$j$的特征能够对位置$i$的输出产生影响,突破了传统卷积的局限,非常适合处理基于时空关系的视觉任务。

具体而言,函数$g$定义为$g(x_j)=W_gx_j,W_{g}$为待学习的权重矩阵。

模块选用嵌入高斯函数作为$f$,即$f(x_i,x_j)=e^{\theta(x_i)^T\phi(x_j)}$,其中$\theta(x_i)=W_\theta x_{i_{,}}\phi(x_j)=W_\phi x_{j}$为两个嵌入,归一化参数${C(x)}=\sum_{\forall j}f(x_i,x_j)$

对于给定的$i$$(1/C)f(x_i,x_j)$相当于沿维度$j$的 softmax 计算,从而得$y=softmax(x^TW_\theta^TW_\phi x)g(x)$,此形式与经典的非局部均值方法相呼应,便于在现代深度学习平台中实现。

进一步引入残差学习思想,模块被公式化为$z_i=W_zy_i+x_i,W_z$为待学习参数。模块输入$x$的通道数与$W_g$$W_\theta$$W_\phi$相 关 , 遵循瓶颈设计,有效减少计算量 。$W_z$的 作 用 是 使 模 块输入输出维度保持一致,极大地增加了模块应用的灵活性,使其可在神经网络的任意位置“嵌入”,为在结构感知超分辨率网络中进行多级集成创造了条件。

图 2. 非局部自相似性模块。特征图以其张量形状显示(在注明时进行适当的重塑)。“\times” 表示矩阵乘法,“+” 表示逐元素求和。softmax 操作在每一行上执行。紫色框表示1\times 1卷积。

2.1.2. 梯度生成分支

该分支主要任务是从低分辨率输入图像的 GM 重建目标高分辨率图像的 GM。首先,通过映射函数$M(\cdot)$从低分辨率图像$I$中提取 GM,其计算方式为计算相邻像素差得到水平和垂直梯度$I_x(x)$$I_y(y)$,进而得到梯度$\nabla I(x)$,最后计算其$L2$范数得到 GM,此映射函数可由固定卷积核的卷积层轻松实现。

提取的低分辨率 GM 随后被送入3\times 3卷积层以提取高维特征。由于 SR 分支同样蕴含丰富的结构特征信息,对 GM 的恢复至关重要,因此该分支通过 CONCAT 函数巧妙融合 GB 的高维特征与 SR 分支不同层级的结构特征。具体而言,采用 RRDB 作为基本构建单元构建深度网络,RRDB 模块架构复杂且功能强大,其内部结构在相关文献中有详细阐述。

在 CONCAT 融合层之后,依次经过 RRDB 模块和卷积层的处理,此融合操作连续进行四次,然后通过3\times 3卷积实现跳跃连接以进行残差学习。接着,利用最近邻函数对获得的梯度特征进行上采样,再使用两个3\times 3卷积层进一步优化梯度特征,从而为指导 SR 过程提供有力支持。最后,通过1\times 1卷积层重建最终的高分辨率 GM。该分支凭借对低分辨率 GM 上下文信息和 SR 分支多级结构特征的充分利用,以及 GM 自身特性(大部分区域接近零,便于关注结构空间关系),能够有效生成高质量的高分辨率图像 GM,为 SR 分支提供准确无误的结构指导信息。

2.1.3. 超分辨率分支

基于现有研究成果,充分利用图像先验有助于提升图像超分辨率性能。尽管深度网络的感受野较大,但传统卷积网络在维持长程依赖方面仍存在不足。因此,本 SR 分支以多级方式集成非局部自相似性模块,旨在有效建立长程依赖关系,强化结构保留能力。同时,为生成更合理的图像结构和纹理,该分支进一步融合 GB 提供的结构信息。

具体操作流程为,分支首先使用3\times 3卷积层提取高维特征,然后堆叠 23 个 RRDB 模块构建深度神经网络。在特定位置(第五、第十、第十五和第二十个 RRDB 模块后)分别添加非局部自相似性模块,这些模块之间通过跳跃连接实现残差学习。接着进行最近邻上采样操作以获取高分辨率特征,随后使用卷积层进行处理。之后,利用 CONCAT 融合层融合 SR 分支的上下文信息与 GB 分支的结构信息。最后,通过 RRDB 模块和两个卷积层重建高分辨率图像,从而实现生成具有更优结构和纹理的图像的目标。

2.2. 像素级GAN

像素级生成对抗训练的目的是让生成的图像在结构上更加合理,避免出现结构失真的问题。它的做法是让生成器和判别器进行一场激烈的 “博弈”。判别器就像一个非常严格的 “裁判”,它会仔细检查生成图像的每个像素,判断这个像素是否和真实图像中的像素来自同一个分布,就像检查每个产品的零部件是否合格一样。生成器则像是一个 “生产者”,它根据低分辨率图像努力生成高分辨率图像,并且要尽量让判别器认为它生成的像素是真实的。

与传统的图像级对抗训练不同,传统的方法只是对整个图像进行一个大致的真假判断,就像只看一眼整栋房子的外观就判断好坏,而像素级生成对抗训练深入到每个像素层面进行判断和优化。它通过构建一个特殊的基于全卷积的判别器,这个判别器可以输出一个和输入图像大小相同的概率图,每个像素都有对应的概率值,表示这个像素是真实像素的可能性。这样就能更精准地控制图像的结构生成,避免出现局部结构混乱的情况,使生成的图像更加自然、真实,就像精心打造每一个细节,让整栋房子从里到外都完美无缺。

2.2.1. 像素级对抗损失

与图像级对抗判别器输出一个概率值来判定整个图像真假不同,像素级对抗判别器的输出是一个与输入图像大小相同的概率图,用于确定每个像素是否为真实像素。为此构建了一个基于全卷积的判别器,它由五个3\times 3卷积层组成,前四层各有 64 个卷积核并接 LeakyReLU 层以增强非线性建模能力,最后一层仅有一个卷积核用于生成概率图。所有卷积步长为 1 且使用填充操作,确保生成的概率图与输入图像分辨率相同,从而实现像素级对抗训练。

2.2.2. 梯度+图像联合优化损失

图像损失

以低分辨率(LR)图像$I^{LR}$为输入,生成超分辨率(SR)图像$I^{SR}$,其对应的高分辨率(HR)图像$I^{HR}$作为真实值。生成器记为$G$,则$I^{SR}=G(I^{LR})$$I^{SR}$应尽可能与$I^{HR}$相似。

多数方法使用像素级重建损失优化网络:

$L1-$范数像素级重建损失$\mathcal{L}_{SR}^{Pix_I}=\mathbb{E}_{I^{SR}}\parallel G\left(I^{LR}\right)-I^{HR}\parallel_{1}$,但该损失会使超分辨率图像边缘过于平滑,降低感知效果,

因此还使用 Johnson 等提出的感知损失函数$\mathcal{L} _{SR}^{Per}= \mathbb{E} _{I^{SR}}\parallel \phi _i\left ( G\left ( I^{LR}\right ) \right ) - \phi _i\left ( I^{HR}\right ) \parallel _1$ ( 其中$\phi _i( \cdot )$表示VGG模型的第$i$层输出)来弥补不足。

此外,超分辨率分支的像素级对抗损失$\mathcal{L}_SR^{Dis_t}$用于优化判别器$D_I$$\mathcal{L}_{SR}^{Adv_t}$用于优化生成器$G$

梯度损失

梯度图 (GM) 能反映图像结构信息,可作为生成器的二阶约束。

通过最小化从SR 图像和 HR 图像中提取的 GM 差异来实现梯度损失,包括:

基于像素级的损失$\mathcal{L}_{SR}^{Pix_{GM}}=\mathbb{E}_{I^{SR}}\parallel M\left(G\left(I^{LR}\right)\right)-M\left(I^{HR}\right)\parallel_{1}$

判别梯度像素是否来自HRGM的损失$\mathcal{L}_{SR}^{DisGM}$

以及梯度判别器通过对抗学习对 SR 结果生成的监督损失$\mathcal{L}_{SR}^{AdvGM}$

联合损失

判别器$D_{I}$$D_{GM}$分别由$\mathcal{L}_{SR}^{Dis}$$\mathcal{L}_{SR}^{DisGM}$优化,生成器$G$由联合损失$\mathcal{L}^G$优化。

$\mathcal{L}^G$包含图像生成损失$\mathcal{L}_{SR}^G$和梯度生成损失$\mathcal{L} ^{G}_{GB}$,其 中 梯 度 生 成 损 失 旨 在 最 小 化 GB 中的像素级重建损失$\mathcal{L}_{GB}^{PixGM}$以重建高质量 GM。

2.3. 实验

2.3.1. 训练细节

训练集:选用 DIV2K 数据集中编号从 0001 到 0800 的 800 张图像,将每张图像切割成 40 张小图像(每张 480×480 像素),共生成 32208 张作为目标高分辨率图像,通过双三次插值获得低分辨率输入,实验仅考虑 4 倍缩放因子。

测试集:使用 Set5、Set14、BSD100、Urban100 和 General100 五个常用数据集,所有数据集均使用双三次插值生成低高分辨率图像对,且训练集和测试集不同。

模型训练的超参数$\gamma_{SR}^{I},\beta_{SR}^{GM},\gamma_{SR}^{GM},\beta_{GB}^{GM},$分别设置为 0.01,0.005,0.01,0.005,0.5,与SPSR 方法训练相同的$5\times10^{5}$次迭代

学习率的设置:采用了动态调整策略,随着训练送代次数的增加而逐渐递减。具体而言,在$0$$5\times10^{4}$次迭代时,学习率为$1.00\times10^{-4}$;在$5\times10^4$$1\times10^5$次迭代时,学习率降至$5.00\times10^{-5}$;在$1\times10^5$$2\times10^5$次迭代时,进一步降低至$2.50\times10^{-5}$;在$2\times10^{5}$$3\times10^{5}$次迭代时,学习率为$1.25\times10^{-5}$;在$3\times10^{5}$$5\times10^{5}$次迭代时,学习率最终降至$6.25\times10^{-6}$。在上述参数设置下,模型 (PGAN) 的学习曲线清晰地展示了训练过程中的损失变化情况,水平轴表示训练迭代次数,垂直轴表示损失值,其中背景中颜色较浅的曲线是原始数据绘制而成,未进行平滑处理,而颜色较深的曲线则是对应的平滑曲线,通过观察学习曲线,可以直观地了解模型在训练讨程中的收敛趋势和稳定性。

2.3.2. 非局部自相似性模块的影响

为深入探究非局部自相似性模块在网络中的作用,进行了一系列消融实验。具体而言,在 SPSR 网络的八个不同位置嵌入非局部自相似性模块,研究其在不同位置对网络性能的影响。这些候选嵌入位置分布在超分辨率分支(每 5 个 RRDB 模块后)和梯度生成分支(每个 concat 操作后),如图 14 所示。通过设计六个不同的消融实验(Exp.1 - Exp.6),分别在不同的组合位置嵌入非局部自相似性模块,并在相同的训练设置下(均训练 200000 次迭代)对各实验结果进行评估。实验结果以表格形式呈现(如表四所示),从中可以看出,并非在所有位置嵌入非局部自相似性模块都能带来性能提升,这表明在超分辨率网络中有效地融合非局部自相似性模块并非易事,需要精心选择嵌入位置。其中,Exp.5 的实验结果表明,当在超分辨率分支的特定位置(①、②、③、④)以多级方式嵌入非局部自相似性模块时,网络能够获得最佳的性能表现,在平均 PSNR 和 SSIM 指标上取得了较好的成绩。基于此实验结果,最终确定的结构感知深度网络仅在超分辨率分支的多个层级(①、②、③、④位置)嵌入四个非局部自相似性模块,以充分发挥其提升图像超分辨率性能的作用。

图 14. 非局部自相似性模块的八个候选嵌入位置示意图。

表四:非局部自相似性模块在不同嵌入位置的消融实验的平均 PSNR(峰值信噪比)和 SSIM(结构相似性)比较。最佳性能以粗体突出显示

表五:非局部自相似性模块不同嵌入位置的消融实验描述

2.3.3. 像素级生成对抗训练的影响

为了验证像素级生成对抗训练对图像超分辨率的影响,专门设计了对比实验。将像素级对抗训练直接应用于 SPSR 方法(记为 Exp.7),并将其结果与同时使用非局部自相似性模块和像素级对抗训练的 PGAN 方法进行对比。所有实验均在相同的训练条件下进行,训练次数为 500000 次迭代。实验结果以表格形式展示(如表六和表七所示),通过对比平均 PSNR 和 SSIM 指标可以发现,像素级对抗训练的引入显著提升了网络性能。在 SPSR 方法中加入像素级对抗训练后(Exp.7),其 PSNR 和 SSIM 值均有明显提高,这表明像素级对抗训练能够使网络生成的图像在结构和质量上更接近真实高分辨率图像。而 PGAN 方法在融合了多级非局部自相似性模块和像素级对抗训练后,进一步提升了性能,在定量指标上取得了最佳成绩。此外,通过视觉对比(如图 15 所示),可以直观地看到像素级对抗训练在缓解结构失真问题上的显著效果。在与图像级对抗训练(如 SPSR)的对比中,像素级对抗训练生成的图像结构更加合理,有效地减少了结构扭曲和变形等问题,使得图像看起来更加自然逼真。这充分证明了像素级生成对抗训练在提高图像超分辨率质量方面的重要作用,与结构感知深度网络相结合,能够为图像超分辨率任务提供更有效的解决方案。

表六:针对有和无非局部自相似性模块以及像素级对抗训练的网络的消融实验说明

表七:有和无非局部自相似性模块以及像素级对抗训练的图像超分辨率网络的平均PSNR(峰值信噪比)和SSIM(结构相似性)比较。最佳性能以粗体突出显示。 

3. HOW

3.1. 定量对比

 将提出的方法 PGAN 与基于 GAN 的图像超分辨率方法(SFTGAN、SRGAN、ESRGAN、NatSR、SPSR)进行对比。在五个数据集上的平均峰值信噪比(PSNR)、结构相似性(SSIM)、感知指数(PI)和学习感知图像块相似性(LPIPS)对比结果显示,PGAN 在大多数数据集上实现了最佳的平均 PSNR、SSIM 和 LPIPS 值,PI 值也与现有技术相当。

表一:各种基于 GAN 的先进图像超分辨率方法在五个数据集上的平均 PSNR 和 SSIM 比较。最佳性能以粗体突出显示

表二:各种基于 GAN 的先进图像超分辨率方法在五个数据集上的平均 PI(感知指数)和 LPIPS(学习感知图像块相似性)比较。最佳性能以粗体突出显示

此外,通过与基线 SPSR 在不同数据集上的测试时间对比,可以发现 PGAN 在运行速度上与 SPSR 相近,这意味着 PGAN 在实现高质量图像超分辨率的同时,并没有牺牲过多的计算效率。

表三:我们的方法 PGAN 与基线 SPSR 在不同数据集上的测试时间(以秒为单位)比较

进一步对比 PGAN 和 SPSR 在训练过程中的 PSNR 变化,可以清晰地看到 PGAN 的收敛速度更快,这表明 PGAN 在训练过程中能够更有效地优化模型参数,更快地达到较好的性能状态。

图 13. SPSR 与我们的 PGAN 在训练过程中的 PSNR(峰值信噪比)比较。

3.2. 定性对比

通过视觉效果对比,双三次插值结果模糊但无结构失真,SPSR 结果虽清晰但仍有结构失真问题,而 PGAN 结果更自然逼真,重建图像结构清晰,无失真和伪影,表明提出的方法可缓解 GAN - 基于方法的结构失真问题,提高重建图像的视觉感知效果。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JIT/极态云】技术文档--函数设计

一、简介 函数是计算机编程中非常重要的概念。它是一段代码,可以在程序中多次调用,用于完成特定的任务。 函数通常接受输入参数,执行特定的操作,并返回一个结果。这个结果可以被程序中的其他代码使用。 二、新建函数 在函数列表…

Springboot整合spring-boot-starter-data-elasticsearch

前言 <font style"color:rgb(36, 41, 47);">spring-boot-starter-data-elasticsearch</font> 是 Spring Boot 提供的一个起始依赖&#xff0c;旨在简化与 Elasticsearch 交互的开发过程。它集成了 Spring Data Elasticsearch&#xff0c;提供了一套完整…

mysql-Innodb锁相关内容

1、InnoDB存储引擎包含的锁类型 共享锁&#xff08;S锁&#xff09;和排他锁&#xff08;X锁&#xff09;意向锁记录锁间隙锁Next-key锁插入意向锁Auto-INC 锁空间索引的谓词锁 2、共享锁&#xff08;S锁&#xff09;和排他锁&#xff08;X锁&#xff09;-- 锁定数据行 共享…

使用Git进行团队协作开发

使用Git进行团队协作开发 Git简介 安装Git 在Windows上安装Git 在macOS上安装Git 在Linux上安装Git 设置Git用户信息 创建Git仓库 基本Git命令 添加文件 提交更改 查看状态 克隆仓库 推送更改 获取更改 分支管理 创建分支 切换分支 合并分支 删除分支 解决合并冲突 检查冲突…

docker安装、设置非sudo执行、卸载

安装 sudo snap install docker 设置docker非sudo执行 sudo groupadd docker sudo usermod -aG docker $USER newgrp docker sudo chown root:docker /var/run/docker.sock 卸载docker 1.删除docker及安装时自动安装的所有包 apt-get autoremove docker docker-ce docker-…

数据结构_二叉树

二叉树的性质 满二叉树 完全二叉树 完全二叉树的特点 二叉树的存储结构 顺序存储 链式存储 二叉链表 三叉链表 二叉树遍历算法 先序遍历 先序遍历&#xff1a;ABDC 中序遍历 后序遍历 层次遍历

Win11安装基于WSL2的Ubuntu

1. 概述 趁着还没有完全忘记&#xff0c;详细记录一下在Win11下安装基于WSL2的Ubuntu的详细过程。不得不说WSL2现在被微软开发的比较强大了&#xff0c;还是很值得安装和使用的&#xff0c;笔者就通过WSL2安装的Ubuntu成功搭建了ROS环境。 2. 详论 2.1 子系统安装 在Win11搜…

Unity编辑器 连接不到SteamVR问题记录

问题表现&#xff1a;之前正常的工程&#xff0c;某天打开后运行&#xff0c;在SteamVR未打开时&#xff0c;Unity工程运行后无法调用起来Steam VR&#xff0c;无任何反应&#xff0c;但用其他软件则可以调用起来SteamVR&#xff0c;并且运行正常&#xff0c;在重装了XR的一些插…

nfs作业

nfs作业 服务机&#xff1a; 编写配置文件&#xff1a; [rootlocalhost ~]# vim /etc/exports 配置文件内容&#xff1a; /nfs/shared *(ro,sync) /nfs/upload 192.168.36.0/24(rw,anonuid210,anongid210,sync) /home/tom 192.168.36.132(rw) 创建目录&#xff0c;文件&am…

qt QMainWindow详解

一、概述 QMainWindow继承自QWidget&#xff0c;并提供了一个预定义的布局&#xff0c;将窗口分成了菜单栏、工具栏、状态栏和中央部件区域。这些区域共同构成了一个功能丰富的主窗口&#xff0c;使得应用程序的开发更加简单和高效。 二、QMainWindow的常用组件及功能 菜单栏&…

Leetcode11:盛水最多的容器

原题地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳…

【每日一题】LeetCode - 判断回文数

今天我们来看一道经典的回文数题目&#xff0c;给定一个整数 x &#xff0c;判断它是否是回文整数。如果 x 是一个回文数&#xff0c;则返回 true&#xff0c;否则返回 false。 回文数 是指从左往右读和从右往左读都相同的整数。例如&#xff0c;121 是回文&#xff0c;而 123 …

Maven 项目管理工具

目录 Maven简介 Maven快速上手 Maven详细介绍 Maven工作机制 Maven安装及配置 使用IDEA创建Maven Web工程 Maven简介 Maven是 Apache 开源组织奉献的一个开源项目&#xff0c;可以翻译为“专家”或“内行”。 Maven 的本质是一个项目管理工具&#xff0c;将项目开发和管…

Tangible Software Solutions 出品最准确可靠的源代码转换器

Tangible Software Solutions 出品最准确可靠的源代码转换器 简介1、Instant C#(VB.NET to C#)2、Instant VB(C# to VB.NET)3、C to C# Converter4、C to Java Converter5、C to Python Converter6、Java to C# Converter7、Java to C Converter8、Java to Python Converter9、…

首届The VRAnimation Award 震撼启幕!VsoCloud独家赞助此次大赛!

CG行业的精英与爱好者们&#xff0c;你们的舞台已经搭好&#xff01;备受瞩目的首届The VR & Animation Award现已正式拉开帷幕&#xff0c;诚邀各位共襄盛举&#xff01;丰厚大奖、作品曝光、行业资源分享……多重惊喜等你来解锁&#xff01; 此次大赛由Rival Technologie…

生产工单系统如何帮助企业控制成本?

我们都知道&#xff0c;在现在竞争日益激烈的市场环境中&#xff0c;企业对于成本控制的需求达到了前所未有的高度。每一分成本的优化&#xff0c;都直接关系到企业的盈利能力和市场竞争力。成本贯穿于生产、销售、管理等各个环节。其中&#xff0c;生产环节的成本控制更是关键…

【瑞吉外卖】-day01

目录 前言 第一天项目启动 获取资料 创建项目 ​编辑 连接本地数据库 连接数据库 修改用户名和密码 ​编辑创建表 创建启动类来进行测试 导入前端页面 创建项目所需目录 检查登录功能 登录界面 登录成功 登录失败 代码 退出功能 易错点 前言 尝试一下企业级项…

2024.10.25 软考学习笔记(知识点)

刷题网站&#xff1a; 软考中级软件设计师在线试题、软考解析及答案-51CTO题库-软考在线做题备考工具

map 和 set 的使用

文章目录 一.序列式容器和关联式容器二. set 系列的使用1. set 和 multiset 参考文档2. set 类介绍3. set 的构造和迭代器4. set 的增删查5. insert 和迭代器遍历使用样例6. find 和 erase 使用样例7. multiset 和 set 的差异 三. map 系列的使用1. map 和 multimap参考文档2. …

【Spring】Spring Boot 日志(8)

本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。 1、日志概述 1.1学习日志的必要性 在第一次学习编程语言的时候&#xff0c;我们就在使用printf或者System.out.println等打印语句打印日志了…