衛星エンベディング データセットを使用した教師あり分類

GitHub で編集
問題を報告する
ページの履歴
このチュートリアルは、Satellite Embedding データセットに関するチュートリアル シリーズの一部です。概要教師なし分類回帰類似性検索もご覧ください。

Satellite Embeddings は、標準のリモート センシング分類ワークフローに使用できます。エンベディングは、少量のラベル付きデータ(数十から数百のサンプル)で高品質の分類結果を実現できる、少量のデータによる学習に特化して設計されています。エンベディングにはスペクトル、空間、時間的コンテキストが含まれているため、k 近傍法(kNN)ランダム フォレストなどの単純な分類器は、エンベディング ベクトルを使用して複雑なランドスケープをターゲット クラスに分類できます。

このチュートリアルでは、kNN 分類器を使用した教師あり学習アプローチを使用して、衛星エンベディングを使用してマングローブを分類する方法について学習します。

リージョンを選択

まず、関心領域を定義します。このチュートリアルでは、ケニアの海岸線に沿ったリージョンを選択し、多角形をジオメトリ変数として定義します。または、コードエディタの描画ツールを使用して、対象領域の周りにポリゴンを描画することもできます。このポリゴンは、インポートのジオメトリ変数として保存されます。

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


図: マングローブの分類対象となる関心領域の選択

トレーニング サンプルを収集する

Satellite Embedding を使用した分類ワークフローでは、比較的正確な結果を得るために必要なラベル付きサンプルはごくわずかです。土地被覆分類では、Earth Engine でポイントをドロップしてラベル付けし、トレーニング サンプルを作成するのが最も簡単です。ここでは、衛星エンベディングの各ピクセルを次の 3 つのクラスのいずれかに分類する 3 クラス分類を作成します。

土地被覆クラス 説明 クラス Value
マングローブ 塩害に強い沿岸植生のすべての種 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 の着色合成画像

これで、分類用のサンプルにラベルを付けるために使用できる、対象年の参照画像が用意されました。まず、サンプルを収集するレイヤを構成します。[Geometry Imports] セクションを開き、[+ new layer] をクリックします。


図: 新しいレイヤを作成する

新しいレイヤの横にある [レイヤ プロパティを編集](歯車アイコン)をクリックし、次のように設定します。レイヤ名を mangroves と入力し、タイプを FeatureCollection に変更します。[+ プロパティ] をクリックし、値 1 を持つ新しいプロパティ landcover を追加します。色を緑色に変更して [OK] をクリックします。


図: マングローブ レイヤのレイヤ プロパティを構成する

同様に、他のクラス用に 2 つの新しいレイヤを追加します。水には landcover2 を、その他には 3 を使用します。


図: (左)水路レイヤと(右)その他のレイヤのレイヤ プロパティを構成する

レイヤを構成したら、サンプルの収集を開始できます。リージョンを拡大して、さまざまなクラスのピクセルを視覚的に識別します。mangroves レイヤを選択し、[マーカーを追加] ツールを使用して、マングローブ林に属するピクセルにポイントをドロップします。マングローブ林は、擬似カラーの Sentinel-2 合成画像では中間色の緑色で表示される傾向があります(参照用に衛星ベースマップ ビューを確認することもできます)。Satellite Embedding データセットで分類する場合、多くのポイントは必要ありません。むしろ、対象地域のばらつきを表す高品質の例を選択することが重要です。このチュートリアルでは、10 個のサンプルで十分です。


図: マングローブ クラスのサンプルを収集する

次に、water レイヤに切り替えて、地表水のピクセルのサンプルを収集します。このピクセルは、開水域の SWIR バンドの強い吸収により、Sentinel-2 合成画像ではほぼ黒で表示されます。other レイヤについても同様の手順を繰り返し、mangrovewater のどちらでもない例を明確に選択します。


図: 水などのクラスのサンプルを収集する

これで、トレーニング サンプルの収集が完了しました。3 つの個別の FeatureCollection を 1 つの地上基準点(gcp)コレクションに統合できます。

var gcps = mangroves.merge(water).merge(other);

分類器をトレーニングする

これで、分類器をトレーニングする準備が整いました。Satellite Embedding データセットを読み込み、選択した年と対象地域のタイルにフィルタし、モザイクを作成してから、エンベディング ベクトルをサンプリングしてトレーニング データセットを作成します。

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 はインタラクティブ コンピューティング環境で許可されている時間よりも多くの時間を必要とします。タスク実行の制限が長く、リソースが多いバッチ コンピューティング環境を活用するために、中間結果をアセットとしてエクスポートすることをおすすめします。これは、大きなリージョンを操作する際に computation timed out エラーや user memory exceeded エラーを回避するうえでも役立ちます。分類された画像をエクスポートしましょう。

// 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 コミュニティ カタログで入手できるため、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)');

グローバル マングローブ ウォッチの結果と、Satellite Embedding データセットの少数ショット分類の出力がほぼ一致していることに注目してください。基本地図を航空写真に切り替えると、航空写真の埋め込み分類では、世界のマングローブ ウォッチ分類で欠落していた景観の詳細も捉えられていることがわかります。

Earth Engine コードエディタでこのチュートリアルの完全なスクリプトを試す