TFRecord は、tf.Example プロトの長いシーケンスを効率的にエンコードするためのバイナリ形式です。TFRecord ファイルは、こちらとこちらで説明されているように、tf.data パッケージを介して TensorFlow によって簡単に読み込まれます。このページでは、Earth Engine が ee.FeatureCollection または ee.Image と TFRecord 形式の間で変換を行う方法について説明します。
TFRecord へのデータのエクスポート
テーブル(ee.FeatureCollection)または画像(ee.Image)を Google ドライブまたは Cloud Storage の TFRecord ファイルにエクスポートできます。エクスポートの構成は、以下で説明するように、エクスポートする内容によって異なります。Earth Engine から TFRecord にエクスポートされるすべての数値は、強制的に float 型に変換されます。
テーブルのエクスポート
ee.FeatureCollection を TFRecord ファイルにエクスポートする場合、テーブル内の各 ee.Feature と TFRecord ファイル内の各 tf.train.Example(各レコード)は 1 対 1 で対応します。ee.Feature の各プロパティは、プロパティに格納されている数値または ee.Array に対応する浮動小数点数のリストを含む tf.train.Feature としてエンコードされます。プロパティに配列を含むテーブルをエクスポートする場合は、読み取り時に配列の形状を TensorFlow に伝える必要があります。TFRecord ファイルにエクスポートされたテーブルは、常に GZIP 圧縮タイプで圧縮されます。エクスポートごとに、常に 1 つの 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 のパッチが 1 つ以上含まれます。ファイルのサイズ(バイト単位)は、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 に示します。パディング ディメンションは、隣接する画像と重なるカーネルの部分に対応します。
kernelSize/2 です。
formatOptions
patchSize、maxFileSize、kernelSize の各パラメータは、formatOptions 辞書を介して ee.Export(JavaScript)または ee.batch.Export(Python)呼び出しに渡されます。ここで、キーは Export に渡される追加パラメータの名前です。TFRecord 形式にエクスポートされた画像の formatOptions には、次のものがあります。
| プロパティ | 説明 | タイプ |
|---|---|---|
patchDimensions |
エクスポート領域にタイル状に配置されたディメンション。境界ボックス内のすべてのピクセルを正確に 1 回カバーします(パッチのディメンションが境界ボックスを均等に分割しない場合、最大の x / y エッジに沿った境界タイルはドロップされます)。ディメンションは 0 より大きくする必要があります。 | 配列<int>[2]。 |
kernelSize |
指定すると、タイルは正と負の両方のマージン寸法でバッファリングされ、隣接するパッチが重複します。指定する場合は、2 つのディメンション(X と Y)を指定する必要があります。 | Array<int>[2]。デフォルト: [1, 1] |
compressed |
true の場合、.tfrecord ファイルを gzip で圧縮し、末尾に「.gz」を付加します。 | ブール値。デフォルト: true |
maxFileSize |
エクスポートされた .tfrecord の最大サイズ(バイト単位、圧縮前)。ファイルサイズを小さくすると、シャーディングが大きくなります(したがって、出力ファイルが増えます)。 | 整数。デフォルト: 1 GiB |
defaultValue |
部分的または完全にマスクされたピクセルの各バンドに設定された値。また、ソースピクセルの配列長が特徴値の深度よりも短い配列バンドから作成された出力 3D 特徴の各値に設定された値(例: 対応する特徴深度が 3 の配列バンド内の長さ 2 の配列ピクセルのインデックス 3 の値)。整数型のバンドの場合、小数部は切り捨てられ、バンドタイプの範囲にクランプされます。デフォルトは 0 です。 | Int。デフォルト: 0 |
tensorDepths |
入力配列バンドの名前から、作成される 3D テンソルの深度へのマッピング。配列は、指定された形状に合うように切り捨てられるか、デフォルト値でパディングされます。配列バンドごとに、対応するエントリが必要です。 | Array<int>[]。デフォルト: [] |
sequenceData |
true の場合、各ピクセルは、スカラーバンドをコンテキストにマッピングし、配列バンドをサンプルのシーケンスにマッピングする SequenceExample として出力されます。SequenceExample は、各パッチのピクセルの行優先順で出力され、次にファイル シーケンス内のエリアパッチの行優先順で出力されます。 | ブール値。デフォルト: false |
collapseBands |
true の場合、すべてのバンドが 1 つの 3D テンソルに結合され、画像内の最初のバンドの名前が付けられます。すべてのバンドは、すべてのバンド内でそのシーケンスの最も遠いタイプに応じて、バイト、int64、float の順にプロモートされます。tensor_depths が指定されている限り、配列バンドを使用できます。 | ブール値。デフォルト: false |
maskedThreshold |
パッチ内のマスクされたピクセルの最大許容割合。この許容量を超えるパッチは、ファイルに書き込まれずにドロップされます。このフィールドが 1 以外に設定されている場合、JSON サイドカーは生成されません。デフォルトは 1 です。 | 浮動小数点数。デフォルト: 1 |
TFRecord「ミキサー」ファイル
TFRecord にエクスポートすると、Earth Engine は「ミキサー」と呼ばれる TFRecord ファイルを含むサイドカーを生成します。これは、パッチの空間配置(ジオリファレンス)を定義するために使用されるシンプルな JSON ファイルです。このファイルは、次のセクションで説明するように、画像に対して行われた予測をアップロードするために必要です。
時系列のエクスポート
Example と SequenceExample の両方への画像のエクスポートがサポートされています。Examples にエクスポートすると、エクスポート リージョンがパッチに分割され、それらのパッチが、各バンドに独自の機能を持ついくつかの .tfrecord ファイルに行優先順でエクスポートされます(collapseBands を指定しない場合)。SequenceExamples にエクスポートすると、ピクセルごとに SequenceExample がエクスポートされます。これらの SequenceExample は、パッチ内で行優先順に並べられ、元のエクスポート リージョン内のパッチの行優先順に並べられます(不明な場合は、常に何らかの形で行優先順になると想定してください)。注: 画像のスカラーバンドは SequenceExample のコンテキストにパックされ、配列バンドは実際のシーケンス データになります。
アレイバンド
配列バンドは、イメージが TFRecord 形式にエクスポートされるときにエクスポートできます。配列バンドをエクスポートすると、SequenceExample の「FeatureList」にデータを入力できます。また、通常の Example にエクスポートするときに 3D テンソルを作成することもできます。配列バンドの長さ / 深さの管理方法については、上の表の collapseBands と tensorDepths をご覧ください。注: collapseBands を使用して SequenceExamples にエクスポートする(パラメータ sequenceData を設定する)と、すべてのバンドがピクセルごとに 1 つの時系列に折りたたまれます。
TFRecord を Earth Engine にアップロードする
テーブル(コマンドラインのみ)と画像を TFRecord ファイルとして Earth Engine にアップロードできます。テーブルの場合、前述の 1 対 1 の関係が逆方向(tf.train.Example -> ee.Feature)に適用されます。
画像のアップロード
エクスポートされた画像で予測を生成する場合は、予測を(TFRecord ファイルとして)アップロードするときにミキサーを指定して、地理参照画像を取得します。パッチの重複部分(図 1 のパディング ディメンション)は破棄され、エクスポートされたリージョンが連続してカバーされるようになります。予測は、最初にエクスポートされた画像サンプルと同じ数と順序の tf.train.Example シーケンスとして配置する必要があります(任意の数のファイル間でも同様)。