【问题标题】:NumPy/PyTorch extract subsets of imagesNumPy/PyTorch 提取图像子集
【发布时间】:2018-03-09 01:40:12
【问题描述】:

在 Numpy 中,给定一堆大图像 Asize(N,hl,wl),以及尺寸 (N) 的坐标 x 和尺寸 (N) 的 y,我想要获得尺寸 (N,16,16) 的较小图像

在 for 循环中它看起来像这样:

B=numpy.zeros((N,16,16))
for i in range(0,N):
  B[i,:,:]=A[i,y[i]:y[i]+16,x[i]:x[i]+16]

但是我可以只使用索引来做到这一点吗? 额外问题:这个索引是否也适用于pytorch?如果没有,我该如何实现呢?

【问题讨论】:

  • 发布的解决方案是否适合您?
  • 是的,它们都很好,但是你假设我正在寻找的每个样本都有不同的切片。虽然不循环样本,但更难移动到火炬。 tensorflow 有一个 extract_glimpses 函数,虽然现在可以使用 :)

标签: python numpy deep-learning pytorch


【解决方案1】:

在 numpy 中,切片非常简单,并且相同的逻辑适用于 pytorch 示例。例如

imgs = np.random.normal(size=(16,24,24))
imgs[:,0:12,0:12].shape
imgs_tensor = torch.from_numpy(imgs)
imgs_tensor[:,0:12,0:12].size()

切片中的第一个:表示选择批次中的所有图像。第 2 和第 3 个: 表示高度和宽度的切片。

【讨论】:

  • 谢谢。但是正在寻找当您想为每张图像分割不同区域时会发生什么
  • 你在看torchvision.transforms.RandomCrop
【解决方案2】:

使用view_as_windows from scikit-image 非常简单,可以将这些滑动窗口视图作为一个 6D 数组,其中第四轴是单例的。然后,使用advanced-indexing 根据yx 索引选择我们想要的索引,以便索引到窗口数组的第二和第三轴,以获得我们的B

因此,实现将是 -

from skimage.util.shape import view_as_windows

BSZ = 16, 16 # Blocksize
A6D = view_as_windows(A,(1,BSZ[0],BSZ[1]))
B_out = A6D[np.arange(N),y,x,0]

说明

为了向其他读者解释问题的真正原因,这里有一个在较小的数据集上运行的示例,块大小为(2,2) -

1) 输入数组(3D):

In [78]: A
Out[78]: 
array([[[ 5,  5,  3,  5,  3,  8],
        [ 5,  *2,  6,  2,  2,  4],
        [ 4,  3,  4,  9,  3,  8],
        [ 6,  3,  3, 10,  4,  5],
        [10,  2,  5,  7,  6,  7],
        [ 5,  4,  2,  5,  2, 10]],

       [[ 4,  9,  8,  4,  9,  8],
        [ 7, 10,  8,  2, 10,  9],
        [10,  *9,  3,  2,  4,  7],
        [ 5, 10,  8,  3,  5,  4],
        [ 6,  8,  2,  4, 10,  4],
        [ 2,  8,  6,  2,  7,  5]],

       [[ *4,  8,  7,  2,  9,  9],
        [ 2, 10,  2,  3,  8,  8],
        [10,  7,  5,  8,  2, 10],
        [ 7,  4, 10,  9,  6,  9],
        [ 3,  4,  9,  9, 10,  3],
        [ 6,  4, 10,  2,  6,  3]]])

2) y 和 x 索引以索引到第二和第三轴:

In [79]: y
Out[79]: array([1, 2, 0])

In [80]: x
Out[80]: array([1, 1, 0])

3) 最后是所需的输出,它是每个 2D 切片沿第一个轴的一个块,其起点(左上角点)是该 2D 切片上的(y,x)。请参阅 A 中的星号 -

In [81]: B
Out[81]: 
array([[[ 2,  6],
        [ 3,  4]],

       [[ 9,  3],
        [10,  8]],

       [[ 4,  8],
        [ 2, 10]]])

【讨论】:

    【解决方案3】:

    这是一个 extract_glimpse 的实现,类似于 PyTorch 中的 tf.image.extract_glimpse。它应该满足您的需求: https://github.com/jimmysue/xvision/blob/main/xvision/ops/extract_glimpse.py#L14

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-02
      • 2018-05-06
      • 2021-09-04
      • 2020-06-03
      • 2021-12-19
      • 1970-01-01
      • 2020-08-22
      • 2013-10-10
      相关资源
      最近更新 更多