一、概述

实时执行逐像素语义分割的能力在移动应用程序中至关重要。 最近针对此任务的深度神经网络的缺点是需要大量的浮点运算,并且运行时间长,这阻碍了它们的可用性。 在本文中,我们提出了一种名为 ENet(高效神经网络)的新型深度神经网络架构,专为需要低延迟操作的任务而创建。 ENet 的速度提高了 18 倍,所需的 FLOP 减少了 75 个,参数减少了 79 个,并且提供了与现有模型相似或更好的准确度。 我们已经在 CamVid、Cityscapes 和 SUN 数据集上对其进行了测试,并报告了与现有最先进方法的比较,以及网络准确性和处理时间之间的权衡。我们提出了在嵌入式系统上提出的架构的性能测量,并建议了可能使 ENet 更快的软件改进。

对可以在低功耗移动设备上实时运行的语义分割(或视觉场景理解)算法产生了强烈的需求。这些算法用对象类别之一标记图像中的每个像素。近年来,更大数据集和计算能力强大的机器的可用性帮助深度卷积神经网络 (CNN) 超越了许多传统计算机视觉算法的性能。 尽管 CNN 在分类和分类任务中越来越成功,但它们在应用于图像的像素标记时提供了粗略的空间结果。 因此,它们通常与其他算法级联以优化结果,例如基于颜色的分割或条件随机场等。

为了对图像进行空间分类和精细分割,已经提出了几种神经网络架构,例如 SegNet或全卷积网络。 所有这些工作都基于VGG16架构,这是一个为多类分类而设计的非常大的模型。这些参考文献提出了具有大量参数和较长推理时间的网络。在这些条件下,它们无法用于许多需要以高于 10 fps 的速率处理图像的移动或电池供电应用。

在本文中,我们提出了一种针对快速推理和高精度进行优化的新神经网络架构。 使用 ENet 分割的图像示例如图 1 所示。在我们的工作中,我们选择不使用任何后处理步骤,这当然可以与我们的方法结合使用,但会降低端到端 CNN 的性能 方法。

图 1:不同数据集(从左到右 Cityscapes、CamVid 和 SUN)上的 ENet 预测。

在第 3 节中,我们提出了一种名为 ENet 的快速紧凑的编码器-解码器架构。 它是根据最近出现在文献中的规则和想法设计的,所有这些我们

在第 4 节中讨论。提议的网络已在 Cityscapes和 CamVid上针对驾驶场景进行了评估,而 SUN 数据集已用于在室内情况下测试我们的网络。 我们在 NVIDIA Jetson TX1 嵌入式系统模块以及 NVIDIA Titan X GPU 上对其进行基准测试。 结果可在第 5 节中找到。

二、相关工作

语义分割对于理解图像内容和寻找目标对象很重要。这种技术在驾驶辅助和增强现实等应用中至关重要。 此外,实时操作对他们来说是必须的,因此仔细设计 CNN 至关重要。 当代计算机视觉应用广泛使用深度神经网络,它现在是用于许多不同任务(包括语义分割)的最广泛使用的技术之一。 这项工作提出了一种新的神经网络架构,因此我们的目标是与其他以相同方式执行大部分推理的文献进行比较。

最先进的场景解析 CNN 使用两个独立的神经网络架构组合在一起:编码器和解码器。 受概率自动编码器的启发,编码器-解码器网络架构已在 SegNet-basic 中引入,并在 SegNet 中进一步改进。 编码器是一个普通的 CNN(例如 VGG16),它被训练来对输入进行分类,而解码器用于对编码器的输出进行上采样。 然而,由于它们的架构庞大且参数众多,这些网络在推理过程中速度很慢。 与全卷积网络 (FCN) 不同,VGG16 的全连接层在最新版本的 SegNet 中被丢弃,以减少浮点运算的数量和内存占用,使其成为这些网络中最小的。 尽管如此,它们都不能实时运行。

其他现有架构使用更简单的分类器,然后将它们与条件随机场 (CRF) 级联,作为后处理步骤。如图所示,这些技术使用繁琐的后处理步骤,并且通常无法标记在一帧中占用较少像素数的类别。 CNNs 也可以与循环神经网络结合以提高准确性,但它们会遭受速度下降的困扰。 此外,必须记住,用作后处理步骤的 RNN 可以与任何其他技术结合使用,包括本工作中介绍的技术。

三、网络架构

