【深度学习】【Image Inpainting】Free-Form Image Inpainting with Gated Convolution

news2024/10/3 4:37:09

模型:DeepFillv2 (CVPR’2019)
论文:https://arxiv.org/abs/1806.03589
代码:https://github.com/JiahuiYu/generative_inpainting

文章目录

  • 效果
  • Abstract
  • Introduction
  • Related Work
    • Automatic Image Inpainting
    • Guided Image Inpainting and Synthesis
    • Feature-wise Gating
  • Approach
    • Gated Convolution
    • Spectral-Normalized Markovian Discriminator (SN-PatchGAN)
    • Inpainting Network Architecture
    • Free-Form Mask Generation
    • Extension to User-Guided Image Inpainting
  • Results
    • 模型速度
    • Quantitative Results
    • Qualitative Comparisons
    • Object Removal and Creative Editing
      • object removal
      • creative editing
    • User Study
    • Ablation Study
  • Conclusions

论文摘录

效果

在这里插入图片描述

Abstract

提出了一种生成式图像绘制系统,利用free-form mask and guidance完成图像。该系统基于从数百万张图像中学习的gated convolutions,而无需额外的标记工作。所提出的门控卷积解决了vanilla convolution (原始普通的神经网络)将所有输入像素视为有效像素的问题,通过为所有层的每个空间位置的每个通道提供可学习的动态特征选择机制来推广部分卷积。此外,由于free-form masks 可能出现在任何形状的图像中的任何位置,因此为单个矩形蒙版设计的全局和局部gan不适用。因此,我们还提出了一种 patch-based GAN loss,称为SNPatchGAN,通过在密集图像补丁上应用频谱归一化鉴别器(spectral-normalized discriminator)。SN-PatchGAN公式简单,训练快速稳定。在自动图像绘制和用户引导扩展方面的实验结果表明,该系统比以前的方法生成的结果质量更高,更灵活。我们的系统可以帮助用户快速删除分散注意力的对象,修改图像布局,清除水印和编辑面孔。

Introduction

Image inpainting (又称 image completion or image hole-filling)是将缺失区域的替代内容综合起来,使修改在视觉上真实、语义上正确的任务。它允许删除分散注意力的物体或修饰照片中不需要的区域。它也可以扩展到任务,包括图像/视频的裁剪,旋转,拼接,重新定位,重新合成,压缩,超分辨率,协调和许多其他。

在计算机视觉中,存在两种广泛的图像绘制方法:使用低级图像特征的补丁匹配和使用深度卷积网络的前馈生成模型。前一种方法[3,8,9]可以合成合理的静止纹理,但在复杂场景、人脸和物体等非静止情况下通常会出现严重失败。后一种方法[15,49,45,46,38,37,48,26,52,33,35,19]可以利用从大规模数据集中学习的语义,以端到端方式合成非平稳图像中的内容。
然而,基于vanilla conv的深度生成模型自然不适合于图像填充,因为空间共享卷积滤波器将所有输入像素或特征视为相同的有效像素或特征。对于填充孔,每层的输入由孔外的有效像素/特征和掩膜区域的无效像素/特征组成。vanilla conv对所有有效的、无效的和混合的(例如,孔边界上的)像素/特征应用相同的过滤器,导致在自由格式掩模上测试时,孔周围的颜色差异、模糊和明显的边缘响应等视觉伪影[15,49]。

在这里插入图片描述

在这里插入图片描述

为了解决这一限制,最近提出了partial convolution[23],其中卷积被masked and normalized 为仅以有效像素为条件。然后是一个基于规则的mask-update step来更新下一层的有效位置。Partial convolution将所有输入位置分类为无效或有效,并对所有层的输入乘以0或1掩码。掩码也可以看作是单个不可学习的特征门控通道1。然而,这种假设有一些局限性。

