คุณใช้การฝังดาวเทียมกับเวิร์กโฟลว์การแยกประเภทการรับรู้จากระยะไกลมาตรฐานได้ การฝังได้รับการออกแบบมาโดยเฉพาะเพื่อให้ทำงานได้ดีในการเรียนรู้แบบมีข้อมูลน้อย ซึ่งหมายความว่าคุณต้องใช้ข้อมูลที่ติดป้ายกำกับจำนวนค่อนข้างน้อย (ตัวอย่าง 10-100 รายการ) เพื่อให้ได้ผลลัพธ์การจัดประเภทคุณภาพสูง เนื่องจาก Embedding มีบริบทเชิงสเปกตรัม เชิงพื้นที่ และเชิงเวลา ตัวแยกประเภทอย่างง่าย เช่น k-Nearest Neighbors (kNN) หรือ Random Forest สามารถใช้เวกเตอร์ Embedding เพื่อจัดประเภทภูมิประเทศที่ซับซ้อนเป็นคลาสเป้าหมายได้
ในบทแนะนำนี้ เราจะมาเรียนรู้วิธีใช้แนวทางการเรียนรู้ภายใต้การดูแลโดยใช้ตัวแยกประเภท kNN เพื่อจัดประเภทป่าชายเลนโดยใช้การฝังดาวเทียม
เลือกภูมิภาค
มาเริ่มด้วยการกำหนดภูมิภาคที่สนใจกัน สำหรับบทแนะนำนี้ เราจะเลือกภูมิภาคตามแนวชายฝั่งของเคนยาและกำหนดรูปหลายเหลี่ยมเป็นตัวแปรเรขาคณิต หรือจะใช้เครื่องมือวาดในตัวแก้ไขโค้ดเพื่อวาดรูปหลายเหลี่ยมรอบๆ ภูมิภาคที่สนใจซึ่งจะบันทึกเป็นตัวแปรเรขาคณิตในการนำเข้าก็ได้
var geometry = ee.Geometry.Polygon([[
[39.4926, -4.39833],
[39.4926, -4.47394],
[39.5491, -4.47394],
[39.5491, -4.39833]
]])
รูปภาพ: การเลือกพื้นที่ที่สนใจสำหรับการจัดประเภทป่าชายเลน
รวบรวมตัวอย่างการฝึก
เวิร์กโฟลว์การแยกประเภทที่มีการฝังดาวเทียมต้องการตัวอย่างที่ติดป้ายกำกับเพียงไม่กี่รายการเพื่อให้ได้ผลลัพธ์ที่ค่อนข้างแม่นยำ สำหรับการจัดประเภทสิ่งปกคลุมดิน วิธีที่ง่ายที่สุดคือการวางจุดและติดป้ายกำกับใน Earth Engine เพื่อสร้างตัวอย่างการฝึก เราจะสร้างการจัดประเภท 3 คลาสที่จะจัดประเภทแต่ละพิกเซลจากการฝังดาวเทียมเป็นหนึ่งใน 3 คลาสต่อไปนี้
คลาสสิ่งปกคลุมดิน | คำอธิบาย | มูลค่าของคลาส |
---|---|---|
ป่าชายเลน | พืชชายฝั่งที่ทนต่อความเค็มทุกชนิด | 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
คลิก + พร็อพเพอร์ตี้ แล้วเพิ่มพร็อพเพอร์ตี้ใหม่ landcover
ที่มีค่า 1
เปลี่ยนสีเป็นเฉดสีเขียว แล้วคลิกตกลง
รูปภาพ: การกำหนดค่าคุณสมบัติเลเยอร์สำหรับเลเยอร์ป่าชายเลน
ในทำนองเดียวกัน ให้เพิ่มเลเยอร์ใหม่ 2 เลเยอร์สำหรับคลาสอื่นๆ ใช้ค่า landcover
2
สำหรับน้ำและ 3
สำหรับอื่นๆ
รูปภาพ: การกำหนดค่าคุณสมบัติเลเยอร์สำหรับ (ซ้าย) น้ำและ (ขวา) เลเยอร์อื่นๆ
เมื่อกำหนดค่าเลเยอร์แล้ว เราจะเริ่มรวบรวมตัวอย่างได้ ซูมเข้าไปยังภูมิภาคและระบุพิกเซลของคลาสต่างๆ ด้วยสายตา เลือกmangroves
เลเยอร์ แล้วใช้เครื่องมือเพิ่มเครื่องหมายเพื่อวางจุดบนพิกเซลที่เป็นป่าชายเลน ซึ่งมักจะปรากฏเป็นสีเขียวโทนกลางในภาพผสม Sentinel-2 แบบสีเทียม (และคุณยังดูมุมมองแผนที่ฐานดาวเทียมเพื่อใช้อ้างอิงได้ด้วย) คุณไม่จำเป็นต้องใช้จุดจำนวนมากเมื่อจัดประเภทด้วยชุดข้อมูลการฝังดาวเทียม แต่สิ่งสำคัญกว่าคือการเลือกตัวอย่างคุณภาพสูงที่แสดงถึงความแปรปรวนภายในภูมิภาคที่คุณสนใจ สำหรับบทแนะนำนี้ ตัวอย่าง 10 รายการก็เพียงพอแล้ว
รูปภาพ: การเก็บตัวอย่างสำหรับชั้นเรียนเกี่ยวกับป่าชายเลน
จากนั้นเปลี่ยนไปใช้เลเยอร์ water
และรวบรวมตัวอย่างสำหรับพิกเซลน้ำผิวดิน ซึ่งจะปรากฏเป็นสีดำเกือบทั้งหมดในภาพคอมโพสิต Sentinel-2 เนื่องจากมีการดูดซับแถบ SWIR อย่างมากสำหรับน้ำที่เปิด ทำกระบวนการซ้ำสำหรับเลเยอร์ other
โดยเลือกตัวอย่างที่เห็นได้ชัดว่าไม่ใช่ mangrove
หรือ water
รูปภาพ: การเก็บตัวอย่างสำหรับชั้นเรียนน้ำและชั้นเรียนอื่นๆ
การรวบรวมตัวอย่างการฝึกเสร็จสมบูรณ์แล้ว เราสามารถผสานรวม FeatureCollection ทั้ง 3 รายการเข้ากับคอลเล็กชันเดียวของจุดควบคุมภาคพื้นดิน (GCP)
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 ตัวเลือกที่ดีสำหรับการจัดประเภทแบบ Few-Shot (การจัดประเภทโดยใช้ตัวอย่างจำนวนน้อยมาก เช่น ตัวอย่างของเรา) คือ 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');
รูปภาพ: การฝังภาพถ่ายจากดาวเทียมที่จัดประเภทแล้ว
สร้างแผนที่ป่าชายเลน
เราสร้างรูปภาพที่จัดประเภทแล้วโดยมี 3 คลาส เราสามารถดึงพิกเซลที่จัดเป็นป่าชายเลน (คลาส 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)');
รูปภาพ: แผนที่ป่าชายเลน
ตรวจสอบผลลัพธ์
หากต้องการประเมินผลลัพธ์ เราสามารถเปรียบเทียบกับชุดข้อมูลที่ผ่านการตรวจสอบจากผู้เชี่ยวชาญคุณภาพสูงอย่าง Global Mangrove Watch ชุดข้อมูลนี้ได้มาจากเรดาร์ชนิดช่องรับคลื่นสังเคราะห์ (SAR) แถบ L จาก 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