TFRecord 是一種二進位格式,可有效率地編碼長序列的 tf.Example proto。TensorFlow 可透過 tf.data 套件輕鬆載入 TFRecord 檔案,詳情請參閱這裡和這裡。本頁說明 Earth Engine 如何在 ee.FeatureCollection 或 ee.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 陣列 (例如圖片修補),則必須在剖析時指定修補的形狀,例如 16x16 像素修補的 shape=[16, 16]。
匯出映像檔
匯出圖片時,資料會依通道、高度、寬度 (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 對應到核心與相鄰圖片重疊的部分:
kernelSize/2。
formatOptions
patchSize、maxFileSize 和 kernelSize 參數會透過 formatOptions 字典傳遞至 ee.Export (JavaScript) 或 ee.batch.Export (Python) 呼叫,其中索引鍵是傳遞至 Export 的其他參數名稱。匯出為 TFRecord 格式的圖片可能包含以下 formatOptions:
| 屬性 | 說明 | 類型 |
|---|---|---|
patchDimensions |
在匯出區域中並排的維度,涵蓋定界框中的每個像素,且每個像素只涵蓋一次 (除非修補程式維度無法平均分割定界框,在這種情況下,沿著最大 x/y 邊緣的邊框圖塊會遭到捨棄)。維度必須大於 0。 | Array<int>[2]。 |
kernelSize |
如果指定,圖塊會以正負邊界尺寸進行緩衝,導致相鄰圖塊之間重疊。如果指定,則必須提供兩個維度 (分別為 X 和 Y)。 | Array<int>[2]。預設:[1, 1] |
compressed |
如果設為 true,系統會使用 gzip 壓縮 .tfrecord 檔案,並附加「.gz」後置字串 | 布林值。預設值:true |
maxFileSize |
匯出的 .tfrecord 檔案大小上限 (壓縮前),以位元組為單位。檔案大小越小,資料分割程度越高 (因此輸出檔案越多)。 | Int。預設值:1 GiB |
defaultValue |
部分或完全遮蓋的像素中,每個波段設定的值,以及由陣列波段製成的輸出 3D 特徵中,每個值設定的值,其中來源像素的陣列長度小於特徵值的深度 (即陣列波段中長度為 2 的陣列像素索引 3 處的值,對應的特徵深度為 3)。整數類型波段的小數部分會捨去,並限制在波段類型的範圍內。預設為 0。 | Int。預設值:0 |
tensorDepths |
從輸入陣列波段名稱對應至其建立的 3D 張量深度。陣列會遭到截斷,或以預設值填補,以符合指定的形狀。每個陣列頻帶都必須有對應的項目。 | Array<int>[]。預設值:[] |
sequenceData |
如果設為 true,每個像素都會輸出為 SequenceExample,將純量帶對應至背景資訊,並將陣列帶對應至範例的序列。SequenceExample 的輸出順序為:先依各個修補程式中像素的列優先順序,再依檔案序列中區域修補程式的列優先順序。 | 布林值。預設值: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 的結構定義中,而陣列波段則會成為實際的序列資料。
Array 錶帶
將圖片匯出為 TFRecord 格式時,可以匯出陣列波段。匯出陣列波段可填入 SequenceExample 的「FeatureList」,並在匯出至一般範例時建立 3D 張量。如要瞭解如何管理陣列頻帶的長度/深度,請參閱上表中的 collapseBands 和/或 tensorDepths。注意:使用 collapseBands 並匯出至 SequenceExamples (即設定 sequenceData 參數),會導致所有波段收合為每個像素一個時間序列。
將 TFRecord 上傳至 Earth Engine
您可以將表格 (僅限指令列) 和圖片上傳至 Earth Engine,做為 TFRecord 檔案。如果是資料表,先前所述的一對一關係會反向套用 (即 tf.train.Example -> ee.Feature)。
上傳圖像
如果您根據匯出的圖像生成預測結果,請在上傳預測結果 (TFRecord 檔案) 時提供混音器,以取得地理參照圖像。請注意,系統會捨棄修補程式的重疊部分 (圖 1 中的 Padding Dimension),以便匯出區域的相鄰涵蓋範圍。預測結果應排列為 tf.train.Example 序列,其數量和順序與原始匯出的圖片範例相同 (即使在任意數量的檔案之間也是如此)。