পূর্ববর্তী টিউটোরিয়ালে (পরিচয়), আমরা দেখেছি কিভাবে স্যাটেলাইট এমবেডিং স্যাটেলাইট পর্যবেক্ষণ এবং জলবায়ু ভেরিয়েবলের বার্ষিক ট্র্যাজেক্টোরি ক্যাপচার করে। এটি ক্রপ ফেনোলজি মডেল করার প্রয়োজন ছাড়াই ফসলের ম্যাপিংয়ের জন্য ডেটাসেটকে সহজেই ব্যবহারযোগ্য করে তোলে। ক্রপ টাইপ ম্যাপিং একটি চ্যালেঞ্জিং কাজ যার জন্য সাধারণত এই অঞ্চলে উৎপাদিত সমস্ত ফসলের জন্য ফসলের ফিনলজি মডেলিং এবং ক্ষেত্র নমুনা সংগ্রহের প্রয়োজন হয়।
এই টিউটোরিয়ালে, আমরা ক্রপ ম্যাপিংয়ের জন্য একটি তত্ত্বাবধানহীন শ্রেণীবিন্যাস পদ্ধতি গ্রহণ করব যা আমাদের ফিল্ড লেবেলের উপর নির্ভর না করে এই জটিল কাজটি সম্পাদন করতে সক্ষম করে। এই পদ্ধতিটি সমষ্টি ফসলের পরিসংখ্যান সহ এই অঞ্চলের স্থানীয় জ্ঞান লাভ করে, যা বিশ্বের অনেক অংশে সহজেই উপলব্ধ।
একটি অঞ্চল নির্বাচন করুন
এই টিউটোরিয়ালের জন্য, আমরা Cerro Gordo County, Iowa-এর জন্য একটি ক্রপ টাইপ ম্যাপ তৈরি করব। এই কাউন্টিটি মার্কিন যুক্তরাষ্ট্রের কর্ন বেল্টে অবস্থিত যেখানে দুটি প্রাথমিক ফসল রয়েছে: ভুট্টা এবং সয়াবিন। এই স্থানীয় জ্ঞান গুরুত্বপূর্ণ এবং আমাদের মডেলের মূল পরামিতিগুলি নির্ধারণ করতে আমাদের সাহায্য করবে৷
আসুন নির্বাচিত কাউন্টির সীমানা পেয়ে শুরু করা যাক।
// Select the region
// Cerro Gordo County, Iowa
var counties = ee.FeatureCollection('TIGER/2018/Counties');
var selected = counties
.filter(ee.Filter.eq('GEOID', '19033'));
var geometry = selected.geometry();
Map.centerObject(geometry, 12);
Map.addLayer(geometry, {color: 'red'}, 'Selected Region', false);
চিত্র: নির্বাচিত অঞ্চল
স্যাটেলাইট এমবেডিং ডেটাসেট প্রস্তুত করুন
এরপরে, আমরা স্যাটেলাইট এমবেডিং ডেটাসেট লোড করি, নির্বাচিত বছরের জন্য ছবি ফিল্টার করি এবং একটি মোজাইক তৈরি করি।
var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');
var year = 2022;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');
var filteredembeddings = embeddings
.filter(ee.Filter.date(startDate, endDate))
.filter(ee.Filter.bounds(geometry));
var embeddingsImage = filteredembeddings.mosaic();
একটি ফসলি জমির মুখোশ তৈরি করুন
আমাদের মডেলিংয়ের জন্য, আমাদের অ-ফসলভূমি এলাকা বাদ দিতে হবে। অনেকগুলি বিশ্বব্যাপী এবং আঞ্চলিক ডেটাসেট রয়েছে যা ক্রপ মাস্ক তৈরি করতে ব্যবহার করা যেতে পারে। ESA WorldCover বা GFSAD গ্লোবাল ক্রপল্যান্ড এক্সটেনশন প্রোডাক্ট হল গ্লোবাল ক্রপল্যান্ড ডেটাসেটের জন্য ভালো পছন্দ। আরও সাম্প্রতিক সংযোজন হল ESA WorldCereal Active Cropland পণ্য যাতে সক্রিয় ফসলের জমির মৌসুমী ম্যাপিং রয়েছে। যেহেতু আমাদের অঞ্চলটি মার্কিন যুক্তরাষ্ট্রে, তাই আমরা একটি ক্রপ মাস্ক পেতে আরও সঠিক আঞ্চলিক ডেটাসেট USDA NASS ক্রপল্যান্ড ডেটা লেয়ার (CDL) ব্যবহার করতে পারি।
// Use Cropland Data Layers (CDL) to obtain cultivated cropland
var cdl = ee.ImageCollection('USDA/NASS/CDL')
.filter(ee.Filter.date(startDate, endDate))
.first();
var cropLandcover = cdl.select('cropland');
var croplandMask = cdl.select('cultivated').eq(2).rename('cropmask');
// Visualize the crop mask
var croplandMaskVis = {min: 0, max: 1, palette: ['white', 'green']};
Map.addLayer(croplandMask.clip(geometry), croplandMaskVis, 'Crop Mask');
চিত্র: ফসলি জমির মুখোশ সহ নির্বাচিত অঞ্চল
প্রশিক্ষণের নমুনা বের করুন
আমরা এম্বেডিং মোজাইক এ ক্রপল্যান্ড মাস্ক প্রয়োগ করি। আমাদের কাছে এখন কাউন্টিতে চাষকৃত ফসলি জমির প্রতিনিধিত্বকারী সমস্ত পিক্সেল বাকি আছে।
// Mask all non-cropland pixels
var clusterImage = embeddingsImage.updateMask(croplandMask);
আমাদের স্যাটেলাইট এমবেডিং ইমেজ নিতে হবে এবং একটি ক্লাস্টারিং মডেল প্রশিক্ষণের জন্য এলোমেলো নমুনা পেতে হবে। যেহেতু আমাদের আগ্রহের অঞ্চলে অনেকগুলি মুখোশযুক্ত পিক্সেল রয়েছে, তাই একটি সাধারণ এলোমেলো নমুনা শূন্য মান সহ নমুনা হতে পারে। আমরা কাঙ্খিত সংখ্যক নন-নাল নমুনা বের করতে পারি তা নিশ্চিত করার জন্য, আমরা মুখোশহীন এলাকায় পছন্দসই নমুনা পেতে স্তরিত নমুনা ব্যবহার করি।
// Stratified random sampling
var training = clusterImage.addBands(croplandMask).stratifiedSample({
numPoints: 1000,
classBand: 'cropmask',
region: geometry,
scale: 10,
tileScale: 16,
seed: 100,
dropNulls: true,
geometries: true
});
একটি সম্পদে নমুনা রপ্তানি করুন (ঐচ্ছিক)
নমুনা নিষ্কাশন একটি গণনাগতভাবে ব্যয়বহুল অপারেশন, এবং উত্তোলিত প্রশিক্ষণের নমুনাগুলি সম্পদ হিসাবে রপ্তানি করা এবং পরবর্তী ধাপে রপ্তানিকৃত সম্পদগুলি ব্যবহার করা একটি ভাল অভ্যাস । এটি বড় অঞ্চলের সাথে কাজ করার সময় গণনার সময় শেষ বা ব্যবহারকারীর মেমরির ত্রুটি অতিক্রম করতে সাহায্য করবে।
রপ্তানি কাজ শুরু করুন এবং আরও এগিয়ে যাওয়ার আগে এটি শেষ হওয়ার জন্য অপেক্ষা করুন।
// Replace this with your asset folder
// The folder must exist before exporting
var exportFolder = 'projects/spatialthoughts/assets/satellite_embedding/';
var samplesExportFc = 'cluster_training_samples';
var samplesExportFcPath = exportFolder + samplesExportFc;
Export.table.toAsset({
collection: training,
description: 'Cluster_Training_Samples',
assetId: samplesExportFcPath
});
একবার রপ্তানির কাজ শেষ হলে, আমরা নিষ্কাশিত নমুনাগুলিকে একটি বৈশিষ্ট্য সংগ্রহ হিসাবে আমাদের কোডে আবার পড়তে পারি।
// Use the exported asset
var training = ee.FeatureCollection(samplesExportFcPath);
নমুনা কল্পনা করুন
আপনি আপনার নমুনা ইন্টারেক্টিভভাবে চালান বা একটি বৈশিষ্ট্য সংগ্রহে রপ্তানি করুন না কেন, এখন আপনার নমুনা পয়েন্ট সহ একটি প্রশিক্ষণ পরিবর্তনশীল থাকবে। আসুন আমাদের প্রশিক্ষণ পয়েন্টগুলি পরিদর্শন করতে এবং Map
যোগ করার জন্য প্রথম নমুনাটি মুদ্রণ করি৷
print('Extracted sample', training.first());
Map.addLayer(training, {color: 'blue'}, 'Extracted Samples', false);
চিত্র: ক্লাস্টারিংয়ের জন্য এলোমেলো নমুনা বের করা হয়েছে
তত্ত্বাবধানহীন ক্লাস্টারিং সম্পাদন করুন
আমরা এখন একটি ক্লাস্টারকে প্রশিক্ষণ দিতে পারি এবং 64D এম্বেডিং ভেক্টরকে একটি নির্বাচিত সংখ্যক স্বতন্ত্র ক্লাস্টারে গোষ্ঠীবদ্ধ করতে পারি। আমাদের স্থানীয় জ্ঞানের উপর ভিত্তি করে, দুটি প্রধান ধরনের ফসল রয়েছে যা বেশিরভাগ এলাকার প্রতিনিধিত্ব করে এবং অবশিষ্ট ভগ্নাংশকে কভার করে অন্যান্য কয়েকটি ফসল। আমরা স্যাটেলাইট এমবেডিং-এ তত্ত্বাবধানহীন ক্লাস্টারিং সঞ্চালন করতে পারি পিক্সেলের ক্লাস্টার পেতে যা একই রকম টেম্পোরাল ট্র্যাজেক্টোরি এবং প্যাটার্ন রয়েছে। অনুরূপ বর্ণালী এবং স্থানিক বৈশিষ্ট্য সহ অনুরূপ ফেনলজি সহ পিক্সেলগুলিকে একই ক্লাস্টারে গোষ্ঠীভুক্ত করা হবে।
ee.Clusterer.wekaCascadeKMeans()
আমাদের সর্বনিম্ন এবং সর্বাধিক সংখ্যক ক্লাস্টার নির্দিষ্ট করতে এবং প্রশিক্ষণের ডেটার উপর ভিত্তি করে সর্বোত্তম সংখ্যক ক্লাস্টার খুঁজে বের করতে দেয়। এখানে সর্বনিম্ন এবং সর্বোচ্চ সংখ্যক ক্লাস্টার নির্ধারণ করতে আমাদের স্থানীয় জ্ঞান কাজে আসে। যেহেতু আমরা কয়েকটি স্বতন্ত্র ধরণের ক্লাস্টার আশা করি - ভুট্টা, সয়াবিন এবং অন্যান্য অনেক ফসল - আমরা 4 কে সর্বনিম্ন সংখ্যক ক্লাস্টার হিসাবে এবং 5 কে সর্বাধিক সংখ্যক ক্লাস্টার হিসাবে ব্যবহার করতে পারি। আপনার অঞ্চলের জন্য কোনটি সর্বোত্তম কাজ করে তা খুঁজে বের করতে আপনাকে এই সংখ্যাগুলির সাথে পরীক্ষা করতে হতে পারে৷
// Cluster the Satellite Embedding Image
var minClusters = 4;
var maxClusters = 5;
var clusterer = ee.Clusterer.wekaCascadeKMeans({
minClusters: minClusters, maxClusters: maxClusters}).train({
features: training,
inputProperties: clusterImage.bandNames()
});
var clustered = clusterImage.cluster(clusterer);
Map.addLayer(clustered.randomVisualizer().clip(geometry), {}, 'Clusters');
চিত্র: তত্ত্বাবধানহীন শ্রেণীবিভাগ থেকে প্রাপ্ত ক্লাস্টার
ক্লাস্টারে লেবেল বরাদ্দ করুন
ভিজ্যুয়াল পরিদর্শনের পরে, পূর্ববর্তী ধাপে প্রাপ্ত ক্লাস্টারগুলি উচ্চ-রেজোলিউশন ছবিতে দেখা খামারের সীমানার সাথে ঘনিষ্ঠভাবে মেলে। আমরা স্থানীয় জ্ঞান থেকে জানি যে দুটি বৃহত্তম ক্লাস্টার হবে ভুট্টা এবং সয়াবিন। আসুন আমাদের ছবিতে প্রতিটি ক্লাস্টারের ক্ষেত্রগুলি গণনা করি।
// Calculate Cluster Areas
// 1 Acre = 4046.86 Sq. Meters
var areaImage = ee.Image.pixelArea().divide(4046.86).addBands(clustered);
var areas = areaImage.reduceRegion({
reducer: ee.Reducer.sum().group({
groupField: 1,
groupName: 'cluster',
}),
geometry: geometry,
scale: 10,
maxPixels: 1e10
});
var clusterAreas = ee.List(areas.get('groups'));
// Process results to extract the areas and create a FeatureCollection
var clusterAreas = clusterAreas.map(function(item) {
var areaDict = ee.Dictionary(item);
var clusterNumber = areaDict.getNumber('cluster').format();
var area = areaDict.getNumber('sum');
return ee.Feature(null, {cluster: clusterNumber, area: area});
});
var clusterAreaFc = ee.FeatureCollection(clusterAreas);
print('Cluster Areas', clusterAreaFc);
আমরা সর্বোচ্চ এলাকা সহ 2 টি ক্লাস্টার বাছাই করি।
var selectedFc = clusterAreaFc.sort('area', false).limit(2);
print('Top 2 Clusters by Area', selectedFc);
কিন্তু আমরা এখনও জানি না কোন ক্লাস্টার কোন ফসল। যদি আপনার কাছে ভুট্টা বা সয়াবিনের কয়েকটি ক্ষেত্রের নমুনা থাকে, তাহলে আপনি তাদের নিজ নিজ লেবেলগুলি বের করতে ক্লাস্টারগুলিতে ওভারলে করতে পারেন। ক্ষেত্রের নমুনার অনুপস্থিতিতে, আমরা ফসলের সামগ্রিক পরিসংখ্যানের সুবিধা নিতে পারি। বিশ্বের অনেক জায়গায়, সামগ্রিক ফসলের পরিসংখ্যান সংগ্রহ করা হয় এবং নিয়মিত প্রকাশ করা হয়। মার্কিন যুক্তরাষ্ট্রের জন্য, ন্যাশনাল এগ্রিকালচারাল স্ট্যাটিস্টিকস সার্ভিস (NASS) প্রতিটি কাউন্টি এবং প্রতিটি প্রধান ফসলের বিস্তারিত ফসলের পরিসংখ্যান রয়েছে। 2022 সালের জন্য, সেরো গোর্ডো কাউন্টি, আইওয়াতে 161,500 একর ভুট্টা লাগানো এলাকা এবং 110,500 একর সয়াবিন রোপিত এলাকা ছিল।
এই তথ্য ব্যবহার করে, আমরা এখন জানি যে শীর্ষ 2টি ক্লাস্টারের মধ্যে, একটিতে সবচেয়ে বেশি এলাকা হবে ভুট্টা এবং অন্যটি সয়াবিন। আসুন এই লেবেলগুলি বরাদ্দ করি এবং প্রকাশিত পরিসংখ্যানগুলির সাথে গণনা করা অঞ্চলগুলির তুলনা করি৷
var cornFeature = selectedFc.sort('area', false).first();
var soybeanFeature = selectedFc.sort('area').first();
var cornCluster = cornFeature.get('cluster');
var soybeanCluster = soybeanFeature.get('cluster');
print('Corn Area (Detected)', cornFeature.getNumber('area').round());
print('Corn Area (From Crop Statistics)', 163500);
print('Soybean Area (Detected)', soybeanFeature.getNumber('area').round());
print('Soybean Area (From Crop Statistics)', 110500);
একটি ফসল মানচিত্র তৈরি করুন
আমরা এখন প্রতিটি ক্লাস্টারের জন্য লেবেলগুলি জানি এবং প্রতিটি ফসলের প্রকারের জন্য পিক্সেলগুলি বের করতে পারি এবং চূড়ান্ত ক্রপ মানচিত্র তৈরি করতে তাদের একত্রিত করতে পারি।
// Select the clusters to create the crop map
var corn = clustered.eq(ee.Number.parse(cornCluster));
var soybean = clustered.eq(ee.Number.parse(soybeanCluster));
var merged = corn.add(soybean.multiply(2));
var cropVis = {min: 0, max: 2, palette: ['#bdbdbd', '#ffd400', '#267300']};
Map.addLayer(merged.clip(geometry), cropVis, 'Crop Map (Detected)');
ফলাফলগুলি ব্যাখ্যা করতে সাহায্য করার জন্য, আমরা UI উপাদানগুলি তৈরি করতে এবং মানচিত্রে একটি কিংবদন্তি যুক্ত করতেও ব্যবহার করতে পারি।
// Add a Legend
var legend = ui.Panel({
layout: ui.Panel.Layout.Flow('horizontal'),
style: {position: 'bottom-center', padding: '8px 15px'}});
var addItem = function(color, name) {
var colorBox = ui.Label({
style: {color: '#ffffff',
backgroundColor: color,
padding: '10px',
margin: '0 4px 4px 0',
}
});
var description = ui.Label({
value: name,
style: {
margin: '0px 10px 0px 2px',
}
});
return ui.Panel({
widgets: [colorBox, description],
layout: ui.Panel.Layout.Flow('horizontal')
});
};
var title = ui.Label({
value: 'Legend',
style: {
fontWeight: 'bold',
fontSize: '16px',
margin: '0px 10px 0px 4px'
}
});
legend.add(title);
legend.add(addItem('#ffd400', 'Corn'));
legend.add(addItem('#267300', 'Soybean'));
legend.add(addItem('#bdbdbd', 'Other Crops'));
চিত্র: ভুট্টা এবং সয়াবিন ফসলের সাথে শনাক্ত করা ফসলের মানচিত্র
ফলাফল যাচাই
আমরা কেবলমাত্র এই অঞ্চলের সামগ্রিক পরিসংখ্যান এবং স্থানীয় জ্ঞান ব্যবহার করে কোনো ফিল্ড লেবেল ছাড়াই স্যাটেলাইট এমবেডিং ডেটাসেটের সাথে একটি ক্রপ টাইপ মানচিত্র পেতে সক্ষম হয়েছি। ইউএসডিএ NASS ক্রপল্যান্ড ডেটা লেয়ারস (CDL) এর অফিসিয়াল ক্রপ টাইপ ম্যাপের সাথে আমাদের ফলাফলের তুলনা করা যাক।
var cdl = ee.ImageCollection('USDA/NASS/CDL')
.filter(ee.Filter.date(startDate, endDate))
.first();
var cropLandcover = cdl.select('cropland');
var cropMap = cropLandcover.updateMask(croplandMask).rename('crops');
// Original data has unique values for each crop ranging from 0 to 254
var cropClasses = ee.List.sequence(0, 254);
// We remap all values as following
// Crop | Source Value | Target Value
// Corn | 1 | 1
// Soybean | 5 | 2
// All other| 0-255 | 0
var targetClasses = ee.List.repeat(0, 255).set(1, 1).set(5, 2);
var cropMapReclass = cropMap.remap(cropClasses, targetClasses).rename('crops');
var cropVis = {min: 0, max: 2, palette: ['#bdbdbd', '#ffd400', '#267300']};
Map.addLayer(cropMapReclass.clip(geometry), cropVis, 'Crop Landcover (CDL)');
চিত্র: (বাম) স্যাটেলাইট এম্বেডিং থেকে ক্রপ ম্যাপ (ডান) CDL থেকে ক্রপ ম্যাপ
যদিও আমাদের ফলাফল এবং অফিসিয়াল মানচিত্রের মধ্যে অমিল রয়েছে, আপনি লক্ষ্য করবেন যে আমরা ন্যূনতম প্রচেষ্টায় বেশ ভাল ফলাফল পেতে সক্ষম হয়েছি। ফলাফলগুলিতে পোস্ট-প্রসেসিং পদক্ষেপগুলি প্রয়োগ করে, আমরা কিছু গোলমাল অপসারণ করতে পারি এবং আউটপুটে শূন্যস্থান পূরণ করতে পারি।
আর্থ ইঞ্জিন কোড এডিটরে এই টিউটোরিয়ালটির জন্য সম্পূর্ণ স্ক্রিপ্টটি চেষ্টা করুন ।