首先,考虑网络的不同层上的输入空间位置,它们可以包括(1)输入图像中的有效像素,(2)输入图像的掩蔽像素,(3)感受野不覆盖输入图像的有效像素的神经元,(4)感受野覆盖输入图像的不同数量的有效像素的神经元(这些有效图像像素也可能具有不同的相对位置),以及(5)深层中的合成像素。启发式地将所有位置分类为无效或有效会忽略这些重要信息。其次,如果我们扩展到用户引导的图像修复,用户在掩模内提供稀疏草图,这些像素位置应该被视为有效还是无效?如何正确更新下一层的遮罩?第三,对于部分卷积,“无效”像素将逐层逐渐消失,基于规则的掩码将是深层中的所有掩码。然而,为了合成空穴中的像素,这些深层可能还需要当前位置是在空穴内部还是外部的信息。具有全一掩码的部分卷积不能提供这样的信息。我们将表明,如果我们允许网络自动学习掩码,则掩码可能具有不同的值,这取决于输入图像中的当前位置是否被掩码,即使在深层中也是如此。

在这里插入图片描述

我们提出了用于free-form image inpainting的门控卷积。它学习每个通道和每个空间位置(例如,内部或外部遮罩、RGB通道或用户指导通道)的动态特征门控机制。

在这里插入图片描述
在不影响性能的情况下,我们还将训练目标简化为两个术语:逐像素重建损失和对抗性损失(a pixelwise reconstruction loss and an adversarial loss)。
在这里插入图片描述
对于实用的图像修复工具来说,启用用户交互至关重要,因为可能存在许多看似合理的解决方案来填补图像中的漏洞。为此,我们提供了一个扩展,允许用户将草图作为引导输入。表1总结了与其他方法的比较。我们的主要贡献如下:(1)我们引入门控卷积,为所有层中每个空间位置的每个通道学习动态特征选择机制,显著提高了自由形式掩模和输入的颜色一致性和修复质量。(2) 我们提出了一种更实用的基于补丁的GAN鉴别器SN-PatchGAN,用于自由形式的图像修复。它简单、快速,并产生高质量的修复结果。(3) 我们将我们的修复模型扩展到交互式模型,使用户能够以草图为指导来获得更多用户想要的修复结果。(4) 我们提出的修复系统在包括Places2自然场景和CelebA HQ人脸在内的基准数据集上实现了比先前技术状态更高质量的自由形式修复。我们展示了所提出的系统可以帮助用户快速去除分散注意力的物体,修改图像布局,清除水印和编辑图像中的人脸。

在这里插入图片描述

Related Work

Automatic Image Inpainting

已经提出了多种用于图像修复的方法。传统上,基于补丁的[8,9]算法基于低级特征(例如,RGB空间上的均方差分特征)逐渐扩展接近孔洞边界的像素,以搜索和粘贴最相似的图像补丁。这些算法在静止纹理区域上运行良好,但在非平稳图像上经常失败。此外,Simakov等人提出了双向相似性综合方法[36],以更好地捕捉和总结非平稳视觉数据。为了降低搜索过程中的高内存和计算成本,提出了基于树的内存加速结构[25]和随机算法[3]。此外,通过匹配局部特征,如图像梯度[2,5]和相似补丁的偏移统计[11],可以改善修复结果。最近,提出了基于深度学习的图像修复系统来直接预测掩模内的像素值。这是一个显著的优势。Yu等人[49]通过采用堆叠生成网络,提出了一种端到端的图像修复模型,以进一步确保生成区域与周围环境的颜色和纹理一致性。此外,为了捕捉长程空间依赖性,提出了上下文注意力模块[49],并将其集成到网络中,以明确地从遥远的空间位置借用信息。然而,这种方法主要在大型矩形掩模上训练,而在自由形式掩模上不能很好地推广。为了更好地处理不规则掩码,提出了部分卷积[23],其中卷积被掩码并重新归一化以仅利用有效像素。是基于规则的掩模更新步骤,以逐层重新计算新的掩模。

Guided Image Inpainting and Synthesis

为了改进图像修复,探索了user guidance,包括点或线[1,3,7,40]、结构[13]、变换或失真信息[14,30]和图像示例[4,10,20,43,51]。值得注意的是,Hays和Efros[10]首先利用数百万张照片作为数据库来搜索与输入最相似的示例图像,然后通过从匹配的图像中剪切和粘贴相应的区域来完成图像。

