

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 語意分割演算法
<a name="semantic-segmentation"></a>

SageMaker AI 語意分割演算法可提供細微的像素層級方式，開發電腦視覺應用程式。它會使用預先定義類別集中的類別標籤，標籤影像中的每個像素。標記對了解場景來說非常重要，而了解場景對日益增加的電腦視覺應用程式 (例如無人車、醫療影像診斷及機器感測) 來說更是至關重要。

相較之下，SageMaker AI [影像分類 - MXNet](image-classification.md)則是一種監督式學習演算法，只會分析整個影像，並將它們分類到多個輸出分類中的其中一個分類。[物件偵測 - MXNet](object-detection.md)則是一種監督式學習演算法，可偵測和分類影像中物件的所有執行個體。它會使用一個矩形的邊界框，指出影像中每個物件的位置和尺度。

因為語意分割演算法會分類影像中的每個像素，它也可以提供影像中所包含物件的形狀資訊。分割輸出會以灰階影像表示，稱為*分割遮罩*。分割遮罩是一種灰階影像，具有和輸入影像相同的形狀。

SageMaker AI 語意分割演算法是使用 [MXNet Gluon 架構和 Gluon CV 工具組](https://github.com/dmlc/gluon-cv)建置的。它可提供三種內建演算法供您選擇，以訓練深度神經網路。您可以使用 [Fully-Convolutional Network (FCN) 演算法](https://arxiv.org/abs/1605.06211)、[Pyramid Scene Parsing (PSP) 演算法](https://arxiv.org/abs/1612.01105)，或 [DeepLabV3](https://arxiv.org/abs/1706.05587)。

這三種演算法中，每一種都具有兩個相異元件：
+ *骨幹* (或*編碼器*) — 可產生可靠功能啟用映射的網路。
+ *編碼器*—可從編碼啟用映射建構分割遮罩的網路。

您也可以為 FCN、PSP 和 DeepLabV3 演算法選擇骨幹：[ResNet50 或 ResNet101](https://arxiv.org/abs/1512.03385)。這些骨幹包含預先訓練的成品，這些成品原先是在 [ImageNet](http://www.image-net.org/) 分類任務上訓練的。您可以微調這些分割的骨幹，以使用您自己的資料。或者，您可以初始化並只使用您自己的資料，從頭訓練這些網路。解碼器一律不會預先訓練。

若要部署訓練模型以進行推論，請使用 SageMaker AI 託管服務。在推論期間，您可以以 PNG 影像或是每個像素每個類別的一組機率，請求分割遮罩。您可以使用這些遮罩做為較大管道的一部分，其中包含額外的下游影像處理或其他應用程式。

**Topics**
+ [語意分割範例筆記本](#semantic-segmentation-sample-notebooks)
+ [語意分割演算法的輸入/輸出介面](#semantic-segmentation-inputoutput)
+ [語意分割演算法的 EC2 執行個體建議事項](#semantic-segmentation-instances)
+ [語意分割超參數](segmentation-hyperparameters.md)
+ [調校語意分割模型](semantic-segmentation-tuning.md)

## 語意分割範例筆記本
<a name="semantic-segmentation-sample-notebooks"></a>

如需使用 SageMaker AI 語意分割演算法訓練模型，及部署它以執行推論的範例 Jupyter 筆記本，請參閱[語意分割範例](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/semantic_segmentation_pascalvoc/semantic_segmentation_pascalvoc.html)。有關如何建立和存取可用於在 SageMaker AI 中執行範例的 Jupyter 筆記本執行個體的說明，請參閱[Amazon SageMaker 筆記本執行個體](nbi.md)。

若要查看所有 SageMaker AI 範例的清單，請建立並開啟筆記本執行個體，然後選擇 **SageMaker AI 範例**索引標籤。範例語意分割筆記本位於 **Amazon 演算法簡介**下方。若要開啟筆記本，請選擇其**使用**標籤，然後選擇**建立複本**。

## 語意分割演算法的輸入/輸出介面
<a name="semantic-segmentation-inputoutput"></a>

SageMaker AI 語意分割預期在 [Amazon Simple Storage Service (Amazon S3)](https://aws.amazon.com/s3/) 上取得客戶的訓練資料集。一但經過訓練，它便會在 Amazon S3 上產生結果模型成品。SageMaker AI 語意分割的輸入介面格式與最標準化語意分割效能評定資料集的輸入介面格式相似。Amazon S3 中的資料集預期會使用四個目錄 (兩個用於影像，兩個則用於註釋)，位於兩個通道中：其中一個是針對 `train`，另一個則是針對 `validation`。註釋預期是未經壓縮的 PNG 影像。資料集也可以擁有一個標籤映射，說明如何建立註釋映射。若沒有的話，則演算法會使用預設。它也支援使用擴增資訊清單影像格式 (`application/x-image`)，從 Amazon S3 直接在管道輸入模式中進行訓練。針對推論，端點則接受內容類型為 `image/jpeg` 的影像。

### 訓練的運作方式
<a name="semantic-segmentation-inputoutput-training"></a>

訓練資料分成四個目錄：`train`、`train_annotation`、`validation` 和 `validation_annotation`。這是這些目錄中每一個目錄的通道。資料集預期會分別針對 `train_annotation` 和 `validation_annotation` 的每個通道具備一個 `label_map.json` 檔案。若您沒有提供這些 JSON 檔案，SageMaker AI 會提供預設集標籤映射。

指定這些檔案的資料集看起來應和以下範例相似：

```
s3://bucket_name
    |
    |- train
                 |
                 | - 0000.jpg
                 | - coffee.jpg
    |- validation
                 |
                 | - 00a0.jpg
                 | - bananna.jpg
    |- train_annotation
                 |
                 | - 0000.png
                 | - coffee.png
    |- validation_annotation
                 |
                 | - 00a0.png
                 | - bananna.png
    |- label_map
                 | - train_label_map.json
                 | - validation_label_map.json
```

訓練和驗證目錄中的每個 JPG 影像，都在 `train_annotation` 和 `validation_annotation` 目錄中擁有一個具備相同名稱的對應 PNG 標籤影像。此命名慣例可協助演算法在訓練期間，將標籤與其對應的影像建立關聯。`train`、`train_annotation`、`validation` 和 `validation_annotation` 通道為必要通道。註釋則是單一通道的 PNG 影像。只要影像中的中繼資料 (格式) 有助於演算法將註釋影像讀取到單一通道的 8 位元不含正負號整數，格式便能正常運作。如需我們模式支援的詳細資訊，請參閱 [Python Image Library documentation](https://pillow.readthedocs.io/en/stable/handbook/concepts.html#modes)。我們建議使用 8 位元的像素，並使用全彩 (`P`) 模式。

使用模式時使用簡易 8 位元整數編碼的影像。為了從此映射取得標籤的映射，演算法會針對每個通道使用一個映射檔案，稱為*標籤映射*。標籤映射會用於將影像中的值映射到實際的標籤索引。在您沒有提供項目而使用的預設標籤映射中，註釋矩陣 (影像) 中的像素值會直接為標籤建立索引。這些影像可以是灰階 PNG 檔案，或是 8 位元的索引 PNG 檔案。未縮放預設案例的標籤映射檔案如下：

```
{
  "scale": "1"
}
```

為了提供一些對比以用於檢視，有些註釋軟體會將標籤影像調整一個常數量。為了支援此功能，SageMaker AI 語意分割演算法提供了重新縮放的選項，可將該值縮小到實際的標籤值。縮小不會將值轉換成適當的整數，演算法會預設為小於或等於縮放值的最大整數。以下程式碼會示範如何設定縮放值來重新縮放標籤值：

```
{
  "scale": "3"
}
```

以下範例示範如何使用此 `"scale"` 值來在映射到要用於訓練的 `mapped_label` 值時，重新縮放輸入註釋影像的 `encoded_label` 值。輸入註釋影像中的標籤值是 0、3、6，尺度為 3，因此他們會映射到 0、1、2 以用於訓練：

```
encoded_label = [0, 3, 6]
mapped_label = [0, 1, 2]
```

在某些情況下，您可能需要為每個類別指定特定的色彩映射。使用標籤映射中的映射選項，如以下 `label_map` 檔案的範例所示：

```
{
    "map": {
        "0": 5,
        "1": 0,
        "2": 2
    }
}
```

此範例的標籤映射為：

```
encoded_label = [0, 5, 2]
mapped_label = [1, 0, 2]
```

使用標籤映射，您可以使用不同的註釋系統及註釋軟體來取得資料，而無須進行許多預先處理。您可以為每個通道提供一個標籤映射。`label_map` 通道中的標籤映射檔案必須遵循四個目錄結構的命名慣例。若您沒有提供標籤映射，演算法會假設尺度為 1 (預設)。

### 使用擴增資訊清單格式進行訓練
<a name="semantic-segmentation-inputoutput-training-augmented-manifest"></a>

擴增的資訊清單格式可讓您在管道模式中使用影像檔案進行訓練，而無需建立 RecordIO 檔案。擴增資訊清單檔案包含資料物件，並且其格式應為 [JSON Lines](http://jsonlines.org/) 格式，如 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 請求中所說明。資訊清單中的每一行都是一個項目，包含影像的 Amazon S3 URI 和註釋影像的 URI。

資訊清單檔案中的每個 JSON 物件都必須包含 `source-ref` 鍵。`source-ref` 鍵應包含指向影像的 Amazon S3 URI 值。標籤則會在 `AttributeNames` 參數值底下提供，如 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 請求中所指定。它也可以在中繼資料標籤底下包含額外的中繼資料，但演算法會忽略這些內容。在下列範例中，`AttributeNames` 包含在影像和註釋參考 `["source-ref", "city-streets-ref"]` 的清單中。這些名稱必須附加 `-ref`。當您使用語意分割演算法與擴增資訊清單搭配時，`RecordWrapperType` 參數值必須必須是 `"RecordIO"`，而 `ContentType` 參數值必須是 `application/x-recordio`。

```
{"source-ref": "S3 bucket location", "city-streets-ref": "S3 bucket location", "city-streets-metadata": {"job-name": "label-city-streets", }}
```

如需擴增資訊清單檔案的詳細資訊，請參閱[訓練任務中的擴增的資訊清單檔案](augmented-manifest.md)。

### 增量訓練
<a name="semantic-segmentation-inputoutput-incremental-training"></a>

您也可以將您先前使用 SageMaker AI 訓練的模型提供給新模型的訓練。此增量訓練可以在您希望使用相同或相似資料訓練新模型時，節省訓練的時間。增量訓練目前只支援用於使用內建 SageMaker AI 語意分割訓練的模型。

若要使用您自己的預先訓練模型，請在 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 請求的 `InputDataConfig` 中，指定 `ChannelName` 為 "model"。將模型通道的 `ContentType` 設為 `application/x-sagemaker-model`。定義網路架構的 `backbone`、`algorithm`、`crop_size` 和 `num_classes` 輸入參數必須在新模型及您上傳到模型通道的預先訓練模型輸入超參數中以一致的方式指定。針對預先訓練模型檔案，您可以使用從 SageMaker AI 輸出取得的壓縮後 (.tar.gz) 成品。您只能使用用於輸入資料的影像格式。如需增量訓練的詳細資訊及其使用方式說明，請參閱[在 Amazon SageMaker AI 中使用增量訓練](incremental-training.md)。

### 產生推論
<a name="semantic-segmentation-inputoutput-inference"></a>

若要查詢部署到端點的已訓練模型，您需要提供一個影像和一個 `AcceptType`，表示所需要的輸出類型。端點會接受內容類型為 `image/jpeg` 的 JPEG 影像。若您請求 `image/png` 的 `AcceptType`，則演算法會輸出一個 PNG 檔案，以及一個與標籤本身具備相同格式的分割遮罩。若您請求 `application/x-recordio-protobuf` 的接受類型，演算法會傳回以 recordio-protobuf 格式編碼的類別機率。後者格式會輸出一個 3D 張量，其中第三個維度大小會與類別數相同。此元件表示每個像素每個類別標籤的機率。

## 語意分割演算法的 EC2 執行個體建議事項
<a name="semantic-segmentation-instances"></a>

SageMaker AI 語意分割演算法只支援使用 GPU 執行個體進行訓練，並且我們建議使用具有較大記憶體的 GPU 執行個體，以使用大型批次大小進行訓練。該演算法可使用單一機器組態中的 P2、P3、G4dn 或 G5 執行個體進行訓練。

針對推論，您可以使用 CPU 執行個體 (例如 C5 和 M5) 和 GPU 執行個體 (例如 P3 和 G4dn)，或是兩者皆使用。如需提供不同 CPU、GPU、記憶體及聯網容量以進行推論的執行個體類型資訊，請參閱 [Amazon SageMaker AI ML 執行個體類型](https://aws.amazon.com/sagemaker/pricing/instance-types/)。