图1 在图像处理,计算机图形、视觉中,将一幅图输入转换到另一张图输出的过程中存在很多问题。即使这里面的一些设置总是相同的,都是图像像素的映射,但这些问题通常使用特殊应用的算法。CAN似乎能很好的解决各种各样的问题。这里我们展示了该方法在几个方面的成果。在每一个案例中,我们使用相同的网络结构和objective只是在不同的数据上进行简单的训练。

摘要

我们研究以CAN作为解决图像之间转换问题的通用解决方法,这个网络不仅仅学习输入图像到输出图像的映射,还学习了训练这种映射的损失函数。这使得可以应用一个相同的方法去解决传统的需要多个不同损失函数的问题成为可能。我们证实了这个方法对以下几种方面很有效:从标签图片合成照片,从线图重构对象,为图片上色等其他任务。的确,自从与此论文相关的pix2pix软件的发布,大量的互联网用户发布了他们自己的利用我们系统的实现,进一步证明了我们的方法有广泛的适用性并且无需调整参数简单采用。我们不再手动设计我们的映射函数,并且这项工作表明我们可以不使用人工设计损失函数也能实现合理的结果。

1.序言

在图像处理,计算机图形和计算机视觉的许多问题可以作为将输入图像转化为相应输出图像。正如一个概念即可以被英语表示也可以用法语表示一样,一个场景或许可以被渲染成RGB图像,梯度场,线图,语义标签图等。与自动语言翻译相似,我们定义自动的图像到图像的转化作为一个场景可能的表示到另一种表示的的任务,只需给定足够的训练数据。传统中,这些任务中的每一项通过单独的专用机器来实现,尽管设置总是相同的:预测像素到像素。此篇论文的目标是为了这些问题开发一种通用的框架。
伴随着CNN成为各种各样图像预测问题的主要方法,同行已经在这个方面迈出了重要一步。CNN学习最小化损失函数-对结果质量评分的目标-尽管学习过程是自动的,仍需要大量的人工努力来设计有效的损失函数。换句话说,我们仍需要告诉CNN什么是我们希望的进行最小化。但是,就像King Midas,我们必须小心我们所期待的!如果我们采取一种天真的方法并且要求CNN去最小化预测和真实地面的像素欧几里德距离,它将倾向于产生模糊的结果。这是因为欧几里德距离通过平均所有合理的输出来最小化,这会导致模糊。提出损失函数,迫使CNN去做我们真的想做的事-输出清晰、真实的图像-这是一个公开的问题,通常需要专家知识。
相对的,如果我们可以只指定一个高级目标,比如“使输出与现实不可区分”,然后自动学习一个适合于实现该目标的损失函数,这将是非常可取的。幸运的是,这正是最近提出的生成对抗网络所做的事。GANs学习一种损失函数,试图对输出图像是真是假进行分类,同时训练生成模型以最小化这种损失。模糊图像是不能容忍的,因为它们看起来明显是假的。因为GAN学习的是适应数据的损失,所以它们可以应用于传统上需要不同类型的损失函数的大量任务。
在这篇文章中,我们探讨了定义条件的GANs。正如GANs学习数据的生成模型一样,条件GAN(CGAN)也学习条件生成模型。这使得CGAN适合于图像到图像的转换的任务,我们在输入图像上设置条件并生成相应的输出图像。
在过去两年中,GANs得到了大力研究,我们在本文中探索的许多技术都是先前提出的。尽管如此,早起的论文集中在具体的应用上,目前还不清楚图像条件GANs作为图像到图像翻译的通用解决方案的有效性。我们的主要贡献是证明在各种各样的问题上,条件GAN会产生合理的结果。我们的第二个贡献是提供一个简单的框架,足以实现良好的结果,并分析几个重要架构选择的效果。
代码可在GitHub - phillipi/pix2pix: Image-to-image translation with conditional adversarial nets.

2.相关工作