条件生成网络的最新进展使用户能够从大规模数据集中学习图像处理、合成和操作。在这里,我们选择性地回顾了几项相关工作。张等人[50]提出了可以将用户指导作为额外输入的彩色化网络。王等人[42]提出使用条件生成对抗性网络从语义标签图合成高分辨率照片真实感图像。Scribbler[34]探索了一个基于草图边界和稀疏颜色笔划的深层生成网络,以合成汽车、卧室或人脸。

Feature-wise Gating

Feature-wise Gating在视觉[12,28,39,41]、语言[6]、语音[27]和许多其他任务中得到了广泛的探索。例如,Highway Networks[39]利用特征门控来简化非常深度网络的基于梯度的训练。挤压和激励网络通过将每个通道与学习的S形门控值显式相乘来重新校准特征响应。WaveNets[27]通过采用特殊特征门控y=tanh(w1x)·sigmoid(w2x)对音频信号进行建模,获得了更好的结果。

Approach

在本节中,我们将自下而上地介绍我们的方法。我们首先介绍了门控卷积SN PatchGAN的细节,然后在图3中介绍了修复网络的概述以及我们的扩展,以允许可选的用户指导。

Gated Convolution

vanilla convolutions 在free-form image inpainting 中不适用,所以才提出了partial convolution。
我们首先解释了为什么[15,49]中使用的香草卷积不适合自由形式的图像修复任务。我们考虑一个卷积层,其中一组滤波器被应用于输入特征图作为输出。假设输入是C−通道,位于C 0-通道输出图中(y,x)处的每个像素计算为
在这里插入图片描述
在这里插入图片描述

Partial convolution[23]提高了不规则掩模的补图质量,但仍存在以下问题:(1)启发式地对所有空间位置进行有效或无效的分类。下一层的遮罩将被设置为1,无论前一层的过滤范围覆盖了多少像素(例如,1个有效像素和9个有效像素被视为相同以更新当前遮罩)。(2)与附加用户输入不兼容。我们的目标是一个用户引导的图像绘制系统,在这个系统中,用户可以选择在遮罩内提供稀疏的草图作为条件通道。在这种情况下,这些像素位置是有效的还是无效的?如何正确更新下一层的蒙版?(3)对于部分卷积,无效像素将在深层逐渐消失,逐渐将所有掩码值转换为1。然而,我们的研究表明,如果我们允许网络自动学习最优掩码,即使在深层中,网络也会为每个空间位置分配软掩码值。(4)每一层的所有通道共用同一个掩码,限制了灵活性。从本质上讲,部分卷积可以看作是不可学习的单通道特征硬门控。

我们提出了一种门控卷积图像补绘网络,如图2所示。不是硬mask,门控卷积从数据中自动学习软掩码。其公式为:
在这里插入图片描述
所提出的门控卷积学习每个通道和每个空间位置的动态特征选择机制。有趣的是,中间门值的可视化表明,它不仅可以根据背景,掩码,草图学习选择特征,而且还可以考虑某些通道的语义分割。即使在较深的图层中,门控卷积也学习在单独的通道中突出显示遮罩区域和草图信息,以更好地生成绘图结果。

在这里插入图片描述

Spectral-Normalized Markovian Discriminator (SN-PatchGAN)

对于之前尝试填充单个矩形孔的补图网络,在被遮挡的矩形区域上使用额外的局部GAN来改善结果[15,49]。

然而,我们考虑的任务是自由形式的图像绘制,其中在任何位置可能有多个任意形状的孔。受全局和局部GAN[15]、MarkovianGANs[16,21]、感知损失[17]和最近对频谱归一化GAN[24]的研究的启发,我们提出了一种简单有效的GAN损失算法,即n - patchgan,用于训练自由形式的图像。鉴别器采用卷积网络,输入由图像、掩模和引导通道组成,输出为形状为R h×w×c的三维特征(h、w、c分别表示通道的高度、宽度和数量)。如图3所示,内核大小为5、步幅为2的6个跨步卷积被堆叠为捕获马尔可夫补丁的特征统计[21]。然后,我们直接对该特征图中的每个特征元素应用gan,针对输入图像的不同位置和不同语义(在不同通道中表示),形成h × w × c个数的gan。值得注意的是,在我们的训练设置中,输出映射中每个神经元的接受野可以覆盖整个输入图像,因此不需要全局鉴别器。

