TADA!用于视频理解的时间自适应卷积

paper题目:TADA! TEMPORALLY-ADAPTIVE CONVOLUTIONS FOR VIDEO UNDERSTANDING

paper是NUS发表在ICLR 2022的工作

paper链接:地址

Code:地址

ABSTRACT

空间卷积广泛用于许多深度视频模型。它从根本上假设时空不变性,即对不同帧中的每个位置使用共享权重。这项工作提出了用于视频理解的时间自适应卷积 (TAdaConv),这表明沿时间维度的自适应权重校准是促进视频中复杂时间动态建模的有效方法。具体来说,TAdaConv 通过根据其局部和全局时间上下文校准每帧的卷积权重,使空间卷积具有时间建模能力。与之前的时间建模操作相比,TAdaConv 更有效,因为它在卷积核而不是特征上进行操作,其维度比空间分辨率小一个数量级。此外,内核校准带来了模型容量的增加。我们通过用 TAdaConv 替换 ResNet 和 ConvNeXt 中的 2D 卷积来构建 TAda2D 和 TAdaConvNeXt 网络,与多个视频动作识别和定位基准上的最先进方法相比,这至少具有同等或更好的性能。我们还证明,作为一种计算开销可忽略不计的易于插入的操作,TAdaConv 可以有效地改进许多现有的视频模型,并具有令人信服的余量。

1 INTRODUCTION

卷积是现代深度视觉模型中不可或缺的操作(He et al., 2016; Szegedy et al., 2015; Krizhevsky et al., 2012),其不同的变体推动了卷积神经网络的最新性能网络(CNN)在许多视觉任务(Xie et al., 2017; Dai et al., 2017; Zhou et al., 2019)和应用场景(Howard et al., 2017; Y ang et al., 2019)中。在视频范例中,与 3D 卷积(Tran 等人,2015)相比,2D 空间卷积和 1D 时间卷积的组合由于其效率而受到更广泛的青睐(Tran 等人,2018;Qiu 等人, 2017)。尽管如此,一维时间卷积仍然在空间卷积之上引入了不可忽略的计算开销。因此,我们寻求直接为空间卷积配备时间建模能力。

卷积的一个基本属性是平移不变性 (Ruderman & Bialek, 1994; Simoncelli & Olshausen, 2001),这是由于其局部连通性和共享权重。然而,最近的动态滤波器工作表明,对于各种空间内容的建模,所有像素的严格分片权重可能不是最优的(Zhou et al., 2021; Wu et al., 2018)。

鉴于视频中时间动态的多样性,我们假设时间建模也可以受益于沿时间维度的松弛不变性。这意味着不同时间步长的卷积权重不再严格共享。现有的动态滤波器网络可以实现这一点,但有两个缺点。首先,它们中的大多数(Zhou et al., 2021; Y ang et al., 2019)很难利用现有的预训练模型,例如 ResNet。这在视频应用中至关重要,因为从头开始训练视频模型对资源的要求很高(Feichtenhofer 等人,2019;Feichtenhofer,2020),并且容易在小型数据集上过度拟合。其次,对于大多数动态滤波器,权重是根据其空间上下文(Zhou et al., 2021; Jia et al., 2016)或全局描述符(Chen et al., 2020a; Y ang et al., 2019),难以捕捉帧之间的时间变化。

在这项工作中,我们提出了用于视频理解的时间自适应卷积(TAdaConv),其中卷积核权重不再在不同帧之间固定。具体来说,第 t t t帧的卷积核 W t \mathbf{W}_{t} Wt​被分解为基础权重和校准权重的乘积: W t = α t ⋅ W b \mathbf{W}_{t}=\boldsymbol{\alpha}_{t} \cdot \mathbf{W}_{b} Wt​=αt​⋅Wb​b,其中校准权重 α t \boldsymbol{\alpha}_{t} αt​是从基础权重 W b \mathbf{W}_{b} Wb​中所有通道的输入数据中自适应生成的。对于每一帧,我们根据其相邻时间步长的帧描述符以及全局描述符生成校准权重,它有效地编码了视频中的局部和全局时间动态。 TAdaConv 和空间卷积之间的区别如图 1 所示。

图1:TAdaConv和视频模型中的空间卷积的比较。(a) 视频中的标准空间卷积在不同帧之间共享内核权重。(b) 我们的TAdaConv通过时间上下文自适应地校准每一帧的内核权重。

