论文阅读:CosAE Learnable Fourier Series for Image Restoration

这是 2024 NeurIPS 上发表的一篇文章,介绍了一种新型的基于傅里叶级数的通用编码器。

Abstract

本文介绍了余弦自动编码器(Cosine Autoencoder, CosAE),这是一种新颖的通用自动编码器,它将经典傅里叶级数与前馈神经网络无缝结合。CosAE 将输入图像表示为一系列二维余弦时间序列,每个序列由一组可学习的频率和傅里叶系数构成的元组定义。该方法与传统自动编码器形成鲜明对比,传统自动编码器在降低分辨率的瓶颈潜在空间中往往会牺牲细节。而 CosAE 在其瓶颈层对频率系数(即幅度和相位)进行编码。这种编码方式能够实现极高的空间压缩,例如,在瓶颈层将特征图下采样 64 倍,且解码时不会丢失细节。我们通过在灵活分辨率超分辨率和盲图像复原这两项极富挑战性的任务上进行大量实验,展示了 CosAE 的优势。这两项任务要求复原网络能够有效地泛化到复杂甚至未知的图像退化情况。我们的方法超越了当前最先进的技术,凸显了其学习可泛化图像复原表示的能力。

Introduction

在这里插入图片描述

  • 图 1:与(a)传统自动编码器不同,(b)CosAE 将频域系数编码为极其狭窄的瓶颈特征图。通过一个基构造模块,它能够如实地呈现输入图像的全局结构和精细细节。

通过重建来训练图像自动编码器是图像表示学习中最常采用的方法之一。这种学习过程的核心是创建一个 information bottleneck (信息瓶颈):网络首先将输入图像下采样为低空间维度的特征,然后再将它们上采样以重建输入图像。information bottleneck 的主要动机是增强网络捕获和保留关键数据内在模式和结构的能力,从而提高表示和泛化能力,这在数据质量对性能至关重要的视觉任务中尤为重要。在自动编码器中引入狭窄的瓶颈不仅为识别任务提供了一种学习通用表示的有效方法,而且为图像合成和操作提供了一种学习解纠缠表示的有效方法。

为了建立信息瓶颈,大多数现有的自动编码器网络将输入图像压缩到一个空间紧凑的潜在空间。它们通过提取主要的共享结构并筛选出任何噪声成分,来学习用于分类和属性解纠缠的中高级表示。然而,窄瓶颈自动编码器很少被直接设计用于图像复原任务,主要是因为传统自动编码器中使用下采样瓶颈常常会导致空间细节的丢失。因此,与更粗粒度的结构相比,这些自动编码器难以有效地表示高频细节,例如纹理。在像素回归质量起关键作用的其他应用中,例如 VQVAE 或潜在扩散模型 (LDM) ,研究人员通过在瓶颈的空间紧凑性和其保存细节的能力之间取得平衡来应对这一挑战。

在本文中,我们提出了一种新颖的自动编码器,可直接应用于图像恢复任务。它不仅拥有极其狭窄的瓶颈以提升表征能力,还能如实地保留高保真细节。我们的解决方案 —— 余弦自动编码器(CosAE),从傅里叶变换原理中汲取灵感,该原理表明有限信号可用一组谐波基函数来描述。我们遵循这一原理对频域系数(包括幅度和相位)进行编码,并在将其解码回原始图像之前,将它们与一组余弦基函数相结合(图 1(b))。这是通过一个谐波构建模块(HCM)实现的,该模块依据经典傅里叶级数的公式,将紧凑特征在空间上扩展为一系列谐波函数。与传统自动编码器的下采样特征图不同,我们发现在 CosAE 中,具有频率系数的表征在空间上可被极度压缩。然而,当这些表征与高频基函数(例如图 1 第二行中的余弦基函数)相结合时,就能有效地重建精细细节。

Approach

在这里插入图片描述

  • 图 2:CosAE 包含一个编码器,该编码器将输入图像压缩为一个狭窄的瓶颈。根据公式(2)(见框图),每个瓶颈向量 [ A n , ϕ n ] [A_n, \phi_{n}] [An,ϕn] 被转换为一组大小为 T × T T \times T T×T 的可学习谐波函数 H H H。然后,解码器从学习到的谐波函数中重建输入。为简便起见, A n A_n An 等同于公式(2)中的 A ( u n , v n ) A_{(u_n, v_n)} A(un,vn)

