超分之ESRGAN

news2024/12/27 19:04:32
  • Esrgan:增强型超分辨率生成对抗网络
  • Esrgan: Enhanced super-resolution generative adversarial networks.
  • In: ECCVW. (2018)
  • Xintao Wang, Ke Yu, Shixiang Wu, Jinjin Gu, Yihao Liu,Chao Dong, Yu Qiao, and Chen Change Loy.

文章目录

      • 摘要
      • 一、引言
      • 二、相关工作
      • 三、Methods
        • 3.1 网络结构(Network Architecture)
        • 3.2 相对辨别器(Relativistic Discriminator)
        • 3.3 感知损失(Perceptual loss)
        • 3.4 网络插值(Network Interpolation)
      • 四、实验
        • 4.1 实验细节
        • 4.2 数据集
        • 4.3 定性分析
        • 4.4 消融实验
        • 4.5 网络插值
      • 五、结论
      • 六、支撑材料

摘要

  • 首先介绍了SRGAN的缺点:
    • SRGAN生成的SR图像的细节经常伴随着令人不愉快的伪影。(unpleasant artifacts)
  • 然后针对SRGAN三个关键组成部分,进一步研究并改进:
    1. 网络结构
      • 引入了没有BN层的Residual-in-Residual Dense Block(RRDB)作为基本网络构建单元。
    2. 对抗损失
      • 借用了relativistic GAN的思想,让辨别器预测相对真实值(ralative realness)而不是绝对真实值(absolute value)。
    3. 感知损失
      • 使用激活前的特征来计算感知损失,这可以为亮度一致性和纹理回复提供更强的监督。

一、引言

