Self-supervised Video Object Segmentation by Motion Grouping

Self-supervised Video Object Segmentation by Motion Grouping



前言

基于运动分组的自监督视频对象分割


摘要

在这里插入图片描述

图1。分割伪装的动物。运动在增强我们视觉系统的感知能力方面起着至关重要的作用在复杂场景中分组——例如,在这些序列中(MoCA数据集[41]),视觉外观(RGB图像)明显缺乏信息。我们提出了一种仅使用运动(即光流)分割物体的自监督方法。从上排到下排,我们展示了视频帧、连续帧之间的光流以及我们的方法产生的分割

动物已经进化出高度功能的视觉系统理解运动,即使在复杂的环境中也能辅助感知。在这篇论文中,我们致力于开发一种能够通过挖掘运动线索来分割物体的计算机视觉系统,即运动分割。我们做以下贡献:首先,我们引入了一个简单的Transformer变量,将光流帧分割成主要对象和背景。其次,我们训练以自我监督的方式构建架构,即不使用任何手动注释。第三,我们分析了几个关键我们的方法和进行彻底消融的组成部分研究以验证其必要性。第四,我们评估在公共基准上提出的架构(DAVIS216,SegTrackv2和FBMS59)。尽管只使用光流作为输入,我们的方法取得了优于或可比于先前最先进的自我监督方法的结果,同时速度快一个数量级。我们还对具有挑战性的伪装数据集(MoCA)进行了评估,显著优于其他自我监督方法,并与最高监督方法相比具有优势方法,强调运动线索的重要性,以及现有视频分割模型中对视觉外观的潜在偏见。

1 引言

当我们环顾世界时,我们毫不费力地将一个复杂的场景感知为一组不同的物体。这种现象被称为感知分组——组织传入视觉信息的过程——通常被认为是一种基本的认知能力,能够有效地理解世界并与世界互动。考虑到视觉输入在某种意义上只是各种颜色的单个点/像素的空间分布,我们如何实现如此显著的百分比成就?1923年,Wertheimer[80]首次推出了格式塔原理,旨在阐明将感官数据组织成组的潜在原因,或格式塔。这些原则很像启发式的“一袋技巧”[59],视觉系统可以利用这些技巧进行分组,例如接近度、相似性、闭合性、连续性、共同命运等。在计算机视觉中,感知分组通常与分割问题密切相关,即从杂乱的场景中提取具有任意形状(像素标签)的对象。在最近的语义或实例分割文献中,通过在图像或视频数据集上训练深度神经网络取得了巨大的进展。虽然看到机器能够检测、分割和分类图像或视频帧中的对象是令人兴奋的,但通过监督学习训练这样的分割模型需要大量的人工注释,从而限制了它们的可扩展性。更重要的是,仅通过静态帧中的外观就可以很好地识别对象的假设往往过于简单——对象并不总是在视觉上与背景环境区分开来。例如,当试图从背景中发现伪装的动物/物体时(图1),通常需要额外的线索,如运动或声音。
在众多线索中,运动通常很容易获得,因为它可以从未标记的视频中隐式生成。在本文中,我们的目标是以自我监督的方式利用这些线索进行对象分割,即训练不需要任何人工注释。在高层次上,我们的目标利用共同命运原理,基本假设是,如果元素以相同的速度沿相同的方向移动(具有相似的光流),它们往往会被视为一个群体。具体来说,我们通过训练一个生成模型来解决这个问题,该模型将光流分解为前景(对象)和背景层,将每个层描述为均匀场,不连续性仅发生在层之间。我们采用Transformer[3]的一个变体,将自我注意替换为槽注意[46],其中迭代分组和绑定已内置于架构中。通过一些关键的结构变化,我们证明了经历相似运动的像素被分组在一起并分配到同一层。

