Экспорт массива изображений в TFRecord в Google Earth Engine - PullRequest
0 голосов
/ 20 июня 2019

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

1 Ответ

2 голосов
/ 22 июня 2019

Чтобы сделать то, что вы хотите, вам нужно сгладить матрицу для экспорта: экспорт в 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]
  }
});
...