什么是tf.extract_image_patches方法的意思?

时间:2017-11-11 09:02:41

标签: python tensorflow scikit-learn sliding-window

我想将我的图像划分为较小的窗口,这些窗口将被发送到神经网络进行训练(例如,用于面部检测器训练)。我在Tensorflow中找到了tf.extract_image_patches方法,这看起来就像我需要的那样。 This question解释了它的作用。

如果(1x10x10x1)1100,那么示例会显示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,这个方法确实做了我所期待的。那么我应该理解这两种方法不能做同样的事情吗?

1 个答案:

答案 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_rowsout_cols是维度   输出补丁。

基本上,这表示[1, 2, 3][11, 12, 13][21, 22, 23]窗口被展平,或向量化"深度"尺寸out_rowsout_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,跨步和填充不支持,第一个维度计算为补丁总数。