详细介绍了针对SRGAN的三个改进:

  1. 网络结构(network architecture):
    • 通过==引入Residual-in-Residual Dense Block(RDDB)==来改进网络结构:
      • RDDB结合了多级残差网络和密集连接,而密集块中的密集连接正是为了避免正反向传递过程中的信息丢失问题(图像信息、梯度),从而使网络具有更高的容量并且更容易训练。
      • 更多的层和连接总是可以提高性能。
    • 移除Batch Normalization(BN)层
      1. 移除BN层实现了稳定的训练和一致的性能。
      2. 有助于提高泛化能力。
      3. 减少计算复杂度和内存的使用。
      • `在训练期间,BN层是通过使用每个batch的均值和方差对特征进行归一化;而在测试时, BN则使用整个训练数据的均值和方差完成对测试数据的归一化。这便出现了一个问题:用训练数据的均值和方差来估计测试数据的均值和方差是否合理?
        • 答案往往是否定的,当训练和测试数据集的统计数据差距很大时,BN层往往会引入一些令人不快的伪影,并限制其泛化能力。
        • 通过实验发现,当再GAN框架下训练更深的网络时,BN层更有可能会带来伪影,这也违反了训练过程中对稳定性能的需求。
    • 使用残差缩放(residual scaling)较小的初始化(smaller initialization)
      • 能够促进训练非常深的网络
      • 这主要是借用了EDSR、Inception-v4的网络思想
      • redisual scaling:通过学习到的残差乘上一个0~1的常数,然后再和主通路上的特征信息做加法,有利于增强网络的稳定性。
      • smaller initialization: 初始查参数方差越小,残差结构的网络越容易训练。
  2. 对抗损失(adversarial loss):
    • ==使用相对平均GAN(Relativistic average GAN)(RaGAN)==来改进辨别器:
      • 它学习判断“一张图像是否比另一张更真实”,而不是“一张图像是真还是假”。
      • 实验表明,这种改进有助于学习更清晰的边缘和更详细的纹理。
      • `SRGAN的对抗损失目的是:让真实图像的判决概率更接近1,让生成图像的判决概率更接近与0。而改进的ESRGAN的目标是:让生成图像和真实图像之间的距离保持尽可能大。
      • 这是引入了真实图像和生成图像见的相对距离(Relativbistic average GAN,RaGAN),而不是SRGAN中的衡量0和1之间的绝对距离。
      • 具体来说,ESRGAN的目的是:让真实图像的判决分布减去生成图像的平均分布,在对上述结果做sigmoid,使得结果更接近于1;让生成图像的判决分布减去真实图像的平均分布,在对上述结果做sigmoid,使得结果更接近于0。
  3. 感知损失(perceptual loss):
    • (基于特征空间计算,而非像素空间)
    • 通过==在激活前使用VGG features ==(而不是像SRGAN中在激活后使用VGG特征)来改进感知损失:
      • 凭经验发现,这中调整后的感知损失提供了更清晰的边缘和令人视觉愉悦的结果。
      • `激活层后的特征图有更稀疏的特征,越深的网络越明显。稀疏的特征会导致更弱的监督,从而网络性能变得更差。
      • 使用激活后得特征图计算感知损失会使得重建图像得亮度和ground-truth图像不一致。
        大量实验表明,增强型 SRGAN(称为 ESRGAN)在清晰度和细节方面始终优于最先进的方法。
  • 关于PIRM-SR Challenge 中的感知损失设计:
    • 文章中提到了新的图像质量评估标准(无参照评估):Ma’s score 和NIQE,计算公式为:perceptual index(即PI) = 1/2 ((10 − Ma) + NIQE), PI值越小,感知质量越好
      在这里插入图片描述

    • 上图中,对于不同的评价标准而言,PSNR and SSIM越高越好,而RMSE and PI越低越好。可以看出,虽然EDSR and RCAN的RMSE很低,但PI却很高,说明感知质量并不好,ESRGAN则相反。

    • 最后,为了平衡感知质量和PSNR指标,作者提出了网络插值。这能够调整重建风格和光滑度。同时,作者将在3.4节对比网络插值和基于像素空间的图像插值的关系。

二、相关工作

该部分主要列出了当年的一些trick

  1. 整体网络结构:
    • 深度卷积神经网络:SRCNN、
    • 深度残差神经网络:VDSR、
    • 拉普拉斯金字塔结构:LapSRN、
    • 残差块:SRGAN、
    • 递归学习:DRCN、DRRN、
    • 稠密连接网络:MemNet、
    • 深的反向投影:DBPN、
    • 残差稠密网络:RDN、
    • 移除BN层的残差块:EDSR、
    • 带有通道注意力的深度网络:RCAN、
    • SR中的强化学习:
      • Crafting a toolchain for image restoration by deep reinforcement learning
    • SR中的无监督学习:
      • Unsupervised image super-resolution using cycle-in-cycle generative adversarial networks
  2. 深度网络的稳定训练方法:
    • 残差通道:
    • 残差缩放:
    • 移除BN层的网络参数初始化方法
    • residual-in-residual dense block替换残差块
  3. 基于感知损失的方法
    • 目标是最小化特征空间的误差而不是像素空间的误差。
  4. 判别损失
    • 相关性判别器作为优化目标,不仅增加了生成数据为真的概率,也减小了真实数据为真的概率。
  5. 评价指标
    • 否定了PSNR 和SSIM。肯定了基于人类感知的无线照评价方法Ma’s score和NIQE,从而根据这种评价标准创建了perceptual index(PI)评价方法。

三、Methods

网络络目标为提升图片的整体感知质量,主要涉及四个方面:

  1. 网络结构;
  2. 判别器;
  3. 感知损失;
  4. 网络插值(平衡感知质量和PSNR).
3.1 网络结构(Network Architecture)

主要对生成器G的结构进行改进:

  1. 移除BN层
    1. 移除BN层的原因:
      • 删除 BN 层可以在不同的面向 PSNR 的任务(包括 SR 和去模糊 )中提高性能并降低计算复杂性。
    2. BN层的原理:
      • BN 层在训练期间使用批次中的均值和方差对特征进行归一化,
      • 并在测试期间使用整个训练数据集的估计均值和方差。
      • 当训练和测试数据集的统计数据差异很大时,BN 层往往会引入令人不快的伪影并限制泛化能力。
    3. BN层对于GAN网络的缺点:
      • 当网络更深并在 GAN 框架下训练时,使用BN层更有可能出现伪影(伪影偶尔会出现在迭代和不同设置中,违反了训练过程中稳定性能的需求)。
    4. 移除BN层的优势:
      • 删除了 BN 层以实现稳定的训练和一致的性能
      • 去除 BN 层有助于提高泛化能力并减少计算量
  2. 将原始的residual block(RB)替换为Residual-in-Residual Dense Block (RRDB)这样的RRDB既融合了多级残差网络的思想,也融合了密集连接的思想。
    • RRDB块的网络结构如下:
      • RRDB采用了两层残差结构,RRDB结构由一个大的残差结构构成,主干部分由3个 RDB(Residual Dense Block)密集残差块构成,将主干网络的输出与残差边叠加。
      • 在程序中,每个RDB块都有5个卷积,然后通过torch.cat函数,将卷积的通道数相叠加,所以卷积的通道数由num_feat,叠加变成num_feat + 4 * num_grow_ch,利用最后一个卷积将通道数调整为num_feat ,通过x5 * 0.2 + x构建残差边。
      • (RDB)Residual Dense Block结构相当于将Residual block (ResBlock)与Dense block密集块相结合,通过密集连通卷积层提取丰富的局部特征,从先前RDB的状态直接连接到当前RDB的所有层,然后利用RDB的局部特征融合自适应地从先前和当前的局部特征中学习更有效的特征,使训练更加稳定。
  3. 改进trick(用于促进训练非常深的网络)
    1. 残差缩放(residual scaling):
      • 在将残差添加到主网络之前,通过乘以0到1之间的常数来缩小残差防止不稳定的途径。
    2. 较小的初始化(smaller initialization):
      • 当初始参数方差变小时,残差架构更容易训练。
        在这里插入图片描述

ESRGAN仍然使用SRGAN网络的高层架构设计,网络共由3部分组成:

  1. 浅层特征抽取层,提取浅层特征。低分辨率图像进入后会经过一个卷积+RELU函数,将输入通道数调整为64。
  2. 深层特征抽取层:包含然N个RDB(Residual Dense Block)密集残差块和一个残差边,每个RDB都包含5个卷积+RELU。
  3. 上采样重建层,然后进入上采样部分,在经过两次上采样后,原图的高宽变为原来的4倍,并且实现分辨率的提升。
    在这里插入图片描述
3.2 相对辨别器(Relativistic Discriminator)

基于相对 GAN 增强了判别器:
- SRGAN中标准的辨别器D:为了让真实图像的判别结果的概率更趋近于1(真),让生成图像的判别结果的概率更趋近于0(假)。
- ESRGAN中的相对平均辨别器D(RaD):让生成图像和真实图像之间的距离保持尽可能大。
![[Pasted image 20230915215014.png]]

参数解释:
- x r x_r xr:真实数据,即 x i : L R 图像 x_i: LR图像 xi:LR图像
- x f x_f xf:假数据, x f = G ( x i ) : S R 图像 x_f = G(x_i): SR图像 xf=G(xi):SR图像
- σ \sigma σ:sigmoid函数:x–> -∞时, σ \sigma σ(x)–>0,x–> +∞时, σ \sigma σ(x)–>1。
- C(x):未变换的鉴别器输出
- E x i E_{x_i} Exi:对小批量中所有 真数据/假数据 取平均值的操作。
- D R a D_{Ra} DRa:相对平均鉴别器RaD

  • 辨别器RaD原理:
    • 首先需要明确的是:判别器对真实数据判决的原始值大于对虚假数据判决的原始值
    • 因此考虑第一个等式左侧: [ C ( R e a l ) − E x f [ C ( F a k e ) ] > 0 [C(Real) - E_{x_f}[C(Fake)] >0 [C(Real)Exf[C(Fake)]>0, 且差值越大,表明二者距离越远,也就是该差值经过sigmoid后的值就越接近于1,这就将真实图片和生成图片很好的区分开;
    • 考虑第二个等式左侧: [ C ( F a k e ) − E x r [ C ( R e a l ) ] < 0 [C(Fake) - E_{x_r}[C(Real)] <0 [C(Fake)Exr[C(Real)]<0,且差值越大(负的越多),表明二者距离越远,也就是改差值经过sigmoid后的值越接近于0,这就将真实图片和生成图片很好的区分开。
  • 辨别器RaD的数学表达式:
    • L D R a = − E x r [ l o g ( D R a ( x r , x f ) ) ] − E x f [ l o g ( 1 − D R a ( x f , x r ) ) ] ( 1 ) L^{Ra}_{D} = - \mathbb E_{x_r}[log(D_{Ra}(x_r,x_f))] - \mathbb E_{x_f}[log(1-D_{R_a}(x_f,x_r))]\quad\quad (1) LDRa=Exr[log(DRa(xr,xf))]Exf[log(1DRa(xf,xr))](1)
  • 生成器的目标损失函数(正好与辨别器相反):
    • L G R a = − E x r [ 1 − l o g ( D R a ( x r , x f ) ) ] − E x f [ l o g ( D R a ( x f , x r ) ) ] ( 2 ) L^{Ra}_{G} = - \mathbb E_{x_r}[1 - log(D_{Ra}(x_r,x_f))] - \mathbb E_{x_f}[log(D_{R_a}(x_f,x_r))]\quad\quad (2) LGRa=Exr[1log(DRa(xr,xf))]Exf[log(DRa(xf,xr))](2)
  • 直观的角度上解释:
    • 因为辨别器是为了更好的区分真实图像和生成图像,而生成器是为了更难区分真实图像和生成图像。
    • 由于生成器的优化函数中同时涉及生成数据 x f x_f xf和真实数据 x r x_r xr,所以生成器在对抗训练中受益于生成数据和真实数据的梯度,更有利于梯度的生成,可以更有利于生成图像中的边缘和细节信息。(而在 SRGAN 中只有生成的部分生效
    • 相对鉴别器有助于学习更清晰的边缘和更详细的纹理
3.3 感知损失(Perceptual loss)
  • 两大缺点(使用VGG激活层后的特征计算感知损失)

    1. 激活后的特征非常稀疏,尤其是在非常深的网络之后;而稀疏激活提供了弱监督,从而导致性能较差。
    2. 与真实图像相比,使用激活后的特征也会导致重建亮度不一致
      ![[Pasted image 20240124151555.png|500]]
  • 改进:

    • 在VGG激活层前获取的感知损失 L p e r c e p L_{percep} Lpercep(通过计算抽象出来的SR和HR的特征图间的距离),而非传统的SRGAN在激活层后计算感知损失。
  • 生成器的优化函数表达式: L G = L p e r c e p + λ L G R a + η L 1 ( 3 ) L_G = L_{percep}+λL^{Ra}_{G} + \eta L_1\quad\quad\quad (3) LG=Lpercep+λLGRa+ηL1(3)

  • 符号含义:

  • L p e r c e p L_{percep} Lpercep:在激活之前的感知损失

  • L 1 = E x i ∣ ∣ G ( x i ) − y ∣ ∣ 1 L_1 = \mathbb E_{x_i}||G(x_i) - y||_1 L1=Exi∣∣G(xi)y1:( L 1 范数 L_1范数 L1范数)评估生成图像 G ( x i ) G(x_i) G(xi)和真实图像y之间的距离。

  • λ 、 η \lambda、\eta λη:平衡不同损失项的系数。

3.4 网络插值(Network Interpolation)

目的:
- 消除基于GAN方法中的令人不快的噪声,同时保持良好的感知质量。
原理:
- 首先训练一个基于PSNR的网络 G P S N R G_{PSNR} GPSNR
- 然后通过微调获得一个基于GAN的网络 G G A N G_{GAN} GGAN
- 然后对这两个网络的所有相应参数进行插值,得到插值模型 G I N T E R P G_{INTERP} GINTERP
公式如下: θ G I N T E R P = ( 1 − α ) θ G P S N R + α θ G G A N ( 4 ) \theta^{INTERP}_{G} = (1 - \alpha)\theta^{PSNR}_{G} +\alpha\theta^{GAN}_{G}\quad\quad\quad(4) θGINTERP=(1α)θGPSNR+αθGGAN(4)符号含义:

  • θ G I N T E R P 、 θ G P S N R 、 θ G G A N \theta^{INTERP}_{G}、\theta^{PSNR}_{G}、\theta^{GAN}_{G} θGINTERPθGPSNRθGGAN:分别是 G I N T E R P 、 G P S N R 、 G G A N G_{INTERP}、G_{PSNR}、G_{GAN} GINTERPGPSNRGGAN的参数。
  • α ∈ [ 0 , 1 ] \alpha \in [0,1] α[0,1]:插值参数。

网络插值的优点:
1. 插值模型能够为任何可行的 α 生成有意义的结果,而不会引入伪影。
2. 可以持续平衡感知质量和保真度,而无需重新训练模型。

是否还有其他平衡方法?
1. 对输出图像(pixel by pixel)逐元素进行插值,但是无法在噪声和模糊之间实现良好的平衡:
- 因为,插值后的图像,要么太模糊,要么带有伪影的噪声。
2. 调整内容损失和对抗损失的权重参数(公式3中的 λ 、 η \lambda、\eta λη):
- 这种方法需要调整损失权重和微调网络,因此实现图像风格的持续控制的成本太高。

四、实验

4.1 实验细节
  • 缩放因子: 4×
  • LR获取方式:
    • matlab 双三次插值下采样
  • mini-batch size: 16
  • HR patch: 128×128
  • 网络的深度与patch的大小成正比:
    • 训练更深的网络受益于更大的 patch ,因为扩大的感受野有助于捕获更多语义信息。
    • 但是会花费更多的训练时间, 并消耗更多的计算资源。
  • 训练分为两个过程:
    1. 首先,训练具有 L1 损失的 PSNR 导向模型;
      • 学习率: 2 × 1 0 − 4 2 ×10^{-4} 2×104,每 2 × 1 0 5 2×10^{5} 2×105学习率衰退2倍
    2. 然后,使用经过训练的 PSNR 导向模型作为生成器的初始化。
      • 学习率: 1 × 1 0 − 4 1×10^{-4} 1×104,分别在50K, 100K,200K,300K时减半
      • 公式三中, λ = 5 × 1 0 − 3 , β = 1 × 10 − 2 \lambda=5×10^{-3}, \beta=1×10{-2} λ=5×103,β=1×102
    • 具有逐像素损失的预训练有助于基于 GAN 的方法获得更美观的结果
      • 原因如下:
        (1)它可以避免生成器出现不期望的局部最优
        (2)预训练后,判别器一开始就收到了相对较好的超分辨率图像,而不是极端的假图像(黑色或噪声图像)这有助于它更专注于纹理判别
  • 优化器:Adam, β 1 = 0.9 , β 2 = 0.999 \beta_1 = 0.9,\beta_2 = 0.999 β1=0.9β2=0.999
    • 交替优化生成器和判别器直至模型收敛。
  • 两种生成器结构:
    1. 含有16个Residual Block,与SRGAN类似。
    2. 使用23个RRDB,更深的模型。
4.2 数据集
  • 训练集:
    1. DIV2K:800张2K分辨率的图像
    2. Flickr2K :2650 张 2K 高分辨率图像
    3. OutdoorSceneTraining (OST)
  • 测试集:
    • set5、Set14 、BSD100 、Urban100 以及 PIRM-SR 挑战赛中提供的 PIRM 自验证数据集。
4.3 定性分析

![[Pasted image 20240124201125.png|500]]

4.4 消融实验
  1. 删除BN层
    • 首先删除所有 BN 层,以获得稳定一致的性能,且不会出现伪影。它不会降低性能,而是节省计算资源和内存使用。
    • 当网络更深、更复杂时,具有 BN 层的模型更有可能引入令人不快的伪影。
  2. 使用激活之前的特征作为感知损失
    • 使用激活之前的特征会导致更准确的亮度分布,更接近真实情况。
    • 在激活之前使用特征有助于产生更锐利的边缘和更丰富的纹理,因为激活前的密集特征提供了更强的纹理。监督比稀疏激活所能提供的监督要多。
  3. 使用相对判别器 R a G A N R_aGAN RaGAN
    • 有利于学习更清晰的边缘和更详细的纹理
  4. 使用RRDB作为生成器的基本块
    • 使用所提出的 RRDB 的更深模型可以进一步改善恢复的纹理, 因为深层模型具有捕获语义信息的强大表示能力, 同时更深的模型可以减少令人不快的噪声。
4.5 网络插值
  1. 纯基于 GAN 的方法:
    • 产生清晰的边缘和更丰富的纹理,但存在一些令人不快的伪影。
  2. 纯基于 PSNR 的方法:
    • 输出卡通风格的模糊图像。
  3. 通过采用网络插值:
    • 可以减少令人不快的伪影,同时保留纹理。
    • 同时,网络插值策略提供了平衡感知质量和保真度的平滑控制。
  4. 图像插值无法有效消除这些伪影。

五、结论

  1. 首先,强调ESRGAN实现了SOTA,并且在PIRM-SR挑战赛中获得感知指数第一名。
  2. 然后,说明了本论文的创新点:
    1. ESRGAN包含多个没有 BN 层的 RDDB 块
    2. 采用了包括残差缩放较小初始化在内的有用技术来促进所提出的深度模型的训练。
    3. 使用相对论 GAN 作为判别器,它学习判断一幅图像是否比另一幅图像更真实,指导生成器恢复更详细的纹理。
    4. 使用激活前的特征来增强感知损失,这提供了更强的监督,从而恢复更准确的亮度和真实的纹理。****

六、支撑材料

  1. 重点实验了BN层带来的伪影。
  2. 重点实验了较小的初始化残差缩放这两种有用的技术,来简化非常深的网络的训练,
  3. 针对不同的数据集,测试了RSRGAN的泛化性。
  4. 重点实现了HR图像的patch size对模型性能的影响。
  5. 更多地可视化了其他测试集的定性实验结果,

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C. Peaceful Rooks

思路&#xff1a;如果是本来就位于对角线上的点&#xff0c;那么自然就没有必要进行移动了&#xff0c;否则就是在浪费操作次数。 那么不在对角线上的点一定需要操作一次&#xff0c;竖直移动或者水平移动到对角线上。 但是我们还发现可能会有n个点构成一个环&#xff0c;就像样…

基于Springboot的大学生心理健康管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的大学生心理健康管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体…

前端上传大文件使用分片上传

前提:分片上传针对于一些大的文件、普通大小的文件使用element中的上传组件可以实现效果,例如几G的文件就会比较卡,所以这时候就需要用到分片上传~ 前端及后端分片上传笔记 效果:(上传进度展示) 效果:(上传成功的效果展示) 1、 新建一个上传组件 2、使用vue-simple-…

thinkphp5向数据表插入数据并且获得id

$id db(数据表名)->insertGetId([status>1]); 直接...打印$id就是这条插入的数据的id了

MySQL定期整理磁盘碎片

MySQL定期整理磁盘碎片&#xff1a;提升数据库性能的终极指南 MySQL作为一个强大的关系型数据库管理系统&#xff0c;在长时间运行后可能会产生磁盘碎片&#xff0c;影响数据库性能。本博客将深入讨论如何定期整理MySQL磁盘碎片&#xff0c;以确保数据库的高效运行。我们将介绍…

MySQL的启动与连接

一、启动MySQL服务 方式一&#xff1a;进入计算机管理界面&#xff0c;点击【服务】&#xff0c;找到【MYSQL80】&#xff0c;右键开启即可 方式二&#xff1a;以管理员身份打开powershell, 输入命令net start MYSQL80. 二、连接MySQL服务 进入MySQL的安装目录中的bin目录&a…

JS中splice方法的用法总结

1. 概述 JavaScript中的splice()方法是用于增加、删除或替换数组中的元素。这个方法可以实现数组的细粒度操作,非常灵活和强大。 2. 语法 splice()方法的语法如下所示: start:必需,表示开始删除或插入的索引位置。如果为负数,则从数组的末尾开始计算。deleteCount:可选…

一些es的基本操作

目录 给索引增加字段&#xff1a;给索引删除字段[^1]&#xff1a;创建索引&#xff1a;插入document删除document(应该是按ID) : 给索引增加字段&#xff1a; 用postMan: 给名为population_portrait_hash_seven的索引增加了一个text类型的字段。 用chrome插件Elasticvue 的Re…

一种解决常用存储设备无法被电脑识别的方法

一、通用串行总线控制器描述 通用串行总线&#xff08;Universal Serial Bus&#xff0c;简称USB&#xff09;&#xff0c;是连接电脑与设备的一种序列总线标准&#xff0c;也是一种输入输出&#xff08;I/O&#xff09;连接端口的技术规范&#xff0c;广泛应用于个人电脑和移动…

解决vld内存泄露检测工具只支持到vs2015的问题,visual studio2015以上版本安装vld内存泄漏检测工具[实测vs2022生效]

目录 一.vld工具下载二.vld应用安装三.visual studio2022环境配置四.visual studio2022 vld内存检测测试 一.vld工具下载 Visual Leak Detector github链接: https://kinddragon.github.io/vld/ 下载直达链接: https://github.com/KindDragon/vld/releases/tag/v2.5.1 下拉至…

怎么计算数据的均值和方差

1. 前言 pytorch 跑深度学习数据集的时候&#xff0c;需要先将数据归一化&#xff0c;可以让网络更好的收敛。一般的均值和方差都是利用&#xff08;灰度值 - 0.5 &#xff09;/ 0.5 本章提供一个计算均值和方差的代码&#xff0c;供以后使用 2. 完整代码 代码如下&#xff…

大数据开发之Spark(累加器、广播变量、Top10热门品类实战)

第 3 章&#xff1a;累加器 累加器&#xff1a;分布式共享只写变量。&#xff08;executor和executor之间不能读数据&#xff09; 累加器用来把executor端变量信息聚合到driver端。在driver中定义的一个变量&#xff0c;在executor端的每个task都会得到这个变量的一份新的副本…

C++——结构体

1&#xff0c;结构体基本概念 结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同的数据类型。像int&#xff08;整型&#xff09;&#xff0c;浮点型&#xff0c;bool型&#xff0c;字符串型等都是属于系统内置的数据类型。而今天要学习的结构体则是属于我们自定义…

函数递归(Recursion)一篇便懂

递归的概念 在 C 语言中&#xff0c;递归&#xff08;Recursion&#xff09;是一种函数调用自身的编程技术。当一个函数在其定义中调用自身时&#xff0c;就称为递归函数。 了解递归思想 把⼀个大型复杂问题层层转化为⼀个与原问题相似&#xff0c;但规模较小的子问题来求解…

安卓开发之自动缩放布局

AutoScalingLayout 适用于 Android 的自动缩放布局。 替换布局&#xff1a; 我们只需要替换根布局所需的自动缩放&#xff0c;子布局也将实现自动缩放。 原始布局AutoScalingLayout相对布局ASRelativeLayout线性布局ASLinearLayoutFrameLayout&#xff08;框架布局&#xff…

k8s部署Ingress

前提&#xff1a;有自备的域名&#xff0c;没有域名可用主机配置的域名解析代替测试 #主机配置的域名 vi /etc/hosts #追加以下内容 127.0.0.1 kuboard1、部署Ingress vi deploy.yaml #输入以下内容apiVersion: v1 kind: Namespace metadata:labels:app.kubernetes.io/instan…

基于springboot+vue的网上租赁系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

33岁前端干了8年,是继续做前端开发,还是转其他工作?

真心不建议在前端开发上终老&#xff0c;相信大家也发现了问题&#xff1a;前端的内容就那些&#xff0c;不管怎么搞都搞不过年轻人。 这个时候就要赶紧想办法为下一个十年做打算了&#xff0c;若是继续在前端开发岗上&#xff0c;过不了几年&#xff0c;要么会被边缘化&#…

微信小程序开发创建component组件,报错WXML file not found解决方案

报错如下&#xff1a; 解决方案&#xff1a; 在组件.json文件加上"styleIsolation": "apply-shared",&#xff1a;

【血泪】dell_smm_hwmon: unable to get SMM Dell signature-黑屏无法进入Ubuntu系统 - 问题解决

【问题描述】 昨天下午装了Ubuntu20.04系统&#xff0c;晚上装显卡驱动的时候&#xff0c;重启一下&#xff0c;直接黑屏了。如下图&#xff0c;一直卡着进不去。 于是反思&#xff0c;想起来每一次都是执行到&#xff1a;禁用nouveau 的这一步&#xff0c;之后就不能启动了。…