条件GAN图像建模的loss
图像到图像的转化问题经常根据每一像素的分类或回归来表示的。这些表示方式通常把输出空间看作无结构化的,即每一个输出像素被看作有条件的独立于输入图像的其他像素的。相反,条件GANs学习结构loss。结构化loss会对输出节点结构进行惩罚。
图2 训练条件GAN来映射线条到图像,鉴别器D,学习在假(由生成器合成)和真{线图,照片} 区分。生成器G,学习欺骗鉴别器。不像传统的非条件GAN,生成器和鉴别器都会观察输入的边缘图。
大量的文献都考虑这种类型的loss,比如条件随机场,结构相似性度量(SSIM),特征匹配,非参数loss,convolutional pseudo-prior和匹配协方差统计的loss。条件GAN不同于浙西学习到的loss,理论上,可以对任何不同于输出和目标的结构进行惩罚。
条件GANs
我们不是第一个在条件设置下应用GANS的。先前和当前的工作已经用离散的标签,文本和图像来限制条件GANs。图像条件模型已经解决从法线图预测图像,图像预测,商品图片产生和从稀疏注视生成图片。其他论文也有利用GANs实现图像到图像的映射,但是只用应用无条件的GAN,依赖其他条件(比如L2回归)来强制输出以输入为条件。这些论文在图像修复,图像预测,用户约束引导的图像操作,风格迁移和超分辨率方面已经取得令人印象深刻的成果。每种方法都是针对特定应用量身定制的。我们的框架不同在没有什么针对于特定应用。这就是的我们的设置比大多数的要简单。
我们的方法在生成器和鉴别器的几个结构选择上也不同于先前的工作。与以往的工作不同,对于我们的生成器,我们使用基于“U-Net”的架构,对于我们的鉴别器,我们使用卷积的“PatchGAN”分类器,它只在图像patch的规模上惩罚结构。先前提出了一种类似的PatchGAN体系结构,用于捕获本地风格的统计数据。在这里,我们展示了这种方法在更广泛的问题上是有效的,并且我们研究了改变patch size的效果。

3.方法

GANs是生成模型,它学习从随机噪声向量z到输出图像y的映射,G:z → y。相反,条件GANs学习从观测图像x和随机噪声向量z到y的映射,G:{x,z} → y。生成器G经过训练以产生不能通过经对抗训练的鉴别器D与“真实”图像区分的输出,鉴别器D经过训练以尽可能好地检测发生器的“假”。如图2所示。

3.1目标函数