总之,我们做出了以下贡献:首先,我们介绍了一种简单的视频对象分割架构,通过利用运动,仅使用光流作为输入。其次,我们提出了一种自我监督的代理任务,用于在没有任何手动监督的情况下训练架构。第三,我们对我们架构成功的关键组件进行了彻底的消融研究,例如从各种帧间隙计算出的光流一致性损失。第四,我们在公共基准上评估了所提出的架构(DAVIS2016[55]、SegTrackv2[42]和FBMS59[56]),其性能优于先前最先进的自监督模型,与监督方法的性能相当。此外,我们还对伪装数据集进行了评估(MoCA[41]),证明了与其他自我和监督方法相比,性能有了显著提高,突出了运动线索的重要性,以及现有视频分割模型中对视觉外观的潜在偏见。

2 相关工作

图像对象分割是计算机视觉中一个由来已久的任务,它涉及将属于图像的像素(或边缘)分割成组(如对象)。在最近的文献[ 5、10、12、16、24、25、31、34、35、39、40、51、52、53、54、57、71、73、74、75、77、84、84、87]中,半监督视频对象分割(半监督VOS )和无监督视频对象分割(无监督VOS )这两个协议引起了视觉界越来越多的兴趣。前者旨在使用像素掩码重新定位视频第一帧中指定的一个或多个目标,后者考虑在视频序列中自动将感兴趣目标(通常是最突出的一个)从背景中分离出来。尽管被称为无监督的VOS,但在实践中,解决此类问题的流行方法广泛依赖于有监督的训练,例如,使用在大规模外部数据集上训练的双流网络[ 16、31、54、71]。作为替代,在这项工作中,我们考虑一个完全无监督的问题,其中没有任何人工标注用于训练。

运动分割与无监督的VOS有一定的相似性,但侧重于发现运动目标。在文献中,[ 10、36、52、63、83]考虑对具有相似运动模式的像素进行聚类;[ 16、70、71]训练深度网络,将运动映射到分割掩模。另一行工作通过显式地利用在流场中,移动对象和它的背景之间的独立性来解决这个问题。例如,文献[ 86 ]提出了一种对抗设置,训练一个生成器来产生掩码,改变输入流,使得画师无法估计缺失的信息。在[ 6、7、41]中,作者提出通过补偿背景运动来突出独立运动物体,或者通过注册连续帧,或者显式估计相机运动。在受限场景下,如自动驾驶领域[ 61 ],提出联合优化深度、相机运动、光流和运动分割。

光流计算是计算机视觉的基本任务之一。深度学习方法允许高效的光流计算,无论是在合成数据[ 68,69]的监督学习中,还是在[ 44、45]的自监督学习中。流已被广泛用于各种问题,偶尔甚至用于代替外观线索( RGB图像)用于跟踪[ 62 ]、姿态估计[ 19 ]、表示学习[ 50 ]和运动分割[ 10 ]。

Transformer架构已被证明非常擅长通过注意力机制来建模输入序列中的长期关系。最初用于语言任务[ 3、9、18],后来被改编用于解决流行的计算机视觉问题,如图像分类[ 20 ]、生成[ 14、60]、视频欠采样[ 4、27、79]、目标检测[ 13 ]、零样本分类[ 58 ]等。在这项工作中,我们从自注意力的一个特殊变体- -slot attention[ 46 ]中获得灵感,slot attention被证明可以有效地在合成数据集上学习以对象为中心的表示,例如。CLEVR。

分层表示最初由Wang和Adelson [ 76 ]提出,用于将视频表示为具有更简单运动的层的组合。自此,图像和视频的分层表示在计算机视觉[ 8、33、38、85、90]中得到了广泛的应用,通常用来估计光流[ 66、67、81、82]。最近,基于深度学习的层分解方法被用来推断新视角合成[ 65、88]、分离反射和其他半透明效果[ 1、2、26、47]的深度,或者进行前景/背景估计[ 26 ]。这些工作对RGB输入进行操作并产生RGB层,而我们提出了一种用于无监督运动目标发现的光流输入分层分解。

