我正在使用大型卫星.JP2图像进行图像分割。
图像形状:(10000,10000,13),因为有13个波段(同一区域有13个不同的波长观测值)
uint32
我想建立最有效的tensorflow管道,但是我经验不足。
我想轻松调整用于训练的频段数量(第一次训练时使用RGB,然后我将尝试添加更多的频段以查看它是否可以提高性能)
我想象了两个不同的管道:
我将我的.JP2 转换为(10000 x 10000 x 13)numpy数组。 然后向管道馈送所需的切片(例如,如果我想要RGB图像,则为128x128x3)
或者,我将大图像预处理为13个不同的文件夹(13个波段) 然后,输入管道使用所需的数据集来构建 128 x 128 x(1-13)输入图片
获取一个大图像并将其按我的意愿切片,直接进入tensorflow管道更为方便,因为我只需要一个10000x10000x13 numpy数组作为训练集。但我不知道它是否是缓释/优化/可能的...
最优化的方法是什么来解决我的铅? (我有一个11Gb 1080 GPU)
答案 0 :(得分:3)
最有效的方法几乎总是迭代改进的产物。因此,作为一个坚实的起点,让我们考虑示例。为了演示的目的,我使用了一个带有随机颜色块的玩具数组,将其分成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)
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,步幅和速率定义了补丁的几何特性。您可以找到很好的解释here。在这种情况下,我们将截取彼此直接相邻的大小为2x2的色块。因此总共有4个补丁。 extract_image_patches
将把所有色块放置到最后一个维度中,或者应用reshape
以获得4个3x形状为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)。如果未应用随机播放,则会按从左上角到右下的顺序排列。
另外,请看一下官方输入管道performance guide