【论文解读】Real-ESRGAN:使用纯合成数据训练真实世界的超分辨率图像

news2024/11/28 6:54:29

图一是4种超分方法的对比效果 。

0 摘要

        尽管在盲超分辨率方面已经进行了许多尝试,以恢复具有未知和复杂退化的低分辨率图像,但它们仍然远远不能解决一般的真实世界退化图像。在这项工作中,我们将强大的 ESRGAN 扩展到一个实际的恢复应用程序(即 Real-ESRGAN),该应用程序使用纯合成数据进行训练。具体来说,引入了高阶退化建模过程,以更好地模拟复杂的现实世界退化。我们还考虑了合成过程中常见的振铃和过冲伪影。此外,我们还采用了具有频谱归一化的 U-Net 判别器来提高判别器能力并稳定训练动态。广泛的比较表明,其视觉性能优于先前在各种真实数据集上的工作。我们还提供高效的实现,以动态合成训练对。

1 引言

        单图像超分辨率(SR)[13, 10, 27]是一个活跃的研究课题,旨在从低分辨率(LR)图像中重建高分辨率(HR)图像。自SRCNN的开创性工作[9]以来,深度卷积神经网络(CNN)方法为SR领域带来了蓬勃发展。 然而,大多数方法[21,27,20,25,50]假设一个理想的双三次下采样核,这与实际退化不同。这种退化不匹配使得这些方法在实际场景中不切实际。

        相反,盲超分辨率 [35, 2, 56] 旨在恢复遭受未知和复杂退化的低分辨率图像。 根据潜在的退化过程,现有的方法可以大致分为显式建模和隐式建模。经典的退化模型[11,29],由模糊、下采样、噪声和JPEG压缩组成(详见第3.1节),在显式模型[56,16,34]中被广泛采用。然而,现实世界的退化通常过于复杂,无法用多个退化的简单组合进行建模。因此,这些方法在实际样本中很容易失败。 隐式建模方法[54,12,46]利用数据分布学习和生成对抗网络(GAN)[14]来获得退化模型。然而,它们仅限于训练数据集内的退化,并且不能很好地泛化到分布外的图像。鼓励读者参考最近的一项盲目SR调查[28],以获得更全面的分类法。  

        这促使我们扩展经典的“一阶”退化模型为真实世界退化的“高阶”退化建模,即用几个重复的退化过程对退化进行建模,每个过程都是经典的退化模型。 根据经验,我们采用二阶降解过程,在简单性和有效性之间取得良好的平衡。 最近的一项研究[55]也提出了一种随机洗牌策略来合成更实际的退化。然而,它仍然涉及固定数量的降解过程,并且所有洗牌的降解是否有用尚不清楚。相反,高阶退化建模更加灵活,并试图模拟真实的退化生成过程。我们在合成过程中进一步加入了sinc滤波器,以模拟常见的振铃和过冲伪影。

        由于降解空间比ESRGAN大得多,因此训练也变得具有挑战性。具体来说,1)判别器需要更强大的能力来区分真实性和复杂的训练输出,而判别器的梯度反馈需要更准确才能增强局部细节。因此,我们将ESRGAN中的VGG式鉴别器改进为U-Net设计[41,52,39]。 2)U-Net结构和复杂的退化也增加了训练的不稳定性。 因此,我们采用频谱归一化(SN)正则化[37,41]来稳定训练动力学。配备专门的改进,使我们能够轻松训练我们的 Real-ESRGAN,并在局部细节增强和伪影抑制之间取得良好的平衡。

        总而言之,在这项工作中,1)我们提出了一个高阶退化过程来模拟实际退化并利用sinc滤波器来模拟常见的振铃和过冲伪影。 2)我们采用了一些必要的修改(例如,具有光谱归一化的U-Net判别器)来增加判别器的能力并稳定训练动态。3)使用纯合成数据训练的Real-ESRGAN能够还原大多数真实世界的图像,并实现比以往作品更好的视觉表现,使其在实际应用中更具实用性