以对象为中心的表示以"对象"为基本构建块(而不是单个像素)来解释场景,这被认为是向人类级泛化迈出的重要一步。关于这个主题有丰富的文献,例如,在[ 29 ]中,IODINE模型使用迭代变分推断来循环地推断一组潜变量,每个潜变量代表图像中的一个对象。类似地,MONet [ 11 ]和GENESIS [ 21 ]也采用了多重编解码步骤。相比之下,文献[ 46 ]提出了时隙At -张力,利用时隙At -张力进行单步编码-解码。然而,上述所有工作仅展示了对合成数据集的应用,例如。CLEVR [ 32 ]。在本文中,我们首次展示了利用运动信息对现实视频进行目标分割的方法,去除了视觉外观(例如复杂的背景纹理)中具有挑战性的细微差别。

3 方法

我们的目标是获取一个输入光流帧并预测一个包含运动物体的片段。我们旨在以自监督的方式训练这个模型,具体来说,我们采用了一个类似自编码器的框架。我们的模型输出两层:一层代表背景,另一层代表前景中的一个或多个运动物体,以及它们的不透明度层(加权掩码)。形式上,我们有在这里插入图片描述
式中:It ñ t ' n
为第t到t+n个输入流( n <0时为后向流),Φp ¨q
为参数化模型,在这里插入图片描述
为第i层重构,在这里插入图片描述
为掩膜。和N=2为层数(前景和背景)。然后,这些层可以线性地组合来重建输入图像在这里插入图片描述
在这里插入图片描述

3.1 流分割架构

为简单起见,我们首先考虑单个流场作为输入(如图2的上半部分所示)的情况。整个模型由3个部分组成:( 1 )一个CNN编码器,用于提取紧凑的特征表示;( 2 )一个具有可学习查询的迭代绑定模块,起到类似于软聚类的作用,即将每个像素分配到一个运动组;( 3 )一个CNN解码器,将每个查询单独解码到全分辨率层outputs(式中,对alpha通道进行阈值分割得到预测段)。CNN Encoder。

CNN Encoder。我们首先将计算得到的两帧图像之间的光流场It η t ’ nP R3 ( ( W0 ) )传递给CNNencoder Φ enc,CNNencoder Φ enc输出一个低分辨率的特征图:

迭代绑定。迭代绑定模块Φ bindaimsto根据图像区域在运动上的相似性将图像区域分组为单个实体,即以相同速率在同一方向上运动的像素应该被分组在一起。直观上,这样的绑定过程需要一个数据依赖的参数更新机制,迭代地适应和丰富模型,逐渐包含更多经历相似运动的像素。

为了完成这个任务,我们采用了一个简单的时隙注意力变体[ 46 ],其中使用了可学习的查询向量,而不是高斯初始化的时隙。最近,slot attention在以对象为中心的表示学习中表现出了出色的性能,其中查询向量通过基于softmax的注意力机制竞争解释部分输入,并且这些槽的表示通过一个循环更新函数迭代更新。在我们的运动分割情况中,理想情况下,每个查询向量中的最终表示分别对运动物体或背景进行编码,然后解码并组合以重建输入流场。

在这里插入图片描述
见图2。Pipeline.。我们的模型以光流It ñ t ’ n为输入,输出一组重建层和不透明度层。具体来说,它由特征编码、迭代绑定和解码到层三个部分组成,这三个部分结合起来重建输入流。为了解决运动模糊(小运动)或光流中的噪声,在训练过程中,在不同帧间隔下计算的两个流场之间的一致性。在推理时,仅使用图的上半部分从单步流中预测掩码。

详解:

