空间变换器网络

paper题目:Spatial Transformer Networks

paper是Google DeepMind发表在NIPS 2015的工作

paper地址:链接

Abstract

卷积神经网络定义了一类异常强大的模型,但仍受限于缺乏以计算和参数有效的方式对输入数据保持空间不变的能力。在这项工作中,我们引入了一个新的可学习模块,即 Spatial Transformer,它明确允许对网络内的数据进行空间操作。这个可微分模块可以插入到现有的卷积架构中,使神经网络能够根据特征图本身对特征图进行主动空间变换,而无需任何额外的训练监督或对优化过程的修改。我们展示了空间变换器的使用导致模型学习平移、缩放、旋转和更通用的变形的不变性,从而在多个基准测试和许多类别的变换中产生最先进的性能。

1 Introduction

近年来,通过采用快速、可扩展、端到端的学习框架卷积神经网络(CNN)[18],计算机视觉的格局发生了巨大的变化和推动。尽管不是最近的发明,但我们现在看到大量基于 CNN 的模型在分类、定位、语义分割和动作识别任务等方面取得了最先进的结果。

能够对图像进行推理的系统的一个理想属性是从纹理和形状中解开目标姿势和部分变形。在 CNN 中引入局部最大池化层有助于满足这一特性,因为它允许网络在一定程度上对特征位置具有空间不变性。然而,由于对最大池化(例如 2 × 2 像素)的空间支持通常很小,这种空间不变性仅在最大池化和卷积的深层层次结构以及 CNN 中的中间特征图(卷积层激活)上实现对输入数据的大转换实际上不是不变的 [5, 19]。 CNN 的这种限制是由于只有一个有限的、预定义的池化机制来处理数据空间排列的变化。

在这项工作中,我们引入了 Spatial Transformer 模块,该模块可以包含在标准神经网络架构中以提供空间转换功能。空间变换器的动作取决于单个数据样本,并在针对相关任务的训练期间学习适当的行为(无需额外监督)。与池化层不同,池化层的感受野是固定的和局部的,空间变换器模块是一种动态机制,可以通过为每个输入样本生成适当的变换来主动地空间变换图像(或特征图)。然后在整个特征图(非局部)上执行转换,可以包括缩放、裁剪、旋转以及非刚性变形。这使得包含空间变换器的网络不仅可以选择图像中最相关(注意)的区域,还可以将这些区域转换为规范的、预期的姿势,以简化后续层中的推理。值得注意的是,空间转换器可以通过标准的反向传播进行训练,从而允许对它们注入的模型进行端到端的训练。

空间变换器可以整合到 CNN 中以有利于多种任务,例如:(i) 图像分类:假设 CNN 被训练为根据图像是否包含特定数字(其中图像的位置和大小)执行图像的多路分类。 数字可能随每个样本显著变化(并且与类别不相关);一个空间变换器可以裁剪出适当的区域并进行尺度归一化,可以简化后续的分类任务,并带来出色的分类性能,见图 1; (ii) 共定位:给定一组包含相同(但未知)类的不同实例的图像,可以使用空间变换器在每个图像中定位它们; (iii) 空间注意:空间变换器可用于需要注意力机制的任务,例如在 [11, 29] 中,但更灵活,可以纯粹通过反向传播进行训练,无需强化学习。使用注意力的一个关键好处是,可以使用转换后的(并因此参与)较低分辨率的输入来支持更高分辨率的原始输入,从而提高计算效率。

图 1:使用空间变换器作为全连接网络的第一层的结果,该网络针对扭曲的 MNIST 数字分类进行了训练。 (a) 空间变换器网络的输入是 MNIST 数字的图像,该图像因随机平移、缩放、旋转和杂波而失真。 (b) 空间变换器的定位网络预测要应用于输入图像的变换。 © 应用变换后的空间变换器的输出。(d) 后续全连接网络对空间变换器输出的分类预测。空间变换器网络(一个包含空间变换器模块的 CNN)仅使用类标签进行端到端训练——系统没有提供ground truth变换的知识。

2 Related Work

在本节中,我们将讨论与本文相关的先前工作,涵盖使用神经网络建模转换的中心思想 [12、13、27]、学习和分析转换不变表示 [3、5、8、17、19、25 ],以及特征选择的注意力和检测机制[1、6、9、11、23]。

