การค้นหาความคล้ายคลึงด้วยชุดข้อมูลการฝังดาวเทียม

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

การฝังมีโอกาสพิเศษในการค้นหาสถานที่และฟีเจอร์ที่คล้ายกันโดยใช้ข้อมูลการสังเกตการณ์โลก การเปรียบเทียบเวกเตอร์การฝังของตำแหน่งอ้างอิงกับเวกเตอร์การฝังของพิกเซลอื่นๆ ทั้งหมดในรูปภาพการฝังจะช่วยให้เราค้นหาตำแหน่งที่มีคุณสมบัติคล้ายกับตำแหน่งอ้างอิงได้ ในทางปฏิบัติ วิธีนี้ช่วยให้เราค้นหาออบเจ็กต์หรือเว็บไซต์ประเภทใดประเภทหนึ่งในภูมิภาคที่เราสนใจได้อย่างง่ายดาย

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


ไซโลเก็บธัญพืช (ภาพ: วิกิพีเดีย)

เลือกภูมิภาคการค้นหา

สำหรับบทแนะนำนี้ เราจะแมปไซโลเก็บธัญพืชในแฟรงคลินเคาน์ตี รัฐแคนซัส เราใช้ตัวกรองและเลือกรูปหลายเหลี่ยมสำหรับเขตนี้

var counties = ee.FeatureCollection('TIGER/2018/Counties');

// Select Franklin County, Kansas
var selected = counties
  .filter(ee.Filter.eq('GEOID', '20059'));
var geometry = selected.geometry();

Map.centerObject(geometry);
Map.addLayer(geometry, {color: 'red'}, 'Search Area');


รูปภาพ: ภูมิภาคที่เลือก

เลือกสถานที่อ้างอิง

เราเริ่มต้นด้วยการทำเครื่องหมายตำแหน่งของไซโลเก็บเมล็ดพืชอย่างน้อย 1 แห่ง ในเครื่องมือแก้ไขโค้ด คุณสามารถใช้แผนที่ฐานดาวเทียม ซึ่งช่วยให้ค้นหาออบเจ็กต์ได้ง่าย

// Use the satellite basemap
Map.setOptions('SATELLITE');

เมื่อพบตำแหน่งของวัตถุที่สนใจแล้ว ให้ใช้เครื่องมือเพิ่มเครื่องหมายจากเครื่องมือวาดเพื่อวางจุดทำเครื่องหมายเป็นตำแหน่งอ้างอิง


รูปภาพ: การเพิ่มตำแหน่งอ้างอิง

แม้ว่าตำแหน่งเดียวก็มักจะเพียงพอ แต่การมีตัวอย่างเพิ่มเติมอีก 2-3 ตัวอย่างจะช่วยลดผลบวกลวงได้ (ในกรณีนี้คือตำแหน่งที่ระบุว่าเป็นไซโลเก็บธัญพืชแต่จริงๆ แล้วไม่ใช่) เราจะเปลี่ยนประเภทของเรขาคณิตให้เป็น FeatureCollection เพื่อให้เพิ่มจุดอ้างอิงได้หลายจุด คลิกปุ่มแก้ไขพร็อพเพอร์ตี้เลเยอร์ข้างรูปทรงเรขาคณิต เปลี่ยนชื่อเลเยอร์เป็น samples และตั้งค่าประเภทการนำเข้าเป็น FeatureCollection คลิก ตกลง


รูปภาพ: การกำหนดค่าเลเยอร์ตัวอย่าง

กลับไปที่หน้าต่างโปรแกรมแก้ไขโค้ดหลัก แล้วเพิ่มจุดในตำแหน่งที่เป็นตัวแทนอีก 2-3 ตำแหน่ง


รูปภาพ: การเพิ่มสถานที่อ้างอิงเพิ่มเติม

สำหรับบทแนะนำนี้ เราได้เลือกสถานที่อ้างอิง 3 แห่ง โดยจะใช้เพื่อดึงเวกเตอร์การฝังจากรูปภาพการฝังดาวเทียม

เลือกระยะเวลา

เลือกปีที่ต้องการค้นหา

var year = 2024;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');

กรองและต่อภาพชุดข้อมูลการฝังภาพจากดาวเทียม

เราโหลดชุดข้อมูลการฝังดาวเทียม กรองรูปภาพสำหรับปีที่เลือก และสร้างภาพโมเสก

var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');

var mosaic = embeddings
  .filter(ee.Filter.date(startDate, endDate))
  .mosaic();

แยกเวกเตอร์การฝังจากตัวอย่าง