主要目的是通过对两帧图像之间的光流场进行处理,将图像中的像素分组为不同的运动实体,例如不同运动状态的物体或背景。这个过程分为三个主要部分:CNN编码器、迭代绑定模块和CNN解码器。下面是对每个部分的详细解释:

  1. CNN编码器(CNN Encoder):
    输入:两帧图像之间的光流场 It 到 I t+1 。
    功能:提取光流场的紧凑特征表示。
    输出:一个低分辨率的特征图。
  2. 迭代绑定模块(Iterative Binding Module):
    输入:来自CNN编码器的低分辨率特征图。
    功能:将图像区域根据运动相似性分组为单个实体。使用可学习的查询向量(而不是高斯初始化的时隙)来竞争解释输入特征的部分,并通过循环更新函数迭代更新这些查询的表示。
    输出:更新后的查询向量,每个向量最终表示一个运动实体或背景。
  3. CNN解码器(CNN Decoder):
    输入:来自迭代绑定模块的查询向量。
    功能:将每个查询向量单独解码到全分辨率层,输出预测的运动分割。
    输出:对每个运动实体或背景的预测分割,通过对alpha通道进行阈值分割得到。
    整个架构的设计思路是,首先通过CNN编码器提取光流场的特征,然后使用迭代绑定模块根据运动相似性将这些特征分组,最后通过CNN解码器将分组的结果解码为全分辨率的运动分割。这种架构能够有效地处理复杂的运动场景,并将图像中的像素准确地分组为不同的运动实体。

3.2 自监督时间一致性损失

不管"第二个"帧是连续的,还是在时间上更早或更晚,为当前帧计算的分割应该是相同的。我们利用这个约束,首先定义一组"秒"帧,然后要求它们两两预测之间的一致性,从而形成一个自监督的时间一致性损失。我们首先描述集合,其次描述损失

Multi-step flow. 由于某些框架下的对象可能是静态的,我们通过利用多个时间步的观测来使我们的预测更加稳健。我们考虑从不同的时间间隔计算的流场作为输入集,即
并使用一个置换不变的一致性损失来鼓励模型对集合中的所有流场预测相同的前景/背景分割。

一致性损失。我们从输入集中随机采样两个流场并通过模型,在这里插入图片描述
输出每个流场的流重建和alpha掩码。由于重构损失是可交换的,因此不能保证同一时隙始终输出背景层;因此,我们使用了一个置换不变的一致性损失,即只通过每个置换的最小误差反向传播。
在这里插入图片描述
值得注意的是,这种一致性强制执行只发生在训练期间。在推理时,使用了单步流,如图2的上半部分所示。
总损失。训练该架构的总损失为:
在这里插入图片描述
在这里插入图片描述

3.3 讨论

与slot attention的差异。时隙注意力最初被引入到RGB图像的自监督目标分割中[ 46 ],并在合成数据( CLEVR [ 32 ] )上证明了其有用性,其中物体是具有简单纹理的原始形状。然而,这种假设在自然图像或视频的情况下不太可能成立,使得推广这种以对象为中心的表示具有挑战性。
在这项工作中,我们基于这样一种见解,即虽然图像中的物体可能不是自然无纹理的,但它们的运动通常是无纹理的。因此,我们通过利用它们的光流来开发自监督的对象分割模型,其中视觉外观上的细微差别被丢弃,从而不局限于简单的合成情况。作为初步尝试,我们使用与[ 46 ]相同的设置进行实验,其中查询向量从高斯分布中采样;然而,我们却无法对其进行训练。相反,我们在这里使用了可学习的嵌入,我们强调这是对我们的模型的成功至关重要的架构变化之一。其他关键的变化包括实例规范化和时间一致性,我们在5.1节的消融中证明了这一点。

为什么它适用于运动分割,提出的思想可以看作是训练一个生成式模型来分割流场。在分层公式下,重新构造被限制为简单的逐层流线性组合,从单个槽矢量解码。从概念上讲,这种设计有效地引入了表示瓶颈,鼓励每个槽向量表示最小信息,即同构运动,并且槽之间具有最小的冗余(互信息)。所有这些特性使得这样的架构非常适合分割经历独立运动的物体的任务。