在这里插入图片描述
使用SN-PatchGAN,我们的inpainting网络训练速度比基线模型更快,更稳定[49]。不使用感知损失,因为在SN-PatchGAN中已经编码了类似的补丁级信息。与PartialConv[23]相比,其中6种不同的损失项和平衡项使用超参数时,我们的最终目标函数仅由逐像素的L1重建损失和SN-PatchGAN损失组成,默认损失平衡超参数为1:1。

Inpainting Network Architecture

我们使用所提出的门控卷积和SN-PatchGAN损失定制了一个生成式图像网络[49]。具体来说,我们采用了[49]中的完整模型架构,包括粗网络和精化网络。完整的框架如图3所示。

在这里插入图片描述
对于粗网络和精化网络,我们使用一个简单的编码器-解码器网络[49],而不是PartialConv[23]中使用的U-Net。我们发现UNet中的跳过连接[31]对非窄掩码没有显著影响。

这主要是因为对于掩蔽区域的中心,这些跳过连接的输入几乎为零,因此无法将详细的颜色或纹理信息传播到该区域的解码器。对于孔边界,我们的编解码器架构配备了门控卷积,足以产生无缝的结果。

我们用门控卷积代替所有的普通卷积[49]。一个潜在的问题是门控卷积引入其他参数。为了保持与基线模型相同的效率[49],我们将模型宽度缩小了25%,并且在数量和质量上都没有发现明显的性能下降。inpainting 网络是端到端训练的,可以在任意位置的自由孔上进行测试。我们的网络是完全卷积的,在推理中支持不同的输入分辨率。

Free-Form Mask Generation

自动生成自由格式掩码的算法非常重要。采样的掩码本质上应该(1)与实际用例中绘制的掩码相似,(2)多样化以避免过度拟合,(3)计算和存储效率高,(4)可控和灵活。先前的方法[23]从两个连续视频帧之间的遮挡估计方法中收集一组固定的不规则遮罩。虽然增加了随机扩张、轮作和种植来增加其多样性,但该方法不满足上述其他要求。

我们介绍了一种简单的算法,在训练过程中自动生成随机的自由格式蒙版。对于填充孔的任务,用户的行为就像使用橡皮擦来回刷,以掩盖不需要的区域。这种行为可以通过重复绘制线条和旋转角度的随机算法简单地模拟。为了保证两条线的平整度,我们还在两条线的连接处画了一个圆。由于篇幅限制,更多的细节在补充材料中。

Extension to User-Guided Image Inpainting

我们以草图为例,将我们的图像绘制网络扩展为一个用户引导系统。草图(或边缘)是简单和直观的用户绘制。我们用人脸和自然场景来展示这两种情况。对于人脸,我们提取地标并连接相关地标。对于自然场景图像,我们直接使用HED边缘检测器提取边缘地图[44],并将高于某一阈值(即0.6)的所有值设置为1。由于篇幅限制,在补充材料中给出了示例草图。

为了在绘画系统中训练用户引导的图像,直观地,我们需要额外的约束损失来强制网络生成以用户引导为条件的结果。然而,通过像素级重构损失和GAN损失的相同组合(将条件通道作为判别器的输入),我们能够学习条件生成网络,其中生成的结果忠实地尊重用户指导。我们还尝试在HED[44]输出特征上使用额外的像素级损失,将原始图像或生成的结果作为输入来执行约束,但绘制质量是相似的。使用5通道输入(R、G、B颜色通道、掩模通道和草图通道)单独训练用户引导的inpainting模型。

Results

模型速度

我们在Places2[53]和CelebA-HQ面部[18]上评估了所提出的自由形式图像绘制系统。我们的模型共有4.1万个参数,使用TensorFlow v1.8, CUDNN v7.0, CUDA v9.0进行训练。在测试中,它在单个NVIDIA® Tesla® V100 GPU上运行每张图像0.21秒,在Intel® Xeon® CPU @ 2.00GHz上运行每张图像平均1.9秒,分辨率为512 × 512,无论孔大小如何。

Quantitative Results

