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