我们网络的架构如表 1 所示。它分为几个阶段,如表中的水平线和每个块名称后的第一个数字突出显示的那样。 输出大小报告为一个输入图像分辨率为 的示例。我们采用 ResNets的视图,将它们描述为具有单个主分支和带有与其分离的卷积滤波器的扩展,然后通过逐元素加法合并回来,如 如图 2b 所示。 每个块由三个卷积层组成:一个降低维度的投影、一个主卷积层(图 2b 中的 conv)和一个扩展。 我们在所有卷积之间放置 Batch Normalization和 PReLU。 就像在原始论文中一样,我们将这些称为瓶颈模块。 如果瓶颈是下采样,则将最大池化层添加到主分支。

图 2:(a) ENet 初始块。 MaxPooling 是用不重叠的 2 2 个窗口进行的,卷积有 13 个过滤器,串联后总计 16 个特征图。 这在很大程度上受到 [28] 的启发。 (b) ENet 瓶颈模块。 conv 是具有 3 3 个过滤器的常规、扩张或完全卷积(也称为反卷积),或者是分解为两个不对称卷积的 5 5 卷积。

表 1:ENet 架构。 输出大小是针对 512 512 的示例输入给出的。

此外,第一个投影被替换为两个维度上步长为 2 的卷积。我们对激活进行零填充,以匹配特征图的数量。 conv 是具有个过滤器的常规、扩张或全卷积(也称为反卷积或分数步幅卷积)。 有时我们用非对称卷积替换它,即 卷积的序列。 对于正则化器,我们使用 Spatial Dropout,在瓶颈 2.0 之前,之后

初始阶段包含一个块,如图 2a 所示。 第 1 阶段由 5 个瓶颈块组成,而第 2 阶段和第 3 阶段具有相同的结构,除了第 3 阶段在开始时不对输入进行下采样(我们省略了第 0 个瓶颈)。 这三个第一阶段是编码器。 阶段 4 和 5 属于解码器。

我们在任何预测中都没有使用偏置项,以减少内核调用和整体内存操作的数量,因为 cuDNN 使用单独的内核进行卷积和偏置添加。 这个选择对准确性没有任何影响。 在每个卷积层和后续非线性之间,我们使用批量归一化。 在解码器中,max pooling 被 max unpooling 替换,padding 被替换为无偏差的空间卷积。 我们在最后一个上采样模块中没有使用池化索引,因为初始块在输入帧的 3 个通道上运行,而最终输出具有 C 个特征图(对象类的数量)。 此外,出于性能原因,我们决定只放置一个裸全卷积作为网络的最后一个模块,它单独占用了解码器处理时间的相当大一部分。

四、设计选择

在本节中,我们将讨论我们最重要的实验结果和直觉,它们塑造了 ENet 的最终架构。

        特征图分辨率

在语义分割期间对图像进行下采样有两个主要缺点。 首先,降低特征图分辨率意味着丢失空间信息,如精确的边缘形状。 其次,全像素分割要求输出与输入具有相同的分辨率。 这意味着强下采样将需要同样强的上采样,这会增加模型大小和计算成本。 第一个问题已在 FCN中通过添加编码器生成的特征图来解决,在 SegNet 中通过保存在最大池化层中选择的元素的索引,并使用它们在解码器中生成稀疏的上采样图。 我们遵循 SegNet 方法,因为它可以减少内存需求。 尽管如此,我们发现强下采样会损害准确性,并试图尽可能地限制它。

然而,下采样有一个很大的优势。 对下采样图像进行操作的过滤器具有更大的感受野,这使它们能够收集更多的上下文。 这在尝试区分类别时尤其重要,例如道路场景中的骑手和行人。 网络仅仅了解人们的外表是不够的,他们出现的环境同样重要。 最后,我们发现为此目的最好使用扩张卷积。

        早期下采样

实现良好性能和实时操作的一个关键直觉是意识到处理大型输入帧非常昂贵。 这听起来很明显,但是许多流行的架构并没有过多关注网络早期阶段的优化,这通常是迄今为止最昂贵的。

ENet 前两个块大大减少了输入大小,并且只使用了一小部分特征图。 它背后的想法是,视觉信息在空间上是高度冗余的,因此可以被压缩成更有效的表示。 此外,我们的直觉是初始网络层不应该直接有助于分类。 相反,它们应该充当良好的特征提取器,并且只为网络的后续部分预处理输入。 这种洞察力在我们的实验中效果很好。 将特征图的数量从 16 个增加到 32 个并没有提高 Cityscapes 数据集的准确性。

        解码器尺寸

