Для чего предназначен метод tf.extract_image_patches?

Я хочу разделить мои изображения на меньшие окна, которые будут отправлены в нейронную сеть для обучения (например, для обучения детекторов лица). я нашел tf.extract_image_patches метод в Tensorflow, который показался мне именно тем, что мне нужно. Этот вопрос объясняет, что он делает.

Пример там показывает ввод (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 и этот действительно делает то, что я ожидал. Так я должен понимать, что эти два метода не делают одно и то же?

1 ответ

Правильно, эти функции возвращают разные тензоры (многомерные массивы).

Первый, tf.extract_image_patches Документация гласит:

Возвращает:

Тензор. Имеет тот же тип, что и изображения. 4-D Тензор с формой [batch, out_rows, out_cols, ksize_rows * ksize_cols * depth] содержащие изображения патчи с размером 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: массив, форма = (n_patches, patch_height, patch_width) или же (n_patches, patch_height, patch_width, n_channels) Коллекция патчей извлечена из изображения, где n_patches либо max_patches или общее количество исправлений, которые можно извлечь.

Это именно то, что вы описываете: каждое окно принимает все пространственные измерения patch_height, patch_width, Здесь форма результата зависит от patch_size Разметка и отступы не поддерживаются, и первое измерение вычисляется как общее количество исправлений.

Другие вопросы по тегам