סיווג בפיקוח עם מערך נתוני הטמעה של לוויין

עריכה ב-GitHub
דיווח על בעיה
היסטוריית הדף
מחברים: spatialthoughts
המדריך הזה הוא חלק מסדרת מדריכים בנושא מערך הנתונים של הטמעת נתוני לוויין. כדאי לעיין גם במדריכים בנושאים הבאים: מבוא, סיווג ללא פיקוח, רגרסיה וחיפוש דמיון.

אפשר להשתמש בהטמעות של נתוני לוויין בתהליכי עבודה סטנדרטיים של סיווג חישה מרחוק. הטכנולוגיה הזו תוכננה במיוחד כדי להצטיין בלמידה עם מספר קטן של דוגמאות, כלומר נדרש מספר קטן יחסית של נתונים מתויגים (מ-10 עד 100 דוגמאות) כדי להשיג תוצאות סיווג באיכות גבוהה. מכיוון שההטמעות כוללות הקשר ספקטרלי, מרחבי וזמני, מסווגים פשוטים כמו k-Nearest Neighbors‏ (kNN) או Random Forest יכולים להשתמש בווקטורים של ההטמעה כדי לסווג נופים מורכבים לקטגוריות יעד.

במדריך הזה נלמד איך להשתמש בגישה של למידה מפוקחת באמצעות מסווג kNN כדי לסווג מנגרובים באמצעות הטמעה של נתוני לוויין.

בחירת אזור

נתחיל בהגדרת אזור עניין. במדריך הזה נבחר אזור לאורך קו החוף של קניה ונגדיר פוליגון כמשתנה הגיאומטרי. אפשר גם להשתמש בכלי השרטוט בעורך הקוד כדי לשרטט פוליגון סביב האזור שמעניין אתכם. הפוליגון יישמר כמשתנה הגיאומטריה בקטע Imports.

var geometry = ee.Geometry.Polygon([[
  [39.4926, -4.39833],
  [39.4926, -4.47394],
  [39.5491, -4.47394],
  [39.5491, -4.39833]
]])


איור: בחירת אזור העניין לסיווג של מנגרובים

איסוף דוגמאות לאימון

תהליכי עבודה של סיווג עם הטמעת Satellite דורשים רק כמה דוגמאות מתויגות כדי להשיג תוצאות מדויקות יחסית. לסיווג כיסוי הקרקע, הכי קל להוסיף נקודות ולתייג אותן ב-Earth Engine כדי ליצור את דוגמאות האימון. ניצור סיווג של 3 כיתות שיסווג כל פיקסל מההטמעה של הלוויין לאחת משלוש הכיתות הבאות:

סיווג כיסוי השטח תיאור ערך הכיתה
מנגרובים כל מיני הצמחים שגדלים בחוף וסובלים מליחות 1
מים כל המים העיליים – אגמים, בריכות, נהרות, אוקיינוסים וכו'. 2
אחר כל המשטחים האחרים – כולל אדמה חשופה, חול, גידולים, עצים וכו'. 3

כדי שנוכל לתייג את הנקודות בצורה נכונה, אנחנו קודם יוצרים קומפוזיציה של Sentinel-2 ללא עננים וטוענים אותה. אנחנו בוחרים תצוגה חזותית של צבעים מדומים שמדגישה את ההבדל בין מים, צמחייה ומשטחים בנויים, וכך מאפשרת לנו לבחור בקלות דגימות מתאימות.

// Pick a year for classification
var year = 2020;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');

// Create a Sentinel-2 composite for the selected year
// for selecting training samples
var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED');
var filteredS2 = s2
  .filter(ee.Filter.date(startDate, endDate))
  .filter(ee.Filter.bounds(geometry));

// Use the Cloud Score+ collection for cloud masking
var csPlus = ee.ImageCollection('GOOGLE/CLOUD_SCORE_PLUS/V1/S2_HARMONIZED');
var csPlusBands = csPlus.first().bandNames();
var filteredS2WithCs = filteredS2.linkCollection(csPlus, csPlusBands);

function maskLowQA(image) {
  var qaBand = 'cs';
  var clearThreshold = 0.6;
  var mask = image.select(qaBand).gte(clearThreshold);
  return image.updateMask(mask);
}

var filteredS2Masked = filteredS2WithCs
  .map(maskLowQA)
  .select('B.*');

// Create a median composite of cloud-masked images
var composite = filteredS2Masked.median();
// Display the input composite
var swirVis = {min: 300, max: 4000, bands: ['B11', 'B8', 'B4']};

Map.centerObject(geometry);
Map.addLayer(composite.clip(geometry), swirVis, 'S2 Composite (False Color)');


איור: הרכבה של צבעים לא אמיתיים בנתוני Sentinel-2

עכשיו יש לנו תמונה לדוגמה מהשנה הרלוונטית שאפשר להשתמש בה כדי לתייג דוגמאות לסיווג. קודם נגדיר את השכבות לאיסוף דגימות. פותחים את הקטע ייבוא גיאומטריה ולוחצים על + שכבה חדשה.


איור: יצירת שכבה חדשה

לוחצים על סמל גלגל השיניים (עריכת מאפייני השכבה) לצד השכבה החדשה ומגדירים אותה כמו שמוצג בהמשך. מזינים את שם השכבה כ-mangroves ומשנים את הסוג ל-FeatureCollection. לוחצים על + נכס ומוסיפים נכס חדש landcover עם הערך 1. משנים את הצבע לגוון ירוק ולוחצים על אישור.


איור: הגדרת מאפייני השכבה של מנגרובים

באופן דומה, מוסיפים 2 שכבות חדשות לכיתות האחרות. משתמשים בערך landcover למים ובערך 2 לכל השאר.3


איור: הגדרת מאפייני השכבה עבור (מימין) מים ועבור (משמאל) שכבות אחרות

אחרי שמגדירים את השכבות, אפשר להתחיל לאסוף דוגמאות. מגדילים את התצוגה של אזור מסוים ומזהים באופן ויזואלי פיקסלים מסוגים שונים. בוחרים בשכבה mangroves ומשתמשים בכלי הוספת סמן כדי להוסיף נקודות לפיקסלים ששייכים ליערות מנגרובים, שבדרך כלל מופיעים כגוון ירוק בינוני בתרכובת הצבעים המלאכותיים של Sentinel-2 (אפשר גם לבדוק את תצוגת מפת הבסיס של הלוויין לעיון). לא צריך הרבה נקודות כשמסווגים באמצעות מערך הנתונים של הטמעת הלוויין. חשוב יותר לבחור דוגמאות באיכות גבוהה שמייצגות את השונות באזור שמעניין אתכם. לצורך ההדרכה הזו, מספיק להשתמש ב-10 דוגמאות.


איור: איסוף דוגמאות לסיווג מנגרובים

לאחר מכן, עוברים לשכבה water ואוספים דגימות של פיקסלים של מים על פני השטח, שמופיעים כמעט שחורים בקומפוזיציה של Sentinel-2 בגלל ספיגה חזקה של פסי ה-SWIR במים פתוחים. חוזרים על התהליך עבור השכבה other, ובוחרים דוגמאות שלא ברור אם הן mangrove או water.


איור: איסוף דוגמאות למים ולסוגים אחרים

איסוף דוגמאות האימון הושלם. אנחנו יכולים למזג את שלושת האוספים הנפרדים של התכונות לאוסף יחיד של נקודות בקרה קרקעיות (GCP).

var gcps = mangroves.merge(water).merge(other);

אימון מסווג

עכשיו אפשר לאמן מסווג. אנחנו טוענים את מערך הנתונים של הטמעת תמונות לוויין, מסננים את האריחים לפי השנה והאזור הרצויים, יוצרים פסיפס ואז דוגמים את וקטורי ההטמעה כדי ליצור מערך נתונים לאימון.

var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');

var embeddingsFiltered = embeddings
  .filter(ee.Filter.date(startDate, endDate))
  .filter(ee.Filter.bounds(geometry));

var embeddingsImage = embeddingsFiltered.mosaic();

// Overlay the samples on the image to get training data.
var training = embeddingsImage.sampleRegions({
  collection: gcps,
  properties: ['landcover'],
  scale: 10
});

print('Training Feature', training.first());

תכונות האימון מקבלות את וקטורי ההטמעה כמאפייני הקלט ואת התווית המשויכת כמאפיין המחלקה. עכשיו אפשר לאמן מסווג באמצעות המאפיינים שחולצו. אפשר לבחור מתוך מגוון של מסווגים שזמינים ב-Earth Engine. בחירה טובה לסיווג עם מספר קטן של דוגמאות (כמו בדוגמה שלנו) היא k-Nearest Neighbors ‏ (kNN). בסיווג kNN, נעשה שימוש בדוגמאות עם תוויות כדי לבצע חלוקה או אשכול של מרחב ההטמעה, ולהקצות תווית לכל פיקסל על סמך התוויות של השכנים הקרובים ביותר שלו במרחב ההטמעה. בואו נאמן מסווג kNN עם נתוני האימון שלנו.

var classifier = ee.Classifier.smileKNN().train({
  features: training,
  classProperty: 'landcover',
  inputProperties: embeddingsImage.bandNames()
});

סיווג של פסיפס Satellite Embedding

עכשיו אפשר להשתמש בסיווג המאומן כדי לחזות את המחלקה בכל הפיקסלים של פסיפס ההטמעה של הלוויין.

var classified = embeddingsImage.classify(classifier);

ייצוא תמונה מסווגת לנכס (אופציונלי)

אם מנסים לסווג אזור גדול, ל-Earth Engine נדרש יותר זמן ממה שמותר בסביבת המחשוב האינטראקטיבית. מומלץ לייצא תוצאות ביניים כנכסים כדי לנצל את סביבת המחשוב באצווה, שבה יש מגבלות ארוכות יותר לביצוע משימות ויש בה יותר משאבים. הפעולה הזו גם עוזרת להתגבר על שגיאות כמו computation timed out או user memory exceeded כשעובדים עם אזורים גדולים. בואו נייצא את התמונה שסווגה.

// Replace this with your asset folder
// The folder must exist before exporting
var exportFolder = 'projects/spatialthoughts/assets/satellite_embedding/';

var classifiedExportImage = 'mangrove_classification';
var classifiedExportImagePath = exportFolder + classifiedExportImage;

Export.image.toAsset({
  image: classified.clip(geometry),
  description: 'Classified_Image_Export',
  assetId: classifiedExportImagePath,
  region: geometry,
  scale: 10,
  maxPixels: 1e10
});

מתחילים את משימות הייצוא וממתינים עד שהן מסתיימות לפני שממשיכים. אחרי שמשימת הייצוא מסתיימת, אנחנו מייבאים את התמונה המסווגת בחזרה לקוד שלנו.

// Use the exported asset
var classified = ee.Image(classifiedExportImagePath);

הדמיה של הסיווג

בין אם הפעלתם את הסיווג באופן אינטראקטיבי או ייצאתם אותו לנכס, עכשיו תהיה לכם משתנה מסווג עם תוצאות הסיווג.

// Choose a 3-color palette
// Assign a color for each class in the following order
// Mangrove, Water, Other
var palette = ['green', 'blue', 'gray'];

Map.addLayer(
  classified.clip(geometry),
  {min: 1, max: 3, palette: palette},
  'Classified Satellite Embeddings Image');


איור: תמונה של הטמעות מסווגות של לוויין

יצירת מפה של מנגרובים

יצרנו תמונה מסווגת עם 3 מחלקות. אנחנו יכולים לחלץ את הפיקסלים שמסווגים כמנגרובים (סיווג 1) כדי ליצור מפת מנגרובים.

// Extract mangroves class
var mangrovesImage = classified.eq(1).selfMask();

var mangroveVis = {min: 0, max: 1, palette: ['green']};

Map.addLayer(mangrovesImage.clip(geometry),
  mangroveVis, 'Mangroves Map (Satellite Embedding Classification)');


איור: מפה של מנגרובים

אימות התוצאות

כדי להעריך את התוצאות שלנו, אנחנו יכולים להשוות אותן למערך נתונים שעבר ביקורת עמיתים באיכות גבוהה: Global Mangrove Watch. מערך הנתונים הזה נגזר ממכ"ם מפתח סינתטי (SAR) בתחום L מ-JAXA, ויש בו מפות שנתיות של מנגרובים משנת 1996 עד 2020. מערך הנתונים הזה זמין בקטלוג הקהילה של GEE, כך שאפשר לטעון אותו בקלות ולהציג אותו באופן חזותי ב-Earth Engine.

var gmw = ee.ImageCollection(
  'projects/earthengine-legacy/assets/projects/sat-io/open-datasets/GMW/extent/GMW_V3');
var gmwFiltered = gmw
  .filter(ee.Filter.date(startDate, endDate))
  .filter(ee.Filter.bounds(geometry));
var gmwImage = gmwFiltered.first();

Map.addLayer(gmwImage.clip(geometry),
  mangroveVis, 'Mangroves (Global Mangrove Watch)');

אפשר לראות שיש התאמה גבוהה בין התוצאות של המעקב הגלובלי אחר מנגרובים לבין הפלט של סיווג עם מספר קטן של דוגמאות של מערך הנתונים Satellite Embedding. אם תעברו למפת בסיס של לוויין, תראו שסיווג ההטמעה של הלוויין תיעד גם את הפרטים הקטנים יותר של הנוף שלא נכללו בסיווג הגלובלי של מעקב אחר מנגרובים.

אפשר לנסות את הסקריפט המלא של ההדרכה הזו בכלי לעריכת קוד ב-Earth Engine.