在这项工作中,我们希望提供与中提出的不同的关于编码器-解码器架构的观点。 SegNet 是一个非常对称的架构,因为编码器是编码器的精确镜像。 相反,我们的架构由一个大型编码器和一个小型解码器组成。 这是因为编码器应该能够以与原始分类架构类似的方式工作,即对较小分辨率的数据进行操作并提供信息处理和过滤。 相反,解码器的作用是对编码器的输出进行上采样,只对细节进行微调。

        非线性运算

最近的一篇论文报告说,在卷积之前使用 ReLU 和 Batch Normalization 层是有益的。 我们尝试将这些想法应用于 ENet,但这对准确性产生了不利影响。 相反,我们发现在网络的初始层中删除大多数 ReLU 可以改善结果。 这是一个非常令人惊讶的发现,因此我们决定调查其原因。

我们用 PReLU 替换了网络中的所有 ReLU,它使用每个特征图的附加参数,目的是学习非线性的负斜率。 我们预计,在身份是更可取的传递函数的层中,PReLU 权重将具有接近 1 的值,反之,如果 ReLU 更可取,则值将接近 0。 该实验的结果如图 3 所示。

图 3:PReLU 权重分布与网络深度。 蓝线是权重平均值,而最大和最小权重之间的区域显示为灰色。 每条垂直虚线对应于主分支中的一个 PReLU,并标记了每个瓶颈块之间的边界。 第 67 个模块的灰色垂直线位于编码器-解码器边界。

初始层的权重表现出很大的差异,并且略微偏向正值,而在编码器的后期部分,它们会稳定为一个循环模式。 主分支中的所有层的行为几乎与常规 ReLU 完全相同,而瓶颈模块内的权重为负,即函数反转并缩小负值。 我们假设身份在我们的架构中效果不佳,因为它的深度有限。 学习到这种有损函数的原因可能是原始的 ResNet 是可以有数百层深度的网络,而我们的网络只使用了几层,它需要快速过滤掉信息。 值得注意的是,解码器的权重变得更加积极,并且学习的函数更接近于同一性。 这证实了我们的直觉,即解码器仅用于微调上采样输出。

        保持信息的维度变化

如前所述,有必要及早对输入进行下采样,但激进的降维也会阻碍信息流。 在[28]中已经提出了解决这个问题的一个很好的方法。 有人认为,VGG 架构使用的一种方法,即执行池化,然后进行卷积扩展维度,无论多么便宜,都会引入代表性瓶颈(或迫使人们使用更多数量的过滤器,这会降低计算效率)。 另一方面,卷积后的池化增加了特征图的深度,计算成本很高。 因此,正如 中提出的,我们选择与步长为 2 的卷积并行执行池化操作,并连接得到的特征图。 这种技术使我们能够将初始块的推理时间加快 10 倍。

此外,我们在原始 ResNet 架构中发现了一个问题。 下采样时,卷积分支的第一个 1 1 投影在两个维度上以 2 的步幅执行,这有效地丢弃了 75% 的输入。 将过滤器大小增加到 2 2 允许考虑全部输入,从而提高信息流和准确性。 当然,它使这些第 4 层的计算成本更高,但是在 ENet 中这些层太少了,因此开销并不明显。

        因式分解过滤器

已经表明,卷积权重具有相当数量的冗余,并且每个卷积可以分解为两个彼此跟随的较小的卷积:一个带有滤波器,另一个带有滤波器。 这个想法也被提出,从现在开始我们采用他们的命名约定,并将这些称为不对称卷积。 我们在网络中使用了 n = 5 的非对称卷积,因此这两个操作的成本类似于单个卷积。 这允许增加块学习的功能的多样性并增加感受野。

更重要的是,bottleneck模块中使用的一系列操作(投影、卷积、投影)可以看作是将一个大的卷积层分解为一系列更小更简单的操作,这就是它的低秩逼近。 这种分解可以实现很大的加速,并大大减少参数的数量,从而减少冗余。 此外,由于插入层之间的非线性操作,它允许使他们计算的函数更丰富。

空洞卷积