与传统自动编码器类似,CosAE 有一个编码器用于生成瓶颈潜在表示,还有一个解码器用于重建输入图像。在瓶颈层中,我们引入了一个谐波构建模块(HCM),以便在空间上将潜在表示扩展为傅里叶级数。我们先回顾经典的二维傅里叶变换理论及其谐波函数。此外,我们还深入探讨所提出的 HCM 的细节,展示如何将经典傅里叶变换整合到神经网络的潜在空间中。

Preliminary of Fourier Series

傅里叶级数是一种用一组正弦函数来表示周期信号或有限信号的有效工具。形式上,一个有限一维信号 { x ( t ) , t < T } \{x(t), t<T \} {x(t),t<T} 的周期延拓可以用振幅 - 相位形式的傅里叶级数表示为:

x ( t ) ≈ A 0 2 + ∑ k = 1 ∞ H ( k , t ) H ( k , t ) = A k cos ⁡ ( 2 π k T t − φ n ) (1) x(t) \approx \frac{A_0}{2} + \sum_{k = 1}^{\infty} \mathcal{H}(k, t) \\ \mathcal{H}(k, t) = A_k \cos(2\pi \frac{k}{T} t - \varphi_n) \tag{1} x(t)2A0+k=1H(k,t)H(k,t)=Akcos(2πTktφn)(1)

其中 k k k 表示离散频率, H ( k , t ) \mathcal{H}(k, t) H(k,t) 表示信号的第 k k k 次谐波分量。在 H ( k , t ) \mathcal{H}(k, t) H(k,t) 中, A k A_k Ak ϕ k \phi_{k} ϕk 分别表示振幅和相位。 A 0 A_{0} A0 是直流分量。公式(1)中的傅里叶级数很容易推广到 n n n 维的情况。在有限二维信号(比如一幅图像)的情境下,对应于 x x x y y y 维度、频率为 ( u , v ) (u, v) (u,v) 的谐波函数表示为:

H ( x , y , u , v ) = A ( u , v ) ⋅ cos ⁡ [ 2 π T ( u x + v y ) − ϕ ( u , v ) ] (2) \mathcal{H}(x, y, u, v) = A(u, v) \cdot \cos[\frac{2 \pi}{T}(ux + vy) - \phi(u, v)] \tag{2} H(x,y,u,v)=A(u,v)cos[T2π(ux+vy)ϕ(u,v)](2)

其中, x < T x < T x<T, $ y < T$, cos ⁡ [ 2 π T ( u x + v y ) ] \cos[\frac{2 \pi}{T}(ux + vy)] cos[T2π(ux+vy)] 作为余弦基函数, H ( x , y , u , v ) \mathcal{H}(x, y, u, v) H(x,y,u,v) 称为谐波函数。

在二维空间中,输入图像的幅度和相位可通过傅里叶变换(如二维快速傅里叶变换,2D FFT)得出。然而,傅里叶系数既不可学习,也无法直接压缩以形成信息瓶颈,因此不能直接助力图像复原或视觉表征学习任务。我们不使用快速傅里叶变换,而是通过编码器将幅度和相位(分别记为 A ( u , v ) A(u,v) A(u,v) ϕ ( u , v ) \phi(u, v) ϕ(u,v) )作为瓶颈特征图进行学习,这样可实现灵活的维度配置。为了重建原始图像,我们利用谐波分量建模(HCM)生成一组经过学习的谐波函数(公式(2)),解码器则充当一个可学习的求和算子,模拟公式(1)中的重建过程。

其核心要点在于,傅里叶系数在表示图像(即便包含复杂细节的图像)时具有紧凑性。例如,一张复杂的纹理图像可能仅有少数几个重要的频率分量。通过将傅里叶系数转化为可学习的表示形式,我们能够设计出一种具有极窄瓶颈的自动编码器。

Encoding Fourier Coefficients

CosAE 的编码器负责学习瓶颈潜在空间的傅里叶系数。给定一个大小为 P × P P \times P P×P 的二维方形图像块 I p I_p Ip,编码器将输入信号压缩为一个维度为 2 × c 2 \times c 2×c 的瓶颈特征向量,该向量表示对相应的幅度和相位。

[ A ∈ R c , ϕ ∈ R c ] = E ( I p ) (3) [A \in \mathcal{R}^{c}, \phi \in \mathcal {R}^{c}] = \mathbf{E}(I_p) \tag{3} [ARc,ϕRc]=E(Ip)(3)