这种分解的主要优点有三个方面:(i)TAdaConv可以很容易地插入到任何现有模型中,以增强时间建模,并且它们的预训练权重仍然可以利用;(ii)借助于时间自适应权重,可以极大地提高时间建模能力;(iii)与通常在学习的2D特征图上操作的时间卷积相比,TAdaConv通过直接操作卷积核更有效。

TAdaConv被提出作为现有模型中空间卷积的替代品。它既可以作为2D网络的独立时间建模模块,也可以插入到现有卷积视频模型中,以进一步增强建模时间动态的能力。为了提高效率,我们通过替换ResNet中的空间卷积来构建TAda2D(He等人,2016),这至少会导致与现有技术相当或更好的性能。作为现有视频模型的增强,TAdaConv对多个视频数据集进行了显著改进。强大的性能和持续的改进表明,TAdaConv可以成为视频中复杂时间动力学建模的重要操作。

2 RELATED WORK

时间建模的ConvNet。视频和图像的根本区别在于时间维度,这使得时间建模成为理解视频的重要研究领域。最近用于视频理解的深度CNN可分为两种类型。第一类通过三维卷积联合建模时空信息(Carreira和Zisserman,2017;Tran等人,2015;Feichtenhofer,2020;Tran等人,2019)。第二类基于2D网络,其中大多数方法采用2D卷积,在空间建模的所有帧之间共享权重,并为时间建模设计额外的操作,例如时间偏移(Lin等人,2019a)、时间差(Wang等人,2021;姜等人,2019),时间卷积(Tran等人,2018;Liu等人,2021b)和相关运算(Wang等人,2020)等。我们的工作直接使空间卷积具有时间建模能力,可以进一步与其他时间建模操作耦合,以获得更强的视频识别性能。

动态网络。动态网络是指具有内容自适应权重或模块的网络,例如动态滤波器/卷积(贾等人,2016;杨等人,2019;李等人,2021)、动态激活(李等人,2020d;陈等人,2020b)和动态路由(王等人,2018;李等人,2020c)等。与静态网络相比,动态网络已证明其超过了网络容量,因此具有更高的性能。在视频理解中,动态滤波器(Liu等人,2021b)或时间聚集(Meng等人,2021)也表现出强大的时间建模能力。最近,一些卷积应用了空间自适应权重(Elsayed等人,2020;Chen等人,2021),显示了在建模不同视觉内容时放松空间不变性的好处。同样,我们提出的TAdaConv通过松弛沿时间维度的不变性来增强时间建模。TAdaConv与以前的工作有两个关键区别:(i)将TAdaConv中的卷积权重分解为基准权重和校准权重,这使TAdaConv能够利用预训练的权重;(ii)根据时间上下文生成校准权重。

3 TADACONV: TEMPORALLY-ADAPTIVE CONVOLUTIONS

在这项工作中,我们试图使空间卷积具有时间建模能力。受时间卷积校准过程(第3.1节)的启发,TAdaConv根据其时间上下文(第3.2节)动态校准每个帧的卷积权重。

3.1 REVISITING TEMPORAL CONVOLUTIONS