4 .实验设置

在本部分中,我们描述了数据集和评估度量,然后介绍了实现细节

4.1.Datasets

我们在4个常用于无监督视频对象分割的不同数据集上进行测试。

DAVIS2016 [ 55 ]共包含50个序列( 30个用于训练, 20个用于验证),描述了动物、人、汽车等多样的运动物体。该数据集包含3455 1080p帧,其中480p为主要运动目标的像素级注释。
Seg Trackv2 [ 42 ]包含14个序列和976个注释框。每个序列包含1 ~ 6个运动目标,存在运动模糊、外观变化、复杂形变、遮挡、慢速运动、交互目标等挑战。
FBMS59 [ 56 ]由59个序列和720个(每20帧进行注释)注释帧组成,它们在图像分辨率上有很大的差异。序列涉及多个移动对象,其中一些对象在一段时间内可能是静态的。

移动伪装动物( MoCA ) [ 41 ]包含141HD视频序列,描述了67种在自然场景中移动的伪装动物。时间和空间注释都以紧边界框的形式为每5帧提供。利用所提供的运动labels(运动、变形、静止),我们过滤掉了以无运动为主的视频,产生了88个视频序列和4803帧(这个子集将被释放)。

4.2 评价度量

我们使用了两种不同的评价指标,这取决于是否提供了像素级的注释或边界框。

分割(Jaccard)。对于DAVIS2016、SegTrackv2和FBMS59,提供了逐像素分割;因此,我们报告了标准的度量,区域相似度( J ),计算测试集上的均值。对于FBMS59和SegTrackv2,我们遵循[ 30、86]的通用做法,将多个对象合并为一个前景。

4.3.Implementation Details

我们评估了三种不同的光流计算方法,即PWC - Net [ 68 ]、RAFT [ 69 ]和ARFlow [ 44 ];前两者是有监督的,而后者是自监督的。在图像对的原始分辨率下提取光流,除FBMS59外,所有数据集的帧间隔分别为nP t ´ 2、´ 1、1、2u
,其中在这里插入图片描述
我们使用来补偿小运动。为了生成用于训练的网络输入,将流大小调整为128 ( 224(并进行相应的缩放) ),转换为3通道图像,并使用光流标准可视化,归一化为[-1,1]。在迭代绑定模块在这里插入图片描述
中,,使用两个可学习的查询向量(当我们考虑从背景中分离出单个运动物体的情况时),选择T = 5次迭代的(如3.1节所述)。对于CNN编码器和解码器,我们采用了一个简单的VGG风格的网络,每个网络包含3个模块;在每个块中,我们使用2卷积、实例归一化和ReLU激活的集合。我们以64张图像的批处理大小进行训练,并使用初始学习率为5 x10 -4 的Adam优化器[ 37 ],每80k次迭代递减。确切的体系结构描述和训练计划可以在补充材料和提交的源代码中找到。

5.Results

在本节中,我们主要与没有人工标注训练的顶级方法- -上下文信息分离( CIS [ 86 ] )进行比较。然而,由于架构、输入分辨率、模态和后处理都不相同,我们尽可能公平地进行比较。注意,通过对预测掩模进行简单的上采样,在全分辨率下对基准进行评估。

为了保证模型的公平比较,我们不考虑后处理的收益,这些后处理通常包括多个作物和流动步长的集合平均、时间平滑和CRFs,但牺牲了运行时间。在这里,我们只考虑单步流在80fps以上的原始逐帧预测,这更可能是运动分割在实际中的应用。

5.1 .消融研究

我们在DAVIS2016上进行所有消融研究,每次改变一个变量,如表1所示。光流算法的选择。在同样的流量提取方法( PWC-Net )下,我们提出的模型( Ours-A )在meanJaccard ( J )上比CIS提高了约4.5个点,并且使用改进的光流法( RAFT )提供了进一步的性能增益。因此,我们从这里使用RAFT.

