TFRecord और Earth Engine

TFRecord, tf.Example protos के लंबे क्रम को बेहतर तरीके से कोड में बदलने के लिए एक बाइनरी फ़ॉर्मैट है. TFRecord फ़ाइलें, TensorFlow में आसानी से लोड हो जाती हैं. इसके लिए, tf.data पैकेज का इस्तेमाल किया जाता है. इसके बारे में यहां और यहां बताया गया है. इस पेज पर बताया गया है कि Earth Engine, ee.FeatureCollection या ee.Image और TFRecord फ़ॉर्मैट के बीच कैसे कन्वर्ज़न करता है.

TFRecord में डेटा एक्सपोर्ट करना

टेबल (ee.FeatureCollection) या इमेज (ee.Image) को Google Drive या 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].

इमेज एक्सपोर्ट की जा रही हैं

किसी इमेज को एक्सपोर्ट करने पर, डेटा को चैनल, ऊंचाई, चौड़ाई (सीएचडब्ल्यू) के तौर पर क्रम में लगाया जाता है. एक्सपोर्ट की गई फ़ाइल को कई 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 में दिखाया गया है. इसमें पैडिंग डाइमेंशन, कर्नेल के उस हिस्से से जुड़ा है जो आस-पास की इमेज को ओवरलैप करता है:

TFRecord इमेज डायग्राम
पहली इमेज. इमेज पैच कैसे एक्सपोर्ट किए जाते हैं. पैडिंग डाइमेंशन 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 पर सेट है, तो .tfrecord फ़ाइलों को gzip से कंप्रेस किया जाता है और उनके आखिर में ".gz" जोड़ा जाता है बूलियन. डिफ़ॉल्ट: true
maxFileSize एक्सपोर्ट की गई .tfrecord फ़ाइल का ज़्यादा से ज़्यादा साइज़, बाइट में (कंप्रेस करने से पहले). फ़ाइल का साइज़ छोटा होने पर, ज़्यादा शार्डिंग होगी. इस वजह से, ज़्यादा आउटपुट फ़ाइलें बनेंगी. इंटिजर. डिफ़ॉल्ट: 1 जीबी
defaultValue किसी पिक्सल के हर बैंड में सेट की गई वैल्यू, जिसे आंशिक या पूरी तरह से मास्क किया गया है.साथ ही, अरे बैंड से बनी आउटपुट 3D सुविधा में हर वैल्यू पर सेट की गई वैल्यू, जहां सोर्स पिक्सल पर अरे की लंबाई, सुविधा की वैल्यू की गहराई से कम थी. जैसे, 3 की संबंधित सुविधा की गहराई वाले अरे बैंड में, लंबाई 2 के अरे पिक्सल के इंडेक्स 3 पर वैल्यू. इंटीजर टाइप के बैंड के लिए, फ़्रैक्शनल पार्ट को हटा दिया जाता है. साथ ही, बैंड टाइप की रेंज के हिसाब से क्लैंप कर दिया जाता है. डिफ़ॉल्ट रूप से, इसकी वैल्यू 0 होती है. Int. डिफ़ॉल्ट: 0
tensorDepths इनपुट अरे बैंड के नामों से, उनके बनाए गए 3D टेंसर की गहराई तक की मैपिंग. अरे को छोटा किया जाएगा या तय किए गए आकार में फ़िट करने के लिए, डिफ़ॉल्ट वैल्यू के साथ पैड किया जाएगा. हर अरे बैंड के लिए, इससे जुड़ी एक एंट्री होनी चाहिए. Array<int>[]. डिफ़ॉल्ट: []
sequenceData अगर सही है, तो हर पिक्सल को SequenceExample के तौर पर आउटपुट किया जाता है. यह स्केलर बैंड को कॉन्टेक्स्ट और अरे बैंड को उदाहरण के क्रम में मैप करता है. SequenceExamples को हर पैच में पिक्सल के रो-मेजर ऑर्डर में आउटपुट किया जाता है. इसके बाद, फ़ाइल सीक्वेंस में एरिया पैच के रो-मेजर ऑर्डर के हिसाब से आउटपुट किया जाता है. बूलियन. डिफ़ॉल्ट: false
collapseBands अगर वैल्यू 'सही है' पर सेट है, तो सभी बैंड को एक 3D टेंसर में जोड़ दिया जाएगा. इसका नाम, इमेज के पहले बैंड के नाम पर रखा जाएगा. सभी बैंड को बाइट, int64s, और फिर फ़्लोट में प्रमोट किया जाता है. यह क्रम, सभी बैंड में मौजूद उस क्रम में सबसे दूर मौजूद टाइप के आधार पर तय होता है. ऐरे बैंड की अनुमति तब तक होती है, जब तक tensor_depths की जानकारी दी जाती है. बूलियन. डिफ़ॉल्ट: false
maskedThreshold किसी पैच में मास्क किए गए पिक्सल का ज़्यादा से ज़्यादा अनुपात. इस सीमा से ज़्यादा पैच को फ़ाइलों में लिखने के बजाय, ड्रॉप कर दिया जाएगा. अगर इस फ़ील्ड को 1 के अलावा किसी और वैल्यू पर सेट किया जाता है, तो JSON साइडकार जनरेट नहीं होगा. डिफ़ॉल्ट वैल्यू 1 होती है. Float. डिफ़ॉल्ट: 1