Hinton [12] 的早期工作着眼于为目标部分分配规范的参考框架,这一主题在 [13] 中反复出现,其中对 2D 仿射变换进行建模以创建由变换部分组成的生成模型。生成训练方案的目标是转换后的输入图像,输入图像和目标之间的转换作为网络的附加输入。结果是一个生成模型,它可以学习通过组合部分来生成目标的变换图像。 Tieleman [27] 进一步提出了变换部分组合的概念,其中学习的部分被明确地仿射变换,变换由网络预测。这种生成胶囊模型能够从转换监督中学习用于分类的判别特征。

在 [19] 中,通过估计原始图像和变换图像的表示之间的线性关系,研究了 CNN 表示对输入图像转换的不变性和等变性。 Cohen & Welling [5] 分析了这种与对称群相关的行为,这也在 Gens & Domingos [8] 提出的架构中得到了利用,从而产生了对对称群更加不变的特征图。设计变换不变表示的其他尝试是散射网络 [3],以及构建变换滤波器的滤波器组的 CNN [17、25]。斯托伦加等人。 [26] 使用基于网络激活的策略来控制网络过滤器对同一图像的后续前向传递的响应,因此可以关注特定特征。在这项工作中,我们的目标是通过操纵数据而不是特征提取器来实现不变表示,这是在 [7] 中为聚类所做的。

具有选择性注意的神经网络通过裁剪来操纵数据,因此能够学习翻译不变性。诸如 [1, 23] 的工作通过强化学习进行训练,以避免需要可微分注意力机制,而 [11] 通过在生成模型中利用高斯核来使用可微分注意机制。 Girshick 等人的工作。 [9] 使用区域提议算法作为注意力的一种形式,[6] 表明可以使用 CNN 回归显著区域。我们在本文中提出的框架可以看作是对任何空间变换的可微注意力的概括。

3 Spatial Transformers

在本节中,我们将描述空间变换器的公式。这是一个可微分模块,它在单次前向传递期间将空间变换应用于特征图,其中变换以特定输入为条件,产生单个输出特征图。对于多通道输入,对每个通道应用相同的变形。为简单起见,在本节中,我们考虑单个变换和每个变换器的单个输出,但是我们可以推广到多个变换,如实验所示。

空间变换机制分为三个部分,如图 2 所示。为了计算,首先一个定位网络(第 3.1 节)获取输入特征图,并通过多个隐藏层输出空间变换的参数这应该应用于特征图——这给出了一个以输入为条件的转换。然后,预测的变换参数用于创建一个采样网格,它是一组点,应该对输入图进行采样以产生变换后的输出。这是由网格生成器完成的,在第 3.2 节中描述。最后,将特征图和采样网格作为采样器的输入,生成从网格点处的输入采样的输出图(第 3.3 节)。

图 2:空间变换器模块的架构。输入特征图UUU被传递到一个定位网络,该网络对变换参数θ\thetaθ进行回归。VVV上的规则空间网格GGG被转换为采样网格Tθ(G)\mathcal{T}_{\theta}(G)Tθ​(G),如 Sect 3.3中所述,将其应用于UUU。产生扭曲的输出特征图VVV。定位网络和采样机制的结合定义了空间变换器。

这三个组件的组合形成了一个空间变换器,现在将在以下部分中更详细地描述。

3.1 Localisation Network


定位网络采用宽度为WWW、高度为HHH和CCC个通道的输入特征图U∈RH×W×CU \in \mathbb{R}^{H \times W \times C}U∈RH×W×C并输出θ\thetaθ,要应用于特征图的变换Tθ\mathcal{T}_{\theta}Tθ​的参数:θ=floc (U)\theta=f_{\text {loc }}(U)θ=floc ​(U)。θ\thetaθ的大小可以根据参数化的变换类型而变化,例如对于仿射变换,θ\thetaθ是 6 维的,如 (1) 中所示。

定位网络函数floc ()f_{\text {loc }}()floc ​()可以采用任何形式,例如全连接网络或卷积网络,但应包括最终回归层以产生转换参数θ\thetaθ。

3.2 Parameterised Sampling Grid


