Earth Engine 中的機器學習

機器學習 API

機器學習 (ML) 是分析地球觀測資料的強大技術。Earth Engine 內建功能,可讓使用者針對常見情境,透過容易使用的 API 建構及使用機器學習模型。

常見的機器學習工作是將衛星圖像中的像素分類至兩個以上的類別。這種方法適用於土地利用土地覆蓋地圖和其他熱門應用程式。

  • 監督式分類:分類土地的其中一種機器學習技術,是使用基準真相範例,教導模型區分不同類別。Earth Engine 內建的監督式分類器支援這項程序。
  • 非監督式分類:在非監督式分類中,系統不會向訓練演算法提供實際資料範例,而是根據資料的固有差異,將可用資料分成不同叢集。如果沒有實際資料、不知道最終類別數量,或想快速進行實驗,Earth Engine 的非監督式分類器就特別實用。
  • 迴歸:分類模型會嘗試將每個輸入內容歸入離散類別,迴歸模型則會嘗試預測每個輸入內容的連續變數。舉例來說,迴歸模型可以預測水質、森林覆蓋率、雲層覆蓋率或作物產量。詳情請參閱 ee.Reducers 的線性迴歸部分

在 Earth Engine 以外的環境中訓練和預測

深度學習和類神經網路是機器學習技術,可有效處理衛星圖像等複雜資料。Earth Engine 的機器學習 API 不支援深度學習和類神經網路。如要使用這些模型,您必須使用 TensorFlow 或 PyTorch 等架構,在 Earth Engine 外部訓練模型。

如果您已熟悉 scikit-learn 等架構 (適用於傳統機器學習) 或 XGBoost (適用於梯度提升決策樹),可能也會想在 Earth Engine 外部進行訓練。

最後,如果資料集非常龐大,超出下方記載的限制,您可能需要在 Earth Engine 外部訓練模型。

從 Earth Engine 匯出資料以進行訓練

從 Earth Engine 以外的模型取得預測結果

如果您在 Earth Engine 外部訓練模型,可以透過幾種方式從該模型取得預測結果。

  • Earth Engine 的 ee.Model 套件可使用 Earth Engine 中的資料,以及 Google Vertex AI 託管的訓練模型進行預測。您可以在 Vertex AI 中代管自訂訓練模型,並使用 ee.Model.fromVertexAi 直接在 Earth Engine 中執行推論。詳情請參閱圖片預測指南表格預測指南
  • 或者,您也可以參閱土地覆蓋分類教學課程,瞭解如何使用 Cloud Functions 等雲端服務進行預測。

在 Earth Engine 以外訓練模型的其他原因

除了熟悉度和偏好之外,如果您想使用 Earth Engine 的 Machine Learning API 不支援的模型架構 (例如卷積神經網路),或是想使用更多 Vertex AI 功能,或遇到 Earth Engine Machine Learning API 的擴充限制,可能也會想在 Earth Engine 外部訓練模型。

訓練集限制

使用 ee.Classifieree.Clusterer 訓練模型通常很有效,資料集大小上限為 100 MB。以 32 位元 (即浮點數) 精確度為例,假設訓練資料集滿足以下條件 (其中 n 是範例數量,b 是頻帶數量):

nb ≤ (100 * 2 20) / 4

舉例來說,如果使用 100 個波段進行訓練,則用於訓練的範例數應少於 200,000 個。

推論限制

由於 Earth Engine 會處理 256x256 的圖像圖塊,因此圖像的推論要求必須少於 400 個波段 (同樣假設圖像的精確度為 32 位元)。

您可以多次重新訓練分類器,讓每次訓練執行的資料集都符合限制。

      var trainings = ee.List.sequence(0, 3).map(function(cover) {
          return image.addBands(landcover.eq(cover).stratifiedSample()
      })

      var classifier = ee.Classifier.smileCart()
          .train(trainings.get(0), "cover")
          .train(trainings.get(1), "cover")
          .train(trainings.get(2), "cover")
          .train(trainings.get(3), "cover")
    

模型大小限制

此外,模型本身不得大於 100 MB。我們許多分類器都可設定限制複雜度,進而限制大小。例如:

      var classifier = ee.Classifier.smileRandomForest({
          numberOfTrees: 10,
          minLeafPopulation: 10,
          maxNodes: 10000
      })