TFRecord “मिक्सर” फ़ाइल

TFRecord में एक्सपोर्ट करने पर, Earth Engine आपकी TFRecord फ़ाइलों के साथ एक साइडकार जनरेट करेगा. इसे “मिक्सर” कहा जाता है. यह एक सामान्य JSON फ़ाइल होती है. इसका इस्तेमाल, पैच के स्पेशल अरेंजमेंट को तय करने के लिए किया जाता है. जैसे, जियोरेफ़रंसिंग. इस फ़ाइल की ज़रूरत, इमेज पर किए गए अनुमानों को अपलोड करने के लिए होती है. इसके बारे में अगले सेक्शन में बताया गया है.

टाइम सीरीज़ एक्सपोर्ट करना

इमेज को Examples और SequenceExamples, दोनों में एक्सपोर्ट किया जा सकता है. Examples में एक्सपोर्ट करने पर, एक्सपोर्ट किए जाने वाले इलाके को पैच में काट दिया जाता है. इसके बाद, उन पैच को रो-मेजर ऑर्डर में कुछ .tfrecord फ़ाइलों में एक्सपोर्ट किया जाता है. हर बैंड की अपनी सुविधा होती है. हालांकि, ऐसा तब होता है, जब आपने collapseBands तय न किया हो. SequenceExamples में एक्सपोर्ट करने पर, हर पिक्सल के लिए एक SequenceExample एक्सपोर्ट किया जाएगा. ये SequenceExamples, किसी पैच में रो-मेजर ऑर्डर में होंगे. इसके बाद, एक्सपोर्ट किए जाने वाले ओरिजनल इलाके में पैच के रो-मेजर ऑर्डर में होंगे. अगर आपको कभी भी पक्का नहीं है, तो हमेशा यह मान लें कि चीज़ें किसी न किसी क्षमता में रो-मेजर ऑर्डर में होंगी. ध्यान दें: किसी इमेज के स्केलर बैंड, SequenceExample के कॉन्टेक्स्ट में पैक हो जाएंगे. वहीं, कलेक्शन बैंड, असल सीक्वेंस डेटा बन जाएंगे.

अरे बैंड

जब किसी इमेज को TFRecord फ़ॉर्मैट में एक्सपोर्ट किया जाता है, तो अरे बैंड एक्सपोर्ट किए जा सकते हैं. अरे बैंड को एक्सपोर्ट करने से, SequenceExamples के “FeatureLists” को भरने का तरीका मिलता है. साथ ही, सामान्य उदाहरणों में एक्सपोर्ट करते समय 3D टेंसर बनाने का तरीका मिलता है. अरे बैंड की लंबाई/गहराई को मैनेज करने के तरीके के बारे में जानने के लिए, ऊपर दी गई टेबल में collapseBands और/या tensorDepths देखें. ध्यान दें: collapseBands का इस्तेमाल करने और SequenceExamples में एक्सपोर्ट करने (यानी कि पैरामीटर sequenceData को सेट करने) पर, सभी बैंड हर पिक्सल के हिसाब से एक टाइम सीरीज़ में छोटा हो जाएंगे.

Earth Engine में TFRecords अपलोड करना

Earth Engine में टेबल (सिर्फ़ कमांड लाइन) और इमेज को TFRecord फ़ाइलों के तौर पर अपलोड किया जा सकता है. टेबल के लिए, पहले बताया गया 1:1 का संबंध, उल्टी दिशा में लागू होता है. जैसे, tf.train.Example -> ee.Feature.

इमेजरी अपलोड करना

अगर एक्सपोर्ट की गई इमेजरी पर अनुमान जनरेट किए जाते हैं, तो अनुमानों को TFRecord फ़ाइलों के तौर पर अपलोड करते समय मिक्सर उपलब्ध कराएं. इससे आपको जियोरेफ़रंस वाली इमेजरी मिलेगी. ध्यान दें कि पैच का ओवरलैप होने वाला हिस्सा (इमेज 1 में पैडिंग डाइमेंशन) हटा दिया जाएगा, ताकि एक्सपोर्ट किए गए इलाके का कवरेज एक जैसा हो. अनुमानों को उसी संख्या और क्रम के tf.train.Example क्रम में व्यवस्थित किया जाना चाहिए जो आपके मूल रूप से एक्सपोर्ट किए गए इमेज के उदाहरणों के तौर पर है. भले ही, फ़ाइलों की संख्या कुछ भी हो.