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

【论文阅读】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模型都可以轻松插入此框架以受益于小波引导。


http://www.kler.cn/a/412011.html

相关文章:

  • 常用的数据结构
  • QML TableView 实例演示 + 可能遇到的一些问题(Qt_6_5_3)
  • JSON数据转化为Excel及数据处理分析
  • django authentication 登录注册
  • Redis-09 SpringBoot集成Redis
  • 【AI】基础原理
  • 紫光档案管理系统 mergeFile SQL注入漏洞复现
  • MySQL闪回恢复:轻松应对数据误删,数据安全有保障
  • 16:00面试,16:08就出来了,问的问题有点变态。。。
  • 实时数据开发 | 一文理解Flink窗口机制
  • 算法学习笔记(十):位运算、数论等
  • Java多态的优势和弊端
  • 入门岛-L0G1000
  • 【H2O2|全栈】JS进阶知识(十)ES6(6)
  • golang版本管理工具:scoop使用
  • Docker 技术:构建高效容器化环境的关键
  • QML TableView 实例演示 + 可能遇到的一些问题(Qt_6_5_3)
  • 裸金属 GPU 上线!DigitalOcean 提供单用户独享H100资源
  • 蓝桥杯不知道叫什么题目
  • 微信小程序加载商品首页数据时,页码没有更新,老是page=1。
  • LAMP环境的部署
  • 【大数据学习 | Spark-Core】RDD的缓存(cache and checkpoint)
  • 网络安全防范课后参考答案
  • vue3 发送 axios 请求时没有接受到响应数据
  • laravel 5.5 增加宏指令 joinSub, 省去->toSql() 和 addBinding($bindings);
  • [每日一氵] Git LFS 用法