NumPy/PyTorch 提取图像子集

NumPy/PyTorch extract subsets of images

在 Numpy 中,给定一堆大图像 A of size(N,hl,wl),以及坐标 x 的大小 (N) 和 y 的大小 (N) 我想得到较小的图像大小 ( 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?如果不是,我该如何在那里实施?

非常简单 view_as_windows from scikit-image, to get those sliding windowed views as a 6D array with the fourth axis being singleton. Then, use advanced-indexing 到 select 我们想要的基于 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]]])

在 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()

其中切片中的第一个 : 指示 select 批次中的所有图像。第二个和第三个:表示对高宽的切片。

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