车牌检测STN:Spatial Transformer Networks

车牌检测STN:Spatial Transformer Networks参考文献:MaxJaderberg,KarenSimonyan,AndrewZisserman,KorayKavukcuoglu.SpatialTransformerNetworks,2016.linkSpatialTransformerNetworks空间变换网络MaxJaderberg,KarenSimonyan,AndrewZisserman,Kor…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

参考文献:Max Jaderberg, Karen Simonyan, Andrew Zisserman, Koray Kavukcuoglu. Spatial Transformer Networks, 2016.link

Spatial Transformer Networks空间变换网络

Max Jaderberg, Karen Simonyan, Andrew Zisserman, Koray Kavukcuoglu

摘要

卷积神经网络定义了一类异常强大的模型,但仍然受到缺乏在计算和参数效率方面对输入数据具有空间不变性的能力的限制。在这项工作中,我们引入了一个新的可学习模块,即空间转换器,它明确地允许在网络中对数据进行空间操作。该可微模块可以插入到现有的卷积结构中,使神经网络能够主动地在特征映射本身上有条件地变换特征映射,而无需任何额外的训练监督或修改优化过程。我们表明,使用空间变换器会导致模型学习到对平移、缩放、旋转和更一般的扭曲不变性,从而在多个基准和多个变换类上获得最先进的性能。

1 引言

近年来,通过采用一种快速、可扩展、端到端的学习框架,即卷积神经网络(CNN)[21],计算机视觉的前景发生了巨大的变化并得到了推进。虽然不是最近的发明,但我们现在看到大量基于cnn的模型在分类[19、28、35]、本地化[31、37]、语义分割[24]和动作识别[12、32]任务等方面取得了最新的成果。

能够对图像进行推理系统的一个理想特性是从纹理和形状中分离出物体的姿态和部分变形。在CNNs中引入局部最大池化层,通过允许网络在空间上对特征的位置保持某种不变,有助于满足这一特性。然而,局部最大池化层的引入使得CNN在特征位置变换上具有一定的空间不变性。但是最大池化层max-pooling的窗口通常很小2*2,因此这种空间不变形仅仅在比较深的网络层次结构上才会被体现出来,并且对于比较大的空间变换是无效的。CNNs对较大空间变换不具有空间不变性的原因是因为只有一个有限的、预先定义的池化机制来处理空间变换。

在这项工作中,我们引入了一个空间转换模块,它可以包含在一个标准的神经网络架构中,以提供空间转换能力。空间转换器的动作取决于单个数据样本,并在训练期间学习相关任务的适当行为(无需额外监督)。与固定且局部的池化层不同,空间变换模块是一种动态机制,它可以通过为每个输入样本生成适当的变换来主动地在空间上变换图像(或特征映射)。然后对整个特征映射(非局部)执行变换,可以包括缩放、裁剪、旋转以及非刚性变形。这使得包括空间变换器的网络不仅可以选择图像中最相关(注意)的区域,而且可以将这些区域转换为规范的、期望的形状,以简化下一层中的识别。值得注意的是,空间变换器可以使用标准的反向传播进行训练,允许对注入的模型进行端到端的训练。
在这里插入图片描述
(a)输入层;(b)STN层;(c)空间变换矫正后的层;(d)输出的识别层。

空间变换器可以并入CNN中,以帮助完成各种任务,例如:(i)图像分类:假设CNN接受训练,根据图像是否包含特定的数字来执行图像的多方向分类,其中数字的位置和大小可能随每个样本而显著变化(并且与类无关),空间变换器将适当的区域简化以进行后续的分类任务,并具有更好的分类性能,参见图1;(ii)共同定位:给定一组包含相同(但未知)类的不同实例的图像,可以使用空间变换器在每个图像中定位它们;(iii)空间注意:空间变换器可以用于需要注意机制的任务,例如在[14, 39 ]中,但是更灵活,并且可以在没有强化学习的情况下纯粹通过反向传播来训练。使用注意力的一个关键好处是,转换了低分辨率输入为高分辨率原始输入,从而提高计算效率。

论文的其余部分安排如下:第二节讨论了相关工作,第三节介绍了空间变换器的设计和实现,第四节给出了最终实验结果。附录A给出了附加的实验和实现细节。

