위성 삽입 데이터 세트를 사용한 지도 학습 분류

GitHub에서 수정
문제 신고
페이지 기록
이 튜토리얼은 위성 삽입 데이터 세트에 관한 튜토리얼 시리즈의 일부입니다. 소개, 감독되지 않은 분류, 회귀, 유사성 검색도 참고하세요.

위성 임베딩은 표준 원격 감지 분류 워크플로에 사용할 수 있습니다. 이 임베딩은 특히 소량 학습에 탁월하도록 설계되었습니다. 즉, 고품질 분류 결과를 얻기 위해서는 비교적 적은 수의 라벨이 지정된 데이터 (샘플 10~100개)가 필요합니다. 임베딩에는 스펙트럼, 공간, 시간 컨텍스트가 포함되므로 k-최근접 이웃 (kNN) 또는 랜덤 포레스트와 같은 간단한 분류자가 임베딩 벡터를 사용하여 복잡한 지형을 타겟 클래스로 분류할 수 있습니다.

이 튜토리얼에서는 kNN 분류기를 사용하여 지도 학습 접근 방식을 사용하여 위성 삽입을 사용하여 맹그로브를 분류하는 방법을 알아봅니다.

지역 선택

관심 영역을 정의하는 것부터 시작해 보겠습니다. 이 튜토리얼에서는 케냐 해안선을 따라 리전을 선택하고 다각형을 형상 변수로 정의합니다. 또는 코드 편집기의 그리기 도구를 사용하여 관심 영역 주위에 다각형을 그릴 수 있습니다. 이 다각형은 가져오기에서 geometry 변수로 저장됩니다.

var geometry = ee.Geometry.Polygon([[
  [39.4926, -4.39833],
  [39.4926, -4.47394],
  [39.5491, -4.47394],
  [39.5491, -4.39833]
]])


그림: 맹그로브 분류를 위한 관심 영역 선택

학습 샘플 수집

위성 삽입을 사용하는 분류 워크플로는 비교적 정확한 결과를 얻기 위해 몇 개의 라벨이 지정된 샘플만 필요합니다. 토지 피복 분류의 경우 Earth Engine에서 포인트를 드롭하고 라벨을 지정하여 학습 샘플을 만드는 것이 가장 쉽습니다. 위성 임베딩의 각 픽셀을 다음 세 가지 클래스 중 하나로 분류하는 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로 변경합니다. + 속성을 클릭하고 값이 1인 새 속성 landcover를 추가합니다. 색상을 녹색 음영으로 변경하고 확인을 클릭합니다.


그림: 맹그로브 레이어의 레이어 속성 구성

마찬가지로 다른 클래스에 대해 새 레이어 2개를 추가합니다. 물에는 landcover2을 사용하고 기타에는 3을 사용합니다.


그림: (왼쪽) 물과 (오른쪽) 기타 레이어의 레이어 속성 구성

레이어가 구성되면 샘플을 수집할 수 있습니다. 영역을 확대하고 시각적으로 다양한 클래스의 픽셀을 식별합니다. mangroves 레이어를 선택하고 마커 추가 도구를 사용하여 맹그로브 숲에 속하는 픽셀에 포인트를 드롭합니다. 맹그로브 숲은 Sentinel-2 의사 색상 합성에서 중간 톤의 녹색으로 표시되는 경향이 있습니다. 위성 기본 지도 보기를 참조할 수도 있습니다. 위성 삽입 데이터 세트로 분류할 때는 많은 포인트가 필요하지 않습니다. 관심 지역 내의 변동성을 나타내는 고품질 예시를 선택하는 것이 더 중요합니다. 이 튜토리얼에서는 10개의 샘플이면 충분합니다.


그림: 맹그로브 클래스의 샘플 수집

다음으로 water 레이어로 전환하고 표면수 픽셀의 샘플을 수집합니다. 표면수는 개방된 물에 대한 SWIR 대역의 강한 흡수로 인해 Sentinel-2 컴포지트에서 거의 검은색으로 표시됩니다. other 레이어에 대해 이 과정을 반복하여 mangrovewater도 아닌 예시를 선택합니다.


그림: 물 및 기타 수업의 샘플 수집

이제 학습 샘플 수집이 완료되었습니다. 세 개의 개별 FeatureCollection을 지상 기준점 (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에서 사용할 수 있는 다양한 분류기 중에서 선택할 수 있습니다. 소수의 예시를 사용하는 분류 (예시와 같은 매우 적은 수의 예시를 사용하는 분류)에는 k-최근접 이웃 (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와 비교할 수 있습니다. 이 데이터 세트는 JAXA의 L-밴드 합성개구레이더 (SAR)에서 파생되었으며 1996~2020년의 연간 맹그로브 지도가 있습니다. 이 데이터 세트는 GEE Community Catalog에서 사용할 수 있으므로 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 코드 편집기에서 이 튜토리얼의 전체 스크립트를 사용해 보세요.