XMen:使用 Atkinson-Shiffrin 记忆模型进行长期视频对象分割

摘要

受Atkinson-Shiffrin记忆模型的启发,我们提出了一种用于长视频的视频目标分割体系结构XMem,它具有统一的特征记忆存储。关于视频目标分割的现有工作通常只使用一种类型的特征记忆。对于长于一分钟的视频,单一功能内存模型将内存消耗和准确性紧密联系在一起。相反,遵循Atkinson-Shiffrin模型,我们开发了一个包含多个独立但深度连接的特征记忆存储的体系结构:快速更新的感觉记忆、高分辨率工作记忆和紧凑从而持续的长期记忆。重要的是,我们开发了一种记忆增强算法,该算法定期将活跃使用的工作记忆元素整合到长期记忆中,从而避免了内存爆炸,并将长期预测的性能衰减降至最低。与新的内存读取机制相结合,XMem在长视频数据集上的性能大大超过了最先进的方法,而在短视频数据集上的性能与最先进的方法(不适用于长视频)不相上下。

1.引言

视频目标分割(VOS)突出显示给定视频中的特定目标对象。这里,我们关注半监督设置,其中第一帧注释由用户提供,并且该方法尽可能准确地分割所有其他帧中的对象,同时优选地实时、在线地运行,并且即使在处理长视频时也具有小的存储器占用。

由于信息必须从给定的注释传播到其他视频帧,所以大多数VOS方法使用特征存储器来存储对象的相关深层网络表示。在线学习方法[3,49,42]使用网络的权重作为其特征记忆。这需要在测试时进行训练,这会降低预测速度。递归方法通常通过掩码[39]或通过隐藏表示[20,47]从最近的帧传播信息。这些方法容易漂移,并与遮挡作斗争。最近的最先进的VOS方法使用注意[36,18,54,9,60]来将存储在特征存储器中的过去帧的表示与从需要分割的新观察到的查询帧中提取的特征相关联。尽管这些方法的性能很高,但它们需要大量的GPU内存来存储过去的帧表示。在实践中,他们通常很难在消费级硬件上处理超过一分钟的视频。

有专门为长视频中的VO设计的方法[29,27]。然而,他们经常牺牲分割质量。具体地说,这些方法通过将新特征与已存储在特征存储器中的特征合并来在特征存储器插入期间减小表示的大小。由于高分辨率特征被立即压缩,它们产生的分割精度较低。图1显示了短/长视频数据集中GPU内存消耗与分割质量之间的关系(详细信息见4.1节)。

我们认为,这种性能和GPU内存消耗之间的不良关联是使用单一功能内存类型的直接结果。为了解决这一限制,我们提出了一种称为XMem的统一存储体系结构。受阿特金森(Shiffrin)记忆模型[1]的启发,该模型假设人类的记忆由三个组成部分组成,XMem保持着三个独立但紧密联系的特征记忆存储:快速更新的感觉记忆高分辨率的工作记忆,以及紧凑的持续的长期记忆。在XMem中,感觉记忆对应于GRU[11]的隐藏表示,它每一帧都会更新。它提供了时间平滑,但由于表示漂移而无法进行长期预测。作为补充,工作记忆是从历史框架的子集聚集而来,并同等地考虑它们[36,9],而不会随着时间的推移而漂移。为了控制工作记忆的大小,XMem受人类记忆中的巩固机制的启发,例行公事地将其表示整合到长期记忆中[46]。XMem将长期记忆存储为一组高度紧凑的原型。为此,我们开发了一种记忆增强算法,该算法将更丰富的信息聚合到这些原型中,以防止因次采样而产生的混叠。为了从工作和长期记忆中读取信息,我们设计了一种时空记忆读取操作。这三个功能内存存储结合在一起,允许以高精度处理长视频,同时保持较低的GPU内存使用量。