为了执行输入特征图的变形,每个输出像素是通过应用以输入特征图中特定位置为中心的采样内核来计算的(这将在下一节中完整描述)。通过像素,我们指的是通用特征图的元素,不一定是图像。通常,输出像素被定义为位于像素Gi=(xit,yit)G_{i}=\left(x_{i}^{t}, y_{i}^{t}\right)Gi​=(xit​,yit​)的规则网格G={Gi}G=\left\{G_{i}\right\}G={Gi​}上,形成输出特征图V∈RH′×W′×CV \in \mathbb{R}^{H^{\prime} \times W^{\prime} \times C}V∈RH′×W′×C,其中H′H^{\prime}H′和W′W^{\prime}W′是网格的高度和宽度,CCC是通道数,在输入和输出中是一样的。

为了清楚说明,暂时假设Tθ\mathcal{T}_{\theta}Tθ​是 2D 仿射变换Aθ\mathrm{A}_{\theta}Aθ​。我们将在下面讨论其他转换。在这种仿射情况下,逐点变换是
(xisyis)=Tθ(Gi)=Aθ(xityit1)=[θ11θ12θ13θ21θ22θ23](xityit1)(1)\left(\begin{array}{c} x_{i}^{s} \\ y_{i}^{s} \end{array}\right)=\mathcal{T}_{\theta}\left(G_{i}\right)=\mathrm{A}_{\theta}\left(\begin{array}{c} x_{i}^{t} \\ y_{i}^{t} \\ 1 \end{array}\right)=\left[\begin{array}{lll} \theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21} & \theta_{22} & \theta_{23} \end{array}\right]\left(\begin{array}{c} x_{i}^{t} \\ y_{i}^{t} \\ 1 \end{array}\right)\quad(1) (xis​yis​​)=Tθ​(Gi​)=Aθ​⎝⎛​xit​yit​1​⎠⎞​=[θ11​θ21​​θ12​θ22​​θ13​θ23​​]⎝⎛​xit​yit​1​⎠⎞​(1)
其中(xit,yit)\left(x_{i}^{t}, y_{i}^{t}\right)(xit​,yit​)是输出特征图中规则网格的目标坐标,(xis,yis)\left(x_{i}^{s}, y_{i}^{s}\right)(xis​,yis​)是输入特征图中定义样本点的源坐标,Aθ\mathrm{A}_{\theta}Aθ​是仿射变换矩阵。我们使用高度和宽度归一化坐标,使得−1≤xit,yit≤1-1 \leq x_{i}^{t}, y_{i}^{t} \leq 1−1≤xit​,yit​≤1当在输出的空间范围内时,并且−1≤xis,yis≤1-1 \leq x_{i}^{s}, y_{i}^{s} \leq 1−1≤xis​,yis​≤1当在输入的空间范围内时(对于yyy坐标)。源/目标变换和采样等价于图形中使用的标准纹理映射和坐标。

(1) 中定义的变换允许对输入特征图应用裁剪、平移、旋转、缩放和倾斜,并且只需要定位网络产生 6 个参数(AθA_{\theta}Aθ​的 6 个元素)。它允许裁剪,因为如果变换是收缩(即左侧 2 × 2 子矩阵的行列式的幅度小于单位),则映射的规则网格将位于面积小于xis,yisx_{i}^{s}, y_{i}^{s}xis​,yis​范围的平行四边形中。与恒等变换相比,这种变换对网格的影响如图 3 所示。

图 3:将参数化采样网格应用于生成输出VVV的图像UUU的两个示例。(a) 采样网格是规则网格G=TI(G)G=\mathcal{T}_{I}(G)G=TI​(G),其中III是恒等变换参数。 (b) 采样网格是用仿射变换Tθ(G)\mathcal{T}_{\theta}(G)Tθ​(G)扭曲规则网格的结果。

转换类Tθ\mathcal{T}_{\theta}Tθ​可能受到更多限制,例如用于注意力的转换
Aθ=[s0tx0sty]\mathrm{A}_{\theta}=\left[\begin{array}{ccc} s & 0 & t_{x} \\ 0 & s & t_{y} \end{array}\right] Aθ​=[s0​0s​tx​ty​​]
允许通过改变s,txs, t_{x}s,tx​和tyt_{y}ty​进行裁剪、平移和各向同性缩放。变换Tθ\mathcal{T}_{\theta}Tθ​也可以更一般化,例如具有 8 个参数的平面投影变换、分段仿射或薄板样条。实际上,转换可以具有任何参数化形式,只要它在参数方面是可微的——这至关重要地允许梯度从样本点Tθ(Gi)\mathcal{T}_{\theta}\left(G_{i}\right)Tθ​(Gi​)反向传播到定位网络输出θ\thetaθ。如果转换以结构化的低维方式进行参数化,则可以降低分配给定位网络的任务的复杂性。例如,一类结构化和可微分变换是注意力、仿射、投影和薄板样条变换的超集,是Tθ=MθB\mathcal{T}_{\theta}=M_{\theta} BTθ​=Mθ​B,其中BBB是目标网格表示(例如,在(1)中,BBB是齐次坐标中的规则网格GGG),并且MθM_{\theta}Mθ​是由θ\thetaθ参数化的矩阵。在这种情况下,不仅可以学习如何预测样本的θ\thetaθ,还可以学习手头任务的BBB。