**实例归一化和分组。**我们观察到两个现象:第一,在保持分组迭代次数T( 3或5)不变的情况下,使用实例归一化训练的模型表现一致更好;第二,使用T ’ 5训练的迭代分组优于使用T ’ 3训练的迭代分组。然而,在T ’ 8时,模型没有收敛到相同的训练步数,因此我们没有将其列入表中。对于剩余的实验,我们使用实例归一化和T ’ 5来平衡性能和训练时间。

一致性和熵正则化。通过对比Ours - B和Ours - I,我们发现在没有时间一致性损失的情况下,性能明显下降,并且熵正则化也很重要,如Ours - B和Ours - H所示

5.2 与国际先进水平的比较

我们展示了Table2中不同数据集的比较结果。在DAVIS2016上,我们对最先进的技术进行了改进对于无监督方法( CIS )的影响较大( ’ 9.1 % )。如图5所示,虽然我们在训练时没有使用任何像素级别的标注,但是我们的方法已经接近在成千上万张图像上训练的有监督模型的性能。此外,我们认为,在现实场景中的运动分割,如被捕食者或猎物,可能需要快速处理。我们的模型在小分辨率(潜在地牺牲了一些准确性)上运行,运行速度超过80fps。

对于Seg Trackv2和FBMS59,它们偶尔会在单个视频中包含多个对象,并且只有其中的一个子集在移动,这使得仅使用流式输入来发现所有对象具有挑战性,但我们仍然取得了有竞争力的性能。我们在下面讨论这个限制。

5.3 Camouflage Breaking

除了对运动目标分割进行评估外,我们还在MoCA数据集上对伪装目标检测模型进行了基准测试,其中视觉线索往往不如运动线索有效。为了与CIS [ 86 ]进行比较,我们使用作者发布的代码和模型,并以自监督的方式在MoCA上微调他们的模型。我们通过只保留预测中最大的连通区域,然后在其周围取边界框,将模型的输出分割掩码转换为边界框。

我们在表3中报告了定量结果,在图4中显示了定性结果。我们的模型明显优于CIS(不允许后处理时为14%)、之前的监督方法,如COD[41](Jac卡上为18.5%),甚至COSNet[48](DAVIS上的顶级监督方法之一)。我们推测,COSNet的性能较弱是由于它完全依赖视觉外观(这会分散MoCA数据的注意力),而不是使用运动输入。这尤其有趣,因为它清楚地表明,没有一个信息线索能够完成这项任务
完美地呼应了双流假说[28],即事件和运动对视觉系统都是必不可少的。

5.4 局限性

尽管在精度和运行时间上对运动分割有显著的改善,但我们注意到所提出的方法(如图4所示)的以下局限性,并将其作为未来的工作:首先,现有的基准大多局限于前景和背景的运动分割,因此,本文选择使用两个时隙;然而,在实际场景中,视频中可能包含多个独立的移动对象,目前的模型将其分配到单层。将这些对象进一步分离成不同的层可能是可取的。其次,我们只探索了仅运动(光流)作为输入,这极大地限制了模型在流是无信息或不完整的(如图4 ,右)时分割对象的能力;然而,自监督的视频对象分割目标也适用于双流方法,因此可以结合RGB。第三,当光流存在噪声或(图4 ,左)质量较低时,当前方法可能会失效;在这种情况下,联合优化流和分割是一种可能的前进方式。

6 .结论

在本文中,我们提出了一个自监督模型,该算法仅取流为输入,并在没有任何人工标注的情况下进行训练,在DAVIS2016等公开基准上超越了以往的自监督方法,缩小了与监督方法的差距。在更具挑战性的伪装数据集( MoCA )上,我们的模型实际上与在大量监督下训练的视频对象分割中的顶级方法进行了比较。随着计算能力的增长和更多高质量视频的出现,网络相信自监督学习算法可以作为监督学习算法的有力竞争者,因为它们的可扩展性和可推广性。


