सैटलाइट इमेज के एम्बेडिंग डेटासेट की मदद से मिलती-जुलती इमेज ढूंढना

GitHub पर बदलाव करें
समस्या की शिकायत करें
पेज का इतिहास
लेखक: spatialthoughts
यह ट्यूटोरियल, सैटेलाइट एम्बेडिंग डेटासेट पर आधारित ट्यूटोरियल की सीरीज़ का हिस्सा है. इसके अलावा, इन्हें भी देखें: परिचय, बिना लेबल वाले डेटा के आधार पर क्लासिफ़िकेशन, लेबल वाले डेटा के आधार पर क्लासिफ़िकेशन, और रिग्रेशन.

अर्थ ऑब्ज़र्वेशन डेटा का इस्तेमाल करके, मिलती-जुलती जगहों और सुविधाओं का पता लगाने के लिए, एम्बेडिंग एक खास अवसर देती हैं. किसी रेफ़रंस लोकेशन के एंबेडिंग वेक्टर की तुलना, एंबेड की गई इमेज के सभी अन्य पिक्सल के एंबेडिंग वेक्टर से करके, हम ऐसी लोकेशन ढूंढ सकते हैं जिनमें रेफ़रंस लोकेशन जैसी प्रॉपर्टी मौजूद हों. इससे हमें अपनी दिलचस्पी के क्षेत्र में मौजूद ऑब्जेक्ट या खास तरह की साइटों को आसानी से ढूंढने में मदद मिलती है.

इस ट्यूटोरियल में, हम किसी इलाके में मौजूद सभी अनाज के साइलो का पता लगाने की कोशिश करेंगे. अनाज के साइलो या अनाज के डिब्बे, लंबी संरचनाएं होती हैं. इनका इस्तेमाल आम तौर पर अनाज को ज़्यादा मात्रा में स्टोर करने के लिए किया जाता है. ये फ़ार्म या प्रोसेसिंग फ़ैसिलिटी में पाए जाते हैं. रिमोट सेंसिंग के पारंपरिक तरीकों से इन स्ट्रक्चर को मैप करना मुश्किल होगा. इसके लिए, ऑब्जेक्ट का पता लगाने वाले कस्टम मॉडल को ट्रेन करना होगा. साइलो का आकार और बनावट अलग-अलग होती है. साथ ही, ये आम तौर पर एक जैसे मटीरियल से बने होते हैं. इसलिए, इन्हें सैटलाइट से ली गई इमेज में यूनीक एम्बेडिंग वेक्टर के साथ दिखाया जाएगा. इससे हमें मिलते-जुलते साइलो को आसानी से ढूंढने में मदद मिलेगी.


अनाज के साइलो (इमेज: Wikipedia)

खोज के लिए इलाका चुनना

इस ट्यूटोरियल में, हम कान्सास के फ़्रैंकलिन काउंटी में मौजूद अनाज के साइलो को मैप करेंगे. हम फ़िल्टर लागू करते हैं और इस काउंटी के लिए पॉलीगॉन चुनते हैं.

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 के तौर पर सेट करें. ठीक पर क्लिक करें.


आंकड़ा: सैंपल लेयर को कॉन्फ़िगर करना

मुख्य कोड एडिटर विंडो में वापस जाकर, कुछ और जगहों पर पॉइंट जोड़ें.


आंकड़ा: ज़्यादा रेफ़रंस लोकेशन जोड़ना

इस ट्यूटोरियल के लिए, हमने तीन रेफ़रंस लोकेशन चुनी हैं. इनका इस्तेमाल, सैटलाइट इमेज से एम्बेड किए गए वेक्टर निकालने के लिए किया जाएगा.

कोई समयावधि चुनें

वह साल चुनें जिसके लिए हमें खोज करनी है.

var year = 2024;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');

सैटलाइट एम्बेडिंग डेटासेट को फ़िल्टर करना और मोज़ेक करना

हम सैटलाइट एम्बेडिंग डेटासेट लोड करते हैं. इसके बाद, चुने गए साल की इमेज को फ़िल्टर करते हैं और एक मोज़ेक बनाते हैं.

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 में, वेक्टर बनाने की प्रोसेस में मेमोरी और कंप्यूटिंग पावर का इस्तेमाल ज़्यादा होता है. नतीजों को विज़ुअलाइज़ करते समय, कैलकुलेशन में ज़्यादा समय लगा या टाइल में गड़बड़ी हुई से बचने के लिए, नतीजों को ऐसेट के तौर पर एक्सपोर्ट करना एक अच्छा तरीका है. ऐसेट एक्सपोर्ट हो जाने के बाद, उसे स्क्रिप्ट में इंपोर्ट किया जा सकता है और विज़ुअलाइज़ किया जा सकता है. इस तरीके से, यह भी पक्का किया जाता है कि आपको बड़े इलाकों में खोज करने में कोई समस्या न हो.

// 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 Code Editor में, इस ट्यूटोरियल के लिए पूरी स्क्रिप्ट आज़माएं.