2 相关工作

        自SRCNN [9, 10]以来,图像超分辨率场[21, 24, 45, 17, 25, 27, 58, 22, 44, 57, 7, 30]经历了各种发展。为了获得视觉上令人愉悦的结果,生成对抗网络[15]通常被用作损失监督,以推动解更接近自然流形[26,40,50,49]。大多数方法都假设使用双三次下采样内核,并且在实际图像中通常会失败。最近的工作还包括图像修复的强化学习或GAN的先验[53,6,47]。

        在盲SR方面已经有几次很好的探索。第一类涉及显式退化表示,通常由两个部分组成:退化预测和条件恢复。 上述两个组件可以单独执行[2,56]或联合(迭代)[16,34,46]。 这些方法依赖于预定义的降解表示(例如,降解类型和水平),并且通常考虑简单的合成降解。此外,不准确的退化估计将不可避免地导致伪影。

        另一类是获取/生成尽可能接近真实数据的训练对,然后训练一个统一的网络来解决盲SR。训练对通常是 1) 用特定的相机捕获,然后进行繁琐的对齐 [5, 51];2)或直接从循环一致性损失的未配对数据中学习[54,33];3)或用估计的模糊核和提取的噪声补丁进行合成[60,19]。然而,1)捕获的数据仅局限于与特定相机相关的退化,因此不能很好地泛化到其他真实图像;2)使用未配对的数据学习细粒度退化具有挑战性,结果通常不令人满意。退化模型。 经典的降解模型[11,29]在盲SR方法[56,16,34]中被广泛采用。然而,现实世界的退化通常过于复杂,无法明确建模。因此,隐式建模试图学习网络内的退化生成过程[54,12,46]。在这项工作中,我们提出了一种灵活的高阶退化模型来合成更实际的退化。

3 方法论

3.1 经典退化模型

        Blind SR 旨在从具有未知和复杂退化的低分辨率图像中恢复高分辨率图像。通常采用经典的退化模型[11,29]来合成低分辨率输入。通常,真值图像 y 首先与模糊核 k 进行卷积。然后,执行比例因子 r 的下采样操作。低分辨率 x 是通过添加噪声 n 获得的。最后,还采用了JPEG压缩,因为它在真实世界的图像中被广泛使用。

x = D(y)=[(y\circledast k)\displaystyle \displaystyle \vee_{k}+n]_{JPEG}

注意:由于没有找到合适下采样符号,故使用V来表示 。

D表示退化过程。我们将简要的回顾下这些常用的退化方法。详细设置在第 4.1 节中指定。更多描述和示例在附录A中。

        模糊。 我们通常将模糊退化建模为使用线性模糊滤波器(内核)的卷积。 各向同性和各向异性高斯滤波器是常见的选择。 对于核大小为 2 t + 1 的高斯模糊核 k,其 (i, j) ∈ [ − t, t ] 元素从高斯分布中采样,形式为:

k(i,j)=\frac{1}{N}exp(-\frac{1}{2}C^{T}\sum^{-1}C), C=[i,j]^T

其中 Σ 是协方差矩阵; C为空间坐标; N 是归一化常数。 协方差矩阵可以进一步表示如下:

