TFRecord 和 Earth Engine

TFRecord 是一種二進位格式,可有效地編碼長序列的 tf.Example protos。TensorFlow 可透過 tf.data 套件輕鬆載入 TFRecord 檔案,如這裡這裡所述。本頁說明 Earth Engine 如何在 ee.FeatureCollectionee.Image 與 TFRecord 格式之間轉換資料。

將資料匯出至 TFRecord

您可以將資料表 (ee.FeatureCollection) 或圖片 (ee.Image) 匯出至 Google 雲端硬碟或 Cloud Storage 中的 TFRecord 檔案。匯出設定取決於您要匯出的內容,如下所述。從 Earth Engine 匯出至 TFRecord 的所有數字都會強制轉換為浮點型別。

匯出資料表

ee.FeatureCollection 匯出至 TFRecord 檔案時,表格中的每個 ee.Feature 與 TFRecord 檔案中的每個 tf.train.Example (即每個記錄) 之間,會存在 1:1 的對應關係。ee.Feature 的每個屬性都會編碼為 tf.train.Feature,其中包含與屬性中儲存的數字或 ee.Array 對應的浮點清單。如果您匯出屬性中含有陣列的表格,則需要在讀取陣列時告知 TensorFlow 陣列的形狀。匯出至 TFRecord 檔案的資料表一律會使用 GZIP 壓縮類型進行壓縮。每個匯出作業都會產生一個 TFRecord 檔案。

以下範例示範如何剖析從匯出表格中匯出的標量屬性資料 ('B2',...,'B7', 'landcover')。請注意,浮點清單的維度為 [1],類型為 tf.float32

Python

dataset = tf.data.TFRecordDataset(exportedFilePath)

featuresDict = {
  'B2': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32),
  'B3': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32),
  'B4': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32),
  'B5': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32),
  'B6': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32),
  'B7': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32),
  'landcover': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32)
}

parsedDataset = dataset.map(lambda example: tf.io.parse_single_example(example, featuresDict))
        

請注意,這個範例說明如何讀取標量功能 (即 shape=[1])。如果您要匯出 2D 或 3D 陣列 (例如圖片圖塊),請在剖析時指定圖塊的形狀,例如 shape=[16, 16] 是 16x16 像素圖塊。

匯出圖片

匯出圖片時,資料會依通道、高度、寬度 (CHW) 的順序排列。匯出內容可分割成多個 TFRecord 檔案,每個檔案都包含一或多個大小為 patchSize 的修補程式,這是使用者在匯出作業中指定的。使用者在 maxFileSize 參數中指定檔案大小 (以位元組為單位)。在產生的 TFRecord 檔案中,每個補丁與每個 tf.train.Example 之間都有 1:1 的對應關係。每個圖片的每個頻帶會儲存為各 tf.train.Example 中的獨立 tf.train.Feature,其中每個特徵中儲存的浮點清單長度為補丁寬度 * 高度。扁平化清單可分割為多個個別像素,如這個範例所示。或者,您也可以像這個範例一樣,復原匯出的補丁形狀。

為了減少邊緣效果,匯出的補丁可以重疊。具體來說,您可以指定 kernelSize,產生大小為:

[patchSize[0] + kernelSize[0], patchSize[1] + kernelSize[1]]
    

每個資訊方塊都會與相鄰的資訊方塊重疊 [kernelSize[0]/2, kernelSize[1]/2]。因此,以 patchSize 大小的圖塊邊緣像素為中心的 kernelSize 大小核取方塊,會包含完全有效的資料。圖 1 說明瞭空間中補丁的空間配置,其中「Padding Dimension」對應至核取區重疊相鄰圖片的部分:

TFRecord 圖像示意圖
圖 1. 圖片修補項目的匯出方式。邊框間距維度為 kernelSize/2

formatOptions

patchSizemaxFileSizekernelSize 參數會透過 formatOptions 字典傳遞至 ee.Export (JavaScript) 或 ee.batch.Export (Python) 呼叫,其中索引鍵是傳遞至 Export 的其他參數名稱。匯出為 TFRecord 格式的圖片可能會產生 formatOptions

