TFRecord และ Earth Engine

TFRecord เป็นรูปแบบไบนารีสําหรับการเข้ารหัสลําดับ tf.Example protos แบบยาวอย่างมีประสิทธิภาพ TensorFlow สามารถโหลดไฟล์ TFRecord ได้อย่างง่ายดายผ่านแพ็กเกจ tf.data ตามที่อธิบายไว้ที่นี่และที่นี่ หน้านี้อธิบายวิธีที่ Earth Engine แปลงระหว่างรูปแบบ ee.FeatureCollection หรือ ee.Image กับรูปแบบ TFRecord

การส่งออกข้อมูลไปยัง TFRecord

คุณสามารถส่งออกตาราง (ee.FeatureCollection) หรือรูปภาพ (ee.Image) ไปยังไฟล์ TFRecord ใน Google ไดรฟ์หรือ Cloud Storage การกำหนดค่าการส่งออกจะขึ้นอยู่กับสิ่งที่คุณส่งออกตามที่อธิบายไว้ด้านล่าง ระบบจะบังคับให้ตัวเลขทั้งหมดที่ส่งออกจาก Earth Engine ไปยัง TFRecord เป็นประเภท float

การส่งออกตาราง

เมื่อส่งออก ee.FeatureCollection ไปยังไฟล์ TFRecord จะมีการจับคู่ 1:1 ระหว่าง ee.Feature แต่ละรายการในตารางกับ tf.train.Example แต่ละรายการ (นั่นคือระเบียนแต่ละรายการ) ในไฟล์ TFRecord พร็อพเพอร์ตี้แต่ละรายการของ ee.Feature ได้รับการเข้ารหัสเป็น tf.train.Feature ที่มีรายการตัวเลขทศนิยมซึ่งสอดคล้องกับตัวเลขหรือ ee.Array ที่เก็บไว้ในพร็อพเพอร์ตี้ หากส่งออกตารางที่มีอาร์เรย์ในพร็อพเพอร์ตี้ คุณจะต้องบอก TensorFlow เกี่ยวกับรูปร่างของอาร์เรย์เมื่ออ่าน ตารางที่ส่งออกไปยังไฟล์ TFRecord จะมีการบีบอัดด้วยประเภทการบีบอัด GZIP เสมอ คุณจะได้รับไฟล์ TFRecord 1 ไฟล์สําหรับการส่งออกแต่ละครั้ง

