Обрезка большого изображения для тензорного конвейера - PullRequest
2 голосов
/ 13 апреля 2019

Я работаю над сегментацией изображения с помощью больших спутниковых изображений .JP2.

  • форма изображения: (10000, 10000, 13) из-за 13 полос (13 различных наблюдений длин волн для одной и той же области)

  • uint32

Я хочу построить самый эффективный трубопровод тензорного потока но у меня нет большого опыта.

Я хочу легко настроить количество полос, используемых для тренировки (RGB для первой тренировки, затем я попытаюсь добавить больше полос, чтобы посмотреть, не увеличит ли это производительность)

Я представил два разных конвейера:

  • I , преобразующий my .JP2 в массив (10000 x 10000 x 13). Затем в конвейер подается желаемых фрагментов (например, 128x128x3, если я хочу изображение RGB)

  • Или, я препроцессирую свой большойизображение в 13 различных папок (13 полос) Затем входной конвейер использует нужные наборы данных для построения входного изображения 128 x 128 x (1-13)

Брать большое изображение и нарезать его, как я хочу, прямо в конвейер тензорного потока удобнее, потому что мне просто нужен массив с размером 10000x10000x13 в качестве обучающего набора.Но я не знаю, является ли это релевантным / оптимизированным / возможным ...

Каков наиболее оптимизированный способ , чтобы решить мой pb?(У меня 11Гб 1080 GPU)

1 Ответ

3 голосов
/ 17 апреля 2019

Наиболее эффективный подход, почти всегда, является продуктом итеративного улучшения. Итак, как хорошее начало, давайте рассмотрим пример. В целях демонстрации я использовал игрушечный массив со случайными цветными блоками, разделил его на 13 полос и сцепил всего 3. Первое измерение добавлено для batch_size

init_image = np.random.randint(0,255,(1, 4, 4, 13))
bands = np.split(d, 13, axis=3)
image = np.concatenate((d_s[0], d_s[1], d_s[2]), axis=3)

Сначала мы создаем одно большое изображение из набора данных, чтобы извлечь из него патчи. enter image description here

dataset = tf.data.Dataset.from_tensor_slices(image)
dataset = dataset.batch(1)
#This, if evaluated inside session, outputs array of shape (1, 4, 4, 3)

Затем мы применяем функцию карты для извлечения патчей. Это делается с помощью tf.image.extract_image_patches , параметры ksizes, шагов и скоростей определяют геометрические свойства патча. Вы можете найти отличное объяснение здесь . В этом случае мы возьмем патчи размером 2х2, непосредственно прилегающие друг к другу. Всего 4 патча. extract_image_patches поместит все патчи в последнее измерение, o reshape применяется, чтобы получить желаемый результат 4 патчей из 3-х каналов изображения формы 2x2.

def parse_func(image):
    ksizes = [1, 2, 2, 1]
    strides = [1, 2, 2, 1]
    rates = [1, 1, 1, 1]
    patches = tf.image.extract_image_patches(image, ksizes, strides, rates, 'SAME')
    image_tensor = tf.reshape(patches, [-1, 2, 2, 3])
    return image_tensor

Затем мы применяем эту функцию к набору данных, затем распаковываем вывод, чтобы перемешать его и создать новый пакет из исправлений. В этом случае размер пакета и размер буфера перемешивания равны количеству исправлений.

dataset = dataset.map(pf)
dataset = dataset.apply(tf.data.experimental.unbatch())
dataset = dataset.shuffle(4).batch(4)

Будет выведен пакет формы (4, 2, 2, 3). Как видите, вывод состоит из 4 патчей формы (2, 2, 3). Если shuffle не применяется, то порядок будет в порядке от левого верхнего угла до правого нижнего.

enter image description hereenter image description here

Кроме того, взгляните на официальный конвейер ввода Руководство по производительности

...