3.3 Differentiable Image Sampling


为了对输入特征图执行空间变换,采样器必须获取一组采样点 Tθ(G)\mathcal{T}_{\theta}(G)Tθ​(G),以及输入特征图UUU,并生成采样的输出特征图VVV。

Tθ(G)\mathcal{T}_{\theta}(G)Tθ​(G)中的每个(xis,yis)\left(x_{i}^{s}, y_{i}^{s}\right)(xis​,yis​)坐标定义了输入中的空间位置,其中应用采样内核来获取输出VVV中特定像素的值。这可以写成
Vic=∑nH∑mWUnmck(xis−m;Φx)k(yis−n;Φy)∀i∈[1…H′W′]∀c∈[1…C](3)V_{i}^{c}=\sum_{n}^{H} \sum_{m}^{W} U_{n m}^{c} k\left(x_{i}^{s}-m ; \Phi_{x}\right) k\left(y_{i}^{s}-n ; \Phi_{y}\right) \forall i \in\left[1 \ldots H^{\prime} W^{\prime}\right] \quad \forall c \in[1 \ldots C]\quad(3) Vic​=n∑H​m∑W​Unmc​k(xis​−m;Φx​)k(yis​−n;Φy​)∀i∈[1…H′W′]∀c∈[1…C](3)
其中Φx\Phi_{x}Φx​和Φy\Phi_{y}Φy​是定义图像插值(例如双线性)的通用采样内核k()k()k()的参数,UnmcU_{n m}^{c}Unmc​是输入通道ccc中位置 (n,m)(n, m)(n,m)处的值,VicV_{i}^{c}Vic​是输出值对于通道ccc中位置(xit,yit)\left(x_{i}^{t}, y_{i}^{t}\right)(xit​,yit​)处的像素iii。请注意,输入的每个通道的采样都是相同的,因此每个通道都以相同的方式进行转换(这保持了通道之间的空间一致性)。

理论上,可以使用任何采样内核,只要可以针对xisx_{i}^{s}xis​和yisy_{i}^{s}yis​定义(子)梯度。例如,使用整数采样内核将 (3) 简化为
Vic=∑nH∑mWUnmcδ(⌊xis+0.5⌋−m)δ(⌊yis+0.5⌋−n)V_{i}^{c}=\sum_{n}^{H} \sum_{m}^{W} U_{n m}^{c} \delta\left(\left\lfloor x_{i}^{s}+0.5\right\rfloor-m\right) \delta\left(\left\lfloor y_{i}^{s}+0.5\right\rfloor-n\right) Vic​=n∑H​m∑W​Unmc​δ(⌊xis​+0.5⌋−m)δ(⌊yis​+0.5⌋−n)
其中⌊x+0.5⌋\lfloor x+0.5\rfloor⌊x+0.5⌋将xxx舍入为最接近的整数,而δ()\delta()δ()是 Kronecker delta 函数。该采样内核等同于仅将距离(xis,yis)\left(x_{i}^{s}, y_{i}^{s}\right)(xis​,yis​)的最近像素处的值复制到输出位置(xit,yit)\left(x_{i}^{t}, y_{i}^{t}\right)(xit​,yit​).。或者,可以使用双线性采样内核,给出
Vic=∑nH∑mWUnmcmax⁡(0,1−∣xis−m∣)max⁡(0,1−∣yis−n∣)V_{i}^{c}=\sum_{n}^{H} \sum_{m}^{W} U_{n m}^{c} \max \left(0,1-\left|x_{i}^{s}-m\right|\right) \max \left(0,1-\left|y_{i}^{s}-n\right|\right) Vic​=n∑H​m∑W​Unmc​max(0,1−∣xis​−m∣)max(0,1−∣yis​−n∣)
为了允许通过这种采样机制反向传播损失,我们可以定义关于UUU和GGG的梯度。对于双线性采样 (5),偏导数是
∂Vic∂Unmc=∑nH∑mWmax⁡(0,1−∣xis−m∣)max⁡(0,1−∣yis−n∣)∂Vic∂xis=∑nH∑mWUnmcmax⁡(0,1−∣yis−n∣){0if ∣m−xis∣≥11if m≥xis−1if m<xis(7)\begin{gathered} \frac{\partial V_{i}^{c}}{\partial U_{n m}^{c}}=\sum_{n}^{H} \sum_{m}^{W} \max \left(0,1-\left|x_{i}^{s}-m\right|\right) \max \left(0,1-\left|y_{i}^{s}-n\right|\right) \\ \frac{\partial V_{i}^{c}}{\partial x_{i}^{s}}=\sum_{n}^{H} \sum_{m}^{W} U_{n m}^{c} \max \left(0,1-\left|y_{i}^{s}-n\right|\right) \begin{cases}0 & \text { if }\left|m-x_{i}^{s}\right| \geq 1 \\ 1 & \text { if } m \geq x_{i}^{s} \\ -1 & \text { if } m< x_{i}^{s}\end{cases} \end{gathered}\quad(7) ∂Unmc​∂Vic​​=n∑H​m∑W​max(0,1−∣xis​−m∣)max(0,1−∣yis​−n∣)∂xis​∂Vic​​=n∑H​m∑W​Unmc​max(0,1−∣yis​−n∣)⎩⎨⎧​01−1​ if ∣m−xis​∣≥1 if m≥xis​ if m<xis​​​(7)
对于∂Vic∂yis\frac{\partial V_{i}^{c}}{\partial y_{i}^{s}}∂yis​∂Vic​​,与 (7) 类似。

这为我们提供了一个(子)可微分采样机制,允许损失梯度不仅流回输入特征图(6),而且流回采样网格坐标(7),因此返回变换参数θ\thetaθ和定位网络因为∂xis∂θ\frac{\partial x_{i}^{s}}{\partial \theta}∂θ∂xis​​和∂xis∂θ\frac{\partial x_{i}^{s}}{\partial \theta}∂θ∂xis​​可以很容易地从(1)推导出来。由于采样函数的不连续性,必须使用子梯度。这种采样机制可以在 GPU 上非常有效地实现,方法是忽略所有输入位置的总和,而只查看每个输出像素的内核支持区域。

3.4 Spatial Transformer Networks


定位网络、网格生成器和采样器的组合形成了空间变换器(图 2)。这是一个独立的模块,可以在任何时候以任意数量放入 CNN 架构中,从而产生空间变换器网络。该模块的计算速度非常快,并且不会影响训练速度,在使用时会导致非常少的时间开销,甚至由于可以应用于转换器输出的后续下采样,可能会在注意力模型中加速。

在 CNN 中放置空间转换器可以让网络学习如何主动转换特征图,以帮助在训练期间最小化网络的整体成本函数。在训练期间,如何转换每个训练样本的知识被压缩并缓存在定位网络的权重(以及空间变换器之前的层的权重)中。对于某些任务,将定位网络的输出θ\thetaθ转发给网络的其余部分也可能很有用,因为它显式地编码了区域或目标的变换,因此也编码了位姿。

也可以使用空间变换器对特征图进行下采样或过采样,因为可以将输出维度H′H^{\prime}H′和W′W^{\prime}W′定义为与输入维度HHH和WWW不同。但是,对于具有固定的小空间支持的采样内核(例如双线性内核),使用空间变换器进行下采样会导致混叠效应。

最后,在一个 CNN 中可以有多个空间转换器。将多个空间变换器放置在网络的不断增加的深度允许对越来越抽象的表示进行转换,并且还为定位网络提供了潜在的更多信息表示,以作为预测转换参数的基础。还可以并行使用多个空间变换器——如果特征图中有多个目标或感兴趣的部分应该单独关注,这将很有用。这种架构在纯前馈网络中的一个限制是并行空间转换器的数量限制了网络可以建模的目标数量。

(Nips-2015)空间变换器网络相关推荐

  1. PyTorch 系列教程之空间变换器网络

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在本教程中,您将学习如何使用称为空间变换器网络的视觉注意机制来扩充 ...

  2. PyTorch 1.0 中文官方教程:空间变换器网络教程

    译者:冯宝宝 作者: Ghassen HAMROUNI 在本教程中,您将学习如何使用称为空间变换器网络的视觉注意机制来扩充您的网络.你可以在 DeepMind paper阅读有关空间变换器网络的更多内 ...

  3. pytorch空间变换网络

    pytorch空间变换网络 本文将学习如何使用称为空间变换器网络的视觉注意机制来扩充网络.可以在DeepMind paper 有关空间变换器网络的内容. 空间变换器网络是对任何空间变换的差异化关注的概 ...

  4. 系统学习深度学习(三十一)--Nature DQN(NIPS 2015)

    转自:https://www.cnblogs.com/pinard/p/9756075.html 1. DQN(NIPS 2013)的问题 在上一篇我们已经讨论了DQN(NIPS 2013)的算法原理 ...

  5. TGRS2021:Road Segmentation for Remote Sensing ImagesUsing Adversarial Spatial Pyrami对抗性空间金字塔网络的道路分割

    TGRS2022:Road Segmentation for Remote Sensing ImagesUsing Adversarial Spatial Pyramid Networks基于对抗性空 ...

  6. 空间变形网络——STN

    1 概述 CNN 的机理使得 CNN 在处理图像时可以做到 transition invariant,却没法做到 scaling invariant 和 rotation invariant.即使是现 ...

  7. Paper:《Spatial Transformer Networks空间变换网络》的翻译与解读

    Paper:<Spatial Transformer Networks空间变换网络>的翻译与解读 导读:该论文提出了空间变换网络的概念.主要贡献是提出了空间变换单元(Spatial Tra ...

  8. 空间映射网络--Spatial Transformer Networks

    Spatial Transformer Networks 主要对目标在特征空间做不变性归一化 解决 角度.尺度等变形引入的影响 Code: https://github.com/skaae/trans ...

  9. 目标检测之空间变形网络(STN)

    目标检测之空间变形网络(STN) 一.STN定义 STN:是一个可以放置在CNN前面,或嵌入到CNN其中的某一环节的模块(空间变形器),是Google旗下 DeepMind 公司的研究成果.该论文提出 ...

  10. 基于空间金字塔网络的光流估计

    Optical Flow Estimation using a Spatial Pyramid Network 我们学习通过结合经典的空间金字塔公式和深度学习来计算光流.通过当前流量估计和计算流量更新 ...

最新文章

  1. 了解机器学习回归的3种最常见的损失函数
  2. BZOJ - 3963: [WF2011]MachineWorks
  3. STL标准库六大组件
  4. 怎么看linux电脑是不是双核,Linux系统如何判断CPU是双核还是单核
  5. 洛谷找最小值c语言,洛谷 P1478 陶陶摘苹果(升级版) C语言实现
  6. [.net]c#登陆实现验证码-图形编程
  7. Puppet 笔记 package file services
  8. Unity游戏开始界面制作教学
  9. Kvaser、C++、Qt编写监控界面(一)
  10. Tableau豆瓣电影数据项目实战练习3
  11. D - Miracle Tree(思维+构造+树的直径)
  12. Hyper-V虚拟机网络配置
  13. 四十岁想跳槽,年龄是最大的障碍吗?
  14. NYOJ - [第九届河南省程序设计大赛]宣传墙(DP)
  15. matlab中magy是什么意思,MATLAB入门基本知识——音频处理
  16. 笔记13:Python 和 Elasticsearch 构建简易搜索
  17. 一个QQ空间的钓鱼盗号过程揭露,大家谨防上当
  18. 联发科 AI 智能核心板 - XY6877ZA(MT6877 天玑 900)
  19. pythonDay5-基本语法-中文编码-多行语句连接-输入输出-个人名片制作-类型之间的转换-判断用户的年龄
  20. MTK平台驱动基本介绍-2

热门文章

  1. dba成长随笔 -- 深入了解Oracle
  2. 中兴通讯加入LoRa Alliance董事会 推动中国运营级LoRa产业链发展
  3. 【连载之一】那些公众号不会告诉你的职业真相
  4. 卖家警惕 网购新骗术来袭
  5. 第三周——小小大佬带飞队
  6. Nginx 安装部署以及负载均衡
  7. java生成tga图片_游戏制作行业为什么使用TGA格式的贴图而不使用PNG格式?
  8. 每月一书(202104):《浪潮之巅》
  9. 关于抢购秒杀的实现思路与事例代码
  10. treeset可以重复吗_社保和商业医疗险可以重复报销吗?报销攻略请收好