如文献[49]所述,图像补绘缺乏良好的定量评价指标。尽管如此,我们在表2中报告了我们对Places2验证图像的平均误差1和平均误差2的评估结果,其中包括中心矩形掩码和自由格式掩码。如表所示,基于学习的方法在平均“1”和“2”误差方面优于PatchMatch[3]。此外,在同一框架内实现的部分卷积得到较差的性能,这可能是由于不可学习的基于规则的门控。
在这里插入图片描述

Qualitative Comparisons

接下来,我们将我们的模型与之前最先进的方法[15,23,49]进行比较。图4和图5显示了带有几个代表性图像的自动和用户引导的绘图结果。对于自动图像绘制,PartialConv的结果是通过其在线演示得到的2。对于用户引导的图像绘制,我们使用与GatedConv完全相同的设置训练PartialConv*,除了卷积类型(草图区域被视为基于规则的掩码更新的有效像素)。对于所有基于学习的方法,都不执行后处理步骤以确保公平性。

在这里插入图片描述

据文献[15]报道,简单均匀区域(图4和图5的最后一行)是基于学习的图像在绘画网络中的难点。以前的普通卷积方法在孔内/周围有明显的视觉伪影和边缘响应。PartialConv产生更好的结果,但仍然表现出可观察到的颜色差异。

我们基于门控卷积的方法获得了更令人赏心悦目的视觉效果,并且没有明显的颜色不一致。

在图5中,给定稀疏的草图,我们的方法产生了具有无缝边界转换的逼真结果。

在这里插入图片描述
PS. 哈哈哈哈,很有意思,PConv论文的确说GL需要后处理,而DeepFillv1也没处理好,大佬这做出了DeepFillv2,直接说你PConv没做好,我这次是做好了。

Object Removal and Creative Editing

此外,我们研究了图像绘画的两个重要的实际用例:对象去除和创造性编辑(object removal and creative editing)。

object removal

在第一个示例中,我们试图移除图6中分散注意力的人。我们将我们的方法与商业产品Photoshop(基于PatchMatch[3])和之前最先进的生成绘画网络(在Places2上训练的官方发布模型)[49]进行了比较。结果表明,Photoshop的Content-Aware填充功能错误地从左边复制了一半的脸。这个例子反映了这样一个事实,即没有从大规模数据中学习的传统方法忽略了图像的语义,这导致在非平稳/复杂场景中出现严重故障。对于使用vanilla卷积的基于学习的方法[49],伪影存在于孔边界附近。

在这里插入图片描述

creative editing

接下来,我们将研究用户与绘图系统交互以产生更理想结果的情况。人脸和自然场景的示例如图7所示。我们的绘制结果很好地遵循用户草图。
在这里插入图片描述

User Study

我们进行了一项用户研究,首先从Places2验证数据集中收集了30张测试图像(有洞但没有草图),而不知道它们在每个模型上的涂漆结果。然后我们计算了以下四种方法的结果进行比较:(1)ground truth,(2)我们的模型,(3)在同一框架内重新实现的PartialConv[23],以及(4)官方的PartialConv[23]。我们做了两种类型的用户研究。(A)我们单独评估每种方法以评估结果的自然度/油漆质量(从1到10,越高越好),(B)我们比较我们的模型和官方的PartialConv模型,以评估哪种方法产生更好的结果。104名用户完成了用户研究,结果如下:

(A) Naturalness: (1) 9.89, (2) 7.72, (3) 7.07, (4) 6.54

(B) Pairwise comparison of (2) our model vs. (4) official PartialConv model: 79.4% vs. 20.6% (the higher the better).

Ablation Study

提出SN-PatchGAN的原因是自由格式蒙版可能出现在任何形状的图像中的任何位置。先前介绍的针对单个矩形掩模设计的全局gan和局部gan[15]不适用。我们在图8中提供了SN-PatchGAN在图像修复背景下的消融实验。SN-PatchGAN的结果明显更好,这验证了(1)单一全局鉴别器的性能较差[15],(2)谱归一化的GAN具有更好的稳定性和性能[24]。虽然引入更多的损失函数可能有助于训练自由形式的图像补图网络[23],但我们证明了SN-PatchGAN损失和像素级L1损失的简单组合,默认损失平衡超参数为1:1,可以产生逼真的补图结果。在补充资料中给出了更多的比较实例。
在这里插入图片描述