เราจะสุ่มตัวอย่างโมเสกที่ตำแหน่งอ้างอิงเพื่อรับเวกเตอร์การฝังที่เชื่อมโยงกับจุดเหล่านี้ นอกจากนี้ เรายังต้องเลือกระดับที่เราต้องการดึงและเปรียบเทียบเวกเตอร์การฝังด้วย คุณสมบัติที่ใช้งานได้จริงของ Embedding ใน Satellite Embedding คือได้รับการออกแบบมาให้สามารถรวมกันแบบเชิงเส้น ซึ่งหมายความว่าสามารถรวบรวมหรือจัดเรียงเป็นลำดับชั้นได้ในขณะที่ยังคงความสัมพันธ์ด้านระยะทางและความหมายที่ตีความไว้ หากเราใช้ค่าเฉลี่ยเชิงพื้นที่กับพิกเซล 2x2 ผลลัพธ์จะแสดงถึงการฝังพิกเซลความละเอียดต่ำที่ใหญ่ขึ้น ความละเอียดดั้งเดิมสำหรับการฝังภาพจากดาวเทียมคือ 10 ม. และสำหรับการระบุวัตถุขนาดเล็ก เช่น ไซโลเก็บธัญพืช นี่จะเป็นมาตราส่วนที่ดีในการใช้งาน แต่หากต้องการค้นหาออบเจ็กต์หรือเว็บไซต์ที่มีขนาดใหญ่กว่า คุณอาจใช้ค่าที่ใหญ่กว่า (เช่น 20 ม., 1,000 ม.) เพื่อจับคู่วัตถุในระดับที่หยาบกว่า

// Choose the scale
// You may choose a larger value for larger objects
var scale = 10;

// Extract the embedding vector from the samples
var sampleEmbeddings = mosaic.sampleRegions({
  collection: samples,
  scale: scale
});

คำนวณความคล้ายคลึง

การคำนวณผลคูณแบบดอทระหว่างเวกเตอร์การฝัง 2 รายการช่วยให้เราคำนวณความคล้ายคลึงกันได้ Dot Product จะลดขนาดของเวกเตอร์ 2 ตัวและมุมระหว่างเวกเตอร์เหล่านั้นให้เหลือเพียงตัวเลขเดียว และในกรณีของเรา เวกเตอร์การฝังมีความยาวเป็นหน่วย ผลลัพธ์จึงเป็นเพียงมุมระหว่างเวกเตอร์

เราเพียงแค่คูณเวกเตอร์การฝัง 64 มิติ 2 เวกเตอร์ที่มีความยาวหน่วยและหาผลรวมของผลิตภัณฑ์เพื่อรับโคไซน์ของมุมระหว่างเวกเตอร์ (หรือที่เรียกว่า "ดอทโปรดักต์") เราจะคำนวณรูปภาพ 1 รูปต่อตำแหน่งอ้างอิง และหาค่าเฉลี่ยของผลลัพธ์เพื่อรับรูปภาพที่มีค่าพิกเซลของผลคูณจุด

// We compute the dot product between two embedding vectors
var bandNames = mosaic.bandNames();

var sampleDistances = ee.ImageCollection(sampleEmbeddings.map(function (f) {
  var arrayImage = ee.Image(f.toArray(bandNames)).arrayFlatten([bandNames]);
  var dotProduct = arrayImage.multiply(mosaic)
    .reduce('sum')
    .rename('similarity');
  return dotProduct;
}));

// Calculate mean distance from all reference locations
var meanDistance = sampleDistances.mean();

พิกเซลที่มีผลคูณจุดใกล้เคียง 1 จะมีเวกเตอร์การฝังที่ค่อนข้างคล้ายกัน (มุมระหว่างเวกเตอร์ใกล้เคียง 0) ในขณะที่ผลคูณจุดที่ใกล้เคียง -1 จะบ่งบอกถึงความแตกต่างที่มากขึ้นระหว่างเวกเตอร์ (ตั้งฉากกับทิศทางตรงกันข้าม) เราสามารถแสดงผลลัพธ์เป็นภาพได้โดยการเพิ่มรูปภาพระยะทางเฉลี่ยลงในแผนที่

var palette = [
  '000004', '2C105C', '711F81', 'B63679',
  'EE605E', 'FDAE78', 'FCFDBF', 'FFFFFF'
];
var similarityVis = {palette: palette, min: 0, max: 1};

Map.addLayer(meanDistance.clip(geometry), similarityVis,
  'Similarity (bright = close)', false);


รูปภาพ: ความคล้ายคลึงของพิกเซลรอบจุดอ้างอิง - โดยพื้นที่ที่สว่างกว่าจะมีความคล้ายคลึงกันมากกว่า

แยกตำแหน่งที่ตรงกัน

