Tensorflow 使用Google Earth引擎导出TFRecords培训修补程序(内核大小问题)

Tensorflow 使用Google Earth引擎导出TFRecords培训修补程序(内核大小问题),tensorflow,training-data,google-earth-engine,tfrecord,Tensorflow,Training Data,Google Earth Engine,Tfrecord,我一直在使用GEE从Sentinel-2导出一些用于Python的培训补丁。 通过遵循GEE指南,并使用Export.image.toDrive函数,然后我可以解析导出的TFRecord文件以重建我的分幅,我可以使它工作 var image_export_options = { 'patchDimensions': [366, 366], 'maxFileSize': 104857600, // 'kernelSize': [366, 366], 'compressed': tr

我一直在使用GEE从Sentinel-2导出一些用于Python的培训补丁。 通过遵循GEE指南,并使用
Export.image.toDrive
函数,然后我可以解析导出的TFRecord文件以重建我的分幅,我可以使它工作

var image_export_options = {
  'patchDimensions': [366, 366],
  'maxFileSize': 104857600,
  // 'kernelSize': [366, 366],
  'compressed': true
}

Export.image.toDrive({
  image: clipped_img.select(bands.concat(['classes'])),
  description: 'PatchesExport',
  fileNamePrefix: 'Oros_1',
  scale: 10,
  folder: 'myExportFolder',
  fileFormat: 'TFRecord',
  region: export_area,
  formatOptions: image_export_options,  
})

但是,当我尝试在
格式选项中指定kernelSize时(根据指南,这应该是“通过[kernelSize[0]/2,kernelSize[1]/2]重叠相邻的分幅”)文件已导出,但“*mixer.json”并没有反映补丁数量的增加,因此我无法在之后遍历补丁。以下命令使google colab会话崩溃:

image_dataset = tf.data.TFRecordDataset(str(path/(file_prefix+'-00000.tfrecord.gz')), compression_type='GZIP')
first = next(iter(image_dataset))
first
奇怪的是,只有当我将kernelSize添加到formatOptions时,问题才会出现。 有没有人遇到过类似的问题


谢谢,

经过一段时间的努力来解决这个问题,我意识到当使用内核大小从GEE导出补丁时,有一个没有很好记录的行为。 与导出的TFRecord捆绑在一起的是一个名为
mixer
xml
文件。 如果我们使用:

'patchDimensions': [184, 184],
'kernelSize': [1, 1],  #default for no overlapping

混音器文件保持不变,没有提及内核/重叠大小:

{'patchDimensions': [184, 184],
 'patchesPerRow': 8,
 'projection': {'affine': {'doubleMatrix': [10.0,
    0.0,
    493460.0,
    0.0,
    -10.0,
    9313540.0]},
  'crs': 'EPSG:32724'},
 'totalPatches': 40}
在第二种情况下,如果我们尝试使用
tf.io.parse\u single\u示例(示例proto,image\u features\u dict)
,其中image\u features\u dict等于:

{'B2': FixedLenFeature(shape=[184, 184], dtype=tf.float32, default_value=None),
 'B3': FixedLenFeature(shape=[184, 184], dtype=tf.float32, default_value=None),
 'B4': FixedLenFeature(shape=[184, 184], dtype=tf.float32, default_value=None)}
它将引发错误:

_FallbackException: This function does not handle the case of the path where all inputs are not already EagerTensors.
Can't parse serialized Example. [Op:ParseExampleV2]

相反,为了解析具有内核大小>1的这些记录,我们必须考虑补丁尺寸+内核大小作为最终的补丁大小,即使<代码>混合器。在本例中,我们的补丁大小为368(原始补丁大小+内核大小)。请注意,对于奇数内核大小,要添加到原始修补程序大小的数字是kernelSize-1。

经过一段时间的努力,我意识到当使用内核大小从GEE导出修补程序时,有一种没有很好记录的行为。 与导出的TFRecord捆绑在一起的是一个名为
mixer
xml
文件。 如果我们使用:

'patchDimensions': [184, 184],
'kernelSize': [1, 1],  #default for no overlapping

混音器文件保持不变,没有提及内核/重叠大小:

{'patchDimensions': [184, 184],
 'patchesPerRow': 8,
 'projection': {'affine': {'doubleMatrix': [10.0,
    0.0,
    493460.0,
    0.0,
    -10.0,
    9313540.0]},
  'crs': 'EPSG:32724'},
 'totalPatches': 40}
在第二种情况下,如果我们尝试使用
tf.io.parse\u single\u示例(示例proto,image\u features\u dict)
,其中image\u features\u dict等于:

{'B2': FixedLenFeature(shape=[184, 184], dtype=tf.float32, default_value=None),
 'B3': FixedLenFeature(shape=[184, 184], dtype=tf.float32, default_value=None),
 'B4': FixedLenFeature(shape=[184, 184], dtype=tf.float32, default_value=None)}
它将引发错误:

_FallbackException: This function does not handle the case of the path where all inputs are not already EagerTensors.
Can't parse serialized Example. [Op:ParseExampleV2]

相反,为了解析具有内核大小>1的这些记录,我们必须考虑补丁尺寸+内核大小作为最终的补丁大小,即使<代码>混合器。在本例中,我们的补丁大小为368(原始补丁大小+内核大小)。请注意,对于奇数内核大小,要添加到原始补丁大小的数字是kernelSize-1