TFRecord ve Earth Engine

TFRecord, tf.Example protos'un uzun dizilerini verimli bir şekilde kodlamak için kullanılan ikili bir biçimdir. TFRecord dosyaları, burada ve burada açıklandığı şekilde tf.data paketi aracılığıyla TensorFlow tarafından kolayca yüklenir. Bu sayfada, Earth Engine'in ee.FeatureCollection veya ee.Image ile TFRecord biçimi arasında nasıl dönüşüm yaptığı açıklanmaktadır.

Verileri TFRecord'a aktarma

Tabloları (ee.FeatureCollection) veya resimleri (ee.Image) Google Drive ya da Cloud Storage'daki TFRecord dosyalarına aktarabilirsiniz. Dışa aktarma işleminin yapılandırması, aşağıda açıklandığı gibi dışa aktardığınız öğeye bağlıdır. Earth Engine'dan TFRecord'a aktarılan tüm sayılar, float türüne zorlanmaktadır.

Tabloları dışa aktarma

Bir ee.FeatureCollection dosyasını TFRecord dosyasına aktarırken tablodaki her ee.Feature ile TFRecord dosyasındaki her tf.train.Example (yani her kayıt) arasında 1:1 bir ilişki vardır. ee.Feature özelliğinin her biri, mülkte depolanan sayıya veya ee.Array değerine karşılık gelen kayan nokta değerlerinin listesiyle birlikte bir tf.train.Feature olarak kodlanır. Özelliklerde diziler içeren bir tabloyu dışa aktarırsanız TensorFlow'a, okunurken dizi şeklini bildirmeniz gerekir. TFRecord dosyasına aktarılan tablolar her zaman GZIP sıkıştırma türüyle sıkıştırılır. Her dışa aktarma işlemi için her zaman tam olarak bir TFRecord dosyası alırsınız.

Aşağıdaki örnekte, dışa aktarılan bir skaler özellik tablosundaki ("B2",...,"B7", "landcover") verileri ayrıştırma işlemi gösterilmektedir. Kayan listelerin boyutunun [1] ve türün tf.float32 olduğunu unutmayın:

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))
        

Bu örnekte skaler özelliklerin (ör. shape=[1]) okunmasının gösterildiğini unutmayın. 2D veya 3D dizileri (ör. resim yamaları) dışa aktarıyorsanız ayrıştırma sırasında yamalarınızin şeklini belirtirsiniz. Örneğin, 16x16 piksellik bir yama için shape=[16, 16].

Resimleri dışa aktarma

Bir resmi dışa aktardığınızda veriler kanal, yükseklik, genişlik (CHW) olarak sıralanır. Dışa aktarma işlemi, her biri dışa aktarma işleminde kullanıcı tarafından belirtilen patchSize boyutunda bir veya daha fazla yamayı içeren birden fazla TFRecord dosyasına bölünebilir. Dosyaların bayt cinsinden boyutu, maxFileSize parametresinde kullanıcı tarafından belirtilir. Elde edilen TFRecord dosyasında her yamalı dosya ile her tf.train.Example arasında 1:1 bir ilişki vardır. Görüntünün her bandı ayrı bir tf.train.Feature olarak depolanır. Her tf.train.Example'ta depolanan kayan nokta listesi uzunluğu, her özellikte yamalı genişlik * yüksekliktir. Düzleştirilmiş listeler, bu örnekte gösterildiği gibi birden çok bağımsız piksele bölünebilir. Dilerseniz dışa aktarılan yamanın şekli bu örnekte gösterildiği gibi kurtarılabilir.

Kenar efektlerini azaltmak için dışa aktarılan yamalar örtüşebilir. Özellikle, aşağıdaki boyutlarda karolar elde edecek bir kernelSize belirtebilirsiniz:

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

Her karo, bitişik karolarla [kernelSize[0]/2, kernelSize[1]/2] kadar örtüşür. Sonuç olarak, patchSize boyutunda bir yamanın kenar pikseli üzerinde merkezlenmiş kernelSize boyutunda bir çekirdek tamamen geçerli veriler içerir. Alandaki yamaların mekansal düzenlemesi Şekil 1'de gösterilmektedir. Burada, Dolgulama Boyutu, çekirdeğin bitişik görüntüyle örtüşen kısmına karşılık gelir:

TFRecord resim şeması
Şekil 1. Resim yamaları nasıl dışa aktarılır? Dolgulu Boyut: kernelSize/2.

formatOptions

patchSize, maxFileSize ve kernelSize parametreleri, formatOptions sözlüğü aracılığıyla ee.Export (JavaScript) veya ee.batch.Export (Python) çağrısına iletilir. Bu sözlüğün anahtarları, Export'e iletilen ek parametrelerin adlarıdır. TFRecord biçiminde dışa aktarılan bir resim için olası formatOptions değerleri şunlardır:

