Multistage GAN for Fabric Defect Detection

用于织物检测的多级GAN

摘要:
织物缺陷检测是一项有趣但具有挑战性的工作。虽然已经提出了许多用于织物缺陷检测的方法,但是由于织物质地和缺陷的复杂多样性,这些方法仍然不是最理想的。在本文中,我们提出了一个基于生成对抗网络(GAN)织物缺陷检测框架。考虑到现有实际应用中的挑战,所提出的织物缺陷检测系统能够学习现有的织物缺陷样本,并且在不同的应用时期自动适应不同的织物质地。具体来说,我们定制了一个用于织物缺陷检测的深度语义分割网络可以检测不同的缺陷类型。此外,我们尝试在无缺陷样本上训练多阶段 GAN 合成新的合理缺陷。首先训练一个纹理条件GAN来探索不同纹理背景的缺陷的条件分布。给定一种新型织物,我们的目标是生成合理的缺陷碎片,然后,一个基于 GAN 的融合网络将生成的缺陷融合到特定位置。最后一个训练好的多级GAN不断更新现有的织物缺陷数据集,并且有助于微调语义分割网络,从而更好的检测不同条件下的缺陷。在不同有代表性的织物上的所进行的综合实验来验证我们所提出的方法的性能。
Fig. 1.简单和复杂纹理织物中的缺陷样品。在简单的纹理面料中,从 (a) 到(d)、缺陷分类为色斑、油污、打结、断头。在复杂质地织物中,从(e)到(h),缺陷被分类为颜色斑点、断头、断纱和白条。

介绍
织物疵点检测是一项重要的质量控制程序,旨在识别和定位织物中出现的疵点[1]-[3]。 自动织物疵点检测是人工智能算法在工业环境中最直接的应用之一,其有效实施可以有效提高织物质量,降低人工成本。
因此,工业和学术研究人员对织物缺陷检测具有相当大的兴趣。目的是检测复杂背景中的各种异常模式。已经提出了许多算法来检测不同假设下的缺陷[4]-[8]。 Abouelela 等人, [6]假设织物纹理是简单结构的组合,将具有不同结构的区域判断为缺陷。由于频域中有缺陷和无缺陷纹理之间存在显着差异,Chan 等人,[7] 使用了一个傅里叶变换以分离有缺陷和无缺陷区域。但是,这种频域方法不适用于复杂纹理的织物。最近,深度学习对许多计算机视觉任务产生了巨大影响。一些方法 [9]-[11] 已将深度神经网络应用于织物缺陷检测。基于学习的子词典,Tong 等人。 [9]采用非局部集中稀疏表示(NCSR)模型来重建输入图像;由此产生的缺陷是从重建图像和输入图像的残差图像中分割出来的。Li等人,[11] 训练了一个基于 Fisher 标准的堆叠去噪自动编码器 (FCSDA),使用相同大小的织物图像补丁将测试补丁分类为有缺陷或无缺陷补丁,重建图像和缺陷补丁之间的残差代表缺陷位置。这种方法在规则图案和更复杂的提花经编织物上取得了可喜的结果。尽管这些方法在特定情况下取得了良好的性能,但大多数仅限于简单的纹理,无法解决现实世界中复杂的织物缺陷检测问题。
为了提高现实世界的织物缺陷检测性能,需要解决几个挑战。 首先,标记现实世界产品中的各种缺陷既费时又费力。 由于织物产品和缺陷的复杂多样性,很难收集带注释的数据集来涵盖所有可能的织物纹理。 因此,在处理没有见过的纹理或材料的织物时,预训练的检测模型通常表现不佳。 而且,由于每种织物类型的生产工艺和材料不同,不同缺陷的外观和特征差异很大,这也增加了织物缺陷检测的难度。 在简单和复杂织物中具有不同缺陷的样品如图1所示。
在本文中,我们提出了一种基于生成对抗网络 (GAN) 的织物缺陷检测框架。考虑到实际应用中的上述挑战,所提出的织物缺陷检测系统能够学习现有的织物缺陷样本,并在不同的应用时期自动适应不同的纹理。具体来说,我们训练了一个生成模型,旨在根据现有的注释缺陷样本学习织物缺陷的模式和分布。由于缺陷外观取决于背景纹理,我们假设织物缺陷及其相应的背景纹理服从一个条件分配。给定背景纹理样式,经过训练的生成模型旨在合成可以添加到织物背景中的缺陷。因此,在处理具有不同背景纹理的新织物时,无需收集和标注训练样本。我们提出了一个多级 GAN 来合成看不见的无缺陷织物样本的缺陷。首先,训练纹理样式条件 GAN 来合成以给定织物纹理为条件的粗糙缺陷。然后,我们将第一阶段产生的缺陷与相应的织物融合以获得最终生成的缺陷织物样本。此外,我们基于现有和生成的缺陷织物样本训练用于织物缺陷检测的语义分割网络。这种语义分割网络能够检测多尺度缺陷,并且可以进行微调以适应新生成的缺陷样本。最后,类似于现实世界的应用程序,我们收集了一个用于织物缺陷检测的数据集并在该数据集上进行实验。结果表明,我们提出的织物缺陷检测系统可以检测不同织物中的不同缺陷类型。
总之,本文做出了以下贡献。1)我们将工业织物缺陷检测任务制定为基于 GAN 的任务,并提出了一种新颖的织物缺陷检测系统。 2)我们提出了一个多级GAN来合成看不见的无缺陷织物纹理中的合理缺陷,可用于更新我们的检测模型以适应不断出现的新型织物纹理。 3)我们训练了一个用于织物缺陷检测的语义分割网络可以检测简单和复杂背景纹理中不同类型和规模的缺陷。 4) 实验结果表明,我们的织物疵点检测系统在一系列织物疵点检测挑战中取得了优异的性能。