我们发现XMem大大超过了在Long-time Video数据集上的先前最先进的结果[29]。重要的是,XMem在短视频数据集上也与当前最先进的(不能处理长视频的)不相上下[41,57]。总而言之:

  • 我们设计了XMem。受Atkinson{Shiffrin记忆模型[1]的启发,我们引入了不同时间尺度的内存库,并为它们配备了内存读取操作,以实现对长视频和短视频的高质量视频对象分割。
  • 我们开发了一种记忆巩固算法,它从工作记忆中选择具有代表性的原型,以及一种记忆增强算法,它将这些原型丰富为一个紧凑而强大的表示,用于长期记忆存储。

2.相关工作

一般的VOS方法。大多数VOS方法使用特征存储器来存储第一帧中给出的信息并分割任何新帧。在线学习方法要么在测试时训练或微调他们的网络,因此在推理方面通常很慢[3,49,32]。最近的改进更有效率[34,42,37,2],但它们仍然需要在线适应,这对输入很敏感,当有更多的训练数据时,收益会减少。相比之下,基于跟踪的方法[39,52,10,22,5,35,63,19,47,20,56]执行帧到帧传播,因此在测试时间是有效的。然而,它们缺乏长期的背景,并且经常在物体遮挡后失去踪迹。虽然一些方法[48,59,53,23,26,6]也包括用于全局匹配的第一参考帧,但上下文仍然有限,并且随着视频的进展,匹配变得更加困难。为了解决上下文限制,最近最先进的方法使用更多过去的帧作为特征记忆[36,13,64,21,28,58,16]。特别是,时空记忆(STM)[36]很受欢迎,并被许多后续工作扩展[43,8,18,54,50,31,9,44,33]。在这些扩展中,我们使用STCN[9]作为我们的工作记忆骨干,因为它简单而有效。然而,由于STM的功能记忆库不断扩大,大多数变体无法处理长视频。AOT[60]是最近的一项工作,它将注意力机制扩展到transformers,但没有解决GPU内存爆炸问题。一些方法[33,14]使用局部特征记忆窗口,该局部特征记忆窗口未能考虑该窗口之外的长期上下文。相比之下,XMem使用多个内存存储来捕获不同的时间上下文,同时由于我们的长期内存和整合,使GPU内存使用严格受限。

专门处理长视频的方法。梁等人[29]提出了AFB-URR算法,如果给定的记忆元素与现有的记忆元素接近,则选择性地使用指数移动平均将其与现有记忆元素合并,否则将其作为新元素添加。当特征记忆达到预定义限制时,采用基于最不频繁使用的机制来移除未使用的特征。Li等人[27]提出全局背景模式。它平均了所有过去的记忆转换成单一的表示形式,从而使GPU内存随时间零增长。然而,这两种方法都急于将新的高分辨率特征记忆压缩到紧凑的表示中,从而牺牲了分割精度。我们的多存储功能记忆避免了急切的压缩,并在短期和长期预测中实现了更高的准确性。

3.XMem

3.1 概述

 图2。XMem 概述。内存读取操作从所有三个内存存储中提取相关特征,并使用这些特征生成掩码。为了合并新的记忆,感觉记忆每帧更新一次,而工作记忆只在第 r 帧更新一次。当工作记忆充分时,工作记忆以一种紧凑的形式合并为长期记忆,长期记忆随着时间的推移会忘记过时的特征。

图2提供了XMem的概述。为了可读性,我们考虑单个目标对象。但是,请注意,实现XMem是为了处理多个对象,这很简单。给定第一帧中的图像和目标对象掩码(图2的左上角),XMem跟踪目标并为后续查询帧生成相应的掩码。为此,我们首先使用输入初始化不同的功能记忆存储。对于随后的每个查询帧,我们分别从长期记忆(第3.3节)、工作记忆(第3.4节)和感觉记忆(第3.5节)执行记忆读取(第3.2节)。读出特征被用来生成分段掩码。然后,我们以不同的频率更新每个特征记忆存储。我们每一帧更新感觉记忆,并在每第r帧将特征插入到工作记忆中。当工作记忆达到预定义的最大Tmax帧时,我们将工作记忆中的特征以高度紧凑的形式整合到长期记忆中。当长期内存也已满时(只有在处理数千帧后才会发生),我们会丢弃过时的功能以限制最大的GPU内存使用量。这些功能内存存储协同工作,即使对于非常长的视频,也能以较低的GPU内存使用率提供高质量的功能。

XMem由三个端到端可训练卷积网络组成,如图3所示:提取特定于查询的图像特征的查询编码器、采用存储器读取步骤的输出以生成对象掩码的解码器、以及将图像与对象掩码组合以提取新的存储器特征的值编码器。有关这些网络的详细信息,请参见第3.6节。在下文中,我们将首先描述内存读取操作,然后再详细讨论每个功能内存存储。

图3. 一个查询帧的内存读取和掩码解码过程。我们从图像中提取查询 q,并从工作/长时记忆中进行基于注意的记忆阅读以获得特征 F。对于每一个 r 帧,我们将新的特征存储到工作记忆中,并对感觉记忆进行深度更新 

3.2 内存读取

图3说明了单个帧的存储器读取和掩码生成过程。掩码是通过解码器计算的,解码器使用短期感觉记忆ht−1∈Rch×H×W和表示存储在长期记忆和工作记忆中的信息的特征F∈Rcv×H×W作为输入。

通过读出操作计算表示存储在长期记忆和工作记忆两者中的信息的特征F

这里,k∈Rck×N和v∈Rcv×N是存储在长期记忆和工作记忆中的总共N个记忆元素的Ck和Cv维键和值。此外,W(k,q)是大小为N×HW的亲和度矩阵,表示由关键字k和通过查询编码器从查询帧获得的查询q∈Rck×HW控制的读出操作。读出操作将每个查询元素映射到所有N个存储元素上的分布,并相应地聚合它们的值v。

通过对包含每个关键元素和每个查询元素之间的成对相似度的相似度矩阵S(k,q)的存储维度(行)应用Softmax来获得亲和度矩阵W(k,q)。为了计算相似度矩阵我们注意到STCN[9]中提出的L2相似性比点积[36]更稳定,但是它的表现力较差,例如,它不能编码存储元件的置信度水平。为了克服这个问题,我们通过引入两个新的尺度项,打破了键和查询之间的对称性,提出了一个新的相似性函数(各向异性L2)。图4显示了它们的效果。

具体地,该关键字与收缩项s ∈[1;∞)N相关联,并且查询与选择项e∈[0,1]ck×hw相关联。然后,通过计算第i个关键元素和第j个查询元素之间的相似度

如果对于所有i、j和c,si=ecj=1,则其等于原始L2相似性[9]。收缩项s直接缩放相似性并显式编码置信度{高的收缩表示低的置信度,并导致更多的局部影响。请注意,如果查询恰好与其重合,即使是低置信度的键也可能有很高的贡献{从而避免了点积的内存支配问题,如[9]中所讨论的。不同地,选择项e控制键空间中每个频道的相对重要性,从而将注意力给予更具区分性的频道。

选择项e与查询q一起由查询编码器生成。收缩项s与密钥k和来自工作和长期记忆的值v一起被收集。该集合被简单地实现为最后一维中的串联:k=kw⊕kLt和v=vw⊕vlt,其中上标‘w’和‘lt’分别表示工作记忆和长期记忆。工作存储器由密钥kw 2 Rck×THW和值Vw 2 Rcv×THW组成,其中T是工作存储器帧的数量。长期存储器类似地由密钥KLT 2RCK×L和值VLT 2RCV×L组成,其中L是长期记忆原型的数量。因此,工作/长时记忆中的元素总数为N=T HW+L。

接下来,我们将详细讨论功能内存存储。

3.3 长期记忆

动机。长期记忆对于处理长视频至关重要。为了存储一组紧凑(消耗很少的GPU内存)但又具有代表性(导致高分割质量)的内存特征,我们设计了一个内存整合过程,从工作内存中选择原型,并使用记忆增强算法来丰富它们,如图5所示。

当工作内存达到预定义大小Tmax时,我们执行内存合并。第一帧(具有用户提供的基本事实)和最新的TMIN−1存储帧将作为高分辨率缓冲器保存在工作存储器中,而其余帧(Tmax−TMIN帧)是转换为长期存储器表示的候选。我们将这些候选者的关键字和值分别称为kc⊂kw和vc⊂vw。在下文中,我们描述挑选一组紧凑的原型密钥Kp⊂Kc的原型选择过程,以及生成与这些原型密钥相关联的丰富原型值Vp的记忆增强算法。最后,这些原型键和值被附加到长期存储器KLT和VLT。

原型选择。在这一步中,我们从候选对象中抽样一个具有代表性的小子集KP⊂KC作为原型。只挑选少量的原型是至关重要的,因为它们的数量与由此产生的长期记忆的大小直接成正比。受人类记忆的启发,我们将频繁访问或学习的模式转移到长期存储中,选择使用率较高的候选模式。具体地说,我们选取了排名前P位的候选人作为原型。一个记忆元素的使用由其在亲和度矩阵W(式(1))中的累积总亲和度(概率质量)来定义,并由每个候选在工作记忆中的持续时间来归一化。请注意,每个候选的持续时间至少r·(Tmin−1),从而实现稳定的使用统计。我们得到了这些原型的key为Kp∈Rck×P。

记忆力增强。注意,到目前为止,我们对候选关键字Kc的原型关键字Kp的采样既是稀疏的又是离散的。如果我们以相同的方式对样本值Vp进行采样,得到的样本值将不可避免地低于其他候选样本值,并容易出现混淆。防止混叠的常见技术是应用抗混叠(例如,高斯)过滤器[15]。出于同样的动机,我们进行过滤,并将更多的信息聚合到每个采样的原型中。虽然标准过滤可以很容易地在图像平面(2D)或时空体积(3D)上执行,但它导致了模糊的特征,尤其是在对象边界附近。为了缓解,我们代之以在高维(Ck)key空间中构建用于过滤的邻域,从而利用由keys Kp和Kc给出的高度表达的邻接信息。由于无论如何都必须计算和存储这些keys以用于内存读取,因此在运行时和内存消耗方面也是经济的。

具体地说,对于每个原型,我们通过加权平均来聚集来自所有值候选VC的值。权重是使用基于关键点相似性的Softmax来计算的。为此,我们方便地重用了公式(2)。通过用候选密钥Kc替换存储密钥k,用原型密钥Kp替换查询Q,得到相似度矩阵S(Kc,Kp)。和以前一样,我们使用Softmax来获得亲和力矩阵W(Kc,Kp)(其中每个原型对应于候选对象上的分布)。然后,我们通过计算原型值Vp

最后,将Kp和Vp分别附加到长时记忆KLT和VLT中。请注意,类似的原型近似已用于transformers[55,38]。不同的是,我们的方法使用了一种新的适用于视频对象分割的原型选择方案。

 删除过时的特征。虽然长期内存非常紧凑,压缩率很高(>6000%),但由于我们不断添加新功能,内存仍然可能溢出。根据经验,使用6 GB内存预算(例如消费级中端GPU),我们可以处理多达34,000帧,而不会遇到任何内存问题。为了处理更长的视频,我们引入了类似于[29]的最不常用(LFU)驱逐算法。与[29]不同,Our\Usage\“(如第3.3节,原型选择中所定义的)由top-k过滤后的累积亲和度定义[8],这绕过了引入额外的阈值超参数。当达到预定义的内存限制时,使用率最低的长期内存元素将被逐出。

长期记忆是实现长视频高效准确分割的关键。接下来,我们讨论工作记忆,这是准确的短期预测的关键。它是长期记忆的基础。

3.4 工作记忆

工作记忆将高分辨率特征存储在临时缓冲区中。它有助于在几秒钟的时间上下文中进行准确的匹配。它还充当进入长期记忆的门户,因为每个记忆元素的重要性是通过它们在工作记忆中的使用频率来估计的。

在我们的多存储特征记忆设计中,我们发现工作记忆的经典实例化足以产生良好的结果。我们在很大程度上采用了基准STCN风格的[9]特征记忆库作为我们的工作记忆,我们将对其进行简要描述以确保其完整性。我们建议读者参考[9]以了解详细信息。然而,请注意,我们的内存读取步骤(第3.2节)有很大不同。工作存储器由密钥kw∈Rck×THW和值Vw∈Rcv×THW组成,其中T是工作存储器帧的数目密钥是从图像编码的,并且驻留在与查询Q相同的嵌入空间中,而值是从图像和掩码两者编码的。图3的右下角说明了工作内存更新过程。在每第r帧,我们1)将查询复制为新的关键字;以及2)通过将图像和预测的掩码馈送到值编码器来生成新值。新的键和值被附加到工作存储器,并在随后的帧的存储器读取中使用。为了避免内存爆炸,我们通过将额外的帧合并到长期内存存储中来限制工作内存T中的帧数量T:Tmin≤T<Tmax,如第3.3节所述。

3.5 感觉记忆

感觉记忆以短期记忆为主,保留了物体位置等低水平信息,这很好地弥补了工作记忆/长期记忆中时间局部性的不足。与工作记忆类似,我们找到了一个经典的基线来很好地工作。

具体地说,感觉记忆存储隐藏的表示ht∈Rch×H×W,被初始化为零矢量,并由门控递归单元(GRU)[11]传播,如图6所示。这种感觉记忆使用解码器的多尺度特征每一帧都被更新。在每第r个帧,每当生成新的工作记忆帧时,我们都会执行深度更新。来自值编码器的特征被用来用另一个GRU刷新感觉记忆。这允许感觉记忆1)丢弃已经保存到工作记忆中的冗余信息,以及2)在我们重新使用现有特征时以最小的开销从深层网络(即,值编码器)接收更新。

