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.Feature 存储在每个 tf.train.Example 中,其中每个特征中存储的浮点列表的长度为补丁宽度 * 高度。扁平化列表可以拆分为多个单独的代码,如此示例中所示。
或者,可以按照此示例中的方式恢复导出的补丁的形状。
为了帮助减少边缘效应,导出的补丁可以重叠。具体而言,您可以指定 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 的大小上限(压缩前),以字节为单位。文件大小越小,分片越多(因此输出文件越多)。 | 整数。默认值:1 GiB |
defaultValue |
在部分或完全遮盖的像素的每个波段中设置的值,以及在由数组波段制成的输出 3D 特征中的每个值处设置的值,其中源像素处的数组长度小于特征值的深度(即,在相应特征深度为 3 的数组波段中,长度为 2 的数组像素的索引 3 处的值)。对于整数类型波段,小数部分会被舍弃,并限制在波段类型的范围内。默认值为 0。 | 整数。默认值: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 会生成一个名为“mixer”的 TFRecord 文件。这是一个简单的 JSON 文件,用于定义图块的空间排列(即地理配准)。如下一部分所述,上传对图像做出的预测时需要此文件。
导出时序
支持将图片导出到 Examples 和 SequenceExamples。导出到 Examples 时,导出区域会被切成多个图块,这些图块会按行优先顺序导出到一定数量的 .tfrecord 文件中,每个波段都有自己的特征(除非您指定 collapseBands)。导出到 SequenceExamples 时,系统会导出每个像素的 SequenceExample,这些 SequenceExample 在图块内按行优先顺序排列,然后在原始导出区域中按图块的行优先顺序排列(如果您不确定,请始终假设内容会以某种方式按行优先顺序排列)。注意:图片的任何标量波段都将打包到 SequenceExample 的上下文中,而数组波段将成为实际序列数据。
Array 表带
将图片导出为 TFRecord 格式时,数组波段可导出。导出数组波段提供了一种填充 SequenceExample 的“FeatureList”的方法,以及一种在导出到常规 Example 时创建 3D 张量的方法。如需了解如何管理数组波段的长度/深度,请参阅上表中的 collapseBands 和/或 tensorDepths。注意:使用 collapseBands 并导出到 SequenceExamples(即设置参数 sequenceData)会导致所有波段都收缩为每个像素一个时序。
将 TFRecord 上传到 Earth Engine
您可以将表格(仅限命令行)和图片作为 TFRecord 文件上传到 Earth Engine。对于表,前面所述的 1:1 关系适用于反向(即 tf.train.Example -> ee.Feature)。
上传图像
如果您针对导出的图像生成预测结果,请在上传预测结果(作为 TFRecord 文件)时提供混合器,以获取地理配准图像。请注意,系统会舍弃补丁的重叠部分(图 1 中的“Padding Dimension”),以实现导出区域的连续覆盖。预测结果应排列为 tf.train.Example 序列,其数量和顺序与您最初导出的图片样本相同(即使在任意数量的文件之间也是如此)。