我们首先重新审视时间卷积以展示其基本过程及其与动态过滤器的关系。为简单起见,我们考虑了深度时间卷积,由于其效率,它被更广泛地使用(Liu 等人,2021b;Jiang 等人,2019)。公式上,对于由 β = [ β 1 , β 2 , β 3 ] \boldsymbol{\beta}=\left[\boldsymbol{\beta}_{1}, \boldsymbol{\beta}_{2}, \boldsymbol{\beta}_{3}\right] β=[β1​,β2​,β3​]参数化并放置(忽略归一化)由 W \mathbf{W} W参数化的 2D 卷积之后的 3 × 1 × 1 3 \times 1 \times 1 3×1×1时间卷积滤波器,第 t t t帧的输出特征 x ~ t \tilde{\mathbf{x}}_{t} x~t​可以是通过以下方式获得:
x ~ t = β 1 ⋅ δ ( W ∗ x t − 1 ) + β 2 ⋅ δ ( W ∗ x t ) + β 3 ⋅ δ ( W ∗ x t + 1 ) , \tilde{\mathbf{x}}_{t}=\boldsymbol{\beta}_{1} \cdot \delta\left(\mathbf{W} * \mathbf{x}_{t-1}\right)+\boldsymbol{\beta}_{2} \cdot \delta\left(\mathbf{W} * \mathbf{x}_{t}\right)+\boldsymbol{\beta}_{3} \cdot \delta\left(\mathbf{W} * \mathbf{x}_{t+1}\right), x~t​=β1​⋅δ(W∗xt−1​)+β2​⋅δ(W∗xt​)+β3​⋅δ(W∗xt+1​),
其中 ⋅ \cdot ⋅表示逐元素乘法, ∗ * ∗表示空间维度上的卷积, δ \delta δ表示 ReLU 激活 (Nair & Hinton, 2010)。可以改写如下:
x ~ t = W t − 1 ∗ x t − 1 + W t ∗ x t + W t + 1 ∗ x t + 1 , \tilde{\mathbf{x}}_{t}=\mathbf{W}_{t-1} * \mathbf{x}_{t-1}+\mathbf{W}_{t} * \mathbf{x}_{t}+\mathbf{W}_{t+1} * \mathbf{x}_{t+1}, x~t​=Wt−1​∗xt−1​+Wt​∗xt​+Wt+1​∗xt+1​,
其中 W t − 1 i , j = M t − 1 i , j ⋅ β 1 ⋅ W , W t i , j = M t i , j ⋅ β 2 ⋅ W \mathbf{W}_{t-1}^{i, j}=\mathbf{M}_{t-1}^{i, j} \cdot \boldsymbol{\beta}_{1} \cdot \mathbf{W}, \mathbf{W}_{t}^{i, j}=\mathbf{M}_{t}^{i, j} \cdot \boldsymbol{\beta}_{2} \cdot \mathbf{W} Wt−1i,j​=Mt−1i,j​⋅β1​⋅W,Wti,j​=Mti,j​⋅β2​⋅W和 W t + 1 i , j = M t + 1 i , j ⋅ β 3 ⋅ W \mathbf{W}_{t+1}^{i, j}=\mathbf{M}_{t+1}^{i, j} \cdot \boldsymbol{\beta}_{3} \cdot \mathbf{W} Wt+1i,j​=Mt+1i,j​⋅β3​⋅W是时空位置自适应卷积权重。 M t ∈ R C × H × W \mathbf{M}_{t} \in \mathbb{R}^{C \times H \times W} Mt​∈RC×H×W是一个动态张量,其值取决于空间卷积的结果。因此,(2+1)D 卷积中的时间卷积本质上执行 (i) 对空间卷积的权重校准和 (ii) 相邻帧之间的特征聚合。但是,如果通过将时间卷积与空间卷积耦合来实现时间建模,则仍然会引入不可忽略的计算开销(参见表 2)。

3.2 FORMULATION OF TADACONV


为了提高效率,我们着手直接赋予空间卷积时间建模能力。受最近发现空间不变性的松弛加强了空间建模的启发(Zhou 等人,2021;Elsayed 等人,2020),我们假设时间自适应权重也可以帮助时间建模。因此,TAdaConv 层中的卷积权重逐帧变化。由于我们观察到以前的动态过滤器几乎不能利用预训练的权重,我们从我们在时间卷积中的观察中获得灵感,并将第 t t t帧 W t \mathbf{W}_{t} Wt​的权重分解为所有帧共享的基本权重 W b \mathbf{W}_{b} Wb​的乘积,以及每个时间步不同的校准权重 α t \boldsymbol{\alpha}_{t} αt​:
x ~ t = W t ∗ x t = ( α t ⋅ W b ) ∗ x t , \tilde{\mathbf{x}}_{t}=\mathbf{W}_{t} * \mathbf{x}_{t}=\left(\boldsymbol{\alpha}_{t} \cdot \mathbf{W}_{b}\right) * \mathbf{x}_{t}, x~t​=Wt​∗xt​=(αt​⋅Wb​)∗xt​,
校准权重生成。为了允许 TAdaConv 对时间动态进行建模,至关重要的是,第 t t t帧的校准权重 α t \boldsymbol{\alpha}_{t} αt​不仅要考虑当前帧,而且更重要的是,它的时间上下文,即 α t = G ( … , x t − 1 , x t , x t + 1 , … ) \boldsymbol{\alpha}_{t}=\mathcal{G}\left(\ldots, \mathbf{x}_{t-1}, \mathbf{x}_{t}, \mathbf{x}_{t+1}, \ldots\right) αt​=G(…,xt−1​,xt​,xt+1​,…)。否则 TAdaConv 将退化为一组不相关的空间卷积,在不同的帧上应用不同的权重。我们在图 2(b)中展示了生成函数 G \mathcal{G} G的实例化。