2 相关工作

在本节中,我们讨论本文的相关工作,包括用神经网络建模变换的中心思想[15,16,36]、学习和分析变换不变量表示[4,6,10,20,22,33]以及用于特征选择的注意和检测机制[1,7,11,14,27,29]。

Hinton[15]的早期工作着眼于为对象组件分配标准参照系,这一主题在[16]中重复出现,其中对二维仿射变换进行建模,以创建由变换组件组成的生成模型。生成训练方案的目标是转换后的输入图像,输入图像和目标之间的转换作为网络的附加输入。其结果是一个生成模型,它可以通过学习生成对象的变换图像。tieleman[36]进一步提出了变换部分的组合概念,显式仿射变换由网络预测得到,这样生成的模型能够从转换监督中学习用于分类的判别特征。

文献[22]通过估计原始图像和变换图像表示之间的线性关系,研究了CNN对输入图像变换的不变性和等变性。cohen&welling[6]分析了对称群的这种行为,gens&domingos[10]提出的体系结构也利用了对称群,从而得到了对对称群更为不变性的特征映射。设计变换不变量表示的其他尝试包括散射网络[4]和构造变换滤波器组的CNN[20,33]。Stollenga等人[34]使用基于网络激活的策略,为同一图像的后续转发过程设置网络过滤器的响应门,从而允许对特定特征的注意。在这项工作中,我们的目标是通过操作数据而不是特征提取器来实现不变量表示,这是在[9]中为聚类所做的。

具有选择性注意的神经网络通过take crops对数据进行操作,从而能够学习转换的不变性。[1,29]通过强化学习使用可微注意机制,而[14]通过在生成模型中使用高斯核来使用可微注意机制。Girshick等人的工作[11]使用区域建议算法作为注意的一种形式,并且[7]表明用CNN回归显著区域是可能的。我们在这篇文章中提出的框架可以看作是对任何空间变换的可微注意力机制的一个推广

3 空间变换

在本节中,我们将描述空间变换器的公式。这是一个可微模块,它在一次前向过程中将空间变换应用于一个特征映射,其中变换以特定输入为条件,生成一个输出特征映射。对于多通道输入,对每个通道应用相同的变换。为了简单起见,在本节中,我们考虑单个变换和每个变换的单个输出,但是在实验中我们可以推广到多个变换。
在这里插入图片描述
U是STN的输入特征图;localisation net是局部化网络, θ \theta θ是输入经过localisation net后得到的变换参数;G是空间网格(V的坐标), τ θ ( G ) \tau_{\theta } (G) τθ(G)是以 θ \theta θ为参数,对所V中所有坐标点G做采样操作的参数化采样网格;Sampler是采样,对V做填充;V是输出的warp特征图。

空间变换器的结构分为三部分,如图2所示。
Localisation net:是一个自己定义的网络,它输入U,输出变化参数Θ,这个参数用来映射U和V的坐标关系。
Grid generator:根据V中的坐标点和变化参数Θ,计算出V相对于U中的坐标点(理解:比如V中的坐标(1,1),与变化参数Θ相乘后,得到坐标(1.2,1.6),即V中坐标(1,1)的像素值等于U中坐标(1.2,1.6)的像素值)。这里是因为V的大小是自己先定义好的,当然可以得到V的所有坐标点,而填充V中每个坐标点的像素值的时候,要从U中去取,所以根据V中每个坐标点和变化参数Θ进行运算,得到一个相对于U的坐标。
Sampler:要做的是填充V,根据Grid generator得到的一系列坐标和原图U(因为像素值要从U中取)来填充,因为计算出来的坐标可能为小数,要用另外的方法来填充,比如双线性插值。

3.1 Localisation Network

局部化网络localisation Network的输入是 U ∈ R H × W × C U\in R^{^{H\times W\times C}} URH×W×C,其中 W W W是宽width, H H H是高height, C C C是通道数channels,输出是 θ \theta θ θ = f l o c ( U ) \theta =f_{loc}(U) θ=floc(U),参数 θ \theta θ的尺寸非常依赖于变换类型,例如仿射变换的参数就是6个维度。

