सैटलाइट एम्बेडिंग का इस्तेमाल, रिमोट सेंसिंग के स्टैंडर्ड क्लासिफ़िकेशन वर्कफ़्लो के लिए किया जा सकता है. इन एम्बेडिंग को खास तौर पर, कम डेटा के साथ सीखने की क्षमता को बेहतर बनाने के लिए डिज़ाइन किया गया है. इसका मतलब है कि अच्छी क्वालिटी वाले क्लासिफ़िकेशन के नतीजे पाने के लिए, लेबल किए गए डेटा की तुलनात्मक रूप से कम संख्या (10 से 100 सैंपल) की ज़रूरत होती है. एम्बेडिंग में स्पेक्ट्रल, स्पेशल, और टेंपोरल कॉन्टेक्स्ट शामिल होता है. इसलिए, k-Nearest Neighbors (kNN) या Random Forest जैसे सामान्य क्लासिफ़ायर, एम्बेडिंग वेक्टर का इस्तेमाल करके जटिल लैंडस्केप को टारगेट क्लास में क्लासिफ़ाई कर सकते हैं.
इस ट्यूटोरियल में, हम सैटेलाइट एम्बेडिंग का इस्तेमाल करके, मैंग्रोव को क्लासिफ़ाई करने के लिए, kNN क्लासिफ़ायर का इस्तेमाल करके, सुपरवाइज़्ड लर्निंग अप्रोच का इस्तेमाल करने का तरीका जानेंगे.
देश या इलाका चुनें
आइए, सबसे पहले दिलचस्पी वाला कोई इलाका तय करते हैं. इस ट्यूटोरियल के लिए, हम केन्या के समुद्री तट के पास का कोई इलाका चुनेंगे. साथ ही, पॉलीगॉन को ज्यामिति वैरिएबल के तौर पर तय करेंगे. इसके अलावा, कोड एडिटर में मौजूद ड्राइंग टूल का इस्तेमाल करके, दिलचस्पी वाले क्षेत्र के चारों ओर एक पॉलीगॉन बनाया जा सकता है. यह पॉलीगॉन, इंपोर्ट में ज्यामिति वैरिएबल के तौर पर सेव हो जाएगा.
var geometry = ee.Geometry.Polygon([[
[39.4926, -4.39833],
[39.4926, -4.47394],
[39.5491, -4.47394],
[39.5491, -4.39833]
]])
आंकड़ा: मैंग्रोव के वर्गीकरण के लिए, दिलचस्पी की जगह चुनना
ट्रेनिंग के सैंपल इकट्ठा करना
सैटलाइट एम्बेडिंग के साथ क्लासिफ़िकेशन वर्कफ़्लो में, अपेक्षाकृत सटीक नतीजे पाने के लिए सिर्फ़ कुछ लेबल किए गए सैंपल की ज़रूरत होती है. ज़मीन की बनावट के हिसाब से क्लासिफ़िकेशन करने के लिए, Earth Engine में पॉइंट जोड़ना और उन्हें लेबल करना सबसे आसान तरीका है. इससे ट्रेनिंग के सैंपल बनाए जा सकते हैं. हम तीन क्लास वाला क्लासिफ़िकेशन बनाएंगे. इससे सैटेलाइट एम्बेडिंग के हर पिक्सल को इन तीन क्लास में से किसी एक में बांटा जाएगा:
लैंडकवर क्लास | ब्यौरा | क्लास वैल्यू |
---|---|---|
मैंग्रोव | नमक को सहने वाले समुद्र किनारे के सभी तरह के पेड़-पौधे | 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
में बदलें. + प्रॉपर्टी पर क्लिक करें और 1
वैल्यू वाली नई प्रॉपर्टी landcover
जोड़ें. रंग को हरे रंग के शेड में बदलें और ठीक है पर क्लिक करें.
आंकड़ा: मैंग्रोव लेयर के लिए लेयर प्रॉपर्टी कॉन्फ़िगर करना
इसी तरह, अन्य क्लास के लिए दो नई लेयर जोड़ें. पानी के लिए landcover
वैल्यू 2
और अन्य के लिए 3
का इस्तेमाल करें.
आंकड़ा: (बाईं ओर) पानी और (दाईं ओर) अन्य लेयर के लिए लेयर प्रॉपर्टी कॉन्फ़िगर करना
लेयर कॉन्फ़िगर होने के बाद, हम सैंपल इकट्ठा करना शुरू कर सकते हैं. किसी इलाके को ज़ूम इन करें और अलग-अलग क्लास के पिक्सल की पहचान करें. mangroves
लेयर चुनें. इसके बाद, मार्कर जोड़ें टूल का इस्तेमाल करके, मैंग्रोव के जंगलों वाले पिक्सल पर पॉइंट डालें. ये जंगल, फ़ॉल्स-कलर वाले Sentinel-2 कंपोज़िट में हल्के हरे रंग के दिखते हैं. रेफ़रंस के लिए, सैटेलाइट बेसमैप व्यू भी देखा जा सकता है. सैटलाइट एम्बेडिंग डेटासेट का इस्तेमाल करके क्लासिफ़ाई करने के लिए, आपको ज़्यादा पॉइंट की ज़रूरत नहीं होती. इसके बजाय, ऐसे बेहतर क्वालिटी वाले उदाहरण चुनना ज़्यादा ज़रूरी होता है जो आपकी दिलचस्पी वाले इलाके में अलग-अलग तरह की जानकारी देते हों. इस ट्यूटोरियल के लिए, 10 सैंपल का सेट काफ़ी होगा.
आंकड़ा: मैंग्रोव क्लास के लिए सैंपल इकट्ठा करना
इसके बाद, water
लेयर पर स्विच करें और सतह के पानी के पिक्सल के लिए सैंपल इकट्ठा करें. ये पिक्सल, हमारे Sentinel-2 कंपोज़िट में लगभग काले रंग के दिखते हैं. ऐसा इसलिए होता है, क्योंकि खुले पानी के लिए SWIR बैंड का ज़्यादातर हिस्सा सोख लिया जाता है. other
लेयर के लिए भी यही प्रोसेस दोहराएं. ऐसे उदाहरण चुनें जो न तो mangrove
हों और न ही water
.
आंकड़ा: पानी और अन्य क्लास के लिए सैंपल इकट्ठा करना
ट्रेनिंग के लिए सैंपल इकट्ठा करने की प्रोसेस पूरी हो गई है. हम तीनों FeatureCollection को एक ही ग्राउंड कंट्रोल पॉइंट (जीसीपी) के कलेक्शन में मर्ज कर सकते हैं.
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()
});
सैटलाइट एम्बेडिंग मोज़ेक को क्लासिफ़ाई करना
अब हम ट्रेन किए गए क्लासिफ़ायर का इस्तेमाल करके, सैटेलाइट एम्बेडिंग मोज़ेक के सभी पिक्सल पर क्लास का अनुमान लगा सकते हैं.
var classified = embeddingsImage.classify(classifier);
क्लासिफ़ाइड इमेज को किसी ऐसेट में एक्सपोर्ट करना (ज़रूरी नहीं)
अगर आपको किसी बड़े इलाके को क्लासिफ़ाई करना है, तो Earth Engine को इंटरैक्टिव कंप्यूटिंग एनवायरमेंट में तय किए गए समय से ज़्यादा समय चाहिए. बीच के नतीजों को ऐसेट के तौर पर एक्सपोर्ट करना एक अच्छा तरीका है. इससे बैच कंप्यूटिंग एनवायरमेंट का फ़ायदा मिलता है. इसमें टास्क पूरा करने के लिए ज़्यादा समय मिलता है और ज़्यादा संसाधन होते हैं. इससे बड़े क्षेत्रों के साथ काम करते समय, कंप्यूटेशन टाइम आउट हो गया या उपयोगकर्ता की मेमोरी खत्म हो गई जैसी गड़बड़ियों को ठीक करने में भी मदद मिलती है. आइए, क्लासिफ़ाइड इमेज को एक्सपोर्ट करते हैं.
// 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');
आंकड़ा: क्लासिफ़ाइड सैटलाइट एम्बेडिंग इमेज
मैंग्रोव का मैप बनाना
हमने तीन क्लास वाली एक क्लासिफ़ाइड इमेज बनाई है. हम मैंग्रोव का मैप बनाने के लिए, मैंग्रोव (क्लास 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)');
आंकड़ा: मैंग्रोव का मैप
नतीजों की पुष्टि करना
अपने नतीजों का आकलन करने के लिए, हम उनकी तुलना पीयर-रीव्यू किए गए अच्छी क्वालिटी वाले डेटासेट से कर सकते हैं: ग्लोबल मैंग्रोव वॉच. यह डेटासेट, 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)');
ध्यान दें कि ग्लोबल मैंग्रोव वॉच के नतीजों और सैटेलाइट एम्बेडिंग डेटासेट के लो-शॉट क्लासिफ़िकेशन के आउटपुट में काफ़ी समानता है. बेसमैप को सैटलाइट पर स्विच करने पर, आपको दिखेगा कि सैटलाइट एम्बेडिंग क्लासिफ़िकेशन ने लैंडस्केप की उन बारीकियों को भी कैप्चर किया है जो ग्लोबल मैंग्रोव वॉच क्लासिफ़िकेशन में मौजूद नहीं हैं.
Earth Engine Code Editor में, इस ट्यूटोरियल के लिए पूरी स्क्रिप्ट आज़माएं.