2017-11-11 106 views
0

我想将我的图像分成更小的窗口,这些窗口将发送到神经网络进行训练(例如面部检测器训练)。我在Tensorflow中找到tf.extract_image_patches方法,这看起来正是我需要的。 This question解释它的功能。什么是tf.extract_image_patches方法的意思?

的例子有示出的给定(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中的修补程序值?这是否意味着这种方法不适用于我上面描述的目的,我不能用它来准备培训批次?我还发现了另一种补丁提取方法,这个是我真正想做的。所以我应该理解这两种方法不会做同样的事情吗?

回答

0

正确,这些函数返回不同的张量(多维数组)。

首先,tf.extract_image_patches文件上写着:

返回:

张量。与图像具有相同的类型。具有形状的4-D张量[batch, out_rows, out_cols, ksize_rows * ksize_cols * depth]包含图像 大小为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:阵列,形状= (n_patches, patch_height, patch_width)(n_patches, patch_height, patch_width, n_channels)的 收集从所述图像,其中n_patches是 任一提取的补丁的max_patches或者可以提取的补丁的总数量 。

这正是你所描述的:每个窗口占据整个空间维度patch_height, patch_width。这里,结果形状取决于,步长和填充是不支持,并且第一个维度计算为修补程序的总数。

+0

那么什么是tensorflow方法?我想到“补丁提取”正是sklearn方法的作用,我会用它,但我需要大步... –