localisation network函数 f l o c ( ) f_{loc}() floc()可以是任意的网络形式,既可以是全连接网络fully-connected network也可以是卷积网络convolutional network,但是应该包含一个最后的回归层final regression layer产生变换参数transformation parameters θ \theta θ

理解无约束车牌检测:把空间变换网络用到了最后一层,学习了6个仿射变换参数。

3.2 Parameterised Sampling Grid

输出特征图 V ∈ R H ′ × W ′ × C V\in R^{^{
{H}’\times {W}’\times C}}
VRH×W×C
H ′ {H}’ H W ′ {W}’ W分别是采样网格的高和宽,C通道数(与V通道数一致)。 G G G为V的坐标网格, G = { G i } G=\{G_{i}\} G={
Gi}
其中 G i = ( x i t , y i t ) G_{i} =(x_{i}^{t},y_{i}^{t}) Gi=(xit,yit)为了得到V的像素值,必须计算V的各个坐标点对应U的坐标点,即参数化采样网格 τ θ ( G ) \tau_\theta(G) τθ(G)
在这里插入图片描述
图3:图像U利用参数化采样网格输出V的两个示例
(a)参数化采样网格是一个规则的 G = τ I ( G ) G=\tau_I(G) G=τI(G),其中 I I I是一个恒等变换参数。(b)参数化采样网格 τ θ ( G ) \tau_\theta(G) τθ(G)采用了仿射变换。

为了简化理解,假定 τ θ \tau_{\theta } τθ是2D仿射空间变换 A θ A_{\theta } Aθ,则V的逐点仿射变换如下:
( x i s y i s ) = τ θ ( G i ) = A θ ( x i t y i t 1 ) = [ θ 11 θ 12 θ 13 θ 21 θ 22 θ 23 ] ( x i t y i t 1 ) \left ( \begin{matrix} x_i^s \\ y_i^s \\ \end{matrix} \right )=\tau_\theta(G_i)=A_\theta \left(\begin{matrix} x_i^t \\ y_i^t \\ 1 \end{matrix} \right ) =\left[ \begin{matrix} \theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21} & \theta_{22} & \theta_{23} \end{matrix} \right]\left(\begin{matrix} x_i^t \\ y_i^t \\ 1 \end{matrix} \right ) (xisyis)=τθ(Gi)=Aθxityit1=[θ11θ21θ12θ22θ13θ23]xityit1—–(1)

( x i t y i t ) \left(\begin{matrix} x_i^t \\ y_i^t \end{matrix} \right ) (xityit)是一个输出特征图V上的目标坐标 ( x i s y i s ) \left ( \begin{matrix} x_i^s \\ y_i^s \\ \end{matrix} \right ) (xisyis)是输入特征图U中的原坐标 A θ A_{\theta } Aθ是仿射变换矩阵,归一化输入图像的宽和高, − 1 ⩽ x i t , y i t ⩽ 1 -1\leqslant x_i^t,y_i^t\leqslant 1 1xit,yit1,同理输出图像 − 1 ⩽ x i s , y i s ⩽ 1 -1\leqslant x_i^s,y_i^s\leqslant 1 1xis,yis1。公式(1)中可以进行裁剪、平移、旋转、放缩和倾斜操作,只需要 A θ A_{\theta } Aθ中的6个参数(localisation network计算)。

如果 τ θ \tau_{\theta } τθ被更强的约束,例如 A θ A_{\theta } Aθ的形式是
A θ = [ s 0 t x 0 s t y ] A_{\theta }=\left[ \begin{matrix} s &0 & t_x \\ 0 & s & t_y \end{matrix} \right] Aθ=[s00stxty]—–(2)

公式(2)允许进行裁剪、平移、各向同性缩放,变量仅仅是 s 、 t x 、 t y s、t_x、t_y stxty

τ θ \tau_{\theta } τθ也可以变成更通用的形式例如平面摄影变换、分段放射或者薄板样条。 τ θ \tau_{\theta } τθ可以转换为任何的参数化形式,它必须是可微的,可微的特性很重要,这样可以允许从采样点 τ θ ( G i ) \tau_\theta(G_i) τθ(Gi)到localisation network输出 θ \theta θ进行梯度的反向传播。如果这种变换以一种结构化、低纬度的方式产生,这将降低分配给localisation network任务的复杂性。一个结构化可微变换的泛型类,它是注意力、仿射、投影、薄板样条变换的超集, τ θ = M θ B \tau_\theta =M_\theta B τθ=MθB,其中 B B B是一个目标网格表示, B B B是一个在齐次坐标中的规范网格 G G G M θ M_\theta Mθ是一个 θ \theta θ参数化的矩阵。 B 、 θ B、\theta Bθ同时被学习。