图 2:TAdaConv 的实例化和 TAda2D 中使用的时间特征聚合。(a) 视频模型中使用的标准卷积。 (b) 我们的 TAdaConv 使用具有全局时间上下文的非线性权重校准。 © TAda2D 中使用的时间特征聚合方案。

在我们的设计中,我们的目标是提高效率和捕捉帧间时间动态的能力。为了提高效率,我们对帧描述向量 v ∈ R T × C \mathbf{v} \in \mathbb{R}^{T \times C} v∈RT×C进行操作,该向量是通过对每个帧的空间维度 GAP 进行全局平均池化获得的,即 v t = G A P s ( x t ) \mathbf{v}_{t}=\mathrm{GAP}_{s}\left(\mathbf{x}_{t}\right) vt​=GAPs​(xt​)。对于时间建模,我们对从 x t a d j = { x t − 1 , x t , x t + 1 } \mathbf{x}_{t}^{a d j}=\left\{\mathbf{x}_{t-1}, \mathbf{x}_{t}, \mathbf{x}_{t+1}\right\} xtadj​={xt−1​,xt​,xt+1​}得到的局部时间上下文 v t a d j = { v t − 1 , v t , v t + 1 } \mathbf{v}_{t}^{a d j}=\left\{\mathbf{v}_{t-1}, \mathbf{v}_{t}, \mathbf{v}_{t+1}\right\} vtadj​={vt−1​,vt​,vt+1​}应用堆叠的两层一维卷积 F \mathcal{F} F,降维率为 r r r。
F ( x t a d j ) = Conv1D ⁡ D C / r → C ( δ ( B N ( Conv ⁡ 1 D C → C / r ( v t a d j ) ) ) ) . \mathcal{F}\left(\mathbf{x}_{t}^{a d j}\right)=\operatorname{Conv1D} \mathrm{D}^{C / r \rightarrow C}\left(\delta\left(\mathrm{BN}\left(\operatorname{Conv} 1 \mathrm{D}^{C \rightarrow C / r}\left(\mathbf{v}_{t}^{a d j}\right)\right)\right)\right) . F(xtadj​)=Conv1DDC/r→C(δ(BN(Conv1DC→C/r(vtadj​)))).
其中 δ \delta δ和BN表示ReLU(Nair & Hinton,2010)和 batchnorm(Ioffe & Szegedy,2015)。