ตัวอย่างต่อไปนี้แสดงการแยกวิเคราะห์ข้อมูลจากตารางพร็อพเพอร์ตี้เชิงสเกลาร์ที่ส่งออก ('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]) หากคุณส่งออกอาร์เรย์ 2 มิติหรือ 3 มิติ (เช่น พาร์ทช์รูปภาพ) คุณจะต้องระบุรูปร่างของพาร์ทช์ ณ เวลาแยกวิเคราะห์ เช่น shape=[16, 16] สำหรับพาร์ทช์พิกเซล 16x16

การส่งออกรูปภาพ

เมื่อส่งออกรูปภาพ ระบบจะจัดเรียงข้อมูลเป็นช่องทาง ความสูง ความกว้าง (CHW) ระบบอาจแยกการส่งออกออกเป็นไฟล์ TFRecord หลายไฟล์ โดยแต่ละไฟล์จะมีแพตช์ขนาด patchSize อย่างน้อย 1 รายการ ซึ่งผู้ใช้ระบุไว้ในการส่งออก ขนาดของไฟล์ในหน่วยไบต์คือขนาดที่ผู้ใช้ระบุไว้ในพารามิเตอร์ maxFileSize แต่ละแพตช์จะเชื่อมโยงกับ tf.train.Example แต่ละรายการในไฟล์ TFRecord ที่ได้ 1:1 ระบบจะจัดเก็บแต่ละย่านของภาพแยกกันโดยเป็น tf.train.Feature ใน tf.train.Example แต่ละรายการ โดยความยาวของรายการประเภท float ที่เก็บไว้ในฟีเจอร์แต่ละรายการคือความกว้าง * ความสูงของแพทช์ รายการที่ผสานแล้วจะแยกออกเป็นพิกเซลเดี่ยวๆ ได้หลายรายการตามที่แสดงในตัวอย่างนี้ หรือจะกู้คืนรูปร่างของแพทช์ที่ส่งออกดังที่แสดงในตัวอย่างนี้ก็ได้

แพตช์ที่ส่งออกสามารถซ้อนทับกันได้เพื่อช่วยลดความคมชัดของขอบ โดยเฉพาะอย่างยิ่ง คุณสามารถระบุ kernelSize ซึ่งจะส่งผลให้การ์ดมีขนาดดังนี้

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

แต่ละการ์ดจะซ้อนทับการ์ดที่อยู่ติดกัน [kernelSize[0]/2, kernelSize[1]/2] ด้วยเหตุนี้ เมล็ดขนาด kernelSize ที่กึ่งกลางอยู่ที่พิกเซลขอบของแพทช์ขนาด patchSize จึงมีข้อมูลที่ถูกต้องทั้งหมด การจัดเรียงเชิงพื้นที่ของแพทช์ในอวกาศแสดงอยู่ในรูปที่ 1 โดยที่มิติข้อมูลการกรอกข้อมูลสอดคล้องกับส่วนของ Kernel ที่ซ้อนทับกับรูปภาพที่อยู่ติดกัน

แผนภาพรูปภาพ TFRecord
รูปที่ 1 วิธีส่งออกแพตช์รูปภาพ มิติข้อมูลการถ่วงน้ำหนักคือ kernelSize/2

formatOptions

ระบบจะส่งพารามิเตอร์ patchSize, maxFileSize และ kernelSize ไปยังการเรียก ee.Export (JavaScript) หรือ ee.batch.Export (Python) ผ่านพจนานุกรม formatOptions โดยที่คำที่เป็นคีย์คือชื่อพารามิเตอร์เพิ่มเติมที่ส่งไปยัง Export formatOptions ที่เป็นไปได้สำหรับรูปภาพที่ส่งออกในรูปแบบ TFRecord มีดังนี้

พร็อพเพอร์ตี้คำอธิบายประเภท
patchDimensions มิติข้อมูลที่วางซ้อนกันในพื้นที่การส่งออก ซึ่งครอบคลุมทุกพิกเซลในขอบเขตการกําหนด 1 ครั้งเท่านั้น (ยกเว้นในกรณีที่มิติข้อมูลแพทช์ไม่ได้แบ่งขอบเขตการกําหนดอย่างสม่ำเสมอ ซึ่งในกรณีนี้ระบบจะทิ้งไทล์ขอบตามขอบ x/y ที่ใหญ่ที่สุด) มิติข้อมูลต้องมากกว่า 0 Array<int>[2]
kernelSize หากระบุไว้ ระบบจะบัฟเฟอร์ไทล์ตามขนาดของระยะขอบทั้งเชิงบวกและเชิงลบ ซึ่งจะทำให้การซ้อนทับกันระหว่างแพตช์ที่อยู่ติดกัน หากระบุ คุณต้องระบุมิติข้อมูล 2 รายการ (X และ Y ตามลำดับ) Array<int>[2] ค่าเริ่มต้น: [1, 1]
compressed หากเป็น "จริง" ระบบจะบีบอัดไฟล์ .tfrecord ด้วย gzip และใส่นามสกุล ".gz" ต่อท้าย บูลีน ค่าเริ่มต้น: true
maxFileSize ขนาดสูงสุดเป็นไบต์ของไฟล์ .tfrecord ที่ส่งออก (ก่อนการบีบอัด) ไฟล์ที่มีขนาดเล็กลงจะส่งผลให้มีการแยกส่วนมากขึ้น (และทำให้ไฟล์เอาต์พุตมีจำนวนมากขึ้น) Int. ค่าเริ่มต้น: 1 GiB
defaultValue ค่าที่ตั้งไว้ในแต่ละย่านของพิกเซลที่มีการมาสก์บางส่วนหรือทั้งหมด และค่าที่ตั้งไว้ที่แต่ละค่าในองค์ประกอบ 3 มิติเอาต์พุตที่สร้างจากย่านอาร์เรย์ที่ความยาวอาร์เรย์ที่พิกัดต้นทางน้อยกว่าความลึกของค่าองค์ประกอบ (เช่น ค่าที่ดัชนี 3 ของพิกเซลอาร์เรย์ที่มีความยาว 2 ในย่านอาร์เรย์ที่มีความลึกขององค์ประกอบที่เกี่ยวข้อง 3) ระบบจะละทิ้งส่วนที่เป็นทศนิยมสำหรับย่านความถี่ประเภทจำนวนเต็ม และจำกัดให้อยู่ในช่วงของประเภทย่านความถี่ ค่าเริ่มต้นคือ 0 Int. ค่าเริ่มต้น: 0
tensorDepths การแมปจากชื่อของแถบอาร์เรย์อินพุตไปยังความลึกของเทนเซอร์ 3 มิติที่สร้างขึ้น ระบบจะตัดอาร์เรย์ให้สั้นลงหรือเพิ่มค่าเริ่มต้นเพื่อปรับให้เข้ากับรูปแบบที่ระบุ แต่ละย่านความถี่ของอาร์เรย์ต้องมีรายการที่เกี่ยวข้อง Array<int>[] ค่าเริ่มต้น: []
sequenceData หากเป็นจริง ระบบจะแสดงผลพิกเซลแต่ละพิกเซลเป็น SequenceExample ที่แมปแถบสเกลาร์กับบริบท และแถบอาร์เรย์กับลําดับของตัวอย่าง ระบบจะแสดงผล SequenceExamples ตามลําดับแถวของพิกเซลในแต่ละแพตช์ จากนั้นตามลําดับแถวของแพตช์พื้นที่ในลําดับไฟล์ บูลีน ค่าเริ่มต้น: เท็จ
collapseBands หากเป็นค่า "จริง" ระบบจะรวมย่านความถี่ทั้งหมดให้เป็นเทนเซอร์ 3 มิติรายการเดียว โดยจะใช้ชื่อของย่านความถี่แรกในรูปภาพ ระบบจะเลื่อนระดับแบนด์ทั้งหมดเป็นไบต์, int64 แล้วเป็นตัวเลขทศนิยมตามลำดับนั้น ทั้งนี้ขึ้นอยู่กับประเภทที่อยู่ไกลที่สุดในลําดับนั้นภายในแบนด์ทั้งหมด ระบบอนุญาตให้มีแถวของอาร์เรย์ตราบใดที่มีการระบุ tensor_depths บูลีน ค่าเริ่มต้น: เท็จ
maskedThreshold สัดส่วนพิกเซลที่มีการมาสก์สูงสุดที่อนุญาตในแพตช์ ระบบจะทิ้งแพตช์ที่เกินจำนวนที่อนุญาตนี้แทนที่จะเขียนลงในไฟล์ หากตั้งค่าช่องนี้เป็นค่าอื่นที่ไม่ใช่ 1 ระบบจะไม่สร้างไฟล์แนบ JSON ค่าเริ่มต้นคือ 1 ลอย ค่าเริ่มต้น: 1

ไฟล์ "มิกเซอร์" ของ TFRecord

เมื่อคุณส่งออกไปยัง TFRecord แล้ว Earth Engine จะสร้างไฟล์ Sidecar ที่มีไฟล์ TFRecord ที่เรียกว่า "Mixer" ซึ่งเป็นไฟล์ JSON ธรรมดาที่ใช้กำหนดการจัดเรียงเชิงพื้นที่ของแพทช์ (เช่น การระบุพิกัดภูมิศาสตร์) ไฟล์นี้จําเป็นสําหรับการอัปโหลดการคาดการณ์ที่ทําในภาพตามที่อธิบายไว้ในส่วนถัดไป

การส่งออกอนุกรมเวลา

ระบบรองรับการส่งออกรูปภาพไปยังทั้ง Examples และ SequenceExamples เมื่อคุณส่งออกไปยัง Examples ระบบจะตัดพื้นที่ส่งออกออกเป็นแพตช์และส่งออกแพตช์เหล่านั้นตามลําดับแถวหลักไปยังไฟล์ .tfrecord จํานวนหนึ่ง โดยแต่ละย่านความถี่จะมีฟีเจอร์เป็นของตัวเอง (เว้นแต่คุณจะระบุ collapseBands) เมื่อคุณส่งออกไปยัง SequenceExamples ระบบจะส่งออก SequenceExample ต่อพิกเซล โดยจัดเรียง SequenceExample เหล่านั้นตามลําดับแถวหลักภายในแพตช์ จากนั้นจัดเรียงตามลําดับแถวหลักของแพตช์ในพื้นที่ส่งออกเดิม (หากไม่แน่ใจ ให้ถือว่าข้อมูลจะอยู่ในลําดับแถวหลักเสมอ) หมายเหตุ: ระบบจะแพ็กแบนด์สเกลาร์ของรูปภาพลงในบริบทของ SequenceExample ส่วนแบนด์อาร์เรย์จะกลายเป็นข้อมูลลำดับจริง

แถบอาร์เรย์

แถบอาร์เรย์จะส่งออกได้เมื่อส่งออกรูปภาพในรูปแบบ TFRecord การส่งออกแถบอาร์เรย์เป็นวิธีป้อนข้อมูล "FeatureLists" ของ SequenceExamples และเป็นวิธีสร้างเทนเซอร์ 3 มิติเมื่อส่งออกไปยัง Examples ปกติ ดูข้อมูลเกี่ยวกับวิธีจัดการความยาว/ความลึกของย่านความถี่ของอาร์เรย์ได้ที่ collapseBands และ/หรือ tensorDepths ในตารางด้านบน หมายเหตุ: การใช้ collapseBands และส่งออกไปยัง SequenceExamples (การตั้งค่าพารามิเตอร์ sequenceData) จะส่งผลให้แถบทั้งหมดยุบเป็นอนุกรมเวลาเดียวต่อพิกเซล

การอัปโหลด TFRecord ไปยัง Earth Engine

คุณสามารถอัปโหลดตาราง (บรรทัดคำสั่งเท่านั้น) และรูปภาพไปยัง Earth Engine เป็นไฟล์ TFRecord สำหรับตาราง ความสัมพันธ์แบบ 1:1 ที่อธิบายไว้ก่อนหน้านี้จะมีผลในทิศทางย้อนกลับ (เช่น tf.train.Example -> ee.Feature)

การอัปโหลดภาพ

หากคุณสร้างการคาดการณ์จากภาพถ่ายที่ส่งออก ให้ระบุมิกเซอร์เมื่ออัปโหลดการคาดการณ์ (เป็นไฟล์ TFRecord) เพื่อรับภาพถ่ายที่อ้างอิงตามภูมิศาสตร์ โปรดทราบว่าระบบจะทิ้งส่วนที่ทับซ้อนกันของแพตช์ (มิติข้อมูลการกรอกข้อมูลในรูปภาพ 1) เพื่อให้ได้พื้นที่ครอบคลุมต่อเนื่องกันของภูมิภาคที่ส่งออก การคาดการณ์ควรจัดเรียงเป็นtf.train.Exampleลำดับที่มีจำนวนและลำดับเดียวกันกับตัวอย่างรูปภาพที่ส่งออกครั้งแรก (แม้จะเป็นไฟล์จำนวนเท่าใดก็ได้)