2017-11-11 168 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方法的作用,我會用它,但我需要大步... –