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') โปรดทราบว่ามิติข้อมูลของรายการ Float คือ [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 โดยที่มิติข้อมูลระยะห่างจากขอบสอดคล้องกับส่วนของเคอร์เนลที่ทับซ้อนกับรูปภาพที่อยู่ติดกัน
kernelSize/2
formatOptions
ระบบจะส่งพารามิเตอร์ patchSize, maxFileSize และ kernelSize ไปยังการเรียก ee.Export (JavaScript) หรือ ee.batch.Export (Python) ผ่านพจนานุกรม formatOptions โดยที่คีย์คือชื่อของพารามิเตอร์เพิ่มเติมที่ส่งไปยัง Export formatOptions ที่เป็นไปได้สำหรับรูปภาพที่ส่งออกไปยังรูปแบบ TFRecord มีดังนี้
| พร็อพเพอร์ตี้ | คำอธิบาย | ประเภท |
|---|---|---|
patchDimensions |
ขนาดที่เรียงต่อกันเหนือพื้นที่ส่งออก ซึ่งครอบคลุมทุกพิกเซลในกรอบล้อมรอบเพียงครั้งเดียว (ยกเว้นเมื่อขนาดแพตช์ไม่แบ่งกรอบล้อมรอบอย่างสม่ำเสมอ ซึ่งในกรณีนี้ ระบบจะตัดไทล์ขอบตามขอบ 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 จะแสดงผลตามลำดับพิกเซลแบบ Row-Major ในแต่ละแพตช์ จากนั้นจะแสดงผลตามลำดับแพตช์พื้นที่แบบ Row-Major ในลำดับไฟล์ | บูลีน ค่าเริ่มต้น: false |
collapseBands |
หากเป็นจริง ระบบจะรวมย่านความถี่ทั้งหมดไว้ใน Tensor 3 มิติเดียว โดยใช้ชื่อของย่านความถี่แรกในรูปภาพ แบนด์ทั้งหมดจะได้รับการโปรโมตเป็นไบต์, int64 และโฟลตตามลำดับ โดยขึ้นอยู่กับประเภทที่อยู่ไกลที่สุดในลำดับนั้นภายในแบนด์ทั้งหมด อนุญาตให้ใช้แบนด์อาร์เรย์ได้ตราบใดที่มีการระบุ tensor_depths | บูลีน ค่าเริ่มต้น: false |
maskedThreshold |
สัดส่วนสูงสุดที่อนุญาตของพิกเซลที่มาสก์ในแพตช์ ระบบจะทิ้งแพตช์ที่เกินค่านี้แทนที่จะเขียนลงในไฟล์ หากตั้งค่าช่องนี้เป็นค่าอื่นที่ไม่ใช่ 1 ระบบจะไม่สร้างไฟล์ JSON ที่เชื่อมโยง ค่าเริ่มต้นคือ 1 | Float ค่าเริ่มต้น: 1 |
ไฟล์ "Mixer" ของ TFRecord
เมื่อส่งออกไปยัง TFRecord แล้ว Earth Engine จะสร้างไฟล์ Sidecar ที่มีไฟล์ TFRecord ที่เรียกว่า "Mixer" ซึ่งเป็นไฟล์ JSON แบบง่ายที่ใช้กำหนดการจัดเรียงเชิงพื้นที่ของแพตช์ (เช่น การอ้างอิงทางภูมิศาสตร์) ไฟล์นี้จำเป็นสำหรับการอัปโหลดการคาดการณ์ที่ทำขึ้นในภาพตามที่อธิบายไว้ในส่วนถัดไป
กำลังส่งออกอนุกรมเวลา
ระบบรองรับการส่งออกรูปภาพไปยังทั้ง Examples และ SequenceExamples เมื่อคุณส่งออกไปยัง Examples ระบบจะตัดขอบเขตการส่งออกเป็นแพตช์และส่งออกแพตช์เหล่านั้นตามลำดับแถวหลักไปยังไฟล์ .tfrecord จำนวนหนึ่ง โดยแต่ละแบนด์จะมีฟีเจอร์ของตัวเอง (เว้นแต่คุณจะระบุ collapseBands) เมื่อคุณส่งออกไปยัง SequenceExamples ระบบจะส่งออก SequenceExample ต่อพิกเซล โดย SequenceExamples เหล่านั้นจะเรียงตามลำดับแถวหลักภายในแพตช์ จากนั้นจะเรียงตามลำดับแถวหลักของแพตช์ในขอบเขตการส่งออกเดิม (หากไม่แน่ใจ ให้ถือว่าสิ่งต่างๆ จะเรียงตามลำดับแถวหลักเสมอ)
หมายเหตุ: ระบบจะรวมแบนด์สเกลาร์ของรูปภาพไว้ในบริบทของ SequenceExample ส่วนแบนด์อาร์เรย์จะกลายเป็นข้อมูลลำดับจริง
สายแบบอาร์เรย์
แบนด์อาร์เรย์จะส่งออกได้เมื่อส่งออกรูปภาพเป็นรูปแบบ TFRecord การส่งออกแถบอาร์เรย์เป็นวิธีป้อนข้อมูล "FeatureLists" ของ SequenceExamples และเป็นวิธีสร้างเทนเซอร์ 3 มิติเมื่อส่งออกไปยัง Example ปกติ ดูข้อมูลเกี่ยวกับวิธีจัดการความยาว/ความลึกของย่านความถี่อาร์เรย์ได้ที่ collapseBands และ/หรือ tensorDepths ในตารางด้านบน หมายเหตุ: การใช้ collapseBands และการส่งออกไปยัง SequenceExamples (การตั้งค่าพารามิเตอร์ sequenceData) จะส่งผลให้แบนด์ทั้งหมดถูกยุบเป็นอนุกรมเวลาเดียวต่อพิกเซล
การอัปโหลด TFRecord ไปยัง Earth Engine
คุณสามารถอัปโหลดตาราง (บรรทัดคำสั่งเท่านั้น) และรูปภาพไปยัง Earth Engine เป็นไฟล์ TFRecord ได้ สำหรับตาราง ความสัมพันธ์แบบ 1:1 ที่อธิบายไว้ก่อนหน้านี้จะมีผลในทิศทางตรงกันข้าม (เช่น tf.train.Example -> ee.Feature)
กำลังอัปโหลดภาพ
หากคุณสร้างการคาดการณ์ในภาพที่ส่งออก ให้ระบุ Mixer เมื่ออัปโหลดการคาดการณ์ (เป็นไฟล์ TFRecord) เพื่อรับภาพที่อ้างอิงทางภูมิศาสตร์ โปรดทราบว่าระบบจะทิ้งส่วนที่ทับซ้อนกันของแพตช์ (มิติข้อมูลระยะห่างจากขอบในรูปที่ 1) เพื่อให้ครอบคลุมพื้นที่ที่ส่งออกอย่างต่อเนื่อง การคาดการณ์ควรจัดเรียงเป็นลำดับ tf.train.Example ที่มีจำนวนและลำดับเดียวกันกับตัวอย่างรูปภาพที่ส่งออกในตอนแรก (แม้จะอยู่ระหว่างไฟล์จำนวนเท่าใดก็ตาม)