如上所述,网络具有广泛的感受野非常重要,因此它可以通过考虑更广泛的上下文来进行分类。 我们想避免过度下采样特征图,并决定使用扩张卷积来改进我们的模型。 他们在以最小分辨率运行的阶段替换了几个瓶颈模块内的主要卷积层。 通过将 Cityscapes 上的 IoU 提高约 4 个百分点,从而显着提高了准确性,而无需额外成本。 当我们将它们与其他瓶颈模块(常规和不对称)交错时,我们获得了最佳精度,而不是像之前那样按顺序排列它们。

        正则化

大多数像素级分割数据集相对较小(大约 103 张图像),因此神经网络等表达模型很快就会开始过拟合。 在最初的实验中,我们使用了 L2 权重衰减,但收效甚微。 然后,受的启发,我们尝试了随机深度,这提高了准确性。 然而,很明显,删除整个分支(即,将它们的输出设置为 0)实际上是应用 Spatial Dropout的一种特殊情况,其中所有通道或一个都不被忽略,而不是选择一个随机子集 . 我们将 Spatial Dropout 放置在卷积分支的末尾,就在相加之前,结果证明它比随机深度好得多。

五、结果

我们在三个不同的数据集上对 ENet 的性能进行了基准测试,以展示实际应用的实时性和准确性。 我们测试了道路场景的 CamVid 和 Cityscapes 数据集,以及室内场景的 SUN RGB-D 数据集。 我们将 SegNet设置为基线,因为它是最快的分割模型之一,与 FCN 相比,它具有更少的参数并且需要更少的内存来操作。 我们所有的模型、训练、测试和性能评估脚本都使用带有 cuDNN 后端的 Torch7 机器学习库。 为了比较结果,我们使用类平均准确率和联合交叉 (IoU) 指标。

六、结论

1、性能分析

我们报告了广泛使用的 NVIDIA Titan X GPU 以及 NVIDIA TX1 嵌入式系统模块的推理速度结果。 ENet 旨在在 NVIDIA TX1 板上实现 10 fps 以上,输入图像大小为 640 360,足以满足实际的道路场景解析应用。 对于推理,我们将批量归一化和 dropout 层合并到卷积滤波器中,以加速所有网络。

推理时间

表 2 比较了不同分辨率的单个输入帧的推理时间。 我们还报告每秒可以处理的帧数。 破折号表示由于内存不足,我们无法获得测量结果。 ENet 比 SegNet 快得多,为实时应用程序提供高帧速率,并允许实际使用具有编码器-解码器架构的非常深的神经网络模型。

硬件要求

表 3 报告了不同模型使用的浮点运算数量和参数的比较。 ENet 的效率是显而易见的,因为它的要求要小两个数量级。 请注意,我们报告了以半精度浮点格式保存模型参数所需的存储空间。 ENet 的参数非常少,所需空间仅为 0.7MB,这使得将整个网络安装在嵌入式处理器中极快的片上存储器中成为可能。 此外,这减轻了对模型压缩的需求,使得使用通用神经网络库成为可能。 但是,如果需要在极其严格的内存限制下运行,这些技术仍然可以应用于 ENet。

软件限制

使我们能够达到这些性能水平的最重要的技术之一是卷积层分解。 然而,我们发现了一个令人惊讶的缺点。 虽然应用这种方法让我们大大减少了浮点运算和参数的数量,但它也增加了单个内核调用的数量,使每个内核调用变得更小。

我们发现其中一些操作可以变得如此便宜,以至于 GPU 内核启动的成本开始超过实际计算的成本。 此外,由于内核无法访问先前保存在寄存器中的值,因此它们必须在启动时从全局内存中加载所有数据,并在工作完成时保存。 这意味着使用更多的内核会增加内存事务的数量,因为必须不断地保存和重新加载特征图。 这在非线性操作的情况下变得尤其明显。 在 ENet 中,PReLU 消耗超过四分之一的推理时间。 由于它们只是简单的逐点操作并且很容易并行化,我们假设它是由上述数据移动引起的。

这些是严重的限制,但是可以通过在现有软件中执行内核融合来解决它们,即创建将非线性直接应用于卷积结果的内核,或者在一次调用中执行多个较小的卷积。 GPU 库(例如 cuDNN)的这种改进可以进一步提高我们网络的速度和效率。

2、基准