方法
在本节中,在讨论三个主要模块的细节之前,我们首先介绍我们的织物缺陷检测思路:1)织物缺陷检测的分割网络,2)用于缺陷织物数据生成的多级 GAN,以及 3)微调使预训练模型适应新织物纹理的策略。
A. Framework Description
如上所述,在实际应用中,注释数据集不足以及织物纹理和缺陷的复杂多样性是织物检测方法的重大挑战。 鉴于这种情况,我们提出了一种基于 GAN 的织物疵点检测系统,该系统能够在现有织物疵点样本上训练检测模型,并在不同的应用时期自动适应不同的纹理。
Fig. 2. The architecture of our proposed system for fabric defect detection
图 2 描绘了我们提出的织物缺陷检测系统。该系统的输入是一个现有的缺陷织物数据集和一个无缺陷织物数据集,其中纹理与现有的缺陷织物数据集非常不同。首先,现有的缺陷织物数据集是用于训练织物分割网络,该网络是为缺陷检测而定制的。基于最先进的语义分割网络 DeepLab V3 [18],我们修改了一些 atrous 卷积层的 atrous rate 并为损失函数添加了一个权重参数以增强它对织物缺陷的影响分割。此外,基于有缺陷和无缺陷的数据集,我们的目标是合成更多具有不同纹理(即背景)的缺陷样本。因此,这些合成的缺陷样本可以被视为检测模型的额外训练样本,以进一步提高其性能。具体来说,我们设计了一个基于多级 GAN 的模块来合成新的有缺陷的织物样本。首先,训练纹理样式条件 GAN 网络以基于给定(条件)纹理生成有缺陷的补丁。然后,我们利用对抗性损失来训练缺陷融合网络,该网络旨在将生成的缺陷融合到无缺陷样品。考虑到大多数缺陷与其背景纹理和颜色高度相关,我们假设缺陷的外观服从给定特定织物背景的条件分布。因此,我们首先训练一个有条件的 GAN 来探索缺陷与其周围环境之间的这种关系,并旨在在新的织物背景上产生合理的缺陷。然而,生成的缺陷仅基于给定背景的“风格”信息,很难平滑地融合到特定位置。因此,我们进一步训练了一个缺陷融合网络来合成真实的缺陷样本。然后,我们使用生成的缺陷对预训练的分割模型进行微调数据集。因此,该模型能够连续检测新纹理中的缺陷。