其中\sigma_{1}\sigma_{2}是沿两个主轴的标准差(即协方差矩阵的特征值);θ 是旋转度。当\sigma_{1}=\sigma_{2} 时,k 是各向同性的高斯模糊核;否则 k 是各向异性核。 

        讨论。 尽管高斯模糊核被广泛用于模拟模糊退化,但它们可能并不能很好地接近真实的相机模糊。 为了包含更多样化的核形状,我们进一步采用了广义高斯模糊核[31]和平台形分布。它们的概率密度函数 (pdf)分别为\frac{1}{N}exp(-\frac{1}{2}(C^{T}\sum^{-1}C)^{\beta})\frac{1}{N}\frac{1}{1+(C^{T}\sum^{-1}C)^{\beta}}\beta为形状参数。据经验,我们发现包括这些模糊内核可以为一些真实样本产生更清晰的输出。

        噪声。 我们考虑两种常用的噪声类型,1)加性高斯噪声和2)泊松噪声。加性高斯噪声具有等于高斯分布的概率密度函数。 噪音强度由高斯分布的标准差(即\sigma值)控制。当RGB图像的每个通道都有独立的采样噪声时,合成噪声为彩色噪声。我们还通过对所有三个通道使用相同的采样噪声来合成灰噪声[55,38]。

        泊松噪声服从泊松分布。 它通常用于近似模拟由统计量子涨落引起的传感器噪声,即在给定曝光水平下感测到的光子数量的变化。泊松噪声的强度与图像强度成正比,不同像素处的噪声是独立的。

        调整大小(缩减采样)。 下采样是在SR中合成低分辨率图像的基本操作。更一般地说,我们考虑下采样和上采样,即调整大小操作。 有几种调整大小算法 - 最近邻插值、面积调整大小、双线性插值和双三次插值。不同的调整大小操作会带来不同的效果 - 有些会产生模糊的结果,而有些可能会输出过于清晰的图像并伴有过冲伪影。

        为了包含更多样化和更复杂的调整大小效果,我们从上述选项中考虑随机调整大小操作。 由于最近邻插值引入了错位问题,因此我们排除了这个问题,只考虑面积、双线性和双三次运算

        JPEG 压缩。 JPEG 压缩是数字图像的一种常用的有损压缩技术。 它首先将图像转换为 YCbCr 色彩空间,并对色度通道进行下采样。然后将图像分成 8 × 8 个块,每个块使用二维离散余弦变换 (DCT) 进行变换,然后对 DCT 系数进行量化。 有关JPEG压缩算法的更多细节,请参见[43]。JPEG 压缩通常会引入令人不快的块伪影。

        压缩图像的质量由质量因子 q ∈ [0, 100] 决定,其中较低的 q 表示较高的压缩比和较差的质量。我们使用 PyTorch 实现 - DiffJPEG [32]

3.2 高阶退化模型

        当我们采用上述经典退化模型合成训练对时,训练后的模型确实可以处理一些真实样本。然而,它仍然无法解决现实世界中一些复杂的劣化问题,尤其是未知的噪声和复杂的伪影(见图3)。这是因为合成的低分辨率图像与逼真的退化图像仍然有很大的差距。因此,我们将经典的退化模型扩展到高阶退化过程,以模拟更实际的退化。

图片解释:用二阶退化过程来模拟更真实的退化,其中的每个退化过程都是由经典的退化步骤组成的。列出了模糊、调整大小、噪点和 JPEG 压缩的详细选项。我们还采用sinc滤波器来合成常见的振铃和过冲伪影。

 图片解释:使用经典退化模型的合成数据训练的模型可以解析一些真实样本(左)。然而,它们会放大噪点或为复杂的真实图像引入振铃伪像(右)。放大以获得最佳视野。

        一些基本的退化过程可视为一阶建模。然而,现实生活中的退化过程是多种多样的,通常包括一系列程序,包括相机成像系统、图像编辑、互联网传输等。例如,当我们想从互联网上恢复低质量的图像下载时,其潜在的降级涉及不同降级过程的复杂组合。 具体来说,原始图像可能是多年前用手机拍摄的,这不可避免地包含相机模糊、传感器噪声、低分辨率和 JPEG 压缩等退化。 然后通过锐化和调整大小操作对图像进行编辑,带来过冲和模糊伪影。 之后,它被上传到一些社交媒体应用程序,这引入了进一步的压缩和不可预测的噪音。由于数字传输也会带来伪影,当图像在互联网上多次传播时,这个过程变得更加复杂。

        如此复杂的劣化过程无法用经典的一阶模型进行建模。因此,我们提出了一个高阶退化模型。 n阶模型涉及n个重复的降解过程(如式5所示),其中每个降解过程采用经典的降解模型(式1),具有相同的过程,但具有不同的超参数。请注意,这里的“高阶”与数学函数中使用的“高阶”不同。 它主要是指同一操作的执行时间。[55]中的随机洗牌策略还可以包括重复的退化过程(例如,双重模糊或JPEG)。但我们强调,高阶退化过程是关键,这表明并非所有洗牌退化都是必要的。为了将图像分辨率保持在合理范围内,方程1中的下采样操作被随机调整大小操作所取代。 根据经验,我们采用了二阶退化过程,因为它可以在保持简单性的同时解决大多数实际情况。图 2 描绘了纯合成数据生成流水线的整体流水线。

         值得注意的是,改进的高阶退化过程并不完美,无法覆盖现实世界中的整个退化空间。相反,它只是通过修改数据合成过程来扩展先前盲SR方法的可求解退化边界。图 11 中提供了几种典型的限制场景。