Code 解析

代码地址:https://github.com/charigyang/motiongrouping/tree/main
在这里插入图片描述
raft里生成光流文件

run_inference.py推理文件修改一下


import os  
import glob as gb  
  
data_path = "/root/autodl-tmp/DAVIS2016"  
gap =[1,2,-1,-2] 
reverse = [0, 1]  
rgbpath = os.path.join(data_path, 'JPEGImages', '1080p')  # path to the dataset 
# rgbpath = data_path + '/JPEGImages'  # path to the dataset
folder = gb.glob(os.path.join(rgbpath, '*'))  
  
for r in reverse:  
    for g in gap:  
        raw_outroot_template = data_path + '/Flows_gap{}/' if r == 0 else data_path + '/Flows_gap{}/'  
        outroot_template = data_path + '/FlowImages_gap{}/' if r == 0 else data_path + '/FlowImages_gap{}/'  
          
        for f in folder:  
            print('===> Running {}, gap {}'.format(f, g))  
            mode = 'raft-things.pth'  # model  
            raw_outroot = raw_outroot_template.format(g)  
            outroot = outroot_template.format(g)  
              
            # Create directories if they don't exist  
            os.makedirs(raw_outroot, exist_ok=True)  
            os.makedirs(outroot, exist_ok=True)  
              
            # Run the prediction script  
            cmd = ("python predict.py "  
                   "--gap {} --model {} --path {} "  
                   "--outroot {} --reverse {} --raw_outroot {}".format(g, mode, f, outroot, r, raw_outroot))  
            os.system(cmd)
1. git clone https://github.com/charigyang/motiongrouping.git
2. cd raft
3. python run_inference.py
4. python train.py --dataset DAVIS --flow_to_rgb
5. python eval.py --dataset DAVIS  --flow_to_rgb --resume_path +权重路径

这里的–inference 不需要,在训练和测试文件都已经显示定义了

注意data.py里面文件后缀名要和自定义数据集的文件后缀名相匹配。
还有train.py里面的t=4,要看自己用了几个帧间隔,然后相匹配。

总结

相关推荐

  1. SQLZOO:Self join

    2024-07-17 23:34:08       34 阅读
  2. self_attention python代码

    2024-07-17 23:34:08       19 阅读
  3. self.predictor.setup_model(model=self.model, verbose=is_cli)

    2024-07-17 23:34:08       29 阅读
  4. python 笔记:cls VS self

    2024-07-17 23:34:08       29 阅读
  5. Pytorch中的self.parameters()

    2024-07-17 23:34:08       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 23:34:08       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 23:34:08       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 23:34:08       57 阅读
  4. Python语言-面向对象

    2024-07-17 23:34:08       68 阅读

热门阅读

  1. 【MySQL】10.用户管理

    2024-07-17 23:34:08       21 阅读
  2. 前端学习(二)

    2024-07-17 23:34:08       17 阅读
  3. JVM 垃圾回收算法

    2024-07-17 23:34:08       21 阅读
  4. 脑电信号中的相位的类型和作用

    2024-07-17 23:34:08       24 阅读
  5. MySQL表中允许有多少个 TRIGGERS(触发器)?

    2024-07-17 23:34:08       19 阅读
  6. 生成式 AI 的发展方向,是 Chat 还是 Agent?

    2024-07-17 23:34:08       17 阅读
  7. 面试题 HashMap中key的存储索引是怎么计算的

    2024-07-17 23:34:08       21 阅读
  8. 深度学习落地实战:人流量监测

    2024-07-17 23:34:08       20 阅读
  9. 【Go系列】Go的内存分配

    2024-07-17 23:34:08       22 阅读
  10. QTablewidget开发详解

    2024-07-17 23:34:08       22 阅读