我们使用 Adam 优化算法来训练网络。 它使 ENet 能够非常快速地收敛,并且在我们使用的每个数据集上训练只需要 3-6 小时,使用四个 Titan X GPU。 它分两个阶段执行:首先我们只训练编码器对输入图像的下采样区域进行分类,然后我们附加解码器并训练网络执行上采样和逐像素分类。 5e-4 的学习率和 2e-4 的 L2 权重衰减以及 10 的批量大小始终提供最佳结果。 我们使用了定义为的自定义类加权方案。 与逆类概率加权相比,当概率接近 0 时,权重是有界的。c 是一个额外的超参数,我们将其设置为 1.02(即,我们将类权重限制在 [1,  50])。

        Cityscapes

该数据集由 5000 个精细标注的图像组成,其中 2975 个可用于训练,500 个用于验证,其余 1525 个已被选为测试集。 Cityscapes 是我们最重要的基准,因为它具有出色的质量和高度变化的道路场景,通常有许多行人和骑自行车的人。 我们对官方评估脚本中选择的 19 个类进行了训练 。 它利用了一个额外的度量,称为联合度量上的实例级交集 (iIoU),它是由平均对象大小加权的 IoU。 如表 4 所示,ENet 在 IoU 和 iIoU 以及 IoU 类别中的表现优于 SegNet。ENet 目前是 Cityscapes 基准测试中最快的模型。 图 4 显示了来自验证集的图像的示例预测。

CamVid

我们测试过 ENet 的另一个汽车数据集是 CamVid。 它包含 367 个训练图像和 233 个测试图像。 有 11 个不同的类别,例如建筑、树木、天空、汽车、道路等,而第 12 个类别包含未标记的数据,我们在训练时会忽略这些数据。 该数据集的原始帧分辨率为 960 720,但我们在训练之前将图像下采样至 480 360。 在表 5 中,我们将 ENet 的性能与现有的最先进算法进行了比较。

ENet 在六个类别中优于其他模型,这些模型很难学习,因为它们对应于较小的对象。 来自测试集的示例图像的 ENet 输出可以在图 5 中找到。

        SUN RGB-D

SUN 数据集由 5285 张训练图像和 5050 张测试图像组成,具有 37 个室内对象类别。我们在这项工作中没有使用任何深度信息,并且仅在 RGB 数据上训练网络。在表 6 中,我们将 ENet 与 SegNet 的性能进行了比较,SegNet 是唯一报告该数据集准确性的神经网络模型。我们的结果虽然在全局平均准确度和 IoU 方面较差,但在类平均准确度上具有可比性。由于全局平均准确率和 IoU 是有利于对占据大图像块的类进行正确分类的指标,因此研究人员通常会强调其他指标在语义分割中的重要性。一个值得注意的例子是引入 iIoU 指标。类平均准确度的可比较结果表明,我们的网络几乎能够像 SegNet 一样区分较小的对象。此外,准确性的差异不应掩盖这两个网络之间巨大的性能差距。 ENet 可以实时处理图像,在嵌入式平台上比 SegNet 快近 20 倍。图 6 显示了来自 SUN 测试集的示例预测。

七、参考代码

GitHub - TimoSaemann/ENet: ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentationhttps://github.com/TimoSaemann/ENet

GitHub - zihaozhang9/ENet: opencv实现的ENet语义分割网络: A Deep Neural Network Architecture for Real-Time Semantic Segmentationhttps://github.com/zihaozhang9/ENet

图 4:ENet 对 Cityscapes 验证集的预测

图 5:CamVid 测试集上的 ENet 预测

图 6:SUN RGB-D 测试集上的 ENet 预测

