TFRecord এবং Earth Engine

TFRecord হল একটি বাইনারি ফর্ম্যাট যা tf.Example protos-এর দীর্ঘ সিকোয়েন্স দক্ষতার সাথে এনকোড করে। TFRecord ফাইলগুলি TensorFlow দ্বারা সহজেই লোড করা হয় tf.data প্যাকেজের মাধ্যমে, যেমন বর্ণনা করা হয়েছে এখানে এবং এখানে। এই পৃষ্ঠায় বর্ণনা করা হয়েছে যে Earth Engine কীভাবে ee.FeatureCollection বা ee.Image এবং TFRecord ফর্ম্যাটের মধ্যে কনভার্ট করে।

TFRecord-এ ডেটা এক্সপোর্ট করা হচ্ছে

আপনি Google Drive বা Cloud Storage-এ TFRecord ফাইলে টেবিল (ee.FeatureCollection) বা ছবি (ee.Image) এক্সপোর্ট করতে পারবেন। আপনি কী এক্সপোর্ট করছেন তার উপর নির্ভর করে এক্সপোর্ট কনফিগার করা হয়, যেমন নিচে বর্ণনা করা হয়েছে। Earth Engine থেকে TFRecord-এ এক্সপোর্ট করা সব নম্বর ফ্লোট টাইপে পরিবর্তন করা হয়।

টেবিল এক্সপোর্ট করা হচ্ছে

TFRecord ফাইলে ee.FeatureCollection এক্সপোর্ট করার সময়, টেবিলের প্রতিটি ee.Feature এবং TFRecord ফাইলের প্রতিটি tf.train.Example (অর্থাৎ, প্রতিটি রেকর্ড)-এর মধ্যে ১:১ অনুরূপতা থাকে। 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-এর মধ্যে ১:১ সম্পর্ক থাকে। ছবির প্রতিটি ব্যান্ড আলাদা tf.train.Feature হিসেবে প্রতিটি tf.train.Example-এ স্টোর করা হয়, যেখানে প্রতিটি ফিচারে স্টোর করা ফ্লোট তালিকার দৈর্ঘ্য হল প্যাচের প্রস্থ * উচ্চতা। ফ্ল্যাট করা তালিকা একাধিক স্বতন্ত্র পিক্সেলে বিভক্ত করা যেতে পারে, যেমনটি এই উদাহরণে দেখানো হয়েছে। অথবা এক্সপোর্ট করা প্যাচের আকার এই উদাহরণের মতো করে ফিরিয়ে আনা যেতে পারে।

এজ এফেক্ট কমাতে সাহায্য করার জন্য, এক্সপোর্ট করা প্যাচ ওভারল্যাপ করতে পারে। নির্দিষ্ট করে বলতে গেলে, আপনি kernelSize নির্দিষ্ট করতে পারেন যার ফলে এই সাইজের টাইল তৈরি হবে:

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

প্রতিটি টাইল তার পাশের টাইলকে [kernelSize[0]/2, kernelSize[1]/2] দিয়ে ওভারল্যাপ করে। এর ফলে, patchSize সাইজের প্যাচের এজ পিক্সেলের কেন্দ্রে থাকা kernelSize সাইজের কার্নেলে সম্পূর্ণ সঠিক ডেটা থাকে। স্পেসে প্যাচের স্থানিক বিন্যাস চিত্র ১-এ দেখানো হয়েছে, যেখানে প্যাডিং ডাইমেনশন কার্নেলের সেই অংশের সাথে সম্পর্কিত যা সংলগ্ন ছবির সাথে ওভারল্যাপ করে:

TFRecord ইমেজ ডায়াগ্রাম
ছবি ১. কীভাবে ছবির প্যাচ এক্সপোর্ট করা হয়। প্যাডিং ডাইমেনশন হল kernelSize/2।

formatOptions

patchSize, maxFileSize ও kernelSize প্যারামিটার ee.Export (জাভাস্ক্রিপ্ট) বা ee.batch.Export (Python) কলে formatOptions ডিকশনারির মাধ্যমে পাস করা হয়, যেখানে কী হল Export-এ পাস করা অতিরিক্ত প্যারামিটারের নাম। TFRecord ফর্ম্যাটে এক্সপোর্ট করা ছবির জন্য সম্ভাব্য formatOptions হল:

প্রপার্টিবিবরণধরন
patchDimensions এক্সপোর্ট এরিয়া জুড়ে ডাইমেনশন টাইল করা হয়েছে, বাউন্ডিং বক্সের প্রতিটি পিক্সেল ঠিক একবার কভার করা হয়েছে (প্যাচ ডাইমেনশন বাউন্ডিং বক্সকে সমানভাবে ভাগ না করলে, সবচেয়ে বড় x/y প্রান্ত বরাবর বর্ডার টাইল বাদ দেওয়া হবে)। ডাইমেনশন অবশ্যই > ০ হতে হবে। Array<int>[2].
kernelSize নির্দিষ্ট করা থাকলে, টাইলগুলি মার্জিন ডাইমেনশন দ্বারা পজিটিভ এবং নেগেটিভ উভয়ভাবেই বাফার করা হবে, যার ফলে প্রতিবেশী প্যাচগুলির মধ্যে ওভারল্যাপ হবে। নির্দিষ্ট করা থাকলে, দুটি ডাইমেনশন প্রদান করতে হবে (যথাক্রমে X এবং Y)। Array<int>[2]. ডিফল্ট: [১, ১]
compressed সত্য হলে, gzip দিয়ে .tfrecord ফাইল কম্প্রেস করে এবং ".gz" প্রত্যয় যোগ করে বুলিয়ান। ডিফল্ট: সত্য
maxFileSize এক্সপোর্ট করা .tfrecord-এর (কম্প্রেশনের আগে) সর্বাধিক সাইজ, বাইটে। ফাইলের সাইজ ছোট হলে শার্ডিং বেশি হবে (এবং, এর ফলে, আরও বেশি আউটপুট ফাইল তৈরি হবে)। Int. ডিফল্ট: ১ গিবিবাইট
defaultValue আংশিক বা সম্পূর্ণভাবে মাস্ক করা পিক্সেলের প্রতিটি ব্যান্ডে সেট করা ভ্যালু এবং অ্যারে ব্যান্ড থেকে তৈরি আউটপুট 3D ফিচারের প্রতিটি ভ্যালুতে সেট করা ভ্যালু, যেখানে সোর্স পিক্সেলে অ্যারের দৈর্ঘ্য ফিচার ভ্যালুর গভীরতার চেয়ে কম ছিল (যেমন, ৩ গভীরতার সংশ্লিষ্ট ফিচার সহ অ্যারে ব্যান্ডের ২ দৈর্ঘ্যের অ্যারে পিক্সেলের ৩ ইনডেক্সে থাকা ভ্যালু)। ইনটিজার টাইপ ব্যান্ডের জন্য ভগ্নাংশ বাদ দেওয়া হয় এবং ব্যান্ড টাইপের রেঞ্জে সীমাবদ্ধ করা হয়। ডিফল্ট হিসেবে ০ সেট করা থাকে। Int. ডিফল্ট: ০
tensorDepths ইনপুট অ্যারে ব্যান্ডের নাম থেকে 3D টেনসরের গভীরতা পর্যন্ত ম্যাপিং। আকার ফিট করার জন্য অ্যারে ট্রাঙ্কেট করা হবে বা ডিফল্ট ভ্যালু দিয়ে প্যাড করা হবে নির্দিষ্ট করা হয়েছে। প্রতিটি অ্যারে ব্যান্ডের জন্য, এটির একটি সংশ্লিষ্ট এন্ট্রি থাকতে হবে। Array<int>[]. ডিফল্ট: []
sequenceData সত্য হলে, প্রতিটি পিক্সেল SequenceExample ম্যাপিং স্কেলার ব্যান্ড হিসেবে প্রসঙ্গ এবং অ্যারে ব্যান্ড হিসেবে উদাহরণের সিকোয়েন্সে আউটপুট করা হয়। SequenceExamples প্রতিটি প্যাচে পিক্সেলের রো-মেজর অর্ডারে এবং তারপর ফাইল সিকোয়েন্সে এরিয়া প্যাচের রো-মেজর অর্ডারে আউটপুট করা হয়। বুলিয়ান। ডিফল্ট: মিথ্যা
collapseBands সত্য হলে, সমস্ত ব্যান্ড একটি একক 3D টেনসরে একত্রিত হবে, ছবির প্রথম ব্যান্ডের নাম গ্রহণ করবে। সব ব্যান্ড বাইট, int64s, তারপর ফ্লোটে প্রোমোট করা হয় সেই ক্রমে যা সব ব্যান্ডের মধ্যে সেই সিকোয়েন্সের সবচেয়ে দূরের ধরনের উপর নির্ভর করে। tensor_depths উল্লেখ করা থাকলে অ্যারে ব্যান্ড ব্যবহার করা যাবে। বুলিয়ান। ডিফল্ট: মিথ্যা
maskedThreshold একটি প্যাচে মাস্ক করা পিক্সেলের সর্বাধিক অনুমোদিত অনুপাত। এই সীমা অতিক্রম করে এমন প্যাচ ফাইলে লেখার পরিবর্তে বাদ দেওয়া হবে। এই ফিল্ডে ১ ছাড়া অন্য কোনও ভ্যালু সেট করা থাকলে, JSON সাইডকার তৈরি করা হবে না। ডিফল্ট হিসেবে ১ সেট করা থাকে। ফ্লোট। ডিফল্ট: ১

