Google Earth Engine Script
var dist = table
var sentinel1 = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterDate('2021-06-01', '2021-06-15')
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filter(ee.Filter.or((ee.Filter.eq('orbitProperties_pass', 'ASCENDING'), ee.Filter.eq('orbitProperties_pass', 'DESCENDING'))))
.filterBounds(dist);
var sentinel2 = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterDate('2021-06-16', '2021-06-30')
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filter(ee.Filter.or((ee.Filter.eq('orbitProperties_pass', 'ASCENDING'), ee.Filter.eq('orbitProperties_pass', 'DESCENDING'))))
.filterBounds(dist);
var sentinel3 = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterDate('2021-07-01', '2021-07-15')
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filter(ee.Filter.or((ee.Filter.eq('orbitProperties_pass', 'ASCENDING'), ee.Filter.eq('orbitProperties_pass', 'DESCENDING'))))
.filterBounds(dist);
var sentinel4 = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterDate('2021-07-16', '2021-07-31')
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filter(ee.Filter.or((ee.Filter.eq('orbitProperties_pass', 'ASCENDING'), ee.Filter.eq('orbitProperties_pass', 'DESCENDING'))))
.filterBounds(dist);
var sentinel5 = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterDate('2021-08-01', '2021-08-15')
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filter(ee.Filter.or((ee.Filter.eq('orbitProperties_pass', 'ASCENDING'), ee.Filter.eq('orbitProperties_pass', 'DESCENDING'))))
.filterBounds(dist);
var sentinel6 = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterDate('2021-08-16', '2021-08-31')
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filter(ee.Filter.or((ee.Filter.eq('orbitProperties_pass', 'ASCENDING'), ee.Filter.eq('orbitProperties_pass', 'DESCENDING'))))
.filterBounds(dist);
var sentinel7 = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterDate('2021-09-01', '2021-09-15')
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filter(ee.Filter.or((ee.Filter.eq('orbitProperties_pass', 'ASCENDING'), ee.Filter.eq('orbitProperties_pass', 'DESCENDING'))))
.filterBounds(dist);
var sentinel8 = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterDate('2021-09-16', '2021-09-30')
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filter(ee.Filter.or((ee.Filter.eq('orbitProperties_pass', 'ASCENDING'), ee.Filter.eq('orbitProperties_pass', 'DESCENDING'))))
.filterBounds(dist);
var sentinel9 = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterDate('2021-10-01', '2021-10-15')
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filter(ee.Filter.or((ee.Filter.eq('orbitProperties_pass', 'ASCENDING'), ee.Filter.eq('orbitProperties_pass', 'DESCENDING'))))
.filterBounds(dist);
var sentinel10 = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterDate('2021-10-16', '2021-10-31')
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filter(ee.Filter.or((ee.Filter.eq('orbitProperties_pass', 'ASCENDING'), ee.Filter.eq('orbitProperties_pass', 'DESCENDING'))))
.filterBounds(dist);
var image1 = sentinel1.select('VH').mean().rename('VH1');
var image2 = sentinel2.select('VH').mean().rename('VH2');
var image3 = sentinel3.select('VH').mean().rename('VH3');
var image4 = sentinel4.select('VH').mean().rename('VH4');
var image5 = sentinel5.select('VH').mean().rename('VH5');
var image6 = sentinel6.select('VH').mean().rename('VH6');
var image7 = sentinel7.select('VH').mean().rename('VH7');
var image8 = sentinel8.select('VH').mean().rename('VH8');
var image9 = sentinel9.select('VH').mean().rename('VH9');
var image10 = sentinel10.select('VH').mean().rename('VH10');
var stacked = image1.addBands([image2,image3,image4,image5,image6,image7,image8,image9,image10]).clip(dist);
print(stacked);
var stacked_scaled = stacked.multiply(10).add(350).uint8();
var bands = ['VH2', 'VH5', 'VH9'];
var display = {bands: bands, min: 0, max: 220};
Map.addLayer(stacked_scaled, display, 'stacked');
// Map.setCenter(77.00,29.68,8);
var collection = ee.ImageCollection('COPERNICUS/S2_SR')
.filterDate('2021-06-5', '2021-08-30')
.filterBounds(dist);
var im = collection.median().clip(dist);
var S2_bands = ['B8', 'B4', 'B3'];
var S2_display = {bands: S2_bands, min: 100, max: 4000};
Map.addLayer(im, S2_display, 'im');
var gt1 = rice1.merge(rice2).merge(rice3).merge(urban).merge(water).merge(other);
var training = stacked_scaled.sampleRegions({
collection: gt1,
properties: ['class'],
scale: 10
});
// Make a Random Forest classifier and train it.
var classifier = ee.Classifier.smileRandomForest(10)
.train({
features: training,
classProperty: 'class',
});
var classified = stacked_scaled.classify(classifier);
var masked = classified.updateMask(classified.gt(0).and(classified.lt(6)));
Map.addLayer(masked,
{min: 1, max:3 , palette: ['orange','magenta','yellow']},
'classification - Kharif');
var areaImage = ee.Image.pixelArea().addBands(masked);
var areas = areaImage.reduceRegion({
reducer: ee.Reducer.sum().group({
groupField: 1,
groupName: 'class',
}),
geometry: dist,
scale: 100,
maxPixels: 1e10,
bestEffort: true,
//tileScale: 8
});
// Print the area calculations.
print('##### AREA SQ. METERS #####');
print(areas);
// Get a confusion matrix representing resubstitution accuracy.
var trainAccuracy = classifier.confusionMatrix();
print('Resubstitution error matrix: ', trainAccuracy);
print('Training overall accuracy: ', trainAccuracy.accuracy());
// Sample the input with a different random seed to get validation data.
var validation = stacked_scaled.sampleRegions({
collection: gt1,
properties: ['class'],
scale: 10
});
// Classify the validation data.
var validated = validation.classify(classifier);
// Get a confusion matrix representing expected accuracy.
var testAccuracy = validated.errorMatrix('class', 'classification');
print('Validation error matrix: ', testAccuracy);
print('Validation overall accuracy: ', testAccuracy.accuracy());
var bandInfo = {
'VH1': {v: 1, f: 'June_1FN'},
'VH2': {v: 2, f: 'June_2FN'},
'VH3': {v: 3, f: 'July_1FN'},
'VH4': {v: 4, f: 'July_2FN'},
'VH5': {v: 5, f: 'Aug_1FN'},
'VH6': {v: 6, f: 'Aug_2FN'},
'VH7': {v: 7, f: 'Sep_1FN'},
'VH8': {v: 8, f: 'Sep_2FN'},
'VH9': {v: 9, f: 'Oct_1FN'},
'VH10': {v: 10, f: 'Oct_2FN'}
};
var xPropVals = []; // List to codify x-axis band names as values.
var xPropLabels = []; // Holds dictionaries that label codified x-axis values.
for (var key in bandInfo) {
xPropVals.push(bandInfo[key].v);
xPropLabels.push(bandInfo[key]);
}
var regionsBand =
gt1
.reduceToImage({properties: ['class'], reducer: ee.Reducer.first()})
.rename('class');
var sentinelSrClass = stacked_scaled.addBands(regionsBand);
// print(sentinelSrClass);
var chart = ui.Chart.image
.byClass({
image: sentinelSrClass,
classBand: 'class',
region: gt1,
reducer: ee.Reducer.mean(),
scale: 10,
// classLabels: ['Mustard', 'Wheat'],
xLabels: xPropVals
})
.setChartType('ScatterChart')
.setOptions({
title: 'Temporal Signatures - Backscatter',
hAxis: {
title: 'Dates',
titleTextStyle: {italic: false, bold: true},
viewWindow: {min: bands[0], max: bands[9]},
ticks: xPropLabels
},
vAxis: {
title: 'Backscatter(Scaled)',
titleTextStyle: {italic: false, bold: true},
viewWindow: {min: 0, max: 250},
},
colors: ['red', 'blue', 'grey', 'green', 'yellow', 'magenta', 'cyan', 'green'],
pointSize: 0,
lineSize: 2,
curveType: 'function'
});
print(chart);
// Export.image.toDrive({
// image: masked, // <--
// description: 'image',
// scale: 1000,
// region: dist
// });
// NDVI
// Define ROI
var roi= table; //geometry_roi;
Map.centerObject(roi,10);
//Date
var startDate = ee.Date('2019-01-01');
var endDate = ee.Date('2020-12-31');
// Create image collection of S-2 imagery for the perdiod 2019-2020
var S2 = ee.ImageCollection('COPERNICUS/S2')
//filter start and end date
.filter(ee.Filter.date(startDate, endDate))
.filterMetadata('CLOUDY_PIXEL_PERCENTAGE', 'less_than',100)
//filter according to drawn boundary
.filterBounds(roi)
print(S2.limit(10))
print(S2.aggregate_array('SPACECRAFT_NAME'))
// Function to calculate and add an NDVI band
var addNDVI = function(image) {
return image.addBands(image.normalizedDifference(['B8', 'B4'] )); //'B8', 'B4'
};
// Add NDVI band to image collection
var S2 = S2.map(addNDVI).select(['nd']);
print('S2',S2.limit(10)) ;
var NDVI=S2.select('nd');
// For month
var month = 1;
// Calculating number of intervals
var months = endDate.difference(startDate,'month').divide(month).toInt();
// Generating a sequence
var sequence = ee.List.sequence(0, months);
// print(sequence)
var sequence_s1 = sequence.map(function(num){
num = ee.Number(num);
var Start_interval = startDate.advance(num.multiply(month), 'month');
var End_interval = startDate.advance(num.add(1).multiply(month), 'month');
var subset = NDVI.filterDate(Start_interval,End_interval);
return subset.max().set('system:time_start',Start_interval);
});
// print('sequence_s1',sequence_s1)
var byMonthYear = ee.ImageCollection.fromImages(sequence_s1);
// print('byMonthYear',byMonthYear)
var multibandNDVI = byMonthYear.toBands().clip(roi);
// print('multiband', multibandNDVI);
var bandsName=['2019-01','2019-02','2019-03','2019-04','2019-05','2019-06',
'2019-07','2019-08','2019-09','2019-10','2019-11','2019-12',
'2020-01','2020-02','2020-03','2020-04','2020-05','2020-06',
'2020-07','2020-08','2020-09','2020-10','2020-11','2020-12']
var multiband1_ndvi = multibandNDVI.rename(bandsName).clip(roi);//(monList)//
//
//s1
var sentinel1_vh = ee.ImageCollection('COPERNICUS/S1_GRD')
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
.select('VH')
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filter(ee.Filter.eq('resolution_meters', 10))
.filter(ee.Filter.date(startDate, endDate))
.filter(ee.Filter.bounds(roi))
// print('s1',sentinel1_vh);
// For month
var month = 1;
// Calculating number of intervals
var months = endDate.difference(startDate,'month').divide(month).toInt();
// Generating a sequence
var sequence = ee.List.sequence(0, months);
// print(sequence)
var sequence_s1 = sequence.map(function(num){
num = ee.Number(num);
var Start_interval = startDate.advance(num.multiply(month), 'month');
var End_interval = startDate.advance(num.add(1).multiply(month), 'month');
var subset = sentinel1_vh.filterDate(Start_interval,End_interval);
return subset.median().set('system:time_start',Start_interval);
});
// print('sequence_s1',sequence_s1)
var byMonthYearS1 = ee.ImageCollection.fromImages(sequence_s1);
var multibands1 = byMonthYearS1.toBands().clip(roi);
var multibands1 = multibands1.rename(bandsName).clip(roi);//.rename(monLists1).clip(roi);//
var isNDVIValid = multiband1_ndvi.gte(0).and(multiband1_ndvi.lte(1));
print("isNDVIValid", isNDVIValid)
// Map.addLayer(multiband1_ndvi , {min: 0.2, max: 0.8}, 'NDVI', 0);
// Set specific NDVI thresholds for different paddy growth stages
var plantingThreshold = 0.2;
var growthThreshold = 0.5;
var harvestThreshold = 0.2;
// Classify NDVI into different growth stages
var plantingStage = multiband1_ndvi.gt(plantingThreshold);
var growthStage = multiband1_ndvi.gt(growthThreshold).and(multiband1_ndvi.lte(harvestThreshold).not());
var harvestStage = multiband1_ndvi.lte(harvestThreshold);
Map.addLayer(plantingStage , {min: 0, max: 1}, 'planting', 0);
Map.addLayer(growthStage , {min: 0, max: 1}, 'growth', 0);
Map.addLayer(harvestStage , {min: 0, max: 1}, 'harvest', 0);
Google Earth Engine Script
// var tel =table.filter(ee.Filter.or(ee.Filter.eq('DISTRICT_N' , 'Hyderabad'),ee.Filter.eq('DISTRICT_N','Nalgonda'),ee.Filter.eq('DISTRICT_N','Warangal')))
var tel =table.filter(ee.Filter.or(ee.Filter.eq('DISTRICT_N' , 'Hyderabad')))
var startdate = '2021-06-01' ;
var enddate = '2022-06-01' ;
var images = sentinel.filter(ee.Filter.date(startdate, enddate)).filterBounds(tel);
print(images);
var ndvi = function(image){
var ndv = image.normalizedDifference(['B8','B4']);
return ndv.copyProperties(image,['system:Index' , 'system:time_start' ])
}
var ndvi = images.map(ndvi);
print(ndvi);
var nd = ndvi.first().clip(tel);
Map.addLayer(nd,{min:0,max:1,palette:['White', 'Green']},'NDVI');
var aoi = roi.merge(roi1);
var chart = ui.Chart.image.seriesByRegion({
imageCollection: ndvi,
regions: tel,
reducer:ee.Reducer.mean(),
scale:250,
seriesProperty:'DISTRICT_N'
});
print(chart);
Training command: python train.py
Inference on single image: python inference.py --model_path --image_path