为了能够适用于任意分辨率的图像,在实际操作中,我们将编码器的下采样步长设置为 P P P,这样幅度 A A A 和相位 ϕ \phi ϕ 都是 c c c 通道维度的特征图,其空间分辨率是输入图像的 1 / P 1/P 1/P。在 CosAE 中,我们会采用相对较大的步长 P P P,以便瓶颈空间可以非常小:对于人脸图像,我们将下采样步长保持为 P = 64 P = 64 P=64(对于 64 x 64 的图像块,会得到一个维度为 R 2 × c \mathbb{R}^{2 \times c} R2×c 的一维瓶颈,见公式 (3));而对于自然图像,我们使用的步长为 P = 32 P=32 P=32。值得注意的是,如下面所介绍的,CosAE 通过将这些系数与作为潜在特征图的余弦基函数相结合,仍然能够如实地重建高频细节。

Constructing Harmonic via HCM

我们引入一个谐波构建模块(图 2 中间框),它作用于瓶颈层,将编码器输出的预测系数转换为一组二维谐波函数,即公式(2)中的 H H H。以二维方形图像块 $I_{p} $为例。编码器对该图像块进行处理,生成 c c c 对幅度 A ∈ R c A \in \mathbb{R}^{c} ARc 和相位 ϕ ∈ R c \phi \in \mathbb{R}^{c} ϕRc。然后,这些与 c c c 个对应的余弦基函数相结合。每个基函数都是一个 T × T T \times T T×T 的二维余弦波形,其中 T T T 可以灵活调整,以达到所需的输出分辨率。因此,根据公式(2),每对傅里叶系数 A ( u , v ) A(u,v) A(u,v) ϕ ( u , v ) \phi(u, v) ϕ(u,v) 将在空间上扩展为一个 T × T T \times T T×T 的谐波函数(空间扩展在图 2 中可视化为两个红色块之间的转换)。这 c c c 个谐波函数构成一个 T × T × c T \times T \times c T×T×c 的特征图,随后进行解码以重建图像块 I p I_{p} Ip。具体来说,在训练过程中,余弦基函数的大小 T T T 可以定制,例如在灵活分辨率超分辨率任务中。我们将在后续章节详细介绍。

值得注意的是, T T T 不能过小,否则无法构成有效的二维余弦波形。为了兼顾模型效率,我们设定 T = P / 2 T=P/2 T=P/2,即对于人脸图像 T = 32 T=32 T=32,对于自然图像 T = 16 T=16 T=16,此时解码器的上采样步长设置为 2。决定余弦基函数的 c c c 对频率 ( u ∈ R c , v ∈ R c ) (u \in \mathbb{R}^c,v \in \mathbb{R}^c) (uRcvRc) 同样是可学习的。

Learning Frequencies as Network Parameters

许多先前的研究工作也像学习傅里叶系数那样,从编码器中学习 u u u v v v,也就是说,频率取决于输入信号。然而,这是最优解吗?为了回答这个问题,我们简要回顾一下谐波函数的特性。

谐波。在信号处理中设置频率有两个关键原则。首先,公式(2)中的频率 ( u , v ) (u, v) (u,v) 是以与信号长度成反比的增量进行采样的。其次,频率必须满足采样定理以避免混叠。为了确定频率的范围,我们对谐波函数应用傅里叶变换(为简化起见,我们采用一维情况,并忽略幅度和相位),

F ( H k ( w ) ) = ∫ − ∞ ∞ cos ⁡ ( 2 π T k t ) e − i 2 π w t d t = π [ δ ( 2 π ( w − k T ) ) + δ ( 2 π ( w + k T ) ) ] (4) F(\mathcal{H}_k(w)) = \int_{-\infty}^{\infty} \cos(\frac{2\pi}{T}kt)e^{-i2\pi wt} dt \\ = \pi [\delta (2\pi(w - \frac{k}{T})) + \delta (2\pi(w + \frac{k}{T}))] \tag{4} F(Hk(w))=cos(T2πkt)ei2πwtdt=π[δ(2π(wTk))+δ(2π(w+Tk))](4)

谐波的带宽 B = k / T B=k/T B=k/T 。根据奈奎斯特 - 香农定理,对于采样率 f s f_s fs,当带宽限制 B = k T < f s 2 B = \frac{k}{T} < \frac{f_s}{2} B=Tk<2fs 时,可保证完美重构。对于离散信号,例如图像,其采样间隔(像素) f s = 1 f_s = 1 fs=1,为防止混叠并确保准确的谐波表示, k k k 可限制为 k < T 2 k < \frac{T}{2} k<2T

