הטמעות מספקות הזדמנות ייחודית למצוא מיקומים ותכונות דומים באמצעות נתונים של תצפית על כדור הארץ. על ידי השוואה בין וקטור ההטמעה של מיקום ייחוס לבין וקטורי ההטמעה של כל הפיקסלים האחרים בתמונה מוטמעת, אפשר למצוא מיקומים שמציגים מאפיינים דומים למיקום הייחוס. בפועל, זה מאפשר לנו למצוא בקלות אובייקטים או סוגים מסוימים של אתרים באזור שמעניין אותנו.
במדריך הזה ננסה למצוא את כל ממגורות התבואה באזור מסוים. ממגורות או מיכלי אחסון לגרעינים הם מבנים גבוהים שמשמשים בדרך כלל לאחסון של גרעינים בכמויות גדולות. הם נמצאים בחוות או במתקני עיבוד. מיפוי המבנים האלה יהיה קשה באמצעות שיטות מסורתיות של חישה מרחוק, וידרוש אימון של מודל מותאם אישית לזיהוי אובייקטים. לסילו יש צורה ומבנה ייחודיים, והוא בדרך כלל עשוי מחומרים דומים. לכן, הוא ייוצג באמצעות וקטורים ייחודיים של הטמעה בתמונות של הטמעת נתונים מלוויין, וכך נוכל לאתר אותו באמצעות חיפוש פשוט של דמיון.
ממגורות (תמונה: ויקיפדיה)
בחירת אזור החיפוש
במדריך הזה נמפה את ממגורות התבואה במחוז פרנקלין שבקנזס. אנחנו מפעילים מסנן ובוחרים את הפוליגון של המחוז הזה.
var counties = ee.FeatureCollection('TIGER/2018/Counties');
// Select Franklin County, Kansas
var selected = counties
.filter(ee.Filter.eq('GEOID', '20059'));
var geometry = selected.geometry();
Map.centerObject(geometry);
Map.addLayer(geometry, {color: 'red'}, 'Search Area');
איור: אזור נבחר
בחירת מיקומים גיאוגרפיים לדוגמה
אנחנו מתחילים בסימון המיקום של ממגורה אחת או יותר. בכלי לעריכת קוד, אפשר להשתמש במפת בסיס של תמונות לוויין, שמקלה על איתור אובייקטים.
// Use the satellite basemap
Map.setOptions('SATELLITE');
אחרי שמוצאים את המיקום של האובייקט שרוצים לסמן, משתמשים בכלי 'הוספת סמן' מתוך 'כלי הציור' כדי להוסיף נקודה ולסמן אותו כמיקום להשוואה.
איור: הוספת מיקום הפניה
לרוב מספיק מיקום אחד, אבל אם יש כמה דוגמאות זה עוזר לצמצם את מספר התוצאות החיוביות הכוזבות (במקרה הזה, מיקומים שזוהו כסילו תבואה אבל הם לא סילו תבואה). נשנה את סוג הגיאומטריה ל-FeatureCollection כדי שנוכל להוסיף כמה נקודות התייחסות. לצד הגיאומטריה, לוחצים על הלחצן עריכת מאפייני השכבה. משנים את שם השכבה ל-samples
ומגדירים את סוג הייבוא כ-FeatureCollection
. לחץ על 'אישור'.
איור: הגדרת שכבת הדגימות
בחלון הראשי של עורך הקוד, מוסיפים נקודות בעוד כמה מיקומים מייצגים.
איור: הוספת מיקומי התייחסות נוספים
במדריך הזה בחרנו 3 מיקומי ייחוס. הם ישמשו לחילוץ וקטורי ההטמעה מתמונות הטמעה של לוויין.
בחירת תקופת זמן
בוחרים את השנה שבה רוצים להריץ את החיפוש.
var year = 2024;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');
סינון ופסיפס של מערך הנתונים Satellite Embedding
אנחנו טוענים את מערך הנתונים של הטמעת לוויין, מסננים את התמונות לפי השנה שנבחרה ויוצרים פסיפס.
var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');
var mosaic = embeddings
.filter(ee.Filter.date(startDate, endDate))
.mosaic();
חילוץ וקטור ההטמעה מהדוגמאות
אנחנו דוגמים את הפסיפס במיקומי ההפניה כדי לקבל את וקטור ההטמעה שמשויך לנקודות האלה. צריך גם לבחור את הסולם שבו רוצים לחלץ ולהשוות את וקטור ההטמעה. תכונה מאוד שימושית של ההטמעות ב-Satellite Embedding היא שהן מתוכננות להיות קומפוזביליות באופן לינארי, כלומר אפשר לצבור אותן או ליצור מהן פירמידה תוך שמירה על יחסי המרחק והמשמעות שלהן. אם ניקח ממוצע מרחבי של 2x2 פיקסלים, התוצאה תייצג את ההטמעה של פיקסל גדול יותר ברזולוציה נמוכה יותר. הרזולוציה המקורית של הטמעת תמונות לוויין היא 10 מ' וזהו קנה מידה טוב לשימוש בזיהוי אובייקטים קטנים כמו ממגורות. אבל אם אתם רוצים למצוא אובייקטים או אתרים גדולים יותר, אתם יכולים להשתמש בערך גדול יותר (כלומר, 20 מ', 1,000 מ') כדי להתאים לאובייקטים בקנה מידה גס יותר.
// Choose the scale
// You may choose a larger value for larger objects
var scale = 10;
// Extract the embedding vector from the samples
var sampleEmbeddings = mosaic.sampleRegions({
collection: samples,
scale: scale
});
חישוב הדמיון
חישוב המכפלה הסקלרית בין שני וקטורי הטמעה מאפשר לנו לחשב את הדמיון ביניהם. המכפלה הסקלרית מצמצמת את הגודל של שני וקטורים ואת הזווית ביניהם למספר יחיד – ובמקרה שלנו, וקטורי ההטמעה הם באורך יחידה, כך שהתוצאה היא רק הזווית בין הווקטורים.
אנחנו יכולים פשוט להכפיל שני וקטורי הטמעה באורך יחידה של 64D ולסכם את המכפלות כדי לקבל את קוסינוס הזווית בין הווקטורים (כלומר, את "המכפלה הסקלרית"). אנחנו מחשבים תמונה אחת לכל מיקום ייחוס, ומחשבים את הממוצע של התוצאה כדי לקבל תמונה עם ערכי פיקסלים של המכפלה הסקלרית.
// We compute the dot product between two embedding vectors
var bandNames = mosaic.bandNames();
var sampleDistances = ee.ImageCollection(sampleEmbeddings.map(function (f) {
var arrayImage = ee.Image(f.toArray(bandNames)).arrayFlatten([bandNames]);
var dotProduct = arrayImage.multiply(mosaic)
.reduce('sum')
.rename('similarity');
return dotProduct;
}));
// Calculate mean distance from all reference locations
var meanDistance = sampleDistances.mean();
פיקסלים עם מכפלה סקלרית שקרובה ל-1 הם בעלי וקטורי הטמעה דומים יחסית (הזווית ביניהם קרובה ל-0), בעוד שמכפלות סקלריות שקרובות ל-1- מצביעות על הבדל גדול יותר בין הווקטורים (אורתוגונליים לכיוון ההפוך). כדי להציג את התוצאות באופן חזותי, אפשר להוסיף את תמונת המרחק הממוצע למפה.
var palette = [
'000004', '2C105C', '711F81', 'B63679',
'EE605E', 'FDAE78', 'FCFDBF', 'FFFFFF'
];
var similarityVis = {palette: palette, min: 0, max: 1};
Map.addLayer(meanDistance.clip(geometry), similarityVis,
'Similarity (bright = close)', false);
איור: מידת הדמיון של הפיקסלים מסביב לנקודת ייחוס – אזורים בהירים יותר דומים יותר
חילוץ של נתוני מיקומים
בשלב הבא, נגדיר סף ונחלץ מיקומים שמכילים את אובייקט היעד. לכל הפיקסלים עם ממגורות יהיו וקטורי הטמעה דומים מאוד לווקטור ההטמעה של ההפניה, והזווית ביניהם תהיה קרובה ל-1. אנחנו מגדירים סף כדי למצוא את כל הפיקסלים האלה באזור. הערך הנכון של הסף תלוי באובייקט שמנסים למצוא ובקנה המידה. אתם יכולים לנסות ערכים שונים ולראות איזה מהם הכי מתאים לאפליקציה שלכם.
// Apply a threshold
var threshold = 0.90;
var similarPixels = meanDistance.gt(threshold);
התוצאה היא תמונה בינארית עם פיקסלים שערכי הדמיון שלהם נמוכים מהסף. עכשיו אנחנו ממירים את התמונה שמתקבלת למצולעים.
// Mask 0 values using selfMask()
// to get polygons only for the matched pixels
var polygons = similarPixels.selfMask().reduceToVectors({
scale: scale,
eightConnected: false,
maxPixels: 1e10,
geometry: geometry
});
כל מצולע מייצג אתר שתואם למיקומי ההפניה. אנחנו יכולים להשתמש בנקודת המרכז כדי לייצג את המיקום התואם.
// Extract the centroids of vectorized polygons
var predictedMatches = polygons.map(function(f) {
return f.centroid({maxError:1});
});
ייצוא התאמות לנכס (אופציונלי)
וקטוריזציה היא פעולה שדורשת הרבה זיכרון ומשאבי מחשוב ב-Earth Engine. כדי להימנע מהשגיאות Computation Timed Out או Tile Error כשמציגים את התוצאות באופן חזותי, מומלץ לייצא את התוצאות כנכס. אחרי שמייצאים את הנכס, אפשר לייבא אותו לסקריפט ולהציג אותו באופן חזותי. בנוסף, השיטה הזו מבטיחה שתוכלו להרחיב את החיפוש לאזורים גדולים בלי בעיות.
// Replace this with your asset folder
// The folder must exist before exporting
var exportFolder = 'projects/spatialthoughts/assets/satellite_embedding/';
var matchesExportFc = 'predicted_grain_silo_matches';
var matchesExportFcPath = exportFolder + matchesExportFc;
Export.table.toAsset({
collection: predictedMatches,
description: 'Predicted_Matches_Export',
assetId: matchesExportFcPath
});
מתחילים את משימות הייצוא וממתינים עד שהן מסתיימות לפני שממשיכים. אחרי שמשימת הייצוא מסתיימת, אנחנו מייבאים את ההתאמות בחזרה לקוד שלנו.
// Use the exported asset
var predictedMatches = ee.FeatureCollection(matchesExportFcPath);
הצגת ההתאמות
בין אם חילצתם את ההתאמות באופן אינטראקטיבי או ייצאתם אותן לאוסף תכונות, עכשיו יש לכם משתנה predictedMatches
עם ההתאמות החזויות למיקומי הייחוס באזור החיפוש. בואו נדמיין אותם.
Map.addLayer(predictedMatches, {color: 'cyan'} , 'Predicted Matches');
אימות התוצאות
כדי להעריך את התוצאות, אפשר להגדיל את התצוגה של כל התאמה חזויה כדי לראות אם יש ממגורה במיקום הזה. אפשר לראות שיש הרבה התאמות שזיהו נכון ממגורות.
איור: אתרים שזוהו בצורה נכונה עם ממגורות
בנוסף, יש בתוצאות כמה תוצאות חיוביות כוזבות. אם תתבוננו, תראו שלהתאמות יש הרבה מאפיינים דומים למיקום ההתייחסות שלנו, ולכן יש להן וקטורי הטמעה דומים.
איור: התאמות חיוביות שגויות
כדי לשפר את התוצאות, אפשר לשנות את מיקומי ההשוואה ואת ערך הסף שנבחר.
אפשר לנסות את הסקריפט המלא של ההדרכה הזו בכלי לעריכת קוד ב-Earth Engine.