3.3 振铃过冲伪影

        振铃伪影通常表现为图像中锐化过渡附近的杂散边缘。它们在视觉上看起来像边缘附近的带状或“幽灵”。过冲伪影通常与振铃伪影结合在一起,表现为边沿过渡处的跳跃增加造成这些伪影的主要原因是信号在没有高频的情况下受到带宽限制。这些伪影很常见,通常由锐化算法、JPEG压缩等产生。 图5(上图)显示了一些存在振铃和过冲伪影的真实样本。

图片解释: Real-ESRGAN 采用与 ESRGAN 相同的生成器网络。对于× 2 和 × 1 的比例因子,它首次采用像素解洗操作来减小空间大小并将信息重新排列到通道维度

 图片解释:上图:真实样本出现振铃效应和过冲伪影。 下图:sinc内核(内核大小为21)和相应过滤图像的示例。放大以获得最佳视野。

        我们采用sinc滤波器(一种切断高频的理想化滤波器)来合成训练对的振铃和过冲伪影。 sinc 滤波器内核可以表示为,该公式的实现来源于image processing - 2-d circularly symmetric low-pass filter - Signal Processing Stack Exchange:

        式中 ( i, j ) 为核坐标; ω 为截止频率;J_{1}是第一类的一阶贝塞尔函数。图5(下图)显示了具有不同截止频率的sinc滤波器及其相应的滤波图像。据观察,它可以很好地合成振铃效应和过冲伪影(尤其是由过度锐利的效果引入)。这些伪影在视觉上与图5(上图)中前两个真实样本中的伪影相似。

我们在两个地方采用sinc滤波器:模糊过程和合成的最后一步。最后一个 sinc 滤波器和 JPEG 压缩的顺序是随机交换的,以覆盖更大的退化空间,因为某些图像可能首先被过度锐化(带有过冲伪影),然后JPEG 压缩;而有些图像可能会先进行 JPEG 压缩,然后进行锐化操作。

3.4 网络和训练

        ESRGAN生成器。我们采用与ESRGAN[50]相同的生成器(SR网络),即具有多个残差中残差密集块(RRDB)的深度网络,如图4所示。 我们还扩展了原始的 × 4 ESRGAN 架构,以执行比例因子为 × 2 和 × 1 的超分辨率。 由于 ESRGAN 是一个繁重的网络,我们首先采用像素解洗(像素洗牌的逆运算 [42])来减小空间大小并扩大通道大小,然后再将输入馈送到主 ESRGAN 架构中。因此,大多数计算是在较小的分辨率空间内进行的,这可以减少GPU内存和计算资源消耗。

 

图片解释: 具有频谱归一化的 U-Net 鉴别器架构

具有频谱归一化 (SN) 的 U-Net 鉴别器。由于Real-ESRGAN旨在解决比ESRGAN大得多的退化空间,因此ESRGAN中鉴别器的原始设计不再适用。 具体来说,Real-ESRGAN 中的判别器需要更大的判别能力来处理复杂的训练输出。除了区分全局样式外,它还需要为局部纹理生成准确的渐变反馈。受 [41, 52] 的启发,我们还将 ESRGAN 中的 VGG 式鉴别器改进为具有跳跃连接的 U-Net 设计(图 6)。UNet 输出每个像素的真实值,并可以向生成器提供详细的每个像素反馈。