MülkAçıklamaTür
patchDimensions Dışa aktarma alanı üzerinde karo halinde boyutlar, sınır kutusundaki her pikseli tam olarak bir kez kaplar (yama boyutları sınır kutusunu eşit olarak bölmediğinde hariç. Bu durumda, en büyük x/y kenarlarındaki kenar karoları atlanır). Boyutlar 0'dan büyük olmalıdır. Array<int>[2].
kernelSize Belirtilen durumda, karolar hem pozitif hem de negatif kenar boşluğu boyutlarıyla tamponlanır. Bu da komşu yamalar arasında çakışmalara neden olur. Belirtilmişse iki boyut sağlanmalıdır (sırasıyla X ve Y). Array<int>[2]. Varsayılan: [1, 1]
compressed Doğru ise .tfrecord dosyalarını gzip ile sıkıştırır ve ".gz" son ekini ekler. Boole. Varsayılan: true
maxFileSize Dışa aktarılan .tfrecord dosyasının (sıkıştırmadan önce) bayt cinsinden maksimum boyutu. Küçük dosya boyutları, daha fazla bölüme ayırmaya (ve dolayısıyla daha fazla çıkış dosyasına) neden olur. Dahili. Varsayılan: 1 GiB
defaultValue Kısmen veya tamamen maskelenmiş bir pikselin her bandında ayarlanan değer ve kaynak pikselde dizi uzunluğunun özellik değerinin derinliğinden az olduğu bir dizi bandından oluşturulan çıkış 3D özelliğindeki her değerde ayarlanan değer (ör.karşılık gelen özellik derinliği 3 olan bir dizi bandındaki 2 uzunluğunda bir dizi pikselin 3. dizinindeki değer). Tam sayı türü bantlar için kesirli kısım atlanır ve bant türünün aralığına sabitlenir. Varsayılan olarak 0 değerine ayarlanır. Tam sayı. Varsayılan: 0
tensorDepths Giriş dizisi bantlarının adlarından, oluşturdukları 3D tenzorların derinliğine kadar eşleme. Diziler, belirtilen şekle sığdırmak için kısaltılır veya varsayılan değerlerle doldurulur. Her dizi bandı için bu alanda karşılık gelen bir giriş olmalıdır. Dizi<int>[]. Varsayılan: []
sequenceData Doğru ise her piksel, skaler bantları bağlama ve dizi bantlarını örneğin dizilerine eşleyen bir SequenceExample olarak çıktı olarak verilir. SequenceExamples, her yamada piksellerin satır öncelikli sırasına göre ve ardından dosya dizisindeki alan yamalarını satır öncelikli sırasına göre çıktı olarak verilir. Boole. Varsayılan: false
collapseBands Doğru ise tüm bantlar tek bir 3D tenör halinde birleştirilir ve resimdeki ilk bantın adını alır. Tüm bantlar, tüm bantlar içindeki bu sıranın en uzak türüne bağlı olarak bu sırayla baytlara, int64'lere ve ardından kayan nokta sayılara yükseltilir. tensor_depths belirtildiği sürece dizi bantlarına izin verilir. Boole. Varsayılan: false
maskedThreshold Bir yamada maskelenmiş piksellerin izin verilen maksimum oranı. Bu izin sınırını aşan yamalar, dosyalara yazılmak yerine atlanır. Bu alan 1 dışında bir değere ayarlanırsa JSON yan aracı üretilmez. Varsayılan olarak 1 değerine ayarlanır. Kayan noktalı. Varsayılan: 1

TFRecord "mikser" dosyası

TFRecord'a dışa aktardığınızda Earth Engine, TFRecord dosyalarınızla birlikte "mikser" adlı bir yan dosya oluşturur. Bu, yamaların mekansal düzenini (ör. coğrafi referanslama) tanımlamak için kullanılan basit bir JSON dosyasıdır. Bu dosya, sonraki bölümde açıklandığı şekilde görüntüler üzerinde yapılan tahminlerin yüklenmesi için gereklidir.

Zaman Serilerini Dışa Aktarma

Hem Examples hem de SequenceExamples'a resim dışa aktarma işlemleri desteklenir. Examples biçiminde dışa aktardığınızda, dışa aktarma bölgesi parçalara ayrılır ve bu parçalar, her bant kendi özelliğine sahip olacak şekilde satır öncelikli sırada bir dizi .tfrecord dosyasına aktarılır (collapseBands belirtmediğiniz sürece). SequenceExamples biçiminde dışa aktardığınızda, piksel başına bir SequenceExample dışa aktarılır. Bu SequenceExamples, bir parça içinde satır öncelikli sırada, ardından orijinal dışa aktarma bölgesindeki parçaların satır öncelikli sırasına göre aktarılır (Emin değilseniz her zaman verilerin bir şekilde satır öncelikli sırada olacağını varsayın). Not: Bir görüntünün tüm skaler bantları bir SequenceExample bağlamında paketlenir. Dizi bantları ise gerçek dizi verileri olur.

Array Bantları

Bir resim TFRecord biçiminde dışa aktarıldığında dizi bantları dışa aktarılabilir. Dizi bantlarının dışa aktarılması, SequenceExamples'ın "FeatureLists"ini doldurmanın ve normal Examples'a aktarırken 3D tenzorlar oluşturmanın bir yolunu sağlar. Dizi bantlarının uzunluklarının/derinliklerinin nasıl yönetildiği hakkında bilgi edinmek için yukarıdaki tabloda collapseBands ve/veya tensorDepths'e bakın. Not: collapseBands kullanılması ve SequenceExamples'a aktarılması (sequenceData parametresinin ayarlanması) sonucunda tüm bantlar piksel başına tek bir zaman serisine daraltılır.

TFRecord'ları Earth Engine'e yükleme

Tabloları (yalnızca komut satırı) ve resimleri Earth Engine'a TFRecord dosyası olarak yükleyebilirsiniz. Tablolar için daha önce açıklanan 1:1 ilişki ters yönde (ör. tf.train.Example -> ee.Feature) geçerlidir.

Görüntü yükleme

Dışa aktarılan görüntüler hakkında tahmin oluşturuyorsanız coğrafi referanslı görüntüler elde etmek için tahminleri (TFRecord dosyaları olarak) yüklerken karıştırıcıyı sağlayın. Yamaların örtüşen kısmının (Şekil 1'deki Dolgu Boyutu), dışa aktarılan bölgenin kesintisiz şekilde kapsanması için atılabileceğini unutmayın. Tahminler, orijinal olarak dışa aktardığınız resim örnekleriyle aynı sayıda ve sırada bir tf.train.Example dizisi olarak düzenlenmelidir (istediğiniz sayıda dosya arasında bile).