B. Segmentation Network
关于基础缺陷检测网络的选择,从 Faster-RCNN [37]、YOLO [38] 或 SSD[39] 等流行的对象检测网络中进行选择是不明智的,因为缺陷通常在规模和纵横比是各种各样的,这可能会降低检测精度。相反,我们选择了由 Chen 等人提出的语义分割网络 DeepLab V3。 [18],作为我们的基础网络。这DeepLab V3 架构如图 3 所示。根据这项工作,输出步幅被定义为原始图像大小与输出特征图大小的比率。深度卷积神经网络通常使用几个级联的卷积块,包括几个卷积和步幅进行特征提取,从而扩大过滤器的感受野并通过链缩小提取的特征图块。为了保持更深层特征图的大小,DeepLab 模型使用多孔卷积而不是卷积和跨步。我们使用 ResNet-50 [40] 作为主干网络,它包含四个块,每个块包括三个 3×3 卷积,最后一个卷积包含除块 4 之外的步长为 2。然后,将多孔卷积用作连续跨步的替代方法,并根据所需的输出跨步值设置多孔率。另一个挑战是准确检测各种规模的缺陷。受空间金字塔池化 [41] 的启发,DeepLabV3 在特征图的顶部部署了一个多孔空间金字塔池化 (ASPP) 模块。具体来说,该模块包含四个具有不同孔隙率的并行孔隙卷积,哪些不同尺度的样本特征可以有效捕获多尺度信息。作为旁注,批量归一化是包含在每个卷积中。为了提取全局特征,一方法是设置一个大的atrous卷积率。然而

C. Synthesizing Novel Defective Samples Using a Multistage GAN
在实际应用中,由于织物纹理多种多样且不断更新,我们必须考虑现有织物缺陷检测方法的弱转移性问题。为了保持我们方法的适应性,我们提出了一个基于多级 GAN 的模块,用于合成具有新纹理的有缺陷的织物样本。作为一种数据增强解决方案,合成的缺陷样本用于进一步微调我们的缺陷检测网络。因此,我们不再需要收集和标记具有新纹理的缺陷织物样本,而是根据不断更新的无缺陷样本简单地合成新的缺陷织物样本。为了合成合理和真实的缺陷,我们首先根据给定的纹理生成独立的缺陷,然后尝试将它们融合到相应的织物背景中。具体来说,在第一阶段,条件 GAN (CGAN) [42] 被训练用于独立缺陷生成,它应该根据输入条件生成不同类型的缺陷,即我们案例中的背景纹理.而且,如果我们直接将产生的缺陷贴在织物上,缺陷看起来仍然不够真实,因为它们不能很好地融入周围区域。所以,在第二阶段,我们提出了一个缺陷融合网络,将生成的缺陷适当地融合成无缺陷的织物图像。
阶段 1. 首先,我们尝试使用“风格标签”来表示新织物样本的背景纹理风格。具体来说,我们通过从没有缺陷的区域中随机裁剪来收集织物补丁作为阶段 1 的输入。 然后使用预训练的 VGGNet 从这些补丁中提取特征。然后,可以从这些特征中计算出 Gram 矩阵 [44] 并将其用作样式标签。 定义 φ(x) 为形状 C ×H ×W 的特征图。 通过将 φ(x) 重塑为 C ×HW 矩阵 ψ,其 Gram 矩阵 G φ (x) 可以计算为:

给定“样式标签”G φ (x),我们训练生成器 G 以生成相应的缺陷。 我们将从原始缺陷样本中裁剪出的真实缺陷及其相应的样式标签定义为真实对,将生成的缺陷及其相应的样式标签定义为假对。 假设实际缺陷 x 的分布为 p x|G φ 并且噪声 z 的分布为 p z ,则条件对抗性损失计算如下:

其中 G φ 是 x 对应的样式标签。 D s 被训练为更好地区分真假对,而 G 被训练产生更真实的缺陷,旨在愚弄 D s 。 随着对抗训练过程,从无缺陷织物纹理中提取的“风格标签”被视为生成相应缺陷的条件信号。 给定不同的织物纹理(即样式标签)作为输入,应该合成具有不同颜色和纹理的缺陷。 最后,将学习给定纹理的缺陷的条件分布,并可以生成给定新织物样本的合理缺陷。

Fig. 4. Schematic of a multistage GAN. Stage 1: Generating defects based on the given texture; Stage 2: Fusing the generated defect into the defect-free sample.
阶段 2. 在缺陷产生后,我们使用缺陷融合网络融合缺陷和纹理,如图 4 的阶段 2 所示。首先,训练补丁中的缺陷区域被裁剪掉,只留下无缺陷的区域带有空白窗口的织物补丁。然后,将生成的缺陷调整大小并粘贴到空白窗口上,从而获得缺陷融合网络的不完美输入 x。为了明确定义,我们将生成的补丁 T(x) 和训练补丁命名为真实图像 y。请注意,缺陷融合网络经过训练,可以将不同的生成缺陷融合到相应的背景中;即,在对抗训练期间,所有训练缺陷样本(具有不同纹理)都被用作真实数据。除了对抗性损失之外,我们还设计了三个损失来微调网络:1)我们设计了输出假图像和真实缺陷图像之间的重建损失,因为我们假设生成的缺陷融合图像应该类似于真正的缺陷补丁。然而,由于假设生成的缺陷样本与原始样本相同是不合理的,我们利用铰链重建损失:

其中 m 定义了放松重建的铰链约束。
2)受[44]的启发,我们对由预训练的 VGGNet 提取的融合补丁的特征图施加约束,并将其惩罚为与相应的真实补丁相似。 通过这种方式,生成器被迫融合缺陷,同时尽可能多地保留缺陷和纹理的主要特征。 真假图像特征之间的特征重建损失计算如下:

其中 φ j (·) 表示来自第 j 层的激活形状为 C j ×H j ×W j 的 VGGNet。 T(x) 和 y 分别表示假图像和真实图像。
3)假图像和真实图像的主要区别在于缺陷和背景的交界处。因此,采用缺陷融合鉴别器DT 来区分真实缺陷样本和合成的新样本。 鉴别器 DT 主要用于检查连接区域,而缺陷融合网络 T 则被迫合成具有改进和融合良好缺陷的样本。 这样,它们之间就形成了一个极大极小博弈,对抗性损失函数定义为:

D. Fine-tuning Strategy
由于织物纹理和缺陷的复杂多样性,很难收集一个覆盖所有可能织物纹理的带注释的缺陷织物数据集,也很难训练出一个适用于所有织物的通用检测模型。幸运的是,收集待检测织物的无缺陷样本是简单可行的,然后这些样本可以作为上述多级 GAN 的输入生成缺陷样本,用于不断更新检测模型。这样,我们使用那些生成的缺陷样本来训练织物缺陷检测模型。为了使模型更快收敛,我们使用现有的带注释的缺陷样本预训练了一个缺陷检测模型,这些样本也用于训练多阶段 GAN 模型。给定要检测的具有新纹理的织物,我们使用缺陷生成模块合成无缺陷织物样本中的缺陷。 最后,使用预训练模型进行检测网络初始化,将生成的缺陷样本输入网络,然后可以使用生成的模型来检测给定织物的缺陷。因此,使用我们提出的基于 GAN 的系统,检测模型可以在不同的应用时期自动适应不同的纹理。