同时,U-Net结构和复杂化也增加了训练的不稳定性。我们采用频谱归一化正则化[37]来稳定训练动态。此外,我们观察到光谱归一化也有利于缓解GAN训练引入的过于尖锐和烦人的伪影。通过这些调整,我们能够轻松训练RealESRGAN,并在局部细节增强和伪影抑制之间取得良好的平衡。

训练过程。分为两个阶段。首先,我们用 L1 损失训练一个面向 PSNR 的模型。得到的模型由Real-ESRNet命名。然后,我们使用经过训练的面向PSNR的模型作为生成器的初始化,并使用L1损失、感知损失[20]和GAN损失[14,26,4]的组合来训练Real-ESRGAN。

4 实验

4.1 数据和实现

训练细节。和ESRGAN类似,我们采用DIV2K [1]、Flickr2K [45]和OutdoorSceneTraining [49]数据集进行训练。训练的HR patch size为256,我们使用 4 个 NVIDIA V100 GPU 训练模型,总批次大小为 48 个。我们使用Adam优化器[23]。 Real-ESRNet 从 ESRGAN 进行了微调,以实现更快的收敛。 我们训练 Real-ESRNet 进行 1000 K 次迭代,学习率为2\times10^{-4},同时训练 Real-ESRGAN 进行 400 K 次迭代,学习率为 1\times10^{-4}。 我们采用指数移动平均线 (EMA) 进行更稳定的训练和更好的表现。 RealESRGAN 使用 L1 损失、感知损失和 GAN 损失的组合进行训练,权重分别为 { 1 , 1 , 0 . 1 } 。 我们使用 { conv1, ...conv5} 特征图(权重 { 0 . 1 , 0 . 1 , 1 , 1 , 1 } ) 在预训练的 VGG19 网络 [20] 中激活函数之前作为感知损失。我们的实现基于BasicSR [48]。

退化详细过程。我们采用二阶退化模型,在简单性和有效性之间取得良好的平衡。 除非另有说明,否则这两个降级过程具有相同的设置。采用高斯核、广义高斯核和平台形核,概率为{0 . 7 , 0 . 15 , 0 . 15 } 。模糊核大小是从 { 7 , 9 , ...21 } .模糊标准差 σ 取样自 [0 . 2 , 3] ( [0 . 2 , 1 . 5] 用于第二次降解过程)。 形状参数β分别从[0. 5,4]和[1,2]中采样广义高斯核和高原形核。我们还使用概率为 0.1 的 sinc 内核。我们跳过了第二次模糊退化,概率为 0.2。

        我们采用高斯噪声和泊松噪声,概率为 { 0 . 5 , 0 . 5 } 。噪声sigma范围和泊松噪声标度分别设置为[1, 30]和[0.05, 3](第二次退化过程为[1,25]和[0.05,2.5])。灰度噪声概率设置为 0.4。JPEG 压缩质量系数设置为 [30 , 95]。最终应用sinc滤波器的概率为0.8。更多详细信息可以在已发布的代码中找到

训练配对池。为了有效提高训练效果。所有降级过程都是在 PyTorch 中通过 CUDA 加速实现的,因此我们能够动态合成训练对。然而,批处理限制了批次中合成降解的多样性。例如,批次中的样本不能具有不同的调整大小比例因子。因此,我们采用训练对池来增加批量中的降解多样性。在每次迭代中,从训练对中随机选择训练样本,形成训练批次。我们在实现中将池大小设置为 180。

在训练期间锐化真实目标图像。我们进一步展示了一种训练技巧,可以在视觉上提高清晰度,同时不引入可见的伪像。 锐化图像的典型方法是采用后处理算法,例如非锐化遮罩 (USM)。但是,此算法往往会引入过冲伪影。根据经验发现,在训练过程中锐化地面实况图像可以更好地平衡锐度和过冲伪影抑制。我们将使用锐化地面实况图像训练的模型表示为 Real-ESRGAN +(比较如图 7 所示)。

