首页 > 解决方案 > 在 Google Earth Engine 中将图像数组导出到 TFRecord

问题描述

我想将 3 个 Landsat 图像(每个 12 个波段)的集合转换为单个图像阵列,然后以 TFRecord 格式导出。我使用了下面的代码。我的输入集合名为images. imageT是累积的图像,从最后丢弃的零带开始。最终imageOfSeries图像的每个像素都包含一个大小为 3x12 的矩阵:

var imageT = ee.Image(0)
images = images.map(function(image){
  return image.toArray();
})   
var accumulate = function(image, imageT) {
  return(ee.Image(imageT).addBands(image)) 
};
var imageOfSeries = ee.Image(images.iterate(accumulate, imageT))
                             .slice(1).toArray(1).matrixTranspose()        
Export.image.toDrive({
  image: imageOfSeries,
  description: 'imageOfSeriesExample',
  scale: 30,
  region: geometry,
  fileFormat: 'TFRecord',
  formatOptions: {
    patchDimensions: [10,10],
    tensorDepths: [3,12]
  }
});

但是 GEE 在运行导出任务时返回错误并说Arrays must have dimensions = 1. 我怎样才能完成我的任务?在这种情况下,我还需要有关如何解码 TFRecord 文件的更多信息,我在 GEE 教程中找不到任何示例。

标签: exportgoogle-earth-engine

解决方案


要执行您想要的操作,您需要展平矩阵以进行导出:导出到 TFRecord 仅支持一维数组(如错误所指出的那样)。目前 EE 不支持直接数组展平,并且希望数组的每个展平元素都有标签。

张量深度也需要数组带的一维长度。

假设您的图像只有一个数组波段,这应该有效(详细说明):

var imageT = ee.Image(0)
images = images.map(function(image){
  return image.toArray();
})   
var accumulate = function(image, imageT) {
  return(ee.Image(imageT).addBands(image)) 
};
var imageOfSeries = ee.Image(images.iterate(accumulate, imageT))
                             .slice(1).toArray(1).matrixTranspose()  

imageOfSeriesFlattened = imageOfSeries
    .arrayFlatten([
        ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
        ['13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24'],
        ['25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36']])
    .toArray();  

Export.image.toDrive({
  image: imageOfSeriesFlattened,
  description: 'imageOfSeriesExample',
  scale: 30,
  region: geometry,
  fileFormat: 'TFRecord',
  formatOptions: {
    patchDimensions: [10,10],
    tensorDepths: [36]
  }
});

推荐阅读