基于上述经典离散傅里叶变换(DFT)的设计,我们在 [ 0 , T / 2 ] [0, T/2] [0,T/2] 范围内初始化 c c c ( u , v ) (u, v) (u,v)。然而,为了实现更灵活的设计, ( u , v ) (u, v) (u,v) 集合应适应不同需求,比如为提高分辨率增加频率对,或者为提高效率减少频率对。在这种情况下,均匀采样可能导致覆盖稀疏。例如,当 T = 64 T = 64 T=64 且基图数量设为 64 时, u u u v v v都会很稀疏,采样值为 [ 0 , 4 , 8 , 16 , 32 ] [0, 4, 8, 16, 32] [0,4,8,16,32] 。由于自然图像的频率并非均匀分布,我们将 ( u , v ) (u, v) (u,v) 设为所有输入图像共享的可学习参数,这样在训练过程中就能对各种频率进行有效建模。与之前基于单个输入图像调整频率的方法相比,我们的设计更紧密地遵循经典原理,使用跨越整个范围的全局共享频率。这种设计还解决了先前模型中常见的一个局限,即过于强调主导自然图像的低频部分,从而实现了更平衡、更全面的频率表示。

Decoding Harmonic for Reconstruction

一旦得到 H T × T × c \mathcal{H}_{T \times T \times c} HT×T×c,我们引入一个解码器网络,得到 RGB 像素:

X = D ( { H ( x , y , u , v ) } ) ; ( u , v ) < T / 2 , ( x , y ) < T (5) X = \mathcal{D}(\{\mathcal{H}(x, y, u, v) \}); (u, v) < T/2, (x, y) < T \tag{5} X=D({H(x,y,u,v)});(u,v)<T/2,(x,y)<T(5)

该架构的设计可以灵活多样。例如,我们的框架既可以采用隐式表示网络,在训练过程中仅对一小部分像素进行采样解码;也可以采用基于卷积或 Transformer 的解码器,这些解码器利用整个潜在空间,并能够融入诸如判别器等额外模块,以生成全尺寸的输出。

Network Implementation
  • FFT 用于额外输入:
    我们发现将输入图像的二维 FFT 作为额外通道可以提升性能,因为这直观上与编码器在潜在空间中捕获傅里叶系数的任务相契合。具体来说,我们应用 FFT 为每个 RGB 通道生成实部和虚部的二维映射,然后将它们与原始 RGB 通道拼接在一起,为网络生成一个 9 通道的输入映射。

  • 网络架构:
    我们基于 [6] 构建编码器和解码器。为了在编码器中实现更大的下采样步长,我们添加了额外的 ResNet 块,并将注意力层放置在瓶颈附近。相应地,我们使用一个相对轻量级的解码器,其上采样因子为 2。我们在所有下游任务中都使用的图像块来训练 CosAE,并且在所有实验中设置。值得注意的是,我们对每个瓶颈特征向量进行独立处理,从而允许对任意尺寸的图像进行推理。这是通过在解码器的每个特征单元内用窗口注意力替代全局注意力来实现的。同样,在推理时,对于尺寸不为的输入,我们也会在每个不重叠的区域使用窗口注意力。

  • 目标函数:
    我们遵循 [6],使用损失和感知损失作为重建目标来训练 CosAE,记为。此外 L r e c = L 1 + L l p i p s L_{rec} = L_1 + L_{lpips} Lrec=L1+Llpips,我们应用基于图像块的判别器,记为 L G A N L_{GAN} LGAN,以增强重建图像的视觉质量。整个网络连同 c c c 对可学习频率 ( u , v ) ∈ R 2 × c (u, v) \in \mathbb{R}^{2 \times c} (u,v)R2×c,使用 L = L r e c + λ L G A N L = L_{rec} + \lambda L_{GAN} L=Lrec+λLGAN 进行训练。我们对自适应权重 λ \lambda λ 保持与 [6] 相同的设置。

Experimental Results

在本文中,我们重点关注灵活分辨率超分辨率和盲图像去噪的应用,而将其他与自动编码器相关的潜在应用留作未来的研究。我们在人脸和自然图像领域对这两项任务进行评估。

对于人脸和自然图像领域,我们使用从 1 到 8 的放大因子来训练 CosAE。在训练期间,我们从训练集中采样一个高分辨率(HR)图像 I H R ∈ R H × W × 3 I_{HR} \in \mathcal{R}^{H \times W \times 3} IHRRH×W×3,并使用均匀采样的比率 ( 1 , 8 ) (1, 8) (1,8) 对其进行下采样,以获得低分辨率(LR)输入图像 I L R ∈ R H / r × W / r × 3 I_{LR} \in \mathcal{R}^{H/r \times W/r \times 3} ILRRH/r×W/r×3