สำหรับขั้นตอนถัดไป เราต้องกำหนดเกณฑ์และแยกตำแหน่งที่มีออบเจ็กต์เป้าหมาย พิกเซลทั้งหมดที่มีไซโลของเมล็ดพืชจะมีเวกเตอร์การฝังที่คล้ายกับเวกเตอร์การฝังอ้างอิงมาก และมุมระหว่างเวกเตอร์ทั้ง 2 จะใกล้เคียงกับ 1 เรากำหนดเกณฑ์เพื่อค้นหาพิกเซลดังกล่าวทั้งหมดภายในภูมิภาค การค้นหาเกณฑ์ที่เหมาะสมจะขึ้นอยู่กับวัตถุที่คุณพยายามค้นหาและขนาด คุณสามารถทดลองใช้ค่าต่างๆ และดูว่าค่าใดเหมาะกับแอปพลิเคชันของคุณมากที่สุด

// Apply a threshold
var threshold = 0.90;
var similarPixels = meanDistance.gt(threshold);

ผลลัพธ์คือรูปภาพไบนารีที่มีพิกเซลซึ่งมีค่าความคล้ายคลึงน้อยกว่าเกณฑ์ ตอนนี้เราจะแปลงรูปภาพที่ได้เป็นรูปหลายเหลี่ยม

// Mask 0 values using selfMask()
// to get polygons only for the matched pixels
var polygons = similarPixels.selfMask().reduceToVectors({
  scale: scale,
  eightConnected: false,
  maxPixels: 1e10,
  geometry: geometry
});

รูปหลายเหลี่ยมแต่ละรูปแสดงถึงเว็บไซต์ที่มีการจับคู่กับสถานที่อ้างอิง เราสามารถใช้จุดศูนย์กลางเพื่อแสดงตำแหน่งที่ตรงกันได้

// Extract the centroids of vectorized polygons
var predictedMatches = polygons.map(function(f) {
  return f.centroid({maxError:1});
});

ส่งออกเนื้อหาที่ตรงกันไปยังเนื้อหา (ไม่บังคับ)

การแปลงเป็นเวกเตอร์เป็นการดำเนินการที่ใช้หน่วยความจำและต้องมีการประมวลผลสูงใน Earth Engine เพื่อหลีกเลี่ยงข้อผิดพลาด Computation Timed Out หรือ Tile Error เมื่อแสดงผลลัพธ์เป็นภาพ แนวทางปฏิบัติแนะนำคือการส่งออกผลลัพธ์เป็นชิ้นงาน เมื่อส่งออกชิ้นงานแล้ว คุณจะนำเข้าชิ้นงานไปยังสคริปต์และแสดงภาพได้ นอกจากนี้ วิธีนี้ยังช่วยให้คุณขยายการค้นหาในพื้นที่ขนาดใหญ่ได้โดยไม่มีปัญหา

// Replace this with your asset folder
// The folder must exist before exporting
var exportFolder = 'projects/spatialthoughts/assets/satellite_embedding/';
var matchesExportFc = 'predicted_grain_silo_matches';
var matchesExportFcPath = exportFolder + matchesExportFc;

Export.table.toAsset({
  collection: predictedMatches,
  description: 'Predicted_Matches_Export',
  assetId: matchesExportFcPath
});

เริ่มงานส่งออกและรอให้เสร็จสิ้นก่อนดำเนินการต่อ เมื่องานส่งออกเสร็จสิ้นแล้ว เราจะนำเข้าการจับคู่กลับไปไว้ในโค้ด

// Use the exported asset
var predictedMatches = ee.FeatureCollection(matchesExportFcPath);

แสดงภาพการจับคู่

ไม่ว่าคุณจะแยกการจับคู่แบบอินเทอร์แอกทีฟหรือส่งออกไปยังคอลเล็กชันฟีเจอร์ ตอนนี้คุณจะมีpredictedMatchesตัวแปรที่มีการจับคู่ที่คาดการณ์ไว้กับสถานที่อ้างอิงภายในพื้นที่ค้นหา มาดูภาพกัน

Map.addLayer(predictedMatches, {color: 'cyan'} , 'Predicted Matches');

ตรวจสอบผลลัพธ์

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


รูปภาพ: เว็บไซต์ที่มีไซโลเก็บเมล็ดพืชที่ระบุอย่างถูกต้อง

ผลลัพธ์ยังมีการตรวจจับที่ผิดพลาดด้วย หากสังเกตดีๆ คุณจะเห็นว่าการจับคู่มีลักษณะหลายอย่างที่คล้ายกับสถานที่อ้างอิงของเรา จึงมีเวกเตอร์การฝังที่คล้ายกัน


รูปภาพ: การจับคู่ผลบวกลวง

หากต้องการปรับปรุงผลลัพธ์ คุณอาจปรับตำแหน่งอ้างอิงและเกณฑ์ที่เลือก

ลองใช้สคริปต์ฉบับเต็มสำหรับบทแนะนำนี้ในโปรแกรมแก้ไขโค้ดของ Earth Engine