TFRecord הוא פורמט בינארי לקידוד יעיל של רצפים ארוכים של פרוטוקולים של tf.Example. אפשר לטעון קובצי TFRecord בקלות ב-TensorFlow באמצעות החבילה tf.data, כפי שמתואר כאן וכאן.
בדף הזה מוסבר איך Earth Engine ממיר בין פורמט ee.FeatureCollection או ee.Image לפורמט TFRecord.
ייצוא נתונים ל-TFRecord
אתם יכולים לייצא טבלאות (ee.FeatureCollection) או תמונות (ee.Image) לקובצי TFRecord ב-Google Drive או ב-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 אחד בדיוק.
הדוגמה הבאה ממחישה ניתוח נתונים מטבלה מיוצאת של מאפיינים סקלריים ('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]).
אם אתם מייצאים מערכים דו-ממדיים או תלת-ממדיים (למשל, תיקוני תמונה), תצטרכו לציין את
צורת התיקונים בזמן הניתוח, למשל shape=[16, 16] לתיקון של 16x16
פיקסלים.
ייצוא תמונות
כשמייצאים תמונה, הנתונים מסודרים לפי ערוצים, גובה ורוחב (CHW). יכול להיות שהייצוא יפוצל לכמה קובצי TFRecord, כשכל קובץ מכיל תיקון אחד או יותר בגודל patchSize, שהמשתמש ציין בייצוא. גודל הקבצים בבייטים מצוין על ידי המשתמש בפרמטר maxFileSize.
יש התאמה של 1:1 בין כל תיקון לבין כל tf.train.Example בקובץ TFRecord שנוצר. כל פס תדרים של התמונה מאוחסן כ-tf.train.Feature נפרד בכל tf.train.Example, כשאורך רשימת ה-float שמאוחסנת בכל מאפיין הוא רוחב * גובה של ה-patch. אפשר לפצל את הרשימות השטוחות לכמה פיקסלים נפרדים, כמו שמוצג בדוגמה הזו.
או שאפשר לשחזר את הצורה של התיקון שיוצא, כמו בדוגמה הזו.
כדי לצמצם את ההשפעות של הקצוות, אפשר לחפוף בין התיקונים שמייצאים. באופן ספציפי, אפשר לציין 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 |
מידות שפרוסות על פני אזור הייצוא, ומכסות כל פיקסל בתיבה התוחמת (bounding box) בדיוק פעם אחת (אלא אם המידות של התיקון לא מחלקות באופן שווה את התיבה התוחמת, ובמקרה כזה אריחי הגבול לאורך הקצוות הגדולים ביותר של x/y יושמטו). המידות חייבות להיות גדולות מ-0. | מערך<int>[2]. |
kernelSize |
אם מציינים את הפרמטר הזה, המשבצות יקבלו מאגר נתונים זמני לפי מידות השוליים, גם באופן חיובי וגם באופן שלילי, וכתוצאה מכך תהיה חפיפה בין משבצות שכנות. אם מציינים את המאפיין, צריך לספק שני ממדים (X ו-Y, בהתאמה). | מערך<int>[2]. ברירת מחדל: [1, 1] |
compressed |
אם הערך הוא True, קובצי ה- .tfrecord נדחסים באמצעות gzip והסיומת ".gz" מתווספת אליהם | בוליאני. ברירת המחדל: true |
maxFileSize |
הגודל המקסימלי בבייטים של קובץ .tfrecord מיוצא (לפני דחיסה). גודל קובץ קטן יותר יגרום ליותר פיצול (ולכן ליותר קובצי פלט). | מספר שלם. ברירת המחדל: 1GiB |
defaultValue |
הערך שמוגדר בכל פס של פיקסל שמוסתר באופן חלקי או מלא, והערך שמוגדר בכל ערך במאפיין תלת-ממדי של פלט שנוצר מפס מערך שבו אורך המערך בפיקסל המקור היה קטן מעומק ערך המאפיין (כלומר, הערך באינדקס 3 של פיקסל מערך באורך 2 בפס מערך עם עומק מאפיין תואם של 3). החלק השברירי מושמט עבור רצועות מסוג מספר שלם, ומוגבל לטווח של סוג הרצועה. ברירת המחדל היא 0. | מספר שלם. ברירת המחדל: 0 |
tensorDepths |
מיפוי משמות הרצועות של מערך הקלט לעומק של הטנזורים התלת-ממדיים שהן יוצרות. מערכים ייחתכו או ירופדו בערכי ברירת מחדל כדי להתאים לצורה שצוינה. לכל פס מערך, צריך להיות ערך תואם. | Array<int>[]. ברירת המחדל: [] |
sequenceData |
אם הערך הוא True, כל פיקסל מופק כ-SequenceExample שממפה תדרים סקלריים להקשר ותדרי מערך לרצפים של הדוגמה. הפלט של SequenceExamples הוא לפי סדר הפיקסלים בכל משבצת, ואז לפי סדר המשבצות ברצף הקבצים. | בוליאני. ברירת המחדל: false |
collapseBands |
אם הערך הוא true, כל הרצועות ישולבו בטנזור תלת-ממדי אחד, שיקבל את השם של הרצועה הראשונה בתמונה. כל הרצועות מקודמות לבייטים, ל-int64 ואז ל-float, בסדר הזה, בהתאם לסוג הרחוק ביותר ברצף הזה בכל הרצועות. מותר להשתמש ברצועות מערך כל עוד מצוין tensor_depths. | בוליאני. ברירת המחדל: false |
maskedThreshold |
השיעור המקסימלי המותר של פיקסלים מוסתרים בתיקון. תיקונים שחורגים מהמכסה הזו יימחקו ולא ייכתבו בקבצים. אם השדה הזה מוגדר לערך שונה מ-1, קובץ ה-JSON הנלווה לא ייווצר. ברירת המחדל היא 1. | מספר ממשי (float). ברירת המחדל: 1 |
קובץ ה-"mixer" של TFRecord
כשמייצאים ל-TFRecord, Earth Engine יוצר קובץ נלווה עם קובצי TFRecord שנקרא mixer. זהו קובץ JSON פשוט שמשמש להגדרת הסידור המרחבי של התיקונים (כלומר, הפניה גיאוגרפית). הקובץ הזה נדרש כדי להעלות תחזיות שנוצרו על סמך התמונות, כמו שמתואר בקטע הבא.
ייצוא של פעולות על ציר הזמן
אפשר לייצא תמונות גם ל-Examples וגם ל-SequenceExamples. כשמייצאים אל Examples, אזור הייצוא נחתך לחלקים והחלקים האלה מיוצאים בסדר row-major למספר קובצי .tfrecord, כאשר לכל פס יש תכונה משלו (אלא אם מציינים collapseBands). כשמייצאים אל SequenceExamples, ייוצא SequenceExample לכל פיקסל, כאשר ה-SequenceExamples האלה יהיו בסדר row-major בתוך חלק, ואז בסדר row-major של חלקים באזור הייצוא המקורי (אם אתם לא בטוחים, תמיד תניחו שהדברים יהיו בסדר row-major במידה מסוימת).
הערה: כל הערוצים הסקלריים של תמונה ייארזו בהקשר של SequenceExample,
והערוצים של המערך יהפכו לנתוני הרצף בפועל.
רצועות Array
אפשר לייצא ערוצי מערכים כשמייצאים תמונה לפורמט TFRecord. ייצוא של מערכי ערוצים מאפשר לאכלס את ה-FeatureLists של SequenceExamples, וליצור טנזורים תלת-ממדיים כשמייצאים ל-Examples רגילים. כדי לדעת איך מנוהלים האורכים/העומקים של רצועות המערך, אפשר לעיין ב-collapseBands ו/או ב-tensorDepths בטבלה שלמעלה. הערה: שימוש ב-collapseBands
וייצוא ל-SequenceExamples (כלומר הגדרת הפרמטר sequenceData)
יגרמו לכך שכל הרצועות יכווצו לסדרת זמן אחת לכל פיקסל.
העלאת קובצי TFRecord ל-Earth Engine
אתם יכולים להעלות טבלאות (בשורת הפקודה בלבד) ותמונות ל-Earth Engine כקובצי TFRecord. בטבלאות, הקשר של 1:1 שתואר קודם חל בכיוון ההפוך (כלומר tf.train.Example -> ee.Feature).
העלאת תמונות
אם אתם יוצרים חיזויים על תמונות שיוצאו, ספקו את המיקסר כשאתם מעלים את החיזויים (כקובצי TFRecord) כדי לקבל תמונות עם הפניה גיאוגרפית. שימו לב שהחלק החופף של הטלאים (מאפיין הריפוד באיור 1) יימחק כדי ליצור כיסוי רציף של האזור שיוצא. התחזיות צריכות להיות מסודרות ברצף tf.train.Example באותו מספר ובאותו סדר כמו דוגמאות התמונות שיוצאו במקור (גם בין מספר שרירותי של קבצים).