条件GAN的目标函数可以表示为
LcGAN (G, D) = Ex,y [ logD(x, y)] + Ex,z [ log(1 − D(x, G(x, z))]. (1)
其中G试图最小化这个函数的值,相反D试图最大化函数值。
也就是G∗ = arg minG maxD LcGAN (G, D).
未来测试条件对于鉴别器的重要性,我们也与鉴别器不观察x的无条件的变形体进行比较:
LGAN (G, D) =Ey  [log D(y)] + Ex,z [ log(1 − D(G(x, z))]. (2)
以前的方法发现,将GAN目标方程与更传统的loss(例如L2距离)组合更加有利。鉴别器的工作保持不变,但是生成器的任务不仅仅是欺骗鉴别器而且还要更加贴近真实的输出。我们也探索了使用L1距离而不是L2距离,因为L鼓励更少的模糊:
LL1(G)=Ex,y,z[ ∥y−G(x,z)∥1]. (3)
我们最终的目标函数是:
G∗ = arg minG maxD LcGAN (G, D) + λLL1(G). (4)
没有z,网络仍然可以学习从x到y的映射,但会产生确定性输出,因此无法匹配除delta函数以外的任何分布。过去的条件GAN已经确认了这一点,并提供高斯噪声z作为生成器的输入,以及x。在最初的实验中,我们没有发现这种策略有效-生成器简单的学会去忽略噪音-这与Mathieu等人的观点一致。相反,对于我们的最终模型,我们只提供了dropout形式的噪声,在训练和测试时应用于生成器的几层。尽管存在dropout噪声,我们观察到网络输出中只有很小的随机性。设计产生高度随机输出的条件GAN,从而捕获模型的条件分布的全部熵,是目前工作尚未解决的一个重要问题。
图3 两种生成器结构的选择。“U-Net”是一个encoder-decoder结构,在encoder和decoder stacks之间的镜像层有跳跃的链接。

3.2网络结构

我们调整了生成器和鉴别器结构。生成器和鉴别器都使用了convolution-BatchNorm-ReLU模块。在线补充材料中提供了结构的细节,主要特征叙述如下。

3.2.1具有跳跃的生成器

图像到图像转换问题的一个定义特征是,它们将高分辨率输入网格映射到高分辨率输出网格。此外,对于我们考虑的问题,虽然输入和输出的表面不同,但是都有相同的底层结构。因此,输入中的结构与输出中的结构大致一致。我们围绕这些考虑因素设计生成器体系结构。
以前解决该领域问题的许多解决方案都使用了encoder-decoder网络。在这样的网络中,输入通过一系列的下采样层,直到瓶颈层,在瓶颈层过程发生逆转。这样的网络要求所有信息流通过所有层,包括瓶颈层。对于许多图像转换问题,输入和输出之间共享了大量低级信息,因此希望在网络上跨越传输信息是明智的。例如,对于图像着色问题,输入和输出共享突出边缘的位置。
为了给生成器提供一个避开这种信息瓶颈的方法,我们添加了跳跃链接,就像“U-Net”结构。特别说明,我们在层 i 到层 n-i 都添加了这种跳跃链接,n是网络总层数。每一个跳跃链接简单的把 i 层和 n-i 层所有的通道串联。

3.2.2马尔可夫过程鉴别器

众所周知L2loss与L1loss在图像生成问题会产生模糊结果。即使这些loss不鼓励产生高频图像,但许多情况下可以准确的捕捉到低频图像。对于这种情况下,我们不必采取一个全新的架构来实现在低频下的准确率,因为L1已经做到了。
这样只需GAN鉴别器进行高频结构的建模,依赖L1去实现低频的正确率。为了进行高频建模,只需要关注patch就可以了。因此我们设计了鉴别器的体系结构-PatchGAN-仅仅对patch规模的结构进行惩罚。这些鉴别器尝试将每个NxN的patch判断真假。我们利用这个鉴别器在图像上遍历,然后取平均值作为D的输出。
在第4.4节中,我们证明了比图像尺寸小得多的N仍可以产生高质量的结果。这是有利的,因为更小的PatchGAN具有更少的参数,运行速度更快,并且可以应用于任意大的图像。
这种鉴别器有效地将图像建模为马尔可夫随机场,假设通过超过一个patch直径分开的像素相互独立。这种联系以前在[38]中探讨过,也是纹理模型[17,21]和风格模型[16,25,22,37]中常见的假设。因此,我们的PatchGAN可以理解为一种纹理/风格的loss。

3.3优化和推论

为了优化我们的网络,我们遵循[24]中的标准方法:我们在D和G交替的进行梯度下降。正如原始GAN论文中所建议的,我们不是训练G最小化log(1−D(x,G(x,z) ),而是训练最大化log D(x,G(x,z) )[24]。此外,我们在优化D时将目标除以2,这会降低D相对于G的学习速度。我们使用minibatch SGD并应用Adam优化器[32],学习率为0.0002,动量参数β1=0.5,β2=0.999。
在推理时,我们以与训练阶段完全相同的方式运行生成器网络。这与通常的协议不同,因为我们在测试时使用了dropout和
batch normalization[29],我们使用的是test batch的统计值而不是train batch。当批量大小设置为1时,这种方法被称为“instance normalization”,并且已被证明对于图像生成任务有用[54]。在我们的实验中,我们根据实验使用1到10之间的batch size。

4实验

未来探索条件GAN的通用性,我们在各种任务和数据集上进行测试,包括图形任务,比如图像生成;视觉任务,比如语义分割。

4.1 评估指标

评估合成图像的质量是一个公认困难的问题[52]。传统的标准,如每像素均方误差,无法评估结果的联合统计,因此无法测量结构loss想要捕获的结构。
为了更全面地评估结果的视觉质量,我们采用了两种策略。首先,我们对Amazon Mechainical Turk进行“真实与虚假”的感知研究。对于着色和图像生成等图形问题,通常可信度是人类观察者的最终目标。因此,我们使用这种方法测试地图生成、航空照片生成和图像着色。
第二,我们测量合成的城市景观是否足够逼真,以至于现成的识别系统能够识别其中的物体。该指标类似于[52]中的“inception score”、[55]中的对象检测评估以及[62]和[42]中的“semantic interpretability”。
AMT感知研究。在我们的AMT实验中,我们遵循[62]中的协议:Turkers接受了一系列试验,将“真实”图像与我们的算法生成的“虚假”图像进行对比。在每次试验中,每个图像出现1秒,之后图像消失,Turkers被给予无限的时间来回答哪个是假的。每次的前10张图片都是练习,Turkers会得到反馈。在主试验的40次试验中没有提供反馈。每次实现只测试一个算法,Turkers不允许完成多个实验。每个算法由50个大约50个Turkers测试。与[62]不同,我们没有包括警惕性测试。在我们的图片上色实验中,真实和虚假的图像是从相同的灰度输入中生成的。地图↔航拍照片,真实和虚假的图像不是从相同的输入中生成的,以使任务更加困难并避免错误结果。地图↔航拍照片,我们在256×256上训练分辨率的图像,但是利用fully-convloutional translation来测试512x512分辨率的图像,利用下采样并以256x256的分辨率呈现给Turkers。对于着色问题,我们训练并测试了在256x256分辨率的图片并且以相同的分辨率结果送给Turkers。
FCN-score。虽然已知生成模型的定量评估具有挑战性,但最近的工作 [52, 55, 62, 42] 尝试使用预训练的语义分类器来测量生成刺激的可辨别性作为伪度量。 直觉是,如果生成的图像是真实的,在真实图像上训练的分类器也能够正确地对合成图像进行分类。 为此,我们采用流行的 FCN-8s [39] 架构进行语义分割,并在城市景观数据集上对其进行训练。 然后,我们通过对合成照片的标签的分类准确度对合成照片进行评分。

4.2目标函数分析

方程4中目标的哪些组成部分重要? 我们进行Ablation Studies来隔离 L1 项、GAN 项的影响,并比较使用以输入为条件的鉴别器(cGAN,方程 1)与使用无条件鉴别器(GAN,方程 2)。
图 4 显示了这些变化对两个标签→照片问题的定性影响。 L1 单独导致合理但模糊的结果。 单独的 cGAN(在方程 4 中设置 λ = 0 )给出了更清晰的结果,但在某些应用程序中引入了视觉伪影。 L1+cGAN (λ = 100)减少了这些伪影。

我们使用城市景观标签→照片任务上的 FCN-score 量化这些观察结果(表 1):基于 GAN 的目标获得更高的分数,表明合成图像包含更多可识别的结构。我们还测试了去除条件的鉴别器(标记为 GAN)的效果。在这种情况下,loss没有惩罚输入和输出之间的不匹配;它只关心输出看起来逼真。这种情况导致性能不佳;检查结果表明,无论输入照片如何,生成器都会崩溃,产生几乎完全相同的输出。显然,在这种情况下,loss衡量输入和输出之间匹配的质量很重要,而且 cGAN 的性能确实比 GAN 好得多。但是请注意,添加 L1 项也会鼓励输出尊重输入,因为 L1 loss 会惩罚与输入正确匹配的真实输出与可能不匹配的合成输出之间的距离。相应地,L1+GAN 在尊重输入下生成逼真渲染方面也很有效。综上所述L1+cGAN,表现同样出色。

Colorfulness 条件GAN的一个显着效果是它们产生清晰的图像,即使在输入标签图中不存在空间结构的情况下。人们可能会想象 cGAN 对光谱维度中的“锐化”有类似的影响——即使图像更加丰富多彩。正如 L1 在不确定边缘的确切位置时会激励模糊一样,当不确定像素应该采用几种可能的颜色值中的哪一种时,它也会激励平均的灰色。特别地,L1 将通过选择可能颜色的条件概率密度函数的中值来最小化loss。另一方面,对抗性loss原则上可以意识到灰色输出是不切实际的,并鼓励匹配真实的颜色分布 [24]。在图7中,我们调查了我们的 cGAN 是否真的在城市景观数据集上实现了这种效果。这些图显示了 Lab 颜色空间中输出颜色值的边缘分布。地面实况分布用虚线表示。很明显,L1 导致比真实更窄的分布,证实了 L1 鼓励平均、灰色的假设。另一方面,使用 cGAN 会使输出分布更接近真实情况。

4.3生成器结构分析

U-Net架构允许低级信息通过直接在网络中传递。 这会带来更好的结果吗? 图5和表2在城市景观生成方面,将U-Net 和encoder-decoder进行了比较。 encoder-decoder是通过简单的切断U-Net中的跳跃连接来创建。 在我们的实验中,encoder-decoder无法学习生成逼真的图像。U-Net的优势似乎不是条件GAN所特有的:当U-Net和encoder-decoder都用 L1 损失进行训练时,U-Net再次取得了优异的结果。

4.4从PixelGANs到PatchGANs再到ImageGANs

我们测试了鉴别器接受域在不同的patch size N的效果,从1x1的PixelGANs到整张图像286x286的ImageGANs。图6展示了这些分析的性质结果,表3展示了在FCN-score方式下的效果。注意本文其他地方,除非具体说明,所有实验均使用70x70的PatchGANs,并且均适用L1+cGAN的loss。

PixelGAN对于空间清晰度没有贡献,但是在提升图像色彩上有帮助。比如在图6中的公交车当网络在用L1 loss训练的情况下被涂成灰色,但是在PixelGAN loss训练下被涂成红色。颜色直方图匹配在图像处理方面是很常见的问题,PixelGANs或许是一个解决办法。
使用16x16的PatchGAN对于提高输出清晰度是足够的,也达到了优秀的FCN-score,但是导致了一些不自然的纹理。70x70的PatchGAN缓解了这些纹理,并且取得了比前者更好的分数。超出这个范围,如果使用286x286的ImageGAN,并不会提升结果的视觉质量并且事实上会得到更低的FCN-score,如表3.这可能是因为ImageGAN比70x70PatchGAN有更多的参数和更深的网络层数,所以更难去训练。
Fully-convolutional translation PatchGAN 的一个优点是fixed-size patch的鉴别器可以应用于任意大的图像。 我们也可以将生成器卷积应用到比训练时更大图片上。我们对地图和航拍照片上进行对比测试。在生成器在256x256图片大小下训练后,我们利用512x512的图像来进行测试。图8结果表明这种方法的有效性。

4.5感知验证

我们验证了我们在地图↔航拍和灰度→颜色任务上的结果的感知真实性。 对于地图↔照片的AMT实验结果在表4给出。我们的方法生成的航空照片在 18.9% 的试验中欺骗了参与者,明显高于 L1,L1产生模糊的结果,几乎无法欺骗参与者。相比之下,在照片->地图的方向上,我们的方法仅愚弄了 6.1% 试验的参与者,这与基线的性能没有显着差异(基于引导测试 )。这可能是因为在具有刚性几何形状的地图中,较小的结构错误比在更混乱的航空照片中更明显。

我们在 ImageNet [51] 上训练着色,并在 [62, 35] 引入的测试分割上进行实验。 我们的方法具有 L1+cGAN loss,在 22.5% 的试验中欺骗了参与者(表 5)。 我们还测试了 [62] 的结果及其使用 L2 loss 的方法的变体(详见 [62])。 条件 GAN 的得分与 [62] 的 L2 变体相似(bootstrap测试差异不显着),但没有达到 [62] 的完整方法,这在我们的实验中欺骗了 27.8% 的参与者。 我们注意到他们的方法经过专门设计,可以在着色方面做得很好。

4.6语义分割

条件 GAN 似乎对输出非常详细或照片的问题上很有效,这在图像处理和图形任务中很常见。那视觉问题,比如语义分割,输出不如输入复杂的问题呢?
为了开始测试这一点,我们在城市景观照片→标签上训练了一 个cGAN ( 有/没有 L1 loss )。 图10显示了定性结果,定量分类精度报告在表 6 中。有趣的是,在没有 L1 损失的情况下训练的 cGAN 能够以合理的精度解决这个问题。 据我们所知,这是 GAN 成功生成“标签”的第一次演示,标签几乎是离散的,而不是“图像”,具有连续值变化。 尽管 cGAN 取得了一些成功,但它们远不是解决这个问题的最佳可用方法:简单地使用 L1 回归比使用 cGAN 获得更好的分数,如表 6 所示。我们认为对于视觉问题,目标( 即预测输出接近真实情况 )可能没有图形任务那么模糊,并且像 L1 这样的 loss 基本上就足够了。

4.7社区驱动研究

自从论文和我们的 pix2pix 代码库首次发布以来,Twitter 社区,包括计算机视觉和图形从业者以及视觉艺术家,已经成功地将我们的框架应用于各种新颖的图像到图像的翻译任务,远远超出了原文范围的。 图 11 和图 12 仅显示了#pix2pix 标签中的几个示例,包括背景去除、调色板生成、素描→肖像、素描→口袋妖怪、“照我做”姿势转移、学会看:阴沉的星期天,以及 异常流行的#edges2cats 和#fotogenerator。 请注意,这些应用程序是创造性的项目,不是在受控、科学的条件下获得的,并且可能依赖于对我们发布的 pix2pix 代码的一些修改。 尽管如此,它们证明了我们的方法作为图像到图像翻译问题的通用商品工具的前景。

5结论

本文的结果表明,条件对抗网络是许多图像到图像翻译任务的有前途的方法,尤其是那些涉及高度结构化图形输出的任务。这些网络学习适应手头任务和数据的loss,这使它们适用于各种设置。
原文链接:Image-to-Image Translation with Conditional Adversarial Networks

《Image-to-Image Translation with Conditional Adversarial Networks》文章翻译相关推荐

  1. Image-to-Image Translation with Conditional Adversarial Networks 论文翻译

    基于条件对抗网络的图像转换 源论文标题:Image-to-Image Translation with Conditional Adversarial Networks 源论文链接:https://p ...

  2. [论文笔记]:Image-to-Image Translation with Conditional Adversarial Networks

    Image-to-Image Translation with Conditional Adversarial Networks 论文翻译 摘要 1. 介绍 2. 相关工作 3. 方法 3.1 评估 ...

  3. CVPR2017/图像翻译:Image-to-Image Translation with Conditional Adversarial Networks基于条件对抗网络的图像到图像的翻译

    CVPR2017/图像翻译:Image-to-Image Translation with Conditional Adversarial Networks基于条件对抗网络的图像到图像的翻译 0.摘要 ...

  4. 【翻译】Image-to-Image Translation with Conditional Adversarial Networks

    条件生成网络实现图对图翻译 原论文标题:Image-to-Image Translation with Conditional Adversarial Networks Isola P, Zhu J ...

  5. pix2pix鼻祖——《Image-to-Image Translation with Conditional Adversarial Networks》论文解析

    今天要说的这篇论文,全名<Image-to-Image Translation with Conditional Adversarial Networks>,来自CVPR2017.这一篇可 ...

  6. Image-to-Image Translation with Conditional Adversarial Networks

    论文下载地址:https://arxiv.org/abs/1611.07004 一.摘要 本文研究条件对抗网络作为图像到图像转换问题的通用解决方案.这些网络不仅学习从输入图像到输出图像的映射,还学习了 ...

  7. Image-to-Image Translation with conditional Adversarial Networks ---- Pix-2-Pix

    任务场景 Photos to semantic segmentation Cityscapes labels to photos Colorization Facades labels to phot ...

  8. Paper Reading:Image-to-Image Translation with Conditional Adversarial Networks

    Introduction 找到一个统一的框架来处理从图片生成图片(image-to-image translation)的任务,其中包含由label map合成图片,由eage maps 重建目标,图 ...

  9. PatchGAN:Image-to-Image Translation with Conditional Adversarial Networks

    写过很多次博客,但是有关GAN的很少,都快忘记了还要分享对于GAN的心得了,恰巧最近正在重新看之前看过的文章,借此机会也把更多GAN的内容总结成文,帮助自己做好笔记. 文章下载地址:http://op ...

最新文章

  1. 第三代测序之Pacific Biosciences
  2. 苹果手机怎么投屏 如何操作
  3. 应用语言学 计算机语言学,应用语言学的名词解释
  4. case....when ...多重判断
  5. linux服务器配置https访问
  6. 贾君鹏你妈妈喊你回家吃饭
  7. metasploit framework
  8. 剑指Offer05. 替换空格
  9. androidpn的一次亲密接触(二)
  10. 直播+抽奖丨eygle等4位大咖讲述DBA职业发展必备软实力
  11. 【软件项目管理】滨江学院 李振宏 软件项目管理 试卷考点知识点整理
  12. IE8无法取得客户端完整路径的解决办法
  13. oracle jdk下载镜像
  14. Java MyEclipse 实现微信跳一跳小程序
  15. ps教程完整版(来自百度网盘)
  16. Windos下的UPD服务器端的C++实现
  17. 【新品重磅发布】FOHEART·HF1面部表情捕捉头盔
  18. 龙卷风路径_【龙卷风的防范措施】龙卷风的易发地点_龙卷风如何分级 - 妈妈网百科...
  19. 微信小程序: 赞赏码的长按识别
  20. 【web前端】前端性能优化指南,还不来看看?

热门文章

  1. 高级Java程序员值得拥有的10本书
  2. try的动词用法_有关try的常用短语和用法
  3. js跨域交互(jQuery+php)之jsonp使用心得
  4. MySQL--学习笔记
  5. 知识图谱——Protege(Protégé)配置与使用
  6. Vmware16支持MacOS
  7. 京东网页版静态页面的几个问题
  8. 电子词典的实现(一)
  9. Git使用教程:完全图解!
  10. 模仿淘宝评价的星级显示