البحث المشابه باستخدام مجموعة بيانات تضمّ بيانات مضمّنة من صور الأقمار الصناعية

التعديل على GitHub
الإبلاغ عن مشكلة
سجلّ الصفحات
المؤلفون: spatialthoughts
يشكّل هذا الفيديو التعليمي جزءًا من سلسلة فيديوهات تعليمية حول مجموعة بيانات Satellite Embedding، يمكنك أيضًا الاطّلاع على مقدمة والتصنيف غير الموجّه والتصنيف الموجّه والانحدار.

توفّر عمليات التضمين فرصة فريدة للعثور على مواقع جغرافية وميزات مشابهة باستخدام بيانات مراقبة الأرض. من خلال مقارنة متجه التضمين لموقع جغرافي مرجعي بمتجهات التضمين لجميع وحدات البكسل الأخرى في صورة التضمين، يمكننا العثور على مواقع جغرافية تتضمّن خصائص مشابهة للموقع الجغرافي المرجعي. في الواقع، يتيح لنا ذلك العثور بسهولة على كائنات أو أنواع معيّنة من المواقع الجغرافية في المنطقة التي تهمّنا.

في هذا البرنامج التعليمي، سنحاول العثور على جميع صوامع الحبوب في منطقة معيّنة. صوامع الحبوب أو حاويات الحبوب هي مبانٍ طويلة تُستخدم عادةً لتخزين الحبوب بكميات كبيرة. ويمكن العثور عليها في المزارع أو مرافق المعالجة. سيكون من الصعب تحديد هذه البُنى باستخدام طرق الاستشعار عن بُعد التقليدية، وسيتطلّب ذلك تدريب نموذج مخصّص لرصد العناصر. بما أنّ الصوامع لها شكل وبنية فريدان، وعادةً ما تكون مصنوعة من مواد متشابهة، سيتم تمثيلها بمتجهات تضمين فريدة في صور Satellite Embedding، ما يتيح لنا تحديد موقعها من خلال بحث بسيط عن التشابه.


صوامع الحبوب (الصورة: ويكيبيديا)

اختيار منطقة البحث

في هذا البرنامج التعليمي، سنرسم خرائط لصوامع الحبوب في مقاطعة فرانكلين، كانساس. نطبّق فلترًا ونختار المضلّع الخاص بهذه المقاطعة.

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 مواقع جغرافية مرجعية. سيتم استخدامها لاستخراج متّجهات التضمين من صور Satellite Embedding.

اختيار فترة زمنية

اختَر سنة نريد إجراء البحث فيها.

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
});

احتساب التشابه

من خلال احتساب الجداء النقطي بين متّجهَي تضمين، يمكننا احتساب التشابه بينهما. يقلّل الضرب النقطي من حجم متجهَين والزاوية بينهما إلى رقم واحد، وفي حالتنا، تكون متجهات التضمين ذات طول الوحدة، والنتيجة هي الزاوية بين المتجهات فقط.

يمكننا ببساطة ضرب خطَّين متجهَين مضمَّنين بطول الوحدة وبـ 64 بُعدًا، ثم جمع النواتج للحصول على جيب تمام الزاوية بين الخطَّين المتجهَين (المعروف أيضًا باسم "الضرب النقطي"). نحتسب صورة واحدة لكل موقع جغرافي مرجعي، ثم نحسب متوسط النتيجة للحصول على صورة تتضمّن قيم وحدات البكسل الخاصة بالضرب النقطي.

// 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. لتجنُّب ظهور الخطأين انتهت مهلة الحساب أو خطأ في المربّع عند عرض النتائج، من الممارسات الجيدة تصدير النتائج كأصل. بعد تصدير مادة العرض، يمكن استيرادها إلى النص البرمجي وعرضها. تضمن هذه الطريقة أيضًا إمكانية توسيع نطاق البحث ليشمل مساحات كبيرة بدون مشاكل.

// 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.