3.6 实施细节

在这里,我们描述一些关键的实现细节。要完全复制训练和推理,请参阅我们的开放源码实现(脚注1)。

网络。遵循通常的做法[36,43,29,9],我们采用ResNets[17]作为特征提取工具,去掉了分类头和最后一个卷积阶段。这会产生步幅为16的特征。查询编码器基于ResNet-50,值编码器基于ResNet-18,如下[9]。为了生成查询q、收缩项s和选择项e,我们将单独的3x3卷积投影应用于查询编码器特征输出。请注意,查询和收缩项都用于当前查询框架,而选择术语被复制到内存中(沿着图3中的复制路径),以便以后在插入新的工作内存时使用。我们在[9]之后设置Ck=64,Cv=512,Ch=64。为了将收缩系数的范围控制在[1;1)内,我们采用(·)2+1,并且为了将选择系数的范围控制在[0;1]内,我们应用S型。

解码器将隐藏表示HTSTM 1和读出特征F级联,然后在−[36]之后,在每个级别融合来自查询编码器的跳过连接的同时,每次迭代上采样2X,直到步长4。通过3×3卷积将STRIDE 4特征图投影到单通道Logit,并对其进行双线性上采样以达到输入分辨率。在多对象场景中,我们使用软聚集[36]来融合来自不同对象的最终日志。注意,大量计算(即,查询编码器、亲和度W)可以在不同对象之间共享,因为它们仅以图像[9]为条件。