Conclusions

我们提出了一种基于端到端门控卷积生成网络的新型自由形式图像绘制系统,该系统使用逐像素的L1损失和SN-PatchGAN进行训练。

我们证明了门控卷积显著改善了自由格式蒙版和用户指导输入的图像绘制结果。我们展示了用户草图作为示例指导,以帮助用户快速删除分散注意力的对象,修改图像布局,清除水印,编辑面部和交互式地创建照片中的新对象。定量结果、定性比较和用户研究证明了我们提出的自由形式图像绘制系统的优越性。

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

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

相关文章

KaiwuDB 资深解决方案专家周幸骏:打造核心时序引擎,释放数据新价值

以下为浪潮 KaiwuDB 资深解决方案专家周幸骏受邀于7月4日在京举行的可信数据库发展大会发表演讲的实录摘要,欢迎大家点赞、收藏、关注! 01 聚焦“时序” 据 IDC 等权威数据统计,预估 2025 年物联网设备产生的数据可达到 79.4ZB ;…

ubuntu与windows之间的文件共享

最近在做项目,需要用到ubuntu进行代码编译生成可执行文件,但是我个人阅读和编写代码喜欢用source insight这个软件IDE。安利一下这个软件,阅读代码和编辑代码真的很棒啊,谁用谁知道吧! 由于在ubuntu中安装source insig…

ShardingJDBC - 学习笔记

一、简介 官网:Apache ShardingSphere 下载地址:下载 :: ShardingSphere 快速入门:ShardingSphere-JDBC :: ShardingSphere 分库分表框架 ShardingSphere包括Sharding-JDBC、Sharding-Proxy、Sharding-Sidecar三个开源分布式数据库中间件解…

每月被攻击4000万次,全球最不安全的关键基础设施实锤了

在当今不确定的地缘政治环境中,无论是个人还是企业都高度关注潜在的网络攻击。而这其中最令人担忧的是对关键基础设施和工业资产的攻击。 关键基础设施中尤其是电力、交通、通信、金融等系统均在现代社会中发挥着至关重要的作用,因此关键基础设施一直是…

程序员如何向老板提加薪?

今天的问题不仅适用于程序员,对于其他职业同样适用。如果你认为自己所做的工作应该得到更多的报酬,并且想为此做点什么,你有两个选择:找一个新的高薪工作或要求加薪。 这两种选择都会带来新的焦虑,但它们都会带来新的…

【框架篇】Spring Boot 配置文件(详细教程)

Spring Boot 配置文件 一,配置文件的用途 配置文件在Spring Boot项目中的地位是比较重要,其功能可主要归纳为以下几个: 进行配置程序属性:配置文件允许设置应用程序的各种属性,如数据库连接、端口号、日志级别、缓存…

多态及其原理

文章目录 构成多态的条件虚函数作用:完成重写 重写重载 重写 隐藏为什么析构函数要搞成符合多态?原理预热对于基类指针或引用指向父类或者子类的成员函数是如何调用不同的函数呢? 一个类如果是基类,它的析构函数最好加上virtual 构成多态的条…

【【51单片机的LCD1602 最简单的一集】】

最简单的一集&#xff0c;明白运算显示就没问题 这一节相对简单 其实只要明白显示行列就可以了 剩下来的取什么基本上就是遍历 然后读取到\0停止 下面是基础的LCD1602的功能 #include <REGX52.H> sbit LCD_RSP2^6; sbit LCD_RWP2^5; sbit LCD_EP2^7; #define LCD_Data…

ES6基础知识七:你是怎么理解ES6中 Generator的?使用场景?

一、介绍 Generator 函数是 ES6 提供的一种异步编程解决方案&#xff0c;语法行为与传统函数完全不同 回顾下上文提到的解决异步的手段&#xff1a; 回调函数promise 那么&#xff0c;上文我们提到promsie已经是一种比较流行的解决异步方案&#xff0c;那么为什么还出现Gen…

归并排序法解释

什么是归并排序法 归并排序是一种常见的排序算法&#xff0c;它基于分治策略&#xff0c;将一个大问题分解为小问题来解决。归并排序的主要思想是将待排序的数组分成两个子数组&#xff0c;分别对这两个子数组进行排序&#xff0c;最后将两个有序的子数组合并成一个有序的数组…