屬性說明類型
patchDimensions 在匯出區域中以平鋪方式顯示的尺寸,會精確覆蓋邊界框中的每個像素 (除非補丁尺寸未平均分割邊界框,在這種情況下,系統會捨棄沿著最大 x/y 邊緣的邊框圖塊)。尺寸必須大於 0。 陣列<int>[2]。
kernelSize 如果指定,則圖塊會以邊界大小為緩衝區,在正負兩端都會產生緩衝區,導致相鄰區塊重疊。如果指定了這個屬性,則必須提供兩個維度 (分別為 X 和 Y)。 陣列<int>[2]。預設值:[1, 1]
compressed 如果設為 true,系統會使用 gzip 壓縮 .tfrecord 檔案,並附加「.gz」字尾 布林值。預設值:true
maxFileSize 匯出的 .tfrecord 大小上限 (壓縮前),以位元組為單位。檔案大小越小,分割的程度就越高 (因此輸出檔案也會增加)。 整數。預設值:1 GiB
defaultValue 在部分或完全遮蔽的像素中,每個頻帶中設定的值,以及在陣列頻帶中,從陣列頻帶建立的輸出 3D 地圖項目中,每個值所設定的值,其中來源像素的陣列長度小於地圖項目值的深度 (也就是陣列頻帶中長度為 2 的陣列像素,其索引 3 的值,對應的地圖項目深度為 3)。整數類型頻帶會捨棄小數部分,並限制在頻帶類型的範圍內。預設為 0。 Int,預設值:0
tensorDepths 將輸入陣列頻帶的名稱對應至所建立 3D 張量的深度。陣列會截斷,或以預設值填補,以符合指定的形狀。每個陣列頻帶都必須有對應的項目。 陣列<int>[]。預設值:[]
sequenceData 如果為 true,每個像素都會輸出為 SequenceExample,將標量頻帶對應至內容,並將陣列頻帶對應至範例的序列。系統會以每個圖塊中像素的列優先順序輸出 SequenceExamples,然後依照檔案序列中區域圖塊的列優先順序輸出。 布林值。預設值:false
collapseBands 如果為 true,所有頻帶都會合併為單一 3D 張量,並採用圖像中第一個頻帶的名稱。所有頻帶都會依序升級為位元組、int64,然後再升級為浮點值,這取決於所有頻帶中該序列最遠的類型。只要指定 tensor_depths,即可使用陣列頻帶。 布林值。預設值:false
maskedThreshold 修補區域中允許的遮罩像素比例上限。超過這個限額的修補程式會遭到捨棄,而不會寫入檔案。如果這個欄位設為 1 以外的值,系統就不會產生 JSON 附加檔案。預設值為 1。 浮動。預設值:1

TFRecord「混合器」檔案

匯出至 TFRecord 時,Earth Engine 會使用 TFRecord 檔案產生名為「混合器」的附加檔案。這是一個簡單的 JSON 檔案,用於定義圖塊的空間排列方式 (即地理參照)。如下一節所述,您需要使用這個檔案才能上傳針對圖像做出的預測結果。

匯出時間序列

系統支援將圖片匯出至 Examples 和 SequenceExamples。匯出至「Examples」時,匯出區域會切割成多個區塊,並以列優先順序匯出這些區塊,匯出至多個 .tfrecord 檔案,每個區塊都有各自的功能 (除非您指定 collapseBands)。匯出至「SequenceExamples」時,系統會匯出每個像素的 SequenceExample,這些 SequenceExample 會以列優先順序匯出,然後以列優先順序匯出原始匯出區域的區塊 (如果不確定,請一律假設資料會以某種方式以列優先順序匯出)。注意:圖像的任何標量頻帶都會封裝至 SequenceExample 的內容中,而陣列頻帶則會成為實際的序列資料。

陣列頻帶

將圖片匯出為 TFRecord 格式時,陣列頻帶即可匯出。陣列頻帶的匯出功能可用於填入 SequenceExamples 的「FeatureLists」,並在匯出至一般示例時建立 3D 張量。如要瞭解如何管理陣列頻帶的長度/深度,請參閱上表中的 collapseBands 和/或 tensorDepths。注意:使用 collapseBands 並匯出至 SequenceExamples (因此設定參數 sequenceData) 會導致所有頻帶縮減為每個像素的單一時序。

將 TFRecords 上傳至 Earth Engine

您可以將表格 (僅限指令列) 和圖片上傳至 Earth Engine,做為 TFRecord 檔案。針對資料表,先前所述的 1:1 關係會以相反方向套用 (即 tf.train.Example -> ee.Feature)。

正在上傳圖像

如果您要針對匯出的圖像產生預測結果,請在上傳預測結果 (以 TFRecord 檔案格式) 時提供 Mixer,以便取得經地理參照的圖像。請注意,系統會捨棄重疊的補丁部分 (圖 1 中的邊框間距),以便在匯出的區域中提供連續的覆蓋範圍。預測結果應以 tf.train.Example 序列排列,數量和順序應與您原先匯出的圖片示例相同 (即使是任意數量的檔案)。