实验步骤
我们接下来详细描述我们的实验设置。为了清楚起见,我们根据我们在第三节中提出的检测系统将我们的实验分为三个部分:检测模型预训练、新纹理的缺陷样本生成和模型微调。第一步,我们收集缺陷织物图像作为我们的原始图像数据集并根据缺陷的原因对它们进行分类。我们在简单和复杂纹理织物中收集了四种缺陷类型。由于生产工艺和材料不同,简单纹理和复杂纹理的织物也有不同的缺陷类型:简单纹理织物中的色斑、油渍、结节和断头,以及色斑、断头、断纱和白条在复杂纹理织物中,如图 1 所示。我们对这些缺陷类型进行分类,目的是改进我们方法的不同方面。简而言之,色斑测试检测小尺寸疵点的能力,油渍用于增强模糊边缘检测,结头和断纱缺陷训练我们改进锐边检测的方法,断头和白条需要我们的模型具有更广泛的领域来捕获大规模缺陷。请注意,我们的目的是检测缺陷而不是对缺陷类型进行分类。
对于数据预处理,我们根据缺陷位置将缺陷样本随机裁剪为 512×512。由于我们的缺陷织物数据集不足以训练通用模型,为了扩展数据集的可变性并避免过度拟合,我们采用了包括色调、亮度、旋转和镜像到缺陷样本的数据增强方法。为清楚起见,我们将此预处理数据集命名为 dataset0。在准备好原始缺陷织物数据集后,我们使用 dataset0 来训练我们的 DeepLab V3 网络。当训练过程完成时,我们获得预训练的检测模型作为步骤 1 的输出。这个预训练模型很好地检测了数据集 0 中存在的纹理中的缺陷。然而,作为上面讨论过,因为背景纹理代表了织物图像的大部分,当两种织物具有非常不同的纹理时,它们之间存在显着差异,这可能导致预训练模型失败。
第二步,我们专注于为检测到的织物生成有缺陷的样本,其纹理可能与 dataset0 中的纹理非常不同。对于要检测的给定织物,我们可以轻松收集该织物的无缺陷样本,并应用我们的多级缺陷生成模块为检测到的织物生成缺陷样本。在第 1 阶段,使用样式标签和真实缺陷训练条件 GAN 以生成不同类型的缺陷。在第 2 阶段,另一个 GAN 使用合成图像和真实缺陷进行训练
图像以生成具有正确融合缺陷的图像。铰链重建损失和感知损失也被应用于进一步约束生成模块。训练后,模块被输入无缺陷样本以生成具有新纹理的有缺陷数据集1。数据集 1 与数据集 0 的随机集合以 1:5 的比例混合,形成混合数据集 2。
在最后一步,我们使用混合源 dataset2 对步骤 1 中的预训练模型进行微调。 具体来说,我们使用我们的预训练模型作为 DeepLab V3 缺陷检测网络的初始化,然后将 dataset2 作为训练数据集进一步微调网络。网络应该能够为检测到的织物提取不同的特征,因此对于新的纹理样本,最终微调模型(步骤 3 的输出)的检测能力得到了提高。
最后,我们在使用真实缺陷样本的测试阶段应用微调模型。上面描述了评估标准,这里我们使用这些标准来评估我们的检测结果。计算不同实验设置中的 TPs、FPs 和 FNs,并计算相应的评估标准,即精度、召回率和 F-measure 值。
生成缺陷样本的结果
我们首先训练提出的多级缺陷生成模块来合成缺陷样本。报告了两个阶段生成的一些织物样本,我们尝试定性分析不同阶段的效果和优势。由于纹理简单的织物不同于纹理复杂的织物,我们将收集到的原始缺陷织物图像分为两类:简单纹理织物样本和复杂纹理织物样本。每个都包含四种不同的缺陷类型。我们的目标是学习不同缺陷类型的模式,并进一步将它们添加到新的无缺陷图片。由于这些新合成的“有缺陷”织物图像将用于微调预训练的检测模型,我们希望这些合成的织物图像尽可能逼真。
在图 6 中,我们展示了来自基于 GAN 的模块每个阶段的一些合成样本。其中,前四组,即(a)、(b)、(c)和(d),对应于简单纹理织物中的四种合成缺陷。其他四组,即(e)、(f)、(g)和(h),显示了添加到复杂纹理织物上的缺陷。在每组中,第一个(最左侧)图像表示原始无缺陷织物图像。请注意,这些输入的无缺陷织物图像不属于 dataset0。根据预训练模型VGGNet提取的样式标签,在第一阶段,生成缺陷补丁,然后粘贴到输入的无缺陷织物图像中。对于图 6 中的每一组,中间的图像代表第 1 阶段之后的合成图像。然后,我们将这些图像作为输入并将它们输入到训练有素的第 2 阶段网络中。在这里,第 2 阶段网络旨在将粘贴的缺陷融合到织物背景中并生成更逼真的样本。在图 6 中,每组的最后一张图像是最终合成的缺陷织物样本。