4.2 对比实验

        与现有作品的比较 我们将 Real-ESRGAN 与几种最先进的方法进行了比较,包括 ESRGAN [50]、DAN [34]、CDC [51]、RealSR [19] 和 BSRGAN [55]。我们使用真实世界的图像在几个不同的测试数据集上进行了测试,包括RealSR [5]、DRealSR [51]、OST300 [49]、DPED [18]、ADE20K验证[59]和来自互联网的图像。由于现有的感知质量指标不能在细粒度尺度上很好地反映人类的实际感知偏好[3],我们在图7中提供了几个具有代表性的视觉样本。定量结果也包含在附录中。B 供参考。

        从图 7 中可以看出,我们的 Real-ESRGAN 在去除伪影和恢复纹理细节方面都优于以前的方法。Real-ESRGAN+(使用锐化地面实况进行训练)可以进一步提高视觉清晰度。 具体来说,第一个样本包含过冲伪影(字母周围的白边)。 直接上采样将不可避免地放大这些伪影(例如,DAN 和 BSRGAN)。Real-ESRGAN考虑了这些常见的伪影,并使用sinc滤波器对其进行仿真,从而有效地消除了振铃和过冲伪影。第二个样品包含未知和复杂的降解。大多数算法无法有效地消除它们,而使用二阶退化过程训练的 Real-ESRGAN 可以。 Real-ESRGAN 还能够为真实世界的样品恢复更逼真的纹理(例如,砖块、山脉和树木纹理),而其他方法要么无法消除退化,要么添加不自然的纹理(例如,RealSR 和 BSRGAN)。

图片解释: 对几个具有代表性的真实世界样本进行定性比较,上采样比例因子为 4。 我们的 Real-ESRGAN 在去除伪影和恢复纹理细节方面都优于以前的方法Real-ESRGAN+(使用锐化真实目标进行训练)可以进一步提高视觉清晰度。其他方法可能无法去除过冲(第一个样本)和复杂的伪影(第二个样本),或者无法恢复各种场景(第 3、4、5 个样本)的真实和自然纹理。( 放大以获得最佳视野 )

图片解释: 顶部:带和不带(放大以获得最佳视图)阶次降级过程的真实 ESRNet 结果。 底部:带和不带 sinc 滤波器的 Real-ESRNet 结果。放大以获得最佳视野

4.3 消融研究

        二阶退化模型。 我们在Real-ESRNet上对降解进行消融研究,因为它更可控,更能反映降解的影响。我们将Real-ESRNet中的二阶过程替换为经典的退化模型来生成训练对。如图8(上图)所示,使用经典一阶退化模型训练的模型不能有效去除墙上的噪点或麦田中的模糊,而Real-ESRNet可以处理这些情况。

        SINC滤波器。如果在训练过程中未使用sinc滤波器,则恢复的结果将放大输入图像中存在的振铃和过冲伪影,如图8(底部)所示,尤其是在文本和线条周围。相比之下,使用 sinc 滤波器训练的模型可以消除这些伪影。

        具有SN正则化的U-Net鉴别器。我们首先采用 ESRGAN 设置,包括 VGG 式鉴别器及其损失权重。然而,从图9中我们可以观察到,这个模型无法恢复详细的纹理(砖块和灌木丛),甚至在灌木丛的树枝上带来了令人不快的伪影。使用U-Net设计可以改善局部细节。然而,它引入了不自然的纹理,也增加了训练的不稳定性。 SN正则化可以改善恢复的纹理,同时稳定训练动态。

        更复杂的模糊内核。 我们在模糊合成中去除了广义高斯核和平台形核。如图 10 所示,在一些真实样本上,该模型无法像 RealESRGAN 那样去除模糊并恢复锐利边缘。然而,在大多数样本上,它们的差异很小,这表明广泛使用的具有高阶退化过程的高斯核已经可以覆盖较大的真实模糊空间。由于我们仍然可以观察到稍微好一点的性能,因此我们在 Real-ESROGAN 中采用了那些更复杂的模糊内核。

