임베딩은 지구 관측 데이터를 사용하여 유사한 위치와 기능을 찾을 수 있는 고유한 기회를 제공합니다. 참조 위치의 임베딩 벡터를 임베딩 이미지의 다른 모든 픽셀의 임베딩 벡터와 비교하면 참조 위치와 유사한 속성을 나타내는 위치를 찾을 수 있습니다. 실제로 이를 통해 관심 지역에서 객체나 특정 유형의 사이트를 쉽게 찾을 수 있습니다.
이 튜토리얼에서는 특정 지역의 모든 곡물 사일로를 찾아봅니다. 곡물 사일로 또는 곡물 저장통은 곡물을 대량으로 저장하는 데 일반적으로 사용되는 높은 구조물입니다. 농장이나 가공 시설에서 발견됩니다. 기존 원격 감지 방법을 사용하면 이러한 구조를 매핑하기 어려우며 맞춤 객체 감지 모델을 학습해야 합니다. 사일로는 모양과 구조가 고유하고 일반적으로 유사한 재료로 만들어지므로 위성 임베딩 이미지에서 고유한 임베딩 벡터로 표현되어 간단한 유사성 검색으로 사일로를 찾을 수 있습니다.
곡물 사일로 (이미지: Wikipedia)
검색 지역 선택
이 튜토리얼에서는 캔자스주 프랭클린 카운티의 곡물 사일로를 매핑합니다. 필터를 적용하고 이 카운티의 다각형을 선택합니다.
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');
그림: 선택한 지역
참조 위치 선택
먼저 하나 이상의 곡물 사일로의 위치를 표시합니다. 코드 편집기에서 객체를 쉽게 찾을 수 있는 위성 기본 지도를 사용할 수 있습니다.
// Use the satellite basemap
Map.setOptions('SATELLITE');
관심 대상 객체의 위치를 찾은 후 그리기 도구의 마커 추가 도구를 사용하여 기준 위치로 표시할 포인트를 드롭합니다.
그림: 참조 위치 추가
위치가 하나만 있어도 충분한 경우가 많지만, 몇 가지 예를 더 추가하면 거짓양성 (이 경우 곡물 사일로가 아닌데 곡물 사일로로 식별된 위치)을 줄이는 데 도움이 됩니다. 참조점을 여러 개 추가할 수 있도록 도형 유형을 FeatureCollection으로 변경합니다. 지오메트리 옆에 있는 레이어 속성 수정 버튼을 클릭합니다. 레이어 이름을 samples
로 변경하고 가져오기 유형을 FeatureCollection
로 설정합니다. '확인'을 클릭합니다.
그림: 샘플 레이어 구성
기본 코드 편집기 창으로 돌아가 몇 개의 대표적인 위치에 포인트를 추가합니다.
그림: 참조 위치 추가
이 튜토리얼에서는 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();
샘플에서 임베딩 벡터 추출
참조 위치에서 모자이크를 샘플링하여 이러한 점과 연결된 임베딩 벡터를 가져옵니다. 또한 삽입 벡터를 추출하고 비교할 스케일을 선택해야 합니다. 위성 임베딩의 매우 실용적인 속성은 선형으로 구성할 수 있도록 설계되었다는 것입니다. 즉, 거리 관계와 해석된 의미를 유지하면서 집계하거나 피라미드화할 수 있습니다. 2x2 픽셀에 걸쳐 공간 평균을 취하면 결과는 더 큰 저해상도 픽셀의 삽입을 나타냅니다. 위성 임베딩의 기본 해상도는 10m이며 곡물 사일로와 같은 작은 물체를 식별하는 데 적합한 스케일입니다. 하지만 더 큰 객체나 사이트를 찾으려면 더 큰 값 (예: 20m, 1000m)를 사용하여 더 거친 스케일의 객체와 일치시킵니다.
// 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
});
유사도 계산
두 임베딩 벡터 간의 내적을 계산하면 유사성을 계산할 수 있습니다. 내적은 두 벡터의 크기와 두 벡터 사이의 각도를 단일 숫자로 줄입니다. 이 경우 임베딩 벡터는 단위 길이이므로 결과는 벡터 사이의 각도일 뿐입니다.
두 개의 64D 단위 길이 임베딩 벡터를 곱하고 곱을 합산하면 벡터 간 각도의 코사인 (일명 '점곱')을 구할 수 있습니다. 참조 위치당 이미지를 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);
그림: 기준점 주변 픽셀의 유사성 - 밝은 영역이 더 유사함
일치하는 위치 추출
다음 단계에서는 임계값을 정의하고 타겟 객체가 포함된 위치를 추출해야 합니다. 곡물 사일로가 있는 모든 픽셀은 참조 임베딩 벡터와 매우 유사한 임베딩 벡터를 가지며 이들 사이의 각도는 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에서 메모리 및 컴퓨팅 집약적인 작업입니다. 결과를 시각화할 때 계산 시간 초과 또는 타일 오류를 방지하려면 결과를 애셋으로 내보내는 것이 좋습니다. 애셋을 내보낸 후 스크립트로 가져와 시각화할 수 있습니다. 이 방법을 사용하면 문제없이 넓은 지역에서 검색을 확장할 수 있습니다.
// 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');
결과 검증
결과를 평가하려면 각 예측 일치 항목을 확대하여 해당 위치에 곡물 사일로가 있는지 확인합니다. 곡물 사일로를 올바르게 식별한 일치 항목이 많이 표시됩니다.
그림: 곡물 사일로가 있는 사이트가 올바르게 식별됨
결과에 거짓양성도 포함되어 있습니다. 일치 항목은 참조 위치와 유사한 특징이 많으므로 삽입 벡터도 유사합니다.
그림: 거짓양성 일치
결과를 개선하려면 참조 위치와 선택한 기준점을 조정하면 됩니다.