深度学习根底入门篇[9.3]:卷积算子:空洞卷积、分组卷积、可拆散卷积、可变性卷积等具体解说以及利用场景和利用实例分析
1. 空洞卷积(Dilated Convolution)
1.1 空洞卷积提出背景
在像素级预测问题中(比方语义宰割,这里以 FCN[1]为例进行阐明),图像输出到网络中,FCN 先如同传统的 CNN 网络一样对图像做卷积以及池化计算,升高特色图尺寸的同时增大感触野。然而因为图像宰割是一种像素级的预测问题,因而咱们应用转置卷积(Transpose Convolution)进行上采样使得输入图像的尺寸与原始的输出图像保持一致。综上,在这种像素级预测问题中,就有两个关键步骤:首先是应用卷积或者池化操作减小图像尺寸,增大感触野;其次是应用上采样扩充图像尺寸。然而,应用卷积或者池化操作进行下采样会导致一个十分重大的问题:图像细节信息被失落,小物体信息将无奈被重建(假如有 4 个步长为 2 的池化层,则任何小于 $2^4$pixel 的物体信息将实践上无奈重建)。
1.2 空洞卷积及其利用
空洞卷积(Dilated Convolution),在某些文献中也被称为扩张卷积(Atrous Deconvolution),是针对图像语义宰割问题中下采样带来的图像分辨率升高、信息失落问题而提出的一种新的卷积思路。空洞卷积通过引入扩张率(Dilation Rate)这一参数使得同样尺寸的卷积核取得更大的感触野。相应地,也能够使得在雷同感触野大小的前提下,空洞卷积比一般卷积的参数量更少。
空洞卷积在某些特定的畛域有着十分宽泛的利用,比方:
- 语义宰割畛域:DeepLab 系列 [2,3,4,5] 与 DUC[6]。在 DeepLab v3 算法中,将 ResNet 最初几个 block 替换为空洞卷积,使得输入尺寸变大了很多。在没有增大运算量的前提下,维持分辨率不升高,取得了更密集的特色响应,从而使得还原到原图时细节更好。
- 指标检测畛域:RFBNet[7]。在 RFBNet 算法中,利用空洞卷积来模仿 pRF 在人类视觉皮层中的离心率的影响,设计了 RFB 模块,从而加强轻量级 CNN 网络的成果。提出基于 RFB 网络的检测器,通过用 RFB 替换 SSD 的顶部卷积层,带来了显著的性能增益,同时依然放弃受控的计算成本。
- 语音合成畛域:WaveNet[8]等算法。
1.3 空洞卷积与规范卷积的区别
对于一个尺寸为 $3\times{3}$ 的规范卷积,卷积核大小为 $3\times{3}$,卷积核上共蕴含 9 个参数,在卷积计算时,卷积核中的元素会与输出矩阵上对应地位的元素进行逐像素的乘积并求和。而空洞卷积与规范卷积相比,多了扩张率这一个参数,扩张率控制了卷积核中相邻元素间的间隔,扩张率的扭转能够管制卷积核感触野的大小。尺寸为 $3\times{3}$,扩张率别离为 $1,2,4$ 时的空洞卷积别离如 图 1 ,图 2 ,图 3 所示。
图 1 扩张率为 1 时的 3 * 3 空洞卷积
扩张率为 1 时,空洞卷积与规范卷积计算形式一样。
图 2 扩张率为 2 时的 3 * 3 空洞卷积
图 3 扩张率为 4 时的 3 * 3 空洞卷积
扩张率大于 1 时,在规范卷积的根底上,会注入空洞,空洞中的数值全副填 0。
1.4 空洞卷积的感触野
对于规范卷积而言,当规范卷积核尺寸为 $3\times{3}$ 时,咱们在输出矩阵上间断进行两次规范卷积计算,失去两个特色图。咱们能够察看不同层数的卷积核感触野大小,如 图 4 所示。
图 4 规范卷积的感触野示例
其中,$3\times3$ 卷积对应的感触野大小就是 $3\times3$,而通过两层 $3\times3$ 的卷积之后,感触野的大小将会减少到 $5\times5$。
空洞卷积的感触野计算形式与规范卷积大同小异。因为空洞卷积实际上能够看作在规范卷积核内填充’0’,所以咱们能够将其设想为一个尺寸变大的规范卷积核,从而应用规范卷积核计算感触野的形式来计算空洞卷积的感触野大小。对于卷积核大小为 $k$,扩张率为 $r$ 的空洞卷积,感触野 $F$ 的计算公式为:
$$F = k + (k-1)(r-1)$$
卷积核大小 $k=3$,扩张率 $r=2$ 时,计算形式如 图 5 所示。
图 5 空洞卷积的感触野示例
其中,通过一层空洞卷积后,感触野大小为 $5\times5$,而通过两层空洞卷积后,感触野的大小将会减少到 $9\times9$。
参考文献
[1] Fully Convolutional Networks for Semantic Segmentation
[2] Semantic image segmentation with deep convolutional nets and fully connected CRFs
[3] DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs
[4] Rethinking Atrous Convolution for Semantic Image Segmentation
[5] Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation
[6] Understanding Convolution for Semantic Segmentation
[7] Receptive Field Block Net for Accurate and Fast Object Detection
[8] WaveNet: a generative model for raw audio
2. 分组卷积(Group Convolution)
2.1 分组卷积提出背景
分组卷积(Group Convolution)最早呈现在 AlexNet[1]中。受限于过后的硬件资源,在 AlexNet 网络训练时,难以把整个网络全副放在一个 GPU 中进行训练,因而,作者将卷积运算分给多个 GPU 别离进行计算,最终把多个 GPU 的后果进行交融。因而分组卷积的概念应运而生。
2.2 分组卷积与规范卷积的区别
对于尺寸为 $H_1\times{W_1}\times{C_1}$ 的输出矩阵,当规范卷积核的尺寸为 $h_1\times{w_1}\times{C_1}$,共有 $C_2$ 个规范卷积核时,规范卷积会对残缺的输出数据进行运算,最终失去的输入矩阵尺寸为 $H_2\times{W_2}\times{C_2}$。这里咱们假如卷积运算前后的特色图尺寸放弃不变,则上述过程能够展现为 图 1 。
图 1 规范卷积示意图
思考到上述过程是残缺运行在同一个设施上,这也对设施的性能提出了较高的要求。
分组卷积则是针对这一过程进行了改良。分组卷积中,通过指定组数 $g$ 来确定分组数量,将输出数据分成 $g$ 组。须要留神的是,这里的分组指的是在深度上进行分组,输出的宽和高放弃不变,行将每 $\frac{C_1}{g}$ 个通道的数据分为一组。因为输出数据产生了扭转,相应的卷积核也须要进行对应的变动,即每个卷积核的输出通道数也就变为了 $\frac{C_1}{g}$,而卷积核的大小是不须要扭转的。同时,每组的卷积核个数也由原来的 $C_2$ 变为 $\frac{C_2}{g}$。对于每个组内的卷积运算,同样采纳规范卷积运算的计算形式,这样就能够失去 $g$ 组尺寸为 $H_2\times{W_2}\times{\frac{C_2}{g}}$ 的输入矩阵,最终将这 $g$ 组输入矩阵进行拼接就能够失去最终的后果。这样拼接实现后,最终的输入尺寸就能够放弃不变,依然是 $H_2\times{W_2}\times{C_2}$。分组卷积的运算过程如 图 2 所示。
图 2 分组卷积示意图
因为咱们将整个规范卷积过程拆分成了 $g$ 组规模更小的子运算来并行进行,所以最终升高了对运行设施的要求。同时,通过分组卷积的形式,参数量也能够失去升高。在上述的规范卷积中,参数量为:
$$h_1 \times w_1 \times C_1 \times C_2$$
而应用分组卷积后,参数量则变为:
$$h_1 \times w_1 \times \frac{C_1}{g} \times \frac{C_2}{g} \times g = h_1 \times w_1 \times C_1 \times C_2 \times \frac{1}{g}$$
2.3 分组卷积利用示例
比方对于尺寸为 $H\times{W}\times{64}$ 的输出矩阵,当规范卷积核的尺寸为 $3\times{3}\times{64}$,共有 $64$ 个规范卷积核时,图 3 为组数 $g=2$ 时的分组卷积计算形式。
图 3 组数为 2 时分组卷积示意图
此时,每组的输出通道数变为 32,卷积核通道数也变为为 32。所以,规范卷积对应的参数量是 $3\times{3}\times{64}\times{64}=36864$,而分组卷积的参数质变为 $3\times{3}\times{32}\times{32}\times{2}=18432$,参数量减少了一半。
参考文献[¶]
[1] ImageNet Classification with Deep Convolutional Neural Networks
© Copyright 2021, nlpers. Revision b063757f
.
Built with Sphinx using a theme provided by Read the Docs.
3. 可拆散卷积(Separable Convolution)
3.1 可拆散卷积提出背景
传统的卷积神经网络在计算机视觉畛域曾经获得了十分好的问题,然而仍然存在一个待改良的问题—计算量大。
当卷积神经网络应用到理论工业场景时,模型的参数量和计算量都是非常重要的指标,较小的模型能够高效地进行分布式训练,减小模型更新开销,升高平台体积功耗存储和计算能力的限度,不便部署在挪动端。
因而,为了更好地实现这个需要,在卷积运算的根底上,学者们提出了更为高效的可拆散卷积。
3.2 空间可拆散卷积
空间拆散卷积(spatial separable convolutions),顾名思义就是在空间维度将规范卷积运算进行拆分,将规范卷积核拆分成多个小卷积核。例如咱们能够将卷积核拆分成两个(或多个)向量的外积:
$$\begin{split} \left[\begin{array}{ccc} 3 & 6 & 9 \\ 4 & 8 & 12 \\ 5 & 10 & 15 \end{array}\right] = \left[\begin{array}{ccc} 3 \\ 4 \\ 5 \end{array}\right] \times \left[\begin{array}{ccc} 1 \quad 2 \quad 3 \end{array}\right] \end{split}$$
此时,对于一副输出图像而言,咱们就能够先用 $3\times1$ 的 kernel 做一次卷积,再用 $1\times3$ 的 kernel 做一次卷积,从而失去最终后果。具体操作如 图 1 所示。
图 1 空间可拆散卷积
这样,咱们将原始的卷积进行拆分,原本须要 9 次乘法操作的一个卷积运算,就变为了两个须要 3 次乘法操作的卷积运算,并且最终成果是不变的。可想而知,乘法操作缩小,计算复杂性就升高了,网络运行速度也就更快了。
然而空间可拆散卷积也存在肯定的问题,那就是并非所有的卷积核都能够拆分成两个较小的卷积核。所以这种办法应用的并不多。
3.3 空间可拆散卷积利用示例
空间可拆散卷积在深度学习中利用较少,在传统图像处理畛域比拟有名的是可用于边缘检测的 sobel 算子,拆散的 sobel 算子计算形式如下:
$$\begin{split} \left[\begin{array}{ccc} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{array}\right] = \left[\begin{array}{ccc} 1 \\ 2 \\ 1 \end{array}\right] \times \left[\begin{array}{ccc} -1 \quad 0 \quad 1 \end{array}\right] \end{split}$$
3.4 深度可拆散卷积
深度可拆散卷积(depthwise separable convolutions)的不同之处在于,其不仅仅波及空间维度,还波及深度维度(即 channel 维度)。通常输出图像会具备 3 个 channel:R、G、B。在通过一系列卷积操作后,输出特色图就会变为多个 channel。对于每个 channel 而言,咱们能够将其想成对该图像某种特定特色的解释阐明。例如输出图像中,“红色”channel 解释形容了图像中的“红色”特色,“绿色”channel 解释形容了图像中的“绿色”特色,“蓝色”channel 解释形容了图像中的“蓝色”特色。又例如 channel 数量为 64 的输入特色图,就相当于对原始输出图像的 64 种不同的特色进行了解释阐明。
相似空间可拆散卷积,深度可拆散卷积也是将卷积核分成两个独自的小卷积核,别离进行 2 种卷积运算:深度卷积运算和逐点卷积运算。首先,让咱们看看失常的卷积是如何工作的。
3.4.1 规范卷积
假如咱们有一个 $12\times 12\times 3$ 的输出图像,即图像尺寸为 $12\times 12$,通道数为 3,对图像进行 $5\times 5$ 卷积,没有填充(padding)且步长为 1。如果咱们只思考图像的宽度和高度,应用 $5\times 5$ 卷积来解决 $12\times 12$ 大小的输出图像,最终能够失去一个 $8\times 8$ 的输入特色图。然而,因为图像有 3 个通道,咱们的卷积核也须要有 3 个通道。这就意味着,卷积核在每个地位进行计算时,实际上会执行 $5\times 5\times 3=75$ 次乘法。如 图 2 所示,咱们应用一个 $5\times 5\times 3$ 的卷积核进行卷积运算,最终能够失去 $8\times 8\times 1$ 的输入特色图。
图 2 输入通道为 1 的规范卷积
如果咱们想减少输入的 channel 数量让网络学习更多种特色呢?这时咱们能够创立多个卷积核,比方 256 个卷积核来学习 256 个不同类别的特色。此时,256 个卷积核会别离进行运算,失去 256 个 $8\times 8\times 1$ 的输入特色图,将其重叠在一起,最终能够失去 $8\times 8\times 256$ 的输入特色图。如 图 3 所示。
图 3 输入通道为 256 的规范卷积
接下来,再来看一下如何通过深度可拆散卷积失去 $8\times 8\times 256$ 的输入特色图。
3.4.2 深度卷积运算
首先,咱们对输出图像进行深度卷积运算,这里的深度卷积运算其实就是逐通道进行卷积运算。对于一幅 $12\times 12\times 3$ 的输出图像而言,咱们应用大小为 $5\times 5$ 的卷积核进行逐通道运算,计算形式如 图 4 所示。
图 4 深度卷积运算
这里其实就是应用 3 个 $5\times 5\times 1$ 的卷积核别离提取输出图像中 3 个 channel 的特色,每个卷积核计算实现后,会失去 3 个 $8\times 8\times 1$ 的输入特色图,将这些特色图重叠在一起就能够失去大小为 $8\times 8\times 3$ 的最终输入特色图。这里咱们能够发现深度卷积运算的一个毛病,深度卷积运算短少通道间的特色交融,并且运算前后通道数无奈扭转。
因而,接下来就须要连贯一个逐点卷积来补救它的毛病。
3.4.3 逐点卷积运算
后面咱们应用深度卷积运算实现了从一幅 $12\times 12\times 3$ 的输出图像中失去 $8\times 8\times 3$ 的输入特色图,并且发现仅应用深度卷积无奈实现不同通道间的特色交融,而且也无奈失去与规范卷积运算统一的 $8\times 8\times 256$ 的特色图。那么,接下来就让咱们看一下如何应用逐点卷积实现这两个工作。
逐点卷积其实就是 $1\times 1$ 卷积,因为其会遍历每个点,所以咱们称之为逐点卷积。$1\times 1$ 卷积在后面的内容中曾经具体介绍了,这里咱们还是联合上边的例子看一下它的具体作用。
咱们应用一个 3 通道的 $1\times 1$ 卷积对上文中失去的 $8\times 8\times 3$ 的特色图进行运算,能够失去一个 $8\times 8\times 1$ 的输入特色图。如 图 5 所示。此时,咱们就应用逐点卷积实现了交融 3 个通道间特色的性能。
图 5 输入通道为 1 的逐点卷积
此外,咱们能够创立 256 个 3 通道的 $1\times 1$ 卷积对上文中失去的 $8\times 8\times 3$ 的特色图进行运算,这样,就能够实现失去与规范卷积运算统一的 $8\times 8\times 256$ 的特色图的性能。如 图 6 所示。
图 6 输入通道为 256 的逐点卷积
3.4.4 深度可拆散卷积的意义
上文中,咱们给出了深度可拆散卷积的具体计算形式,那么应用深度可拆散卷积代替规范卷积有什么意义呢?
这里咱们看一下上文例子中规范卷积的乘法运算个数,咱们创立了 256 个 $5\times 5\times 3$ 的卷积核进行卷积运算,每个卷积核会在输出图片上挪动 $8\times 8$ 次,因而总的乘法运算个数为:
$$256 \times 3 \times 5 \times 5 \times 8 \times 8=1228800$$
而换成深度可拆散卷积后,在深度卷积运算时,咱们应用 3 个 $5\times 5\times 1$ 的卷积核在输出图片上挪动 $8\times 8$ 次,此时乘法运算个数为:
$$3 \times 5 \times 5 \times 8 \times 8=4800$$
在逐点卷积运算时,咱们应用 256 个 $1\times 1\times 3$ 的卷积在输出特色图上挪动 $8\times 8$ 次,此时乘法运算个数为:
$$256 \times 1 \times 1 \times 3 \times 8 \times 8=49152$$
将这两步运算相加,即可失去,应用深度可拆散卷积后,总的乘法运算个数变为:53952。能够看到,深度可拆散卷积的运算量相较规范卷积而言,计算量少了很多。
3.4.5 深度可拆散卷积利用示例
MobileNetv1[1] 中应用的深度可拆散卷积如 图 7 右侧所示。相较于左侧的规范卷积,其进行了拆分,同时应用了 BN 层以及 RELU 激活函数穿插在深度卷积运算和逐点卷积运算中。
图 7 MobileNetv1 中的可拆散卷积
参考文献 ¶
[1] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
4. 可变形卷积详解
4.1 提出背景
视觉辨认的一个要害挑战是如何适应物体尺度、姿势、视点和整机变形的几何变动或模型几何变换。
但对于视觉辨认的传统 CNN 模块,不可避免的都存在 固定几何构造 的缺点:卷积单元在固定地位对输出特色图进行采样;池化层以固定比率升高空间分辨率;一个 ROI(感兴趣区域)池化层将一个 ROI 宰割成固定的空间单元;不足解决几何变换的外部机制等。
这些将会引起一些显著的问题。例如,同一 CNN 层中所有激活单元的感触野大小是雷同的,这对于在空间地位上编码语义的高级 CNN 层是不须要的。而且,对于具备精密定位的视觉辨认(例如,应用齐全卷积网络的语义宰割)的理论问题,因为不同的地位可能对应于具备不同尺度或变形的对象,因而,尺度或感触野大小的自适应确定是可取的。
为了解决以上所提到的局限性,一个天然地想法就诞生了:卷积核自适应调整本身的形态。这就产生了可变形卷积的办法。
4.2 可变形卷积
4.2.1 DCN v1
可变形卷积顾名思义就是卷积的地位是可变形的,并非在传统的 $N × N$ 的网格上做卷积,这样的益处就是更精确地提取到咱们想要的特色(传统的卷积仅仅只能提取到矩形框的特色),通过一张图咱们能够更直观地理解:
图 1 绵羊特征提取
在下面这张图外面,右边传统的卷积显然没有提取到残缺绵羊的特色,而左边的可变形卷积则提取到了残缺的不规则绵羊的特色。
那可变卷积实际上是怎么做的呢?_其实就是在每一个卷积采样点加上了一个偏移量_,如下图所示:
图 2 卷积核和可变形卷积核
(a) 所示的失常卷积法则的采样 9 个点(绿点);(b)(c)(d) 为可变形卷积,在失常的采样坐标上加上一个位移量(蓝色箭头);其中 (d) 作为 (b) 的非凡状况,展现了可变形卷积能够作为尺度变换,比例变换和旋转变换等非凡状况。
一般的卷积,以 $3\times3$ 卷积为例对于每个输入 $y_(\mathrm{p}_0)$,都要从 $x$ 上采样 9 个地位,这 9 个地位都在核心地位 $\mathrm{x}(p0)$ 向周围扩散,$(-1,-1)$ 代表 $\mathrm{x}(p0)$ 的左上角,$(1,1)$ 代表 $\mathrm{x}(p0)$ 的右下角。
$$\mathrm{R} = \{(-1,-1),(-1,0),…,(0,1),(1,1)\}$$
所以传统卷积的输入就是(其中 $\mathrm{p}_n$ 就是网格中的 $n$ 个点,$\mathrm{w}(\mathrm{p}_n)$ 示意对应点地位的卷积权重系数):$ $y(\mathrm{p}_0)=\sum_{\mathrm{p}_n\in\mathrm{R}}\mathrm{w}(\mathrm{p}_n) \cdot \mathrm{x}(\mathrm{p}_0+\mathrm{p}_n)$ $
正如下面论述的可变形卷积,就是在传统的卷积操作上退出了一个偏移量 $\Delta \mathrm{p}_n$,正是这个偏移量才让卷积变形为不规则的卷积,这里要留神这个偏移量能够是小数,所以上面的式子的特征值须要通过_双线性插值_的办法来计算。
$$y(\mathrm{p}_0)=\sum_{\mathrm{p}_n\in\mathrm{R}}\mathrm{w}(\mathrm{p}_n) \cdot \mathrm{x}(\mathrm{p}_0+\mathrm{p}_n+\Delta \mathrm{p}_n)$$
那这个偏移量如何算呢?咱们来看:
图 3 3×3 deformable convolution
对于输出的一张 feature map,假如原来的卷积操作是 $3\times3$ 的,那么为了学习偏移量 offset,咱们定义另外一个 $3\times3$ 的卷积层(图中下面的那层),输入的维度其实就是原来 feature map 大小,channel 数等于 $2N$(别离示意 $x,y$ 方向的偏移)。上面的可变形卷积能够看作先基于下面那局部生成的 offset 做了一个插值操作,而后再执行一般的卷积。
4.2.2 DCN v2
DCN v2 在 DCN v1 根底(增加 offset)上增加每个采样点的权重
为了解决引入了一些无关区域的问题,在 DCN v2 中咱们不只增加每一个采样点的偏移,还增加了一个权重系数 $\Delta m_k$,来辨别咱们引入的区域是否为咱们感兴趣的区域,如果这个采样点的区域咱们不感兴趣,则把权重学习为 0 即可:
$$y(\mathrm{p}_0)=\sum_{\mathrm{p}_n\in\mathrm{R}}\mathrm{w}(\mathrm{p}_n) \cdot \mathrm{x}(\mathrm{p}_0+\mathrm{p}_n+\Delta \mathrm{p}_n) \cdot \Delta m_k$$
paddle 中的 API
paddle.vision.ops.deform_conv2d(*x*, *offset*, *weight*, *bias=None*, *stride=1*, *padding=0*, *dilation=1*, *deformable_groups=1*, *groups=1*, *mask=None*, *name=None*);
deform_conv2d 对输出 4 -D Tensor 计算 2 - D 可变形卷积。详情参考 deform_conv2d。
外围参数解析:
- x (Tensor) – 形态为 $(N,C,H,W)$ 的输出 Tensor,数据类型为 float32 或 float64。
- offset (Tensor) – 可变形卷积层的输出坐标偏移,数据类型为 float32 或 float64。
- weight (Tensor) – 卷积核参数,形态为 $M,C/g,k_H,k_W]$, 其中 M 是输入通道数,$g$ 是 group 组数,$k_H$ 是卷积核高度尺寸,$k_W$ 是卷积核宽度尺寸。数据类型为 float32 或 float64。
- stride (
int|list|tuple
,可选) – 步长大小。卷积核和输出进行卷积计算时滑动的步长。如果它是一个列表或元组,则必须蕴含两个整型数:(stride_height,stride_width)。若为一个整数,stride_height = stride_width = stride。默认值:1。 - padding (
int|list|tuple
,可选) – 填充大小。卷积核操作填充大小。如果它是一个列表或元组,则必须蕴含两个整型数:(padding_height,padding_width)。若为一个整数,padding_height = padding_width = padding。默认值:0。 - mask (Tensor, 可选) – 可变形卷积层的输出掩码,当应用可变形卷积算子 v1 时,请将 mask 设置为 None, 数据类型为 float32 或 float64。
输出:
- input 形态:$(N,C_{in},H_{in},W_{in})$
- weight 形态:$(C_{out},C_{in},H_f,W_f)$
- offset 形态:$(N,2*H_f*W_f,H_{out},W_{out})$
- mask 形态:$(N,H_f*W_f,H_{out},W_{out})$
输入:
- output 形态:$(N,C_{out},H_{out},W_{out})$
其中:
$$\begin{split} H_{out}=\frac{(H_{in}+2*paddings[0]-(dilations[0]*(H_f-1)+1))} {strides[0]}+1 \\ W_{out}=\frac{(W_{in}+2*paddings[1]-(dilations[1]*(W_f-1)+1))} {strides[1]}+1 \end{split}$$
算法实例:
#deformable conv v2:
import paddle
input = paddle.rand((8, 1, 28, 28))
kh, kw = 3, 3
weight = paddle.rand((16, 1, kh, kw))
# offset shape should be [bs, 2 * kh * kw, out_h, out_w]
# mask shape should be [bs, hw * hw, out_h, out_w]
# In this case, for an input of 28, stride of 1
# and kernel size of 3, without padding, the output size is 26
offset = paddle.rand((8, 2 * kh * kw, 26, 26))
mask = paddle.rand((8, kh * kw, 26, 26))
out = paddle.vision.ops.deform_conv2d(input, offset, weight, mask=mask)
print(out.shape)
# returns
[8, 16, 26, 26]
#deformable conv v1: 无 mask 参数
import paddle
input = paddle.rand((8, 1, 28, 28))
kh, kw = 3, 3
weight = paddle.rand((16, 1, kh, kw))
# offset shape should be [bs, 2 * kh * kw, out_h, out_w]
# In this case, for an input of 28, stride of 1
# and kernel size of 3, without padding, the output size is 26
offset = paddle.rand((8, 2 * kh * kw, 26, 26))
out = paddle.vision.ops.deform_conv2d(input, offset, weight)
print(out.shape)
# returns
[8, 16, 26, 26]
阐明:
- 对于每个 input 的图片数据都是 $(C,H_{in},W_{in})$ 类型的数据,其中 offset 和 mask(如果有)中的 $H_{out}$ 和 $W_{out}$ 示意的是输入图片的 feature 数据格式高和宽。
- 对于每个 input 图片数据数据对应的输入 feature map 图中每一个输入的特色地位都有对应的一个大小为 $2*H_f*W_f$ 的偏移项和 $H_f*W_f$ 的掩膜项。这样的大小设置是因为偏移项对应的是咱们采样的有 $H_f*W_f$ 个点,每个点都有对应的两个偏移方向和一个重要水平。前者就对应了咱们的偏移项,后者就对应了掩膜项。
-
算法的过程能够了解为以下三个步骤:
- 通过 offset 获取对应输入地位的偏移数据,进行采样点的偏移
- 失常应用卷积核查偏移后的采样点进行卷积操作
- 应用 mask 对卷积的输入进行对应地位相乘,这决定了不同地位的关注水平
4.3 实例成果
图 4 regular、DCN v1、DCN v2 的感触野比照
能够从上图 4 看到,能够看到当绿色点在指标上时,红色点所在区域也集中在指标地位,并且根本可能笼罩不同尺寸的指标,因而通过可变形卷积,咱们能够更好地提取出感兴趣物体的残缺特色,成果是十分不错的。
但 DCN v1 听起来不错,但其实也有问题:咱们的可变形卷积有可能引入了无用的上下文(区域)来烦扰咱们的特征提取,这显然会升高算法的体现。通过上图 4 的比照试验后果(多边形区域框)咱们也能够看到 DCN v2 更能集中在物体的残缺无效的区域
图 5 regular、DCN v1、DCN v2 的准确率比照
应用可变形卷积,能够更加高效的从图片中获取到指标的特色信息,能够起到晋升传统卷积神经网络(如 ResNet
、Faster R-CNN
等)辨认和宰割上的性能。如以上图 5,能够将 ResNet
等网络中的 $3\times3$ 规范卷积操作更改为 $3\times3$ 可变形卷积操作,通过钻研发现只有减少很少的计算量,就能够失去较大幅度的性能晋升。
总结来说,_DCN v1 中引入的 offset 是要寻找无效信息的区域地位,DCN v2 中引入权重系数是要给找到的这个地位赋予权重,这两方面保障了无效信息的精确提取_。
参考文献
[1] Dai J , Qi H , Xiong Y , et al. Deformable Convolutional Networks[J]. IEEE, 2017.
[2] Zhu X , Hu H , Lin S , et al. Deformable ConvNets V2: More Deformable, Better Results[C]// 2019 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR). IEEE, 2019.
[3] https://blog.csdn.net/cristiano20/article/details/107931844
[4] https://www.zhihu.com/question/303900394/answer/540818451
[5] https://www.paddlepaddle.org.cn/documentation/docs/zh/api/pad…