图片解释:图9是鉴别器的消融效果对比。图10是使用更多模糊核(广义模糊核和平台形核)进行消融。图 11:局限性:1) 扭曲的线条;2)GAN训练引起的令人不快的伪影;3)未知和分布外的降解。

4.4 不足

        尽管 Real-ESRGAN 能够恢复大多数真实世界的图像,但它仍然有一些局限性。 如图11所示,1)由于混叠问题,一些修复的图像(尤其是建筑物和室内场景)有扭曲的线条。2)GAN训练在某些样本上引入了令人不快的伪影。3)它无法消除现实世界中分布外的复杂退化。更糟糕的是,它可能会放大这些伪影。这些缺点对Real-ESRGAN的实际应用影响很大,在今后的工作中亟待解决。

5 总结

        在本文中,我们使用纯合成训练对训练实用的 Real-ESRGAN 进行真实世界的盲超分辨率训练为了合成更实际的退化,我们提出了一种高阶退化过程,并采用sinc滤波器来模拟常见的振铃和过冲伪影我们还利用具有频谱归一化正则化的 U-Net 判别器来提高判别器能力并稳定训练动态。使用合成数据训练的 Real-ESRGAN 能够增强细节,同时消除大多数真实世界图像的恼人伪影。

附录材料:待补充......

 

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

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

相关文章

计算机图形学-变换基础

坐标系转换历程模型坐标系 -> 世界坐标系 -> 摄像机坐标系 -> 视口(屏幕)坐标系 变换 仿射变换和线性变换线性:旋转 缩放 镜像 切变放射: 平移 平移 2D变换矩阵 3D变换矩阵 旋转 2D旋转矩阵 //2D 旋转private (float,…

案例026:基于微信的原创音乐小程序的设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

7000字详解 动态代理(JDK动态代理 CGLIB动态代理)与静态代理

代理模式 1. 代理模式 概念2. 静态代理3. 动态代理3.1.JDK动态代理3.2.CGLIB动态代理3.3. JDK动态代理和CGLIB动态代理区别 4.静态代理和动态代理区别5.篇末 1. 代理模式 概念 代理模式是一种设计模式。 使用代理对象来替代真实对象,用代理对象去访问目标对象。这样…

ROS2智能小车基本原理图

我觉得这样意思已经表的很清楚了 这个图很重要,有了这个图,就可以积累每个部分的代码了,如果没有这个图,那么每次都只能是测试,以前的代码都会需要重新写一次。不过第一次训练也许更重要,这也是不可避免的…

使用STM32与MFRC522 IC进行RFID卡的读取与识别(含代码)

利用STM32与MFRC522 IC进行RFID卡的读取和识别,可以实现对RFID卡的读取和获取卡片标识信息。MFRC522 IC是一种高集成度的13.56MHz RFID芯片,常用于门禁系统、物流跟踪和智能支付等领域。下面将介绍如何使用STM32与MFRC522 IC进行RFID卡的读取和识别&…

Mycat实现读写分离

Mycat实现读写分离 Mycat支持MySQL主从复制状态绑定的读写分离机制。这里实现的也是基于MySQL主从复制的读写分离。 MySQL主从复制配置 首先要配置MySQL的主从复制,这里配置的是一主一次从。可以参考下面的文章。 https://blog.csdn.net/wsb_2526/article/detail…

【c++随笔14】虚函数表

【c随笔14】虚函数表 一、虚函数表(Virtual Function Table)1、定义2、查看虚函数表2.1、 问题:三种类型,包含一个int类型的class、一个int类型的变量、int类型的指针:这三个大小分别是多少呢?2.2、怎么发现…

JVM 内存管理深度剖析

1、JVM 基础知识 1.1 JVM 与操作系统的关系 JVM 能识别 class 后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成指定操作。操作系统并不认识这些 class 文件,是 JVM 将它们翻译成操作系统可识别的机器码&#xf…

【古诗生成AI实战】之二——项目架构设计