训练。在[36,43,29,9]之后,我们首先在通过变形静态图像生成的长度为3的合成序列上对我们的网络进行预训练。我们原封不动地采用STCN[9]的开源实现,训练在[45,51,25,62,7]上。接下来,我们在YouTubeVOS[57]和Davis[41]上执行主要训练,并进行课程抽样[36]。我们注意到,默认序列长度3不足以训练感觉记忆,因为它将严重依赖于初始状态。因此,我们取而代之的是长度为8的序列样本。为了减少训练时间和进行正则化,在训练时间内随机选择最多三个(而不是所有)过去的帧作为任何查询的工作记忆。在两个RTX A6000 GPU上,整个培训过程大约需要35个小时。深度更新以0.2的概率执行,该概率为1=r,因为我们在[9]之后默认使用r=5。可选的是,我们还预先训练了BL30K[8,12,4],这进一步提高了准确率。我们用星号(∗)标记任何使用BL30K的方法。

在[60]之后,我们使用自举交叉熵损失和骰子损失,加权相等。对于优化,我们使用AdamW[24,30],学习率为1e-5,权重衰减为0.05,在静态图像预训练中用于批次为16的150K迭代,在主训练中用于批次为8的110K迭代。在第一次80K迭代后,我们将学习速率降低了10倍。为了进行公平的比较,我们还使用上述设置重新训练了STCN[9]基线。STCN的性能没有显著差异(见附录)。