为了在局部一维卷积的基础上获得更大的帧间视野,我们通过线性映射函数FC将全局描述符 g \mathrm{g} g添加到权重生成过程 F \mathcal{F} F中,进一步纳入全局时间信息。
F ( x t a d j , g ) = Conv ⁡ 1 D C / r → C ( δ ( B N ( Conv ⁡ 1 D C → C / r ( v t a d j + F C C → C ( g ) ) ) ) , \mathcal{F}\left(\mathbf{x}_{t}^{a d j}, \mathbf{g}\right)=\operatorname{Conv} 1 \mathrm{D}^{C / r \rightarrow C}\left(\delta\left(\mathrm{BN}\left(\operatorname{Conv} 1 \mathrm{D}^{C \rightarrow C / r}\left(\mathbf{v}_{t}^{a d j}+\mathrm{FC}^{C \rightarrow C}(\mathbf{g})\right)\right)\right),\right. F(xtadj​,g)=Conv1DC/r→C(δ(BN(Conv1DC→C/r(vtadj​+FCC→C(g)))),
其中 g = GAP ⁡ s t ( x ) \mathrm{g}=\operatorname{GAP}_{s t}(\mathbf{x}) g=GAPst​(x), G A P s t \mathrm{GAP}_{s t} GAPst​是空间和时间维度上的全局平均池化。

初始化。 TAdaConv 旨在通过简单地替换 2D 卷积轻松插入到现有模型中。为了有效使用预训练的权重,TAdaConv 被初始化为与标准卷积完全相同。这是通过将 F \mathcal{F} F中最后一个卷积的权重初始化为零并向公式添加一个常数向量 1 来实现的:
α t = G ( x ) = 1 + F ( x t a d j , g ) . \boldsymbol{\alpha}_{t}=\mathcal{G}(\mathbf{x})=\mathbf{1}+\mathcal{F}\left(\mathbf{x}_{t}^{a d j}, \mathbf{g}\right) . αt​=G(x)=1+F(xtadj​,g).
这样,在初始状态, W t = 1 ⋅ W b = W b \mathbf{W}_{t}=\mathbf{1} \cdot \mathbf{W}_{b}=\mathbf{W}_{b} Wt​=1⋅Wb​=Wb​,我们用预训练的权重加载 W b \mathbf{W}_{b} Wb​。

校准尺寸。基础权重 W b ∈ R C out  × C in  × k 2 \mathbf{W}_{b} \in \mathbb{R}^{C_{\text {out }} \times C_{\text {in }} \times k^{2}} Wb​∈RCout ​×Cin ​×k2可以在不同维度上进行校准。我们在 C i n C_{i n} Cin​维度 ( α t ∈ R 1 × C i n × 1 ) \left(\alpha_{t} \in \mathbb{R}^{1 \times C_{i n} \times 1}\right) (αt​∈R1×Cin​×1)上实例化校准,因为基于输入特征的权重生成比输出通道或空间结构更精确地估计输入通道的关系(经验分析表 7)。

与其他动态过滤器的比较。表 1 将 TAdaConv 与现有的动态过滤器进行了比较。基于专家混合的动态过滤器(例如 CondConv)动态聚合多个内核以生成所有位置共享的权重。大多数其他动态过滤器中的权重完全由输入生成,例如图像中的 DynamicFilter (Jia et al., 2016) 和 DDF (Zhou et al., 2021) 以及视频中的 TAM (Liu et al., 2021b)。与基于图像的相比,TAdaConv 通过从局部和全局时间上下文生成权重来实现时间建模。与 TANet (Liu et al., 2021b) 相比,TAdaConv 由于时间自适应权重而更擅长时间建模。此外,TAdaConv 可以有效地生成与预训练模型相同的权重,而以前的方法很难利用预训练模型。

表 1:与其他动态滤波器的比较。

与时间卷积的比较。表 2 比较了 TAdaConv 与 R(2+1)D 在参数和 FLOPs 中的比较,这表明我们在空间卷积之上的大部分额外计算开销比时间卷积小一个数量级。

表2: ( 2 + 1 ) D (2+1) \mathrm{D} (2+1)D卷积和TAdaConv在FLOPs和参数数上的比较。操作实例设置: C o = C i = 64 , k = 3 , T = 8 , H = W = 56 C_{o}=C_{i}=64, k=3, T=8, H=W=56 Co​=Ci​=64,k=3,T=8,H=W=56和 r = 4 r=4 r=4。网络设置示例。ResNet-50,输入分辨率为 8 × 22 4 2 8\times 224^{2} 8×2242。有色数字表示添加到二维卷积或ResNet-50的额外FLOPs/Params。

4 TADA2D: TEMPORALLY ADAPTIVE 2D NETWORKS

我们通过用我们提出的 TAdaConv 替换 ResNet(R2D)中的 2D 卷积来构建 TAda2D 网络。此外,基于跨步平均池化,我们提出了一个用于 2D 网络的时间特征聚合模块,对应于时间卷积的第二个基本步骤。如图2(c)所示,聚合模块放置在TAdaConv之后。公式上,给定 TAdaConv x ~ \tilde{\mathbf{x}} x~的输出,聚合特征可以得到如下:
x a g g r = δ ( B N 1 ( x ~ ) + B N 2 ( T e m p A v g P o o l k ( x ~ ) ) ) , \mathbf{x}_{a g g r}=\delta\left(\mathrm{BN}_{1}(\tilde{\mathbf{x}})+\mathrm{BN}_{2}\left(\mathrm{TempAvgPool}_{k}(\tilde{\mathbf{x}})\right)\right), xaggr​=δ(BN1​(x~)+BN2​(TempAvgPoolk​(x~))),
其中TempAvgPool k _{k} k​表示内核大小为 k k k的跨步时间平均池化。我们对由TAdaConv x ~ \tilde{\mathbf{x}} x~提取并通过跨步平均池化TempAvgPool Te ⁡ k ( x ~ ) \operatorname{Te}_{k}(\tilde{\mathbf{x}}) Tek​(x~)聚合的特征使用不同的批量归一化参数,因为它们的分布本质上是不同的。在初始化过程中,我们将预训练的权重加载到 BN1,并将 BN2 的参数初始化为零。再加上 TAdaConv 的初始化,TAda2D 的初始状态与 Temporal Segment Networks 完全相同(Wang et al., 2016),而校准和聚合显着增加了模型的训练容量。在实验中,我们将此结构称为快捷(Sc.)分支和单独的 BN(SepBN.)分支。

参考文献

(ICLR-2022)TADA!用于视频理解的时间自适应卷积相关推荐

  1. 图解时间自适应卷积----Time-aware Large Kernel Convolutions

    论文:Time-aware Large Kernel Convolutions 链接:arxiv.org/pdf/2002.03184v1.pdf 偶尔看到一篇比较有意思的论文,其提出的方法设计得很巧 ...

  2. 时间自适应卷积:比自注意力更快的特征提取器

    论文标题: Time-aware Large Kernel Convolutions 论文作者: Vasileios Lioutas, Yuhong Guo 论文链接: https://arxiv.o ...

  3. ICCV2021 |优胜劣汰,MIT团队提出自适应多模态选取框架用于视频理解

    关注公众号,发现CV技术之美 AdaMML: Adaptive Multi-Modal Learning for Efficient Video Recognition 项目主页:https://rp ...

  4. Android 用于视频回放显示时间刻度的一个自定义View

    实现效果: View的主要代码 public class TimeRuleView extends View {private static final boolean LOG_ENABLE = Bu ...

  5. 神经架构搜索在视频理解中研究进展的综述

    作者 | Michael S. Ryoo 研究员与 AJ Piergiovanni 学生研究员(Google 机器人团队) 来源 | TensorFlow(ID:TensorFlow_official ...

  6. 【PySlowFast】Facebook开源算法代码库PySlowFast,轻松复现前沿视频理解模型

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 在近些年的视频理解研究中,Facebook AI Research 贡献了许多精彩 ...

  7. Facebook开源算法代码库,轻松复现前沿视频理解模型

    在近些年的视频理解研究中,Facebook AI Research 贡献了许多精彩的工作.近日,FAIR视频团队在 ICCV 相关研讨会上开源了视频识别检测代码库 PySlowFast,并同时发布了预 ...

  8. Facebook开源算法代码库PySlowFast,轻松复现前沿视频理解模型

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自机器之心. 在近些年的视频理解研究中,Facebook AI Research 贡献了许多精彩的工作.近日,FAIR视频团队在 ICCV 相关 ...

  9. 深度学习时代的视频理解综述

    深度学习时代的视频理解综述 本文为b站@bryanyzhu老师四期视频理解相关论文解读的汇总图文笔记. 我们先精读深度学习时代视频理解领域最为重要的两篇论文:双流网络和 I3D.它们分别是领域内两大类 ...

最新文章

  1. rust矿洞绳子怎么爬下_车底下绑一根绳子妙用在哪?看看老司机怎么说!
  2. Shiny平台构建与R包开发(二)——数据输入
  3. info java module_如何在Jdk9 / java-9中解决module-info.java编译错误
  4. Jenkins 最新版qq邮箱配置实例演示,5步设置保证邮件接收成功!
  5. 360 开源企业级 Kubernetes 多集群管理平台 Wayne
  6. 第一章:系统困境之 再努力也不能直接打开的死结
  7. 手机有一个时钟的标志_STM32F7系统配置控制器(SYSCFG)及复位和时钟控制(RCC)...
  8. Algorithms Part 1-Question 4- SCC 强联通问题
  9. Java Excel文件下载
  10. ylb:SQL 系统函数
  11. html5中动画总结,HTML5-CSS3总结学习(二)
  12. VLAN划分和网络配置实例
  13. Matlab自动保存图像时使用saveas函数运行出错
  14. 小A与小姐姐给气球涂色[dp + 快速幂]
  15. java输入数字星期,输出英文
  16. 18年NDVI斜率图生成
  17. 用python写字动画_Duang!用Python来实现唱歌、跳舞、写字、画画?无所不能的pyt
  18. 性能测试指标及常用监控工具
  19. 重磅丨云和恩墨zCloud数据库云管平台2.0版本发布
  20. 网易为什么成门户唯一常青树?从几个产品说起

热门文章

  1. 第 349 场力扣周赛
  2. android ui层 交互层 业务逻辑层 服务层,表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)...
  3. leaflet和minimap切换时图层保持一致
  4. 基于移动应用的城市公共气象服务平台的设计与实现
  5. 三星i879救砖及刷回官方教程
  6. Chromium源码下载问题及方案汇总
  7. Retrofit2实现图片上传下载携带token校验
  8. 计算机视觉的热门研究方向与发展趋势
  9. 文艺清新简约教师公开课PPT模板
  10. iscsi initiator 配置