การแยกประเภทภายใต้การควบคุมดูแลด้วยชุดข้อมูลการฝังดาวเทียม

แก้ไขใน GitHub
รายงานปัญหา
ประวัติหน้าเว็บ
ผู้เขียน spatialthoughts
บทแนะนำนี้เป็นส่วนหนึ่งของชุดบทแนะนำเกี่ยวกับชุดข้อมูลการฝังดาวเทียม โปรดดู ข้อมูลเบื้องต้น การจัดประเภทแบบไม่มีการกำกับดูแล การถดถอย และการค้นหาความคล้ายคลึงกันด้วย

คุณใช้การฝังดาวเทียมกับเวิร์กโฟลว์การแยกประเภทการรับรู้จากระยะไกลมาตรฐานได้ การฝังได้รับการออกแบบมาโดยเฉพาะเพื่อให้ทำงานได้ดีในการเรียนรู้แบบมีข้อมูลน้อย ซึ่งหมายความว่าคุณต้องใช้ข้อมูลที่ติดป้ายกำกับจำนวนค่อนข้างน้อย (ตัวอย่าง 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