4.实验

除非另有说明,否则我们使用Tmin=5、Tmax=10和P=128,从工作记忆到长期记忆的压缩比为6328%。我们将长期内存元素的最大数量设置为10,000,这意味着XMem永远不会消耗超过1.4 GB的GPU内存,即使是在移动设备上也可能支持应用程序。当k=30时,我们使用top-k过滤[8]。
默认使用480P视频。为了进行评估,我们使用标准指标(越高越好)[40]:贾卡德指数J、轮廓精度F及其平均值J&F。对于YouTubeVOS[57],J和F是分别计算\Seed\“和\unSeed\”类的,分别由下标S和U表示。G是看得见的和看不见的类别的J&F的平均值。对于AOT[60],我们将其R50变体与具有与我们相同的ResNet主干的R50变体进行比较。

4.1 长期视频数据集

4.2 短期视频数据集

4.3 消融实验

4.4 局限性

我们的方法有时候会失败,当目标物体移动太快或有严重的运动模糊,因为即使是最快的更新感官记忆不能赶上。请参阅附录中的例子。我们认为拥有大视野的感官记忆比我们的基线实例化更有效。

5.结论

我们给出了第一个用于视频对象分割的多存储特征存储模型 XMem {。XMem 以最小的 GPU 内存使用率实现了优秀的性能,适用于长视频和短视频。我们相信 XMem 是在移动设备上实现可访问 VOS 的一个很好的步骤,我们希望引起人们对更广泛应用的长期 VOS 任务的关注。

XMem: Long-Term Video Object Segmentationwith an Atkinson-Shiffrin Memory Model(论文翻译)相关推荐

  1. 【翻译】Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector论文翻译

    [论文翻译]:Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector [论文来源]:Few-Shot Obje ...

  2. 《Fast Video Object Segmentation by Reference-Guided Mask Propagation》论文阅读

    Abstract 我们提出了一种有效的半监督视频对象分割方法. 与其他方法相比,我们的方法在运行时间很短的情况下实现了与最先进的方法相比的准确性.为此,我们提出了一个深度的Siamese编码器 - 解 ...

  3. 《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》论文翻译

    原文:https://arxiv.org/abs/1506.01497 Faster R-CNN: Towards Real-Time ObjectDetection with Region Prop ...

  4. Object Detection in 20 Years A Survey-论文翻译(阅读笔记)

    Object Detection in 20 Years A Survey论文翻译(阅读笔记) 原文地址:[1905.05055] Object Detection in 20 Years: A Su ...

  5. 视频物体分割--One-Shot Video Object Segmentation

    One-Shot Video Object Segmentation CVPR2017 http://www.vision.ee.ethz.ch/~cvlsegmentation/osvos/ One ...

  6. 视频目标检测--Flow-Guided Feature Aggregation for Video Object Detection

    Flow-Guided Feature Aggregation for Video Object Detection https://arxiv.org/abs/1703.10025 Our fram ...

  7. 视频编辑利器,不喜欢就框除!开源视频物体移除软件video object removal

    点击我爱计算机视觉标星,更快获取CVML新技术 image inpainting 像上图中的image inpainting相信大家并不陌生,OpenCV就有相关的例子. 但如果是去除视频里的目标呢, ...

  8. VideoMatch: Matching based Video Object Segmentation

    Abstract: 1.视频目标分割是一个很重要的挑战,对于各种各样的视频分析任务.最近视频目标分割任务基于深度网络取得了state-of-the-art的结果. 2.由于作为预测任务的表述,这些方法 ...

  9. MaskRNN Instance Level Video Object Segmentation 论文翻译

    摘要 实例级视频对象分割是视频编辑和压缩的一项重要技术.为了捕获时间的一致性,本文中,我们开发了MaskRNN,一个递归的神经网络方法,它在每个框架中融合了两个深网的输出,每个对象实例--一个提供一个 ...

最新文章

  1. 显著性目标检测代码全汇总!(包含2D、3D、4D以及Video)
  2. RecyclerView的滚动事件OnScrollListener研究
  3. python软件界面-用Html来写Python桌面软件的UI界面-htmlPy
  4. 安卓Socket处理
  5. 好工作为什么会与你擦肩而过?
  6. oracle的env函数用法,env命令_Linux env 命令用法详解:显示系统中已存在的环境变量...
  7. 海报样机模型帮助以专业的方式展示你的设计
  8. 云服务器显示隐藏文件,云服务器显示隐藏文件
  9. 李开复:2018中国最大AI红利?是政策
  10. linux windows 区别
  11. UI设计中图标类型指南
  12. HDU 2037 (贪心或记忆化搜索)
  13. 【水文】2345——卸载!拜拜了您嘞
  14. Vue3.0笔记(B站天禹老师)
  15. 解决Commend 'ifconfig' not found , but can be installed whith............ifconfig不能查看ip问题
  16. 【Scratch-外观模块】背景切换指令
  17. 托尔斯泰《战争与和平》主要人物
  18. vue 动态设置 echarts 画布大小 更新图表数据
  19. ec20 以太网_以太网光纤收发器有什么作用?
  20. matlab中som结果,matlab神经网络工具箱中的som怎么使用

热门文章

  1. Latex系列3---页面设置+字体字号+颜色符号
  2. 【04Vue3 目录结构】VUE3目录结构概述结构详解目录结构的作用注意事项
  3. linux vim 搜索关键词,Linux_vim 计算搜寻关键字数量,在看过 vim 的全域指令和 search - phpStudy...
  4. 大数据(一) - hadoop生态系统及版本演化
  5. VUE iView之栅格布局响应式布局
  6. 嵌入式Qt 开发一个视频播放器
  7. Java中如何优雅的把Map转为对象
  8. c语言helloworld代码(c语言helloworld代码编写)
  9. 关于单引号单引号还是双引号的概述
  10. 2023年最新软著申请流程(一):软件著作权说明、国家版权官网的账号注册与实名认证