机器学习笔记 - ENet论文解读相关推荐

  1. 机器学习笔记 - JigsawNet论文解读

    一.摘要 使用卷积神经网络和基于循环的组合的碎片图像重组 这里提出了一种新的算法,可以将任意切碎的图像重新组装到其原始状态.现有的重组管道通常由一个局部匹配阶段和一个全局组合阶段组成.在局部阶段,片段 ...

  2. NeurIPS 2019年十篇机器学习领域的论文解读:来自谷歌、Facebook、普林斯顿大学、斯坦福大学最新研究成果

    本文整理总结了NeurIPS 2019上十篇机器学习领域的论文,这些论文来自谷歌.Facebook.普林斯顿大学.斯坦福大学等团队的最新研究成果,供大家参考学习. Differentiable Ran ...

  3. 机器学习笔记 - YOLOv7 论文简述与推理

    一.概述 YOLO 系列对象检测模型已经取得了长足的进步. YOLOv7 是这个著名的基于锚的单次目标检测器系列的最新成员. 它带来了一系列改进,包括最先进的准确性和速度. 以 COCO 数据集为基准 ...

  4. 机器学习:MixMatch 论文解读

    最近谷歌出了一篇有关半监督学习的 paper,几乎可以说是到目前为止,半监督学习领域的集大成者了,在常用的数据集上,取得了非常惊人的效果.这篇 paper,基本把之前半监督学习领域,有用的方式方法都尝 ...

  5. 机器学习笔记 - YOLO家族简介

    一.背景概述 目标检测是计算机视觉中最重要的课题之一.大多数计算机视觉问题都涉及检测视觉对象类别,如行人.汽车.公共汽车.人脸等.这一领域不仅限于学术界,而且在视频监控.医疗保健.车载传感和自动驾驶. ...

  6. 【论文解读】ICLR 2021 |可信多模态机器学习:兼听则明,信而有征

    论文解读:韩宗博 硕士研究生 | 天津大学 智能与计算学部 指导老师:张长青,天津大学副教授,博士生导师 1. 方法动机 多模态人工智能技术正在被广泛应用到智能医疗.无人系统等重要领域,设计精准.可靠 ...

  7. 【NeurIPS100】谷歌、Facebook、斯坦福等十篇机器学习最新论文解读

    NeurIPS 2019虽然刚刚落幕,但是学习的任务还远未结束. 今天我们整理了NeurIPS 2019上十篇机器学习领域的论文,这些论文来自谷歌.Facebook.普林斯顿大学.斯坦福大学等团队的最 ...

  8. 论文解读《Evaluating the visualization of what a Deep Neural Network has learned》–阅读笔记

    本文属于原创,转载请注明出处 *本论文解读的初衷: 1.由于某些原因,最近有关注到神经网络可解释性与可视化方向的发展. 2.本人习惯阅读优秀的博文后直接点赞收藏,而这篇却没有搜到相关解读,不知道是不是 ...

  9. 《基于机器学习的雷达辐射源分选与识别技术研究》论文解读

    <基于机器学习的雷达辐射源分选与识别技术研究>论文解读 Data:2023-2-04 Ref: 李雪琼, "基于机器学习的雷达辐射源分选与识别技术研究," PhD Th ...

最新文章

  1. vue 可合并表格组件_merge-table
  2. Qt5.9使用QWebEngineView加载网页速度非常慢,问题解决
  3. 索尼服务器维护时间,索尼云服务器
  4. java集合——具体的集合
  5. 有源带阻和无源带阻的区别_一文看懂AOC有源光缆与DAC高速线缆的差异
  6. python+HEG对mod021km数据进行几何校正、辐射定标
  7. js把txt转为html,js格式化文本为html标签
  8. 阿里矢量库的图标使用教程(在线,下载)
  9. 苹果ipad有哪几款_别再乱买了!一篇文章讲清楚不同型号iPad之间的区别
  10. 抽样调查之分层随机抽样
  11. 中小学生计算机编程笔试,计算机编程笔试题
  12. 跟着Cell学作图| 11.Ingenuity Pathway Analysis(IPA)
  13. 晒往期云栖大会的照片或感想_赢2017杭州云栖大会门票
  14. 灵活无成本的ITSM系统|ServiceHot ITSOM
  15. 关于临时HY学长被安排拉二分题不想翻译找到DYM学长这件事
  16. 社交电商难定义,蘑菇街、小红书、拼多多注定要兵分三路?
  17. 安卓camera2 API获取YUV420_888格式详解
  18. 【定义】三角形行列式和对角行列式
  19. 全球及中国空气净化器市场销售模式与营销策略前景咨询报告2022版
  20. python 从大到小循环_Python循环小实例----猜大小

热门文章

  1. 西昌学院的计算机专业,西昌学院有哪些专业
  2. Qt开源作品27-鼠标定位十字线
  3. options请求方式
  4. yocs_velocity_smoother速度平滑包的动态参数设置
  5. 马斯克的星链计划原理是什么,快跟室友一起学习一手卫星链路设计吧
  6. HashMap是什么
  7. 天池比赛-01-用随机森林进行信贷违约预测-Baseline
  8. matlab建模怎么移动箭头,如何使用箭头键在屏幕上移动图形?
  9. vue如何配置兼容ie es6转es5
  10. 如何成为某个领域的达人?