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 我们想要的基于 y
和 x
索引的索引到窗口的第二和第三轴数组来获取我们的 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
在 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 我们想要的基于 y
和 x
索引的索引到窗口的第二和第三轴数组来获取我们的 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