为了训练具有灵活输出分辨率的超分辨率模型,我们接着采样一个放大比率 u ∈ ( 1 , r ) u \in (1, r) u(1,r),让 CosAE 将输入图像放大为 I o u t ∈ R u r H × u r W × 3 I_{out} \in \mathcal{R}^{urH \times urW \times 3} IoutRurH×urW×3。这是通过设置 T = T m a x u / r T = T_{max} u/r T=Tmaxu/r 来实现的,其中 T m a x T_{max} Tmax 指的是前面节中的 T T T,它将低分辨率图像放大到高分辨率图像的原始尺寸。

实验中,我们总是(通过双线性插值)将低分辨率图像调整为高分辨率图像的原始尺寸,以适配 CosAE 的编码器。在训练期间,高分辨率图像的尺寸固定为 256 × 256 256 \times 256 256×256,可以通过调整大小(例如对于人脸图像)或随机裁剪(例如对于自然图像)来实现。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

YOLOv11改进,YOLOv11检测头融合RepConv卷积,并添加小目标检测层(四头检测),适合目标检测、分割等任务

摘要 作者提出了一种简单而强大的卷积神经网络架构,其推理阶段采用与 VGG 类似的网络体结构,仅由一堆 3x3 卷积和 ReLU 组成,而训练阶段的模型具有多分支拓扑。这种训练阶段和推理阶段架构的解耦通过结构重参数化技术实现,因此我们将该模型命名为 RepVGG。 # 理论介绍 Re…

深度学习笔记——循环神经网络RNN

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络RNN知识点。 文章目录 文本特征提取的方法1. 基础方法1.1 词袋模型&#xff08;Bag of Words, BOW&#xff09;工作原…

Selenium工具使用Python 语言实现下拉框定位操作

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 我们通常遇到的下拉框有显性的下拉框和隐性的下拉框&#xff1b;有的下拉框还可以进行单选或多选操作&#xff0c;在selenium中如何实现下拉框的定位通常使用selec…

使用 Continue 插件时,发现调用外部地址

https://us.i.posthog.com/e/?ip1&_1737025525924&ver1.163.0&compressiongzip-js 看是一个帮助改善产品的网址。估计类似某推广流量监控的插件工具吧。网上没用查到其他说明&#xff0c;可能国内使用不多的原因。 但是发送的数据看不出来是个什么内容。 我用来搜…

【PyQt】图像处理系统

[toc]pyqt实现图像处理系统 图像处理系统 1.创建阴影去除ui文件 2.阴影去除代码 1.创建阴影去除ui文件 UI文件效果图&#xff1a; 1.1QT Desiger设置组件 1.两个Pushbutton按钮 2.两个label来显示图像 3.Text Browser来显示输出信息 1.2布局的设置 1.先不使用任何La…

【Idea】编译Spring源码 read timeout 问题

Idea现在是大家工作中用的比较多的开发工具&#xff0c;尤其是做java开发的&#xff0c;那么做java开发&#xff0c;了解spring框架源码是提高自己技能水平的一个方式&#xff0c;所以会从spring 官网下载源码&#xff0c;导入到 Idea 工具并编译&#xff0c;但是发现build的时…

Linux 音视频入门到实战专栏(视频篇)视频编解码 MPP

文章目录 一、MPP 介绍二、获取和编译RKMPP库三、视频解码四、视频编码 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2;本篇将介绍如何调用alsa api来进行音频数据的播放和录制。 一、MPP 介绍 瑞芯微提供的媒体处理软件平台…

爬虫后的数据处理与使用(使用篇--实现分类预测)

&#xff08;&#xff09;紧接上文&#xff0c;在完成基本的数据处理后&#xff0c;接下来就是正常的使用了。当然怎么用&#xff0c;确实需要好好思考一下~ 上文&#xff1a;爬虫后的数据处理与使用&#xff08;处理篇&#xff09; 前言&#xff1a; 一般来说&#xff0c;我…

RabbitMQ--延迟队列

&#xff08;一&#xff09;延迟队列 1.概念 延迟队列是一种特殊的队列&#xff0c;消息被发送后&#xff0c;消费者并不会立刻拿到消息&#xff0c;而是等待一段时间后&#xff0c;消费者才可以从这个队列中拿到消息进行消费 2.应用场景 延迟队列的应用场景很多&#xff0c;…

