deform_conv2d

paddle.vision.ops.deform_conv2d ( x, offset, weight, bias=None, stride=1, padding=0, dilation=1, groups=1, mask=None, name=None ) [源代码]

deform_conv2d 对输入4-D Tensor计算2-D可变形卷积。给定输入Tensor x,输出Tensor y,可变形卷积运算如下所示:

可形变卷积v2(mask != None):

deform_conv2d - 图1

可形变卷积v1(mask = None):

deform_conv2d - 图2

其中

deform_conv2d - 图3

deform_conv2d - 图4

分别为第k个位置的可学习偏移和调制标量。在deformable conv v1中

deform_conv2d - 图5

为1.

具体细节可以参考论文:<<Deformable ConvNets v2: More Deformable, Better Results>><<Deformable Convolutional Networks>>

示例

输入:

input 形状:

deform_conv2d - 图6

卷积核形状:

deform_conv2d - 图7

offset 形状:

deform_conv2d - 图8

mask 形状:

deform_conv2d - 图9

输出:

输出形状:

deform_conv2d - 图10

其中

deform_conv2d - 图11

参数:

  • x (Tensor) - 形状为

    deform_conv2d - 图12

    的输入Tensor,数据类型为float32或float64。

  • offset (Tensor) – 可变形卷积层的输入坐标偏移,数据类型为float32或float64。

  • weight (Tensor) – 卷积核参数,形状为

    deform_conv2d - 图13

    , 其中 M 是输出通道数,g 是group组数,kH是卷积核高度尺寸,kW是卷积核宽度尺寸。数据类型为float32或float64。

  • bias (Tensor, 可选) - 可变形卷积偏置项, 形状为

    deform_conv2d - 图14

  • 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。

  • dilation (int|list|tuple,可选) - 空洞大小。空洞卷积时会使用该参数,卷积核对输入进行卷积时,感受野里每相邻两个特征点之间的空洞信息。如果空洞大小为列表或元组,则必须包含两个整型数:(dilation_height,dilation_width)。若为一个整数,dilation_height = dilation_width = dilation。默认值:1。

  • groups (int,可选) - 二维卷积层的组数。根据Alex Krizhevsky的深度卷积神经网络(CNN)论文中的成组卷积:当group=n,输入和卷积核分别根据通道数量平均分为n组,第一组卷积核和第一组输入进行卷积计算,第二组卷积核和第二组输入进行卷积计算,……,第n组卷积核和第n组输入进行卷积计算。默认值:1。

  • mask (Tensor, 可选) – 可变形卷积层的输入掩码,当使用可变形卷积算子v1时,请将mask设置为None, 数据类型为float32或float64。

  • name (str,可选) – 具体用法请参见 Name ,一般无需设置,默认值为None。

返回:可变形卷积输出的4-D Tensor,数据类型为float32或float64。

代码示例

  1. #deformable conv v2:
  2. import paddle
  3. input = paddle.rand((8, 1, 28, 28))
  4. kh, kw = 3, 3
  5. weight = paddle.rand((16, 1, kh, kw))
  6. # offset shape should be [bs, 2 * kh * kw, out_h, out_w]
  7. # mask shape should be [bs, hw * hw, out_h, out_w]
  8. # In this case, for an input of 28, stride of 1
  9. # and kernel size of 3, without padding, the output size is 26
  10. offset = paddle.rand((8, 2 * kh * kw, 26, 26))
  11. mask = paddle.rand((8, kh * kw, 26, 26))
  12. out = paddle.vision.ops.deform_conv2d(input, offset, weight, mask=mask)
  13. print(out.shape)
  14. # returns
  15. [8, 16, 26, 26]
  16. #deformable conv v1:
  17. import paddle
  18. input = paddle.rand((8, 1, 28, 28))
  19. kh, kw = 3, 3
  20. weight = paddle.rand((16, 1, kh, kw))
  21. # offset shape should be [bs, 2 * kh * kw, out_h, out_w]
  22. # In this case, for an input of 28, stride of 1
  23. # and kernel size of 3, without padding, the output size is 26
  24. offset = paddle.rand((8, 2 * kh * kw, 26, 26))
  25. out = paddle.vision.ops.deform_conv2d(input, offset, weight)
  26. print(out.shape)
  27. # returns
  28. [8, 16, 26, 26]