Openlayers入门,Openlayers调整中心点坐标、Openlayers调整缩放级别、Openlayers调整地图可视角度和地图复位

专栏目录: OpenLayers入门教程汇总目录 前言 本章介绍一下Openlayers最基础的调整中心点坐标方式、调整缩放级别、调整地图可视角度和地图复位的小功能示例,非常简单,可直接上手。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@6…

重学C++系列之继承

一、什么是继承 继承是面向对象三大特性之一&#xff0c;C中&#xff0c;被继承的类称为基类&#xff08;父类&#xff09;&#xff0c;继承别的类的类成为派生类&#xff08;子类&#xff09;&#xff0c;继承除了基类的构造函数和析构函数不继承外&#xff0c;其余成员全部继…

【安卓】视频播放器实现过程,超详细注释,自定义视频进度条,打开本地文件播放视频等功能。

一、实现效果 废话不多说&#xff0c;直接上代码&#xff0c;里面有详细注释&#xff0c;不清楚的评论区留言。 二、布局代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res…

Android安卓实战项目(3)—一个炫酷的健身APP界面

Android安卓实战项目&#xff08;3&#xff09;—一个炫酷的健身APP界面 一.项目运行介绍 1.大致浏览 2.功能介绍 &#xff08;1&#xff09;功能一 上导航条 &#xff08;2&#xff09;功能二 下导航条 二.具体实现 MainActivity.java package com.rckdeveloper.fitene…

python 面向对象编程的特点 - 封装 - 继承(经典类、新式类) - 多态 - 静态方法、类方法 - 下划线的使用 - 回合制攻击游戏实验

目录 面向对象编程的特点&#xff1a; 封装&#xff1a;封装是将数据和操作&#xff08;方法&#xff09;封装在一个对象中的能力 继承&#xff1a;继承是指一个类&#xff08;子类&#xff09;可以继承另一个类&#xff08;父类&#xff09;的属性和方法。 我们为什么需要继…

Python采集法外狂徒张三所有视频【含jS逆向解密】

传说中&#xff0c;有人因为只是远远的看了一眼法外狂徒张三就进去了&#x1f602; 我现在是获取他视频&#xff0c;岂不是直接终生了&#x1f929; 网友&#xff1a;赶紧跑路吧 &#x1f60f; 好了话不多说&#xff0c;我们直接开始今天的内容吧&#xff01; 你需要准备 …

详解STM32的GPIO八种输入输出模式,GPIO各种输入输出的区别、初始化的步骤详解,看这文章就行了(超详细)

在STM32微控制器中&#xff0c;常见的输入输出(GPIO)模式有八种&#xff0c;分别是推挽输出、开漏输出、复用推挽输出、复用开漏输出、浮空输入、上拉输入、下拉输入和模拟输入。下面我将为你解释每种模式的特点和区别&#xff0c;并提供相应的示例代码。 文章目录 介绍区别初…

组合模式-树形结构的处理

A公司需要筛选出年龄35岁及以上(如果是领导&#xff0c;年龄为45岁及以上)的人。其组织架构图如下。 图 A公司部分组织架构图 图 传统解决方案 public class Development {private String name;public Development(String name) {this.name name;}List<Employee> emplo…

uni-app优雅的实现时间戳转换日期格式

现在显示的格式如下图&#xff1a; 我期望统一格式&#xff0c;所以不妨前端处理一下&#xff0c;核心代码如下 filters: {// 时间戳处理formatDate: function(value, spe /) {value value * 1000let data new Date(value);let year data.getFullYear();let month data.…

【设计模式——学习笔记】23种设计模式——适配器模式Adapter(原理讲解+应用场景介绍+案例介绍+Java代码实现)

介绍 生活中的案例 不同国家的插座不同&#xff0c;出国旅游充电器不能直接使用&#xff0c;可以通过使用多功能转换插头来辅助使用 基础介绍 适配器模式将某个类的接口转换成客户端期望的另一个接口表示&#xff0c;主的目的是兼容性&#xff0c;让原本因接口不匹配不能一起…