Fig. 6. Samples of synthesized defective fabric samples. Defect types are (a) color spot, (b) oil stain, © knot, and (d) broken end in simple-textured fabric and (e) color spot, (f) broken end, (g) broken yarn, and (h) white strip in complex-textured fabric.
在图 6 中,我们展示了来自基于 GAN 的模块每个阶段的一些合成样本。其中,前四组,即(a)(b)、(c)和(d),对应于简单纹理织物中的四种合成缺陷。其他四组,即(e)、(f)、(g)和(h),显示了添加到复杂纹理织物上的缺陷。在每组中,第一个(最左侧)图像表示原始无缺陷织物图像。请注意,这些输入的无缺陷织物图像不属于 dataset0。根据预训练模型VGGNet提取的样式标签,在第一阶段,生成缺陷补丁,然后粘贴到输入的无缺陷织物图像中。对于图 6 中的每一组,中间的图像代表第 1 阶段之后的合成图像。然后,我们将这些图像作为输入并将它们输入到训练有素的第 2 阶段网络中。在这里,第 2 阶段网络旨在将粘贴的缺陷融合到织物背景中并生成更逼真的样本。在图 6 中,每组的最后一张图像是最终合成的缺陷织物样本。
如图 6 所示,在第 1 阶段之后,我们生成的模块已经可以根据给定的织物样式生成合理的缺陷。 然而,由于只合成了缺陷,合成的缺陷并没有完美地融合到背景中。 此外,对于一些斑点或块状缺陷,如油污和结节缺陷,合成缺陷显得不切实际。 因此,我们引入第 2 阶段来细化在第 1 阶段合成的那些图像。在第 2 阶段之后,生成的缺陷可以自然地融合到织物背景中,从而提供逼真的缺陷样本以进一步微调
检测模型。

总结:
本文主要有两个创新点。一是训练一个条件GAN(CGAN)来学习纹理背景和缺陷之间的条件分布,当给出一种新型织物时,该模型可以产生以该新型织物为背景的缺陷。二是由于条件GAN(CGAN)产生的缺陷不能和新型织物的背景完全融合,因此利用一个基于GAN的融合网络将缺陷和背景完全融合,从而产生新的缺陷样本。

