Экспорт массива изображений в TFRecord в Google Earth Engine

Я хочу преобразовать коллекцию из 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.


person Shahriar49    schedule 20.06.2019    source источник


Ответы (1)


Чтобы сделать то, что вы хотите, вам нужно будет выровнять матрицу для экспорта: экспорт в TFRecord поддерживает только одномерные массивы (как указано в ошибке). На данный момент EE не поддерживает прямое сглаживание массива и хочет, чтобы метки приходились на сглаженный элемент массива.

Кроме того, тензорная глубина требует порядка 1D длины полос вашего массива.

Предполагая, что ваше изображение имеет ровно одну полосу массива, это должно работать (многословно, чтобы подчеркнуть):

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]
  }
});
person Christopher Brown    schedule 21.06.2019
comment
Спасибо за ответ. Да, мне удалось это сделать, сделав все 1D, но я не думал, что это будет ограничением ... - person Shahriar49; 22.06.2019