矩阵计算代码: np.meshgrid & DeformConv2d

meshgrid

X, Y = np.meshgrid(X, Y)

import numpy as np

X = np.arange(1, 4)
Y = np.arange(11, 13)
# MX.shape=MY.shape=(len(Y), len(X))=(H,W)
MX, MY = np.meshgrid(X, Y)
print(MX)
print(MY)
MP = np.stack([MX, MY], axis=-1)
[[1 2 3]
 [1 2 3]]
[[11 11 11]
 [12 12 12]]
MP:
	(x0, y0) (x1, y0) (x2, y0)
	(x0, y1) (x1, y1) (x2, y1)
=>
MX:
	x0 x1 x2
	x0 x1 x2
MY:
	y0 y0 y0
	y1 y1 y1

Y, X = torch.meashgrid(Y, X)

注意torch.meshgrid是反着的, Y, X = torch.meashgrid(Y, X)

import torch

X = torch.arange(1, 4)
Y = torch.arange(11, 13)
# MX.shape=MY.shape=(len(Y), len(X))=(H,W)
MY, MX = np.meshgrid(Y, X)
print(MX)
print(MY)
MP = np.stack([MX, MY], axis=-1)
tensor([[1, 2, 3],
        [1, 2, 3]])
tensor([[11, 11, 11],
        [12, 12, 12]]) 

example

import torch
a = torch.randn(2, 3)
h, w = a.shape
x, y = torch.arange(w), torch.arange(h)
y, x = torch.meshgrid(y, x)

print(a)
print(a[y, x])
assert a == a[y, x]
tensor([[-0.6665,  1.2862, -0.4445],
        [ 0.3087, -1.0775,  0.6277]])
tensor([[-0.6665,  1.2862, -0.4445],
        [ 0.3087, -1.0775,  0.6277]])

mmcv.ops.DeformConv2d

class DeformConv2d(nn.Module):
    ...
    def forward(self, x: Tensor, offset: Tensor) -> Tensor:
        """Deformable Convolutional forward function.

        Args:
            x (Tensor): Input feature, shape (B, C_in, H_in, W_in)
            offset (Tensor): Offset for deformable convolution, shape
                (B, deform_groups*kernel_size[0]*kernel_size[1]*2,
                H_out, W_out), H_out, W_out are equal to the output's.

                An offset is like `[y0, x0, y1, x1, y2, x2, ..., y8, x8]`.
                The spatial arrangement is like:

                .. code:: text

                    (x0, y0) (x1, y1) (x2, y2)
                    (x3, y3) (x4, y4) (x5, y5)
                    (x6, y6) (x7, y7) (x8, y8)

        Returns:
            Tensor: Output of the layer.
        """

可知offset是先行优先排列展开的点集合,再y优先的展开为一维向量。

在RepPointsHead中对feat_map上每个特征点预测的pts,都是相对中心点的偏移,而DeformaConv2D中的offset是相对卷积kernel上对应点的。

dcn_kernel = 3
dcn_pad = dcn_kernel // 2  # dcn_stride=1, dcn_kernel is odd number
base_off = np.arange(-dcn_pad, dcn_pad+1)
base_off_x, base_off_y = np.meshgrid(base_off, base_off)
base_off = np.stack([base_off_y , base_off_x], axis=-1).reshape(-1)
print(base_off)
base_off = torch.tensor(base_off).view(1, -1, 1, 1)

dcn_off = pts_out_init - base_off
feat = dconv(feat, dcn_off.type_as(feat))
array([-1, -1, -1,  0, -1,  1,  0, -1,  0,  0,  0,  1,  1, -1,  1,  0,  1, 1])
结构化数组是NumPy库中一种特殊的数组类型,它能够存储不同类型的数据,每个数据都有一个关联的结构。如果你想在Python中使用NumPy库创建一个覆盖[0,1]x[0,1]区域的结构化数组,并且有x和y坐标的覆盖,你可以按照以下步骤进行: 首先,你需要安装NumPy库(如果还没有安装的话),可以使用pip命令来安装:`pip install numpy`。 然后,你可以使用`np.meshgrid`函数来生成两个网格矩阵,分别代表x和y坐标。`np.meshgrid`函数可以将一个二维坐标网格化。接下来,我们可以将这些网格存储到一个结构化数组中。 以下是一个示例代码,展示了如何创建一个结构化数组,其中包含两个字段(x和y),并且这两个字段覆盖了[0,1]x[0,1]的区域: ```python import numpy as np # 定义x和y坐标的网格点数量 N = 10 # 生成x和y的坐标网格 x, y = np.meshgrid(np.linspace(0, 1, N), np.linspace(0, 1, N)) # 将x和y坐标合并为一个结构化数组 xy = np.zeros((N*N,), dtype=[('x', float), ('y', float)]) xy['x'] = x.flatten() xy['y'] = y.flatten() # 输出结构化数组的前几个元素来验证结果 print(xy[:5]) ``` 这段代码首先使用`np.linspace`函数创建了从0到1的N个等间隔的点,然后用`np.meshgrid`函数生成了两个坐标网格。`x`和`y`变量将包含这些坐标值的二维数组形式。为了创建结构化数组,我们定义了一个数据类型(dtype),指定包含两个字段:`x`和`y`,它们都是浮点数类型。接着,我们使用`flatten`方法将二维坐标网格展平成一维数组,并将其存储在结构化数组`xy`的对应字段中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值