Multistage GAN for Fabric Defect Detection 用于织物检测的多级GAN相关推荐

  1. CVPR2019文章解读 Pyramid Feature Attention Network for Saliency detection 用于显著性检测的金字塔特征注意网络

    Pyramid Feature Attention Network for Saliency detection 摘要 显著性检测是计算机视觉领域的基本挑战之一,怎么有效去提取特征非常关键,目前的一些 ...

  2. 以YOLOv5为基准实现布匹缺陷检测(Fabric Defect Detection)

    一.YOLOv5 安装 使用以下命令安装最新版的YOLOv5 # 下载代码 git clone https://github.com/ultralytics/yolov5 # clone cd yol ...

  3. [织物瑕疵检测]D4Net: De-deformation defect detection network for non-rigidproducts with large patterns

    该论文发自Information Sciences,属于ccf b的文献,主要贡献是针对自己收集的LELP数据集利用DNN网络进行训练,达到了接近0.97的准确度. 文章概括 D4Net的优点在于提出 ...

  4. 使用深度学习 进行缺陷检测,GAN用于表面缺陷检测

    使用深度学习 进行缺陷检测 链接: 千顺智能. 数据库– GRIMA database http://dmery.ing.puc.cl/index.php/material/gdxray/ steel ...

  5. Deep learning based multi-scale channel compression feature surface defect detection system

    基于深度学习的多尺度通道压缩特征表面缺陷检测系统 Deep learning based multi-scale channel compression feature surface defect ...

  6. 论文阅读DefectNet: Toward Fast and Effective Defect Detection缺陷网:走向快速有效的缺陷检测

    DefectNet: Toward Fast and Effective Defect Detection缺陷网:走向快速有效的缺陷检测 期刊:IEEE Transactions on Instrum ...

  7. Multi-scale multi-intensity defect detection in ray image of weld bead

    Multi-scale multi-intensity defect detection in ray image of weld bead 焊道射线图像中的多尺度多强度缺陷检测 Abstract T ...

  8. 多目标分类的混淆矩阵_用于目标检测的混淆矩阵

    多目标分类的混淆矩阵 After training a machine learning classifier, the next step is to evaluate its performanc ...

  9. 何恺明团队新作ViTDet:用于目标检测的视觉Transformer主干网络

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 转载自:机器之心 | 编辑:张倩.小舟 做目标检测就一定需要 FPN 吗?昨天,来自 Facebook AI ...

  10. 用于表检测和结构识别的深度学习:综述

    摘要 表格无处不在,从科学期刊.论文.网站和报纸,到我们在超市购买的物品.因此,检测它们对于自动理解文档内容至关重要.由于深度学习网络的快速发展,表格检测的性能显著提高.本次总结的目的是深入了解表格检 ...

最新文章

  1. C#中如何得到Graphics对象
  2. PHP函数-判断字符是否在于指定的字符串中
  3. SQL Server 自动更新统计信息的基本算法
  4. linux里面安装php,linux下怎么安装php环境
  5. Google猜画小歌升级:现在可以跟好友对战了
  6. Android SQLite用sql语句进行增删改查
  7. 20.有效的括号(力扣leetcode) 博主可答疑该问题
  8. 压缩(minify)
  9. 3套看漫画学python视频教程
  10. win7 ie11版本安装报此更新不适用于计算机问题
  11. mysql 授权_MySQL的授权
  12. 通过.reg文件修改注册表
  13. Php计算圆柱的表面积和体积,圆柱体的面积计算公式
  14. Vim编辑器快速上手
  15. b站pink老师JavaScript的DOM案例代码——模拟京东快递单号查询
  16. java一天一只顽猴想去从山脚_六年级上册语文一课一练(附答案)
  17. obd 与服务器通讯协议,OBD系统的通讯协议介绍 - 〖汽车维修设备制作〗 - 中威汽车电子技术论坛 - Powered by Discuz!...
  18. 程序员debug三大定律
  19. 在LibreOffice 中启用录制宏的功能
  20. linux安全之服务安全

热门文章

  1. 绝版、珍藏、经典软件集合!
  2. IoT黑板报0220:三星5G商用关键设备开发完成
  3. windows C++多线程(四):_beginthread的使用
  4. Linux screen capture
  5. pclzip.lib.php,LimeSurvey
  6. 人物动画计算机课教学反思,flash课教学反思
  7. Windows Server AppFabric安装教程
  8. android 那个桌面好,手机桌面软件哪个好?最好用的手机桌面软件推荐
  9. ffmpeg 踩坑总结 —— 视频转码 转H264格式
  10. 科来网络分析系统与数据包分析