TFRecord “মিক্সার” ফাইল

TFRecord-এ এক্সপোর্ট করার সময়, Earth Engine আপনার TFRecord ফাইলের সাথে একটি সাইডকার তৈরি করবে যাকে "মিক্সার" বলা হয়। এটি একটি সাধারণ JSON ফাইল যা প্যাচের স্থানিক বিন্যাস (যেমন, জিওরেফারেন্সিং) নির্ধারণ করতে ব্যবহৃত হয়। পরবর্তী বিভাগে যেমন বর্ণনা করা হয়েছে, সেই অনুযায়ী ইমেজারিতে করা পূর্বাভাস আপলোড করার জন্য এই ফাইলটি প্রয়োজন।

টাইম সিরিজ এক্সপোর্ট করা হচ্ছে

Examples এবং SequenceExamples, দুটিতেই ছবি এক্সপোর্ট করার সুবিধা কাজ করে। আপনি যখন Examples-এ এক্সপোর্ট করেন, তখন এক্সপোর্ট অঞ্চলটি প্যাচে কাটা হয় এবং সেই প্যাচগুলি সারি-মেজর ক্রমে কিছু সংখ্যক .tfrecord ফাইলে এক্সপোর্ট করা হয়, যার প্রতিটি ব্যান্ড নিজস্ব ফিচার সহ (যদি না আপনি collapseBands নির্দিষ্ট করেন)। আপনি যখন SequenceExamples-এ এক্সপোর্ট করেন, প্রতি-পিক্সেল একটি SequenceExample এক্সপোর্ট করা হবে, সেই SequenceExamples সহ একটি প্যাচের মধ্যে সারি-মেজর ক্রমে এবং তারপর আসল এক্সপোর্ট অঞ্চলে প্যাচের সারি-মেজর ক্রমে (যদি আপনি কখনও অনিশ্চিত হন, তাহলে সবসময় ধরে নিন যে জিনিসগুলি কোনও না কোনও ক্ষমতায় সারি-মেজর ক্রমে থাকবে)। মনে রাখবেন: কোনও ছবির যেকোনও স্কেলার ব্যান্ড SequenceExample-এর প্রসঙ্গে প্যাক করা হবে, যেখানে অ্যারে ব্যান্ডগুলি আসল সিকোয়েন্স ডেটা হয়ে যাবে।

অ্যারে ব্যান্ড

TFRecord ফর্ম্যাটে কোনও ছবি এক্সপোর্ট করা হলে, অ্যারে ব্যান্ড এক্সপোর্ট করা যায়। অ্যারে ব্যান্ড এক্সপোর্ট করার মাধ্যমে SequenceExamples-এর “FeatureLists” পপুলেট করা যায় এবং রেগুলার Examples-এ এক্সপোর্ট করার সময় 3D টেনসর তৈরি করা যায়। অ্যারে ব্যান্ডের দৈর্ঘ্য/গভীরতা কীভাবে ম্যানেজ করা হয় সেই সম্পর্কে তথ্যের জন্য, উপরের টেবিলে collapseBands এবং/অথবা tensorDepths দেখুন। মনে রাখবেন: collapseBands-এর ব্যবহার এবং SequenceExamples-এ এক্সপোর্ট করার (তাই sequenceData প্যারামিটার সেট করা) ফলে সব ব্যান্ড পিক্সেল প্রতি একটি টাইম সিরিজে ভেঙে যাবে।

Earth Engine-এ TFRecords আপলোড করা

আপনি Earth Engine-এ TFRecord ফাইল হিসেবে টেবিল (শুধুমাত্র কমান্ড লাইন) এবং ছবি আপলোড করতে পারবেন। সারণীর ক্ষেত্রে, আগে বর্ণিত ১:১ সম্পর্ক বিপরীত দিকে প্রযোজ্য হয় (যেমন, tf.train.Example -> ee.Feature)।

ছবি আপলোড করা হচ্ছে

আপনি এক্সপোর্ট করা ইমেজের উপর পূর্বাভাস জেনারেট করলে, জিওরেফারেন্স করা ইমেজ পেতে পূর্বাভাস (TFRecord ফাইল হিসেবে) আপলোড করার সময় মিক্সার প্রদান করুন। মনে রাখবেন যে প্যাচের ওভারল্যাপ করা অংশ (চিত্র ১-এ প্যাডিং ডাইমেনশন) বাদ দেওয়া হবে যাতে এক্সপোর্ট করা অঞ্চলের কভারেজ একই সীমানার মধ্যে থাকে। পূর্বাভাসগুলি একই সংখ্যা এবং ক্রমের tf.train.Example ক্রম হিসাবে সাজানো উচিত যেমন আপনার মূলত এক্সপোর্ট করা ছবির উদাহরণ (এমনকি ফাইলের একটি ইচ্ছামত সংখ্যার মধ্যেও)।