flutter开发-figma交互设计图可以转换为flutter源代码-如何将设计图转换为flutter源代码-优雅草央千澈

flutter开发-figma交互设计图可以转换为flutter源代码-如何将设计图转换为flutter源代码-优雅草央千澈 开发背景 可能大家听过过蓝湖可以转ui设计图为vue.js&#xff0c;react native代码&#xff0c;那么请问听说过将figma的设计图转换为flutter源代码吗?本文优雅草央千澈带…

当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线

问题&#xff1a;当设置dialog中有el-table时&#xff0c;并设置el-table区域的滚动&#xff0c;看到el-table中多了一条横线&#xff1b; 原因&#xff1a;el-table有一个before的伪元素作为表格的下边框下&#xff0c;初始的时候已设置&#xff0c;在滚动的时候并没有重新设置…

代理模式实现

一、概念&#xff1a;代理模式属于结构型设计模式。客户端不能直接访问一个对象&#xff0c;可以通过代理的第三者来间接访问该对象&#xff0c;代理对象控制着对于原对象的访问&#xff0c;并允许在客户端访问对象的前后进行一些扩展和处理&#xff1b;这种设置模式称为代理模…

windows 搭建flutter环境,开发windows程序

环境安装配置&#xff1a; 下载flutter sdk https://docs.flutter.dev/get-started/install/windows 下载到本地后&#xff0c;随便找个地方解压&#xff0c;然后配置下系统环境变量 编译windows程序本地需要安装vs2019或更新的开发环境 主要就这2步安装后就可以了&#xff0…

Redis系列之底层数据结构字典Dict

Redis系列之底层数据结构字典Dict Dict数据结构 Dict是Redis数据结构中使用最为频繁的复合型数据结构&#xff0c;本质上是一个哈希表 查看redis6.0版本的源码&#xff0c;链接&#xff1a;https://github.com/redis/redis/blob/6.0/src/dict.h 哈希表的结构定义&#xff1…

【Azure 架构师学习笔记】- Azure Function (2) --实操1

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Function 】系列。 接上文【Azure 架构师学习笔记】- Azure Function (1) --环境搭建和背景介绍 前言 上一文介绍了环境搭建&#xff0c;接下来就在本地环境下使用一下。 环境准备 这里我下载了最新的VS studio&…

【NextJS】PostgreSQL 遇上 Prisma ORM

NextJS 数据库 之 遇上Prisma ORM 前言一、环境要求二、概念介绍1、Prisma Schema Language&#xff08;PSL&#xff09; 结构描述语言1.1 概念1.2 组成1.2.1 Data Source 数据源1.2.2 Generators 生成器1.2.3 Data Model Definition 数据模型定义字段(数据)类型和约束关系&…

左神算法基础提升--3

文章目录 Manacher 算法经典算法Manacher算法原理 单调栈或单调队列 Manacher 算法 经典算法 在每学习Manacher算法之前我们可能会使用一种比较经典暴力的算法&#xff1a;遍历str字符串&#xff0c;将字符串中的每个字符作为对称点&#xff0c;向两边扩散找到回文字段&#x…

浅谈操作系统与初识Linux

一、Linux操作系统的出现 1.1操作系统的出现以及相关的四个要素 1.2最早出现的操作系统及其创始人 起初&#xff0c;IBM为了让计算机可以以更低技术成本进行使用&#xff0c;以此来售卖计算机&#xff1b; 为计算机搭载上了Unix操作系统&#xff0c;Unix由肯汤普森用汇编语…

ElasticSearch下

DSL查询 叶子查询&#xff1a;在特定字段里查询特定值&#xff0c;属于简单查询&#xff0c;很少单独使用复合查询&#xff1a;以逻辑方式组合多个叶子查询或更改叶子查询的行为方式 在查询后还可以对查询结果做处理&#xff1a; 排序&#xff1a;按照1个或多个字段做排序分页…

java根据模板导出word,并在word中插入echarts相关统计图片以及表格

引入依赖创建word模板创建ftl模板文件保存的ftl可能会出现占位符分割的问题&#xff0c;需要处理将ftl文件中的图片的Base64删除&#xff0c;并使用占位符代替插入表格&#xff0c;并指定表格的位置在图片下方 Echarts转图片根据模板生成word文档DocUtil导出word文档 生成的wor…