[1] 项目架构 在我们深入古诗生成AI项目的具体实践之前,让我们首先理解整个项目的架构。本项目的代码流程主要分为三个关键阶段: 1、数据处理阶段;   2、模型训练阶段;   3、文本生成阶段。 第一步:在数据处理阶段…

WordPress无需插件禁用WP生成1536×1536和2048×2048尺寸图片

我们在使用WordPress上传图片媒体文件的时候,是不是看到媒体库中有15361536和20482048的图片文件,当然这么大的文件会占用我们的服务器空间,如何禁止掉呢? function remove_default_image_sizes( $sizes) {unset( $sizes[1536x15…

Gee教程1.HTTP基础

标准库启动web服务 Go语言内置了 net/http库,封装了HTTP网络编程的基础的接口。这个Web 框架便是基于net/http的。我们先回顾下这个库的使用。 package mainimport ("fmt""log""net/http" )func main() {//可以写成匿名函数(lambda…

Java 注解在 Android 中的使用场景

Java 元注解有 5 种,常用的是 Target 和 Retention 两个。 其中 Retention 表示保留级别,有三种: RetentionPolicy.SOURCE - 标记的注解仅保留在源码级别中,并被编译器忽略RetentionPolicy.CLASS - 标记的注解在编译时由编译器保…

树状数组 / pbds解法 E2. Array Optimization by Deque

Problem - 1579E2 - Codeforces Array Optimization by Deque - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 树状数组解法 将 a i a_i ai​插入到队头,贡献为:原队列中所有比 a i a_i ai​小的数的数量将 a i a_i ai​插入到队尾,贡献为&a…

深信服超融合一体机提示:内存ECC

PS:此事件分享主要来源于季度巡检时发现的超融合一体机红灯闪烁异常,接入IPMI端口查看日志发现持续提示内存ECC; 因为是只有3.05这一天发现了有这个告警的提示,所以当时清除了日志以后重启了BMC服务就解决了;但是如果清…

常见树种(贵州省):021冬青、连香树、白辛树、香合欢、云贵鹅耳枥、肥牛树、杜英、格木、黄连木、圆果化香树、南天竹

摘要:本专栏树种介绍图片来源于PPBC中国植物图像库(下附网址),本文整理仅做交流学习使用,同时便于查找,如有侵权请联系删除。 图片网址:PPBC中国植物图像库——最大的植物分类图片库 一、冬青 …

MyBatis插入操作返回主键报错问题记录

一开始用直接传参数的方法写的插入操作 StudentMapper.java接口 Integer insertStudent(Param("sname") String name,Param("sage") int age); 然后在网上搜了返回主键的方法 StudentMapper.xml: <insert id"insertStudent" useGenerat…

简易版王者荣耀

所有包和类 GameFrame类 package newKingOfHonor;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.ArrayList;im…

【操作系统】Linux操作系统中命令行参数与环境变量

本篇要分享的内容关于Linux新操作系统中命令行参数。 命令行参数本质上还是作为以后的环境变量的基础来学习的&#xff0c;所以在接触更高难度的内容之前先学习基础。 以下为本篇目录 目录 1.main函数的参数&#xff1f; 2.命令行解释器意义 3.环境变量 3.1.PATH环境变量…

手把手教会你--渗透实战--Hack The Box-Starting Point-Meow--持续更新

有什么问题&#xff0c;请尽情问博主&#xff0c;QQ群796141573 前言 前言 请务必跟着博主复现一遍 参考&#xff1a; Hack The Box-Starting Point-Meow

工业级 S25HS01GTDPBHV030 NOR闪存,L9305EP汽车级驱动器IC,LMK03318RHSR时钟发生器,PLL(中文资料)

一、工业级 S25HS01GTDPBHV030 Semper™ NOR闪存 S25HS01GT SEMPER™ NOR Flash闪存系列是英飞凌高性能、安全而可靠的 NOR Flash解决方案。 它集成了适用于汽车、工业、通信等广泛应用的关键安全功能。 凭借 SEMPER™ NOR Flash闪存&#xff0c;英飞凌推出了业界首款符合 ASI…