tensorflow管道的大图像切片

tensorflow管道的大图像切片,tensorflow,image-segmentation,tensorflow-datasets,Tensorflow,Image Segmentation,Tensorflow Datasets,我正在用大型卫星.JP2图像进行图像分割 图像形状:(10000,10000,13)因为有13个波段(同一区域13个不同的波长观测值) uint32 我想建造最高效的tensorflow管道,但我没有太多经验 我想轻松调整用于训练的乐队数量(第一次训练使用RGB,然后我会尝试添加更多乐队,看看是否能提高性能) 我想象了两条不同的管道: I将my.JP2转换为(10000 x 10000 x 13)numpy数组然后向管道馈送所需的切片(例如,如果我想要RGB图像,则为128x128x3)

我正在用大型卫星.JP2图像进行图像分割

  • 图像形状:(10000,10000,13)因为有13个波段(同一区域13个不同的波长观测值)

  • uint32

我想建造最高效的tensorflow管道,但我没有太多经验

我想轻松调整用于训练的乐队数量(第一次训练使用RGB,然后我会尝试添加更多乐队,看看是否能提高性能)

我想象了两条不同的管道:

  • Imy.JP2转换为(10000 x 10000 x 13)numpy数组然后向管道馈送所需的切片(例如,如果我想要RGB图像,则为128x128x3)

  • 或者,我将我的大图像预处理成13个不同的文件夹(13个波段) 然后输入管道使用所需的数据集来构建 128 x 128 x(1-13)输入图像

获取一个大图像并按我的需要将其切片,直接放入tensorflow管道更方便,因为我只需要一个10000x1000x13 numpy数组作为训练集。但我不知道它是否相关/优化/可能

解决我的pb问题最优化的方法是什么?
(我有一个11Gb 1080 GPU)

最有效的方法几乎总是迭代改进的产物。所以,作为一个坚实的开端,让我们考虑一个例子。为了演示的目的,我使用了一个带有随机色块的玩具阵列,将它分成13个色带,并连接了3个色带。为批大小添加第一个维度

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)
首先,我们从数据集中创建一个大图像,从中提取补丁。

然后我们应用一个映射函数来提取面片。这是通过参数ksizes、步长和速率来完成的,这些参数定义了面片的几何特性。你可以找到一个很好的解释。在本例中,我们将使用大小为2x2的面片,面片之间直接相邻。总共有4个补丁<代码>提取\u图像\u面片将所有面片放入最后一个维度,应用o
重塑
以获得形状为2x2的3通道图像的4个面片的所需输出

def parse_func(图像):
ksizes=[1,2,2,1]
步幅=[1,2,2,1]
比率=[1,1,1,1]
patches=tf.image.extract_image_patches(图像、大小、步幅、速率,‘相同’)
image_tensor=tf.重塑(面片,[-1,2,2,3])
返回图像张量
然后我们将此函数应用于数据集,然后取消对输出的批处理以将其洗牌,并从修补程序中创建新的批处理。在这种情况下,批处理大小和洗牌缓冲区大小等于修补程序的数量

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)组成。如果未应用随机播放,则将按从左上角到右下角的顺序播放


另外,看看官方的输入管道

你说的“先RGB,然后我再添加IR”到底是什么意思?您希望在不同的学习阶段获得不同的输入?或者只是能够改变输入的形状?我坚持使用后者,你可以测试不同的组合。第二个问题,若你们对原始图像进行切片,你们将如何处理标签?您将使用什么网络体系结构?我只希望能够轻松更改我的训练数据(使用更多或更少的波段)。我将使用一个带有(128 x 128 x nb_所需的频带)输入形状的Unet模型
dataset = dataset.map(pf)
dataset = dataset.apply(tf.data.experimental.unbatch())
dataset = dataset.shuffle(4).batch(4)