理解无约束车牌检测: G G G为以原点为中心的标准单元矩阵的坐标, τ θ ( G ) \tau_\theta(G) τθ(G)为仿射变换系数乘以标准单元矩阵的坐标,是相对于U的参数化采样网格。

3.3 differentiable Image Sampling可微图像采样

由于在3.2计算出了V中每个坐标点对应到U的坐标点(即参数化采样网格 τ θ ( G ) \tau_\theta(G) τθ(G)中的 ( x i s y i s ) \left ( \begin{matrix} x_i^s \\ y_i^s \\ \end{matrix} \right ) (xisyis)),在3.3就可以直接根据V的坐标点取得对应到U中坐标点的像素值来进行填充,而不需要经过矩阵运算。需要注意的是,填充并不是直接填充,首先计算出来的坐标可能是小数,要处理一下,其次填充的时候往往要考虑周围的其它像素值,填充公式如下。

V i c = ∑ n H ∑ m W U n m c k ( x i s − m ; ϕ x ) k ( y i s − n ; ϕ y ) ∀ ∈ [ 1… H ′ W ′ ] ∀ c ∈ [ 1… C ] V_i^c=\sum _n^H\sum_m^W{U_{nm}^ck(x_i^s-m;\phi _x)k(y_i^s-n;\phi_y )}\forall \in[1…H’W’] \forall_c\in[1…C] Vic=nHmWUnmck(xism;ϕx)k(yisn;ϕy)[1...HW]c[1...C]—–(3)

ϕ x \phi _x ϕx ϕ y \phi_y ϕy是泛型采样核 k ( ) k() k()的参数,定义了图像插值的方式(双线性插值), U n m c U_{nm}^c Unmc是输入 U U U在通道 C C C位置(n,m)的灰度值, V i c V_i^c Vic是输出V在通道 C C C位置 ( x i t , y i t ) (x_i^t,y_i^t) (xit,yit)像素i,所以可以看出每个通道都是以相同的方式进行变换的,这也保证了通道之间空间一致性。

理论上任何形式的采样核都可以使用,只要(子)梯度可以对 x i s x_i^s xis y i s y_i^s yis进行求导,例如公式(3)所示的整形采样核。

V i c = ∑ n H ∑ m W U n m c δ ( ⌊ x i s + 0.5 ⌋ − m ) δ ( ⌊ y i s + 0.5 ⌋ − n ) V_i^c=\sum _n^H\sum_m^W{U_{nm}^c\delta(\left \lfloor x_i^s +0.5\right \rfloor -m)\delta(\left\lfloor y_i^s +0.5\right\rfloor-n)} Vic=nHmWUnmcδ(xis+0.5m)δ(yis+0.5n)—–(4)

其中 ⌊ x + 0.5 ⌋ \left\lfloor x+0.5\right\rfloor x+0.5是对x进行四舍五入, δ ( ) \delta() δ()是Krobecker delta function,该采样核等价于将输入位置 ( x i s , y i s ) (x_i^s,y_i^s) (xis,yis)拷贝到输出位置 ( x i t , y i t ) (x_i^t,y_i^t) (xit,yit)

或者,可以使用双线性采样核,给出
V i c = ∑ n H ∑ m W U n m c m a x ( 0 , 1 − ∣ x i s − m ∣ ) m a x ( 0 , 1 − ∣ y i s − n ∣ ) V_i^c=\sum _n^H\sum_m^W{U_{nm}^cmax(0,1-|x_i^s-m|)max(0,1-|y_i^s-n|)} Vic=nHmWUnmcmax(0,1xism)max(0,1yisn)—–(5)

为了让损失函数通过这种采样机制反向传播,我们定义关于U和G的梯度如下,对于双线性采样bilinear sampling (5)该这部分偏微分如下:

∂ V i c ∂ U n m c = ∑ n H ∑ m W m a x ( 0 , 1 − ∣ x i s − m ∣ ) m a x ( 0 , 1 − ∣ y i s − n ∣ ) \frac{\partial V_i^c}{\partial U_{nm}^c} =\sum_n^H\sum_m^Wmax(0,1-|x_i^s-m|)max(0,1-|y_i^s-n|) UnmcVic=nHmWmax(0,1xism)max(0,1yisn)—–(6)

∂ V i c ∂ x i s = ∑ n H ∑ m W U n m s m a x ( 0 , 1 − ∣ y i s − n ∣ ) { 0 i f ∣ m − x i s ∣ ⩾ 1 1 i f m ⩾ x i s − 1 i f m < x i s \frac{\partial V_i^c}{\partial x_i^s} =\sum_n^H\sum_m^WU_{nm}^smax(0,1-|y_i^s-n|)\{\begin {matrix} 0& if |m-x_i^s| \geqslant 1 \\ 1& if m\geqslant x_i^s \\ -1 & if m< x_i^s\end{matrix} xisVic=nHmWUnmsmax(0,1yisn){
011ifmxis1ifmxisifm<xis
—–(7)

∂ V i c ∂ y i s \frac{\partial V_i^c}{\partial y_i^s} yisVic类似于公式(7)。

(偏)可微的采样机制允许损失梯度回流到输入特征特征图(6)和采样网格坐标(7),并且可以传回到转换参数 θ \theta θ和局部网络localisation network ∂ x i s ∂ θ \frac{\partial x_i^s} {\partial \theta} θxis ∂ x i s ∂ θ \frac{\partial x_i^s} {\partial \theta} θxis在公式(1)中很容易被计算。注意:由于采样函数不连续性,因此必须使用子梯度。

3.4 spatial transformer network

从图2我们可以看到,spatial transformer由localisation network、grid generator和samper组成。这是一个自包含模块,可以放在CNN架构的任何位置,任何数量产生spatial transformer network。该模块计算速度非常快,几乎不消耗时间,如果有下采样操作甚至可以潜在的加速。

在CNN中放置空间变换器可以让网络学习如何主动变换特征图,以帮助在训练期间最小化损失函数。在训练期间,如何转换每个训练样本并缓存localisation network 的权重(以及空间变换器之前层的权重)。对于某些任务,将localisation network的输出 θ \theta θ向前馈送到网络的其余部分也可能有用,因为它显示的编码了平移、姿态、区域和对象。

空间变换器也可以对特征映射进行降采样或过采样,获取一个有别于输入 H × W H\times W H×W H ′ × W ′ H’\times W’ H×W,然而对于固定的采样核,小空间支持(如双线性采样核),利用空间变换下采样可能导致混叠效果。

最后,在CNN中可以有多个STN,将多个空间变换器放置在网络越深的位置,可以对越来越抽象的信息进行变换,还可以为localisation network提供潜在的更多信息表示,以便根据预测信息得到转换参数。我们还可以并行使用多个空间变换器,如果多个对象或者感兴趣的部分需要单独关注时就十分有效了。这种结构在前馈网络中的一个限制是,并行空间转换器的数量限制了网络能够建模的对象数量。

4 实验

在本节中,我们将探讨空间变换网络在许多有监督学习任务中的应用。在第4.1节中,我们首先对MNIST手写数据集的失真版本进行了实验,展示了空间变换器通过主动变换输入图像来提高分类性能的能力。在第4.2节中,我们在具有挑战性的现实数据集Street View House Numbers[25]上测试空间变换网络,以进行数字识别,显示了使用嵌入CNN卷积堆栈中的多个空间变压器的最新结果。最后,在第4.3节中,我们研究了使用多个并行空间变换器进行细粒度分类,通过发现对象部分并学习关注它们,展示了cub-200-2011 birds数据集[38]的最新性能。关于MNIST加成和共定位的进一步实验见附录A。

4.1 Distorted MNIST


MNIST手写数字识别,对比了不同的网络结构和spatial transform的kernel,结果是带TPS的CNN效果最好,因为CNN里面有pooling所以对spatial会更鲁棒一些。
在这里插入图片描述

4.2 Street View House Numbers


这个实验里每隔几层conv就放一个STN,这样就是在feature上做spatial transform了,做了可视化之后可以发现stn不止做空间变化,还有crop的效果,类似attention,所以在运算上也会有些加速。
在这里插入图片描述

4.3 Fine-Grained Classification


这个实验验证多个STN并行作用在同一个feature map上的效果,从结果上看STN变多了对结果还是有帮助的,这个原因解释为更多的STN可以更好的对不同part做spatial transform并且关注不同的区域特征,这个对我们之前做多patch人脸识别的任务有类似的启发,其实可以用attention的方式自动去学习使用哪些part。
在这里插入图片描述

5 Conclusion

本文介绍了一种新的神经网络包含模块-空间变换网络。该模块可以被放入网络中,对特征进行显式的空间变换,为神经网络建模数据开辟了新的途径,并在不改变损失函数的情况下,以端到端的方式学习。虽然CNNs提供了令人难以置信的强大baseline,但我们看到在多个任务中使用空间变换器在精度上有所提高,从而获得了最先进的性能。此外,空间变换器的回归变换参数可作为输出,并可用于后续任务(无约束车牌检测中就是学习了仿射变换参数并作为输出)。虽然我们在这项工作中只探索了前馈网络,但早期的实验表明,空间变换在递归模型中非常强大,对于需要分离对象参考帧的任务非常有用,而且很容易扩展到三维变换(见附录A.3)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/180291.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 5g网络切片是什么意思_网络切片是5G网络的标志性

    5g网络切片是什么意思_网络切片是5G网络的标志性众所周知,5G网络除了高速度、低时延外,还将承载万物互联,而要满足各种不同垂直行业的差异化需求,就要依靠5G网络切片来实现。因此有专业人士认为网络切片是5G的核心,是运营商服务垂直行业的基础和关键。那么,到底什么是网络切片,为什么5G需要网络切片?网络切片,到底“切”的是什么?01切片技术是5G网络的核心2020年以来,5G建设浪潮奔涌而来,行业应用加速落地,5G与产业加速渗透融合,与经济高质量发展、社会数字化转型的联系愈发紧密。“4G改变生活,5G改变社会”,虽然当前5G的建设成果及其展现出的威

  • 数据库sql语句练习题「建议收藏」

    1、统计同一个房屋下的车辆个数:SELECThouseid,COUNT(*)FROMt_carGROUPBYhouseId;2、在1的基础上,统计拥有最多车辆个数的房间号SELECThouseId,COUNT(*)ascar_numFROMt_carGROUPBYhouseIdORDERBYcar_numDESCLIMIT1;

  • 精灵图 详解

    精灵图 详解精灵图技术why?1.减少请求次数,提高界面加载速度what?图片拼合技术,它就是把多张小图合成一张大图,利用 背景定位属性background-position:xpxypx实现显示大图当中的某一个小图how?1.确定显示小图片的那个盒子的宽高2.以背景的方式插入精灵图background-image:url();3.移动图片的定位位置background-positi…

  • 图片下划线 html,HTML <U>下划线标签元素 HTML下划线标签「建议收藏」

    图片下划线 html,HTML <U>下划线标签元素 HTML下划线标签「建议收藏」为html字体下划线样式标签,即对文字实现下划线效果。一、认识html下划线标签U1、htmlU下划线标签语法:以开始,以结束。u标签不是单独一个标签,而是有开始有闭合的一对标签,使用时候切记勿忘记结束,完成一组u下划线标签使用。内容HTML结构语法分析图2、下划线u用法被加下划线HTML下划线U使用效果截图二、htmlU下划线标签使用小实例接下来CSS5对html下划线标签进行小小实…

  • ICE初识

    ICE初识
    ICE:InternetCommunicationsEngine
    一种适用于异种环境的面向对象中间件平台
    他为我们提供了除DCOM,CORBA,JAVARMI,.NETRemoting,WebService,SOAPRPC以外的一种远程调用方式。
    更重要的是ICE是一种跨操作系统跨语言的远程调用方式(支持.NET1.1MONO1.0)。

    主页在:http://www.zeroc.com/index.html

  • 2021python激活码【在线注册码/序列号/破解码】[通俗易懂]

    2021python激活码【在线注册码/序列号/破解码】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号