我想将我的图像划分为较小的窗口,这些窗口将被发送到神经网络进行训练(例如,用于面部检测器训练)。我在Tensorflow中找到了tf.extract_image_patches
方法,这看起来就像我需要的那样。 This question解释了它的作用。
如果(1x10x10x1)
为1
(100
,那么示例会显示ksize
(数字(1, 3, 3, 1)
到strides
按顺序)的输入(1, 5, 5, 1)
)。输出是这样的:
[[[[ 1 2 3 11 12 13 21 22 23]
[ 6 7 8 16 17 18 26 27 28]]
[[51 52 53 61 62 63 71 72 73]
[56 57 58 66 67 68 76 77 78]]]]
但是我希望这样的窗口(形状为(Nx3x3x1)
,以便它是N
大小为3x3
的补丁/窗口:
[[[1, 2, 3]
[11, 12, 13]
[21, 22, 23]]
...
那么为什么所有补丁值都存储在1D中?这是否意味着这种方法不适用于我上面描述的目的,我不能用它来准备培训批次?我还发现了另一种补丁提取方法sklearn.feature_extraction.image.extract_patches_2d
,这个方法确实做了我所期待的。那么我应该理解这两种方法不能做同样的事情吗?
答案 0 :(得分:0)
正确,这些函数返回不同的张量(多维数组)。
首先,tf.extract_image_patches
文档为:
返回:
张量。与图像具有相同的类型。具有包含图像的形状
[batch, out_rows, out_cols, ksize_rows * ksize_cols * depth]
的4-D张量 大小为ksize_rows x ksize_cols x depth
的补丁 "深度"尺寸。注意out_rows
和out_cols
是维度 输出补丁。
基本上,这表示[1, 2, 3]
,[11, 12, 13]
,[21, 22, 23]
窗口被展平,或向量化"深度"尺寸。 out_rows
和out_cols
是根据strides
参数(在本例中为strides=[1, 5, 5, 1]
)和padding
计算的,'VALID'
。因此,输出形状为(1, 2, 2, 9)
。
换句话说:
strides
更改了空间维度ksizes
更改深度请注意,输出张量确实包含所有单独的窗口,因此您可以通过选择来访问它们。
另一方面,sklearn.feature_extraction.image.extract_patches_2d
:
返回:
patches
:array,shape =(n_patches, patch_height, patch_width)
或(n_patches, patch_height, patch_width, n_channels)
从n_patches
所在的图像中提取的补丁集合max_patches
或者可以的补丁总数 萃取。
这正是您所描述的:每个窗口都采用整个空间维度patch_height, patch_width
。这里,结果形状取决于patch_size
,跨步和填充不支持,第一个维度计算为补丁总数。