جاسازی ها فرصتی منحصر به فرد برای یافتن مکان ها و ویژگی های مشابه با استفاده از داده های رصد زمین است. با مقایسه بردار جاسازی یک مکان مرجع با بردارهای جاسازی برای تمام پیکسل های دیگر یک تصویر جاسازی شده، می توانیم مکان هایی را پیدا کنیم که ویژگی های مشابه مکان مرجع را نشان می دهند. در عمل، این به ما امکان می دهد به راحتی اشیاء یا انواع خاصی از سایت ها را در منطقه مورد علاقه خود پیدا کنیم.
برای این آموزش سعی می کنیم تمام سیلوهای غلات را در یک منطقه پیدا کنیم. سیلوهای غلات یا سطل های غلات سازه های بلندی هستند که معمولاً برای ذخیره انبوه غلات استفاده می شوند. آنها در مزارع یا تأسیسات فرآوری یافت می شوند. نگاشت این ساختارها با روش های سنتی سنجش از دور دشوار خواهد بود و نیاز به آموزش یک مدل تشخیص شی سفارشی دارد. از آنجایی که سیلوها شکل، ساختار منحصر به فردی دارند و معمولاً از مواد مشابه ساخته می شوند، آنها با بردارهای جاسازی منحصر به فرد در تصاویر جاسازی ماهواره ای نشان داده می شوند که به ما امکان می دهد آنها را با یک جستجوی تشابه ساده مکان یابی کنیم.
سیلوهای غلات (تصویر: ویکی پدیا)
منطقه جستجو را انتخاب کنید
برای این آموزش، سیلوهای غلات در شهرستان فرانکلین، کانزاس را نقشه میکشیم. یک فیلتر اعمال می کنیم و چند ضلعی را برای این شهرستان انتخاب می کنیم.
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');
هنگامی که مکان شی مورد نظر را پیدا کردید، از ابزار Add a Marker از ابزار Drawing Tools استفاده کنید تا نقطه ای را رها کنید تا آن را به عنوان مکان مرجع علامت گذاری کنید.
شکل: اضافه کردن یک مکان مرجع
حتی یک مکان منفرد اغلب کافی است، اما داشتن چند نمونه بیشتر به کاهش موارد مثبت کاذب کمک می کند (در این مورد، مکان هایی که به عنوان سیلوهای دانه شناسایی می شوند که در واقع سیلوهای غلات نیستند). ما نوع هندسه را به FeatureCollection تغییر می دهیم تا بتوانیم چندین نقطه مرجع اضافه کنیم. روی دکمه Edit layer properties در کنار هندسه کلیک کنید. نام لایه را به samples
تغییر دهید و نوع واردات را به صورت FeatureCollection
تنظیم کنید. روی OK کلیک کنید.
شکل: پیکربندی لایه نمونه
در پنجره اصلی ویرایشگر کد، نقاطی را در چند مکان نماینده دیگر اضافه کنید.
شکل: افزودن مکان های مرجع بیشتر
برای این آموزش، ما 3 مکان مرجع را انتخاب کرده ایم. اینها برای استخراج بردارهای جاسازی از تصاویر جاسازی ماهواره ای استفاده خواهند شد.
یک دوره زمانی را انتخاب کنید
سالی را انتخاب کنید که می خواهیم جستجو را برای آن انجام دهیم.
var year = 2024;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');
مجموعه داده های Satellite Embedding را فیلتر و موزاییک کنید
مجموعه داده های Satellite Embedding را بارگذاری می کنیم، تصاویر را برای سال انتخابی فیلتر می کنیم و یک موزاییک ایجاد می کنیم.
var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');
var mosaic = embeddings
.filter(ee.Filter.date(startDate, endDate))
.mosaic();
وکتور تعبیه را از نمونه ها استخراج کنید
ما از موزاییک در مکان های مرجع نمونه برداری می کنیم تا بردار تعبیه مرتبط با این نقاط را بدست آوریم. همچنین باید مقیاسی را که میخواهیم بردار جاسازی را استخراج و مقایسه کنیم، انتخاب کنیم. یکی از ویژگیهای بسیار کاربردی تعبیهها در Satellite Embedding این است که آنها بهگونهای طراحی شدهاند که به صورت خطی ترکیب شوند، به این معنی که میتوان آنها را جمع یا هرم کرد در حالی که روابط فاصله را حفظ کرده و معنی را تفسیر کرد. اگر میانگین فضایی را بیش از 2×2 پیکسل در نظر بگیریم، نتیجه نشاندهنده تعبیه یک پیکسل بزرگتر با وضوح پایینتر است. رزولوشن اصلی برای جاسازی ماهواره 10 متر است و برای شناسایی اجسام کوچک مانند سیلوهای دانه، این مقیاس مناسبی برای استفاده خواهد بود. اما اگر به دنبال یافتن اشیاء یا مکانهایی هستید که بزرگتر هستند، میتوانید از یک مقدار بزرگتر (یعنی 20 متر، 1000 متر) برای مطابقت با اجسام در مقیاسهای درشتتر استفاده کنید.
// 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 بعدی را ضرب کنیم و حاصل جمع آوری کسینوس زاویه بین بردارها (معروف به "محصول نقطه") را بدست آوریم. ما 1 تصویر را برای هر مکان مرجع محاسبه می کنیم و میانگین نتیجه را می گیریم تا تصویری با مقادیر پیکسل حاصلضرب نقطه ای بدست آوریم.
// 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});
});
صادرات موارد منطبق به دارایی (اختیاری)
Vectorization یک عملیات فشرده حافظه و محاسباتی در 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');
شکل: مکان های پیش بینی شده سیلوهای غلات
نتایج را تأیید کنید
برای ارزیابی نتایج، میتوانید روی هر مسابقه پیشبینیشده زوم کنید تا ببینید آیا یک سیلو دانه در آن مکان وجود دارد یا خیر. خواهید دید که کبریت های زیادی وجود دارد که سیلوهای غلات را به درستی شناسایی کرده اند.
شکل: مکان هایی که به درستی با سیلوهای غلات شناسایی شده اند
نتایج همچنین دارای برخی موارد مثبت کاذب است. اگر مشاهده کنید، منطبقها دارای بسیاری از ویژگیهای مشابه با محل مرجع ما هستند و بنابراین دارای بردارهای جاسازی مشابه هستند.
شکل: مطابقت های مثبت کاذب
برای بهبود نتایج، میتوانید مکانهای مرجع و آستانه انتخابشده را تنظیم کنید.
اسکریپت کامل این آموزش را در ویرایشگر کد موتور زمین امتحان کنید .