

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

# 影像分類 - MXNet
<a name="image-classification"></a>

Amazon SageMaker 影像分類演算法是一種支援多標籤分類的監督式學習演算法。它會取得一個影像做為輸入和輸出，並將一或多個標籤指派給該影像。該演算法所使用的卷積神經網絡能夠從頭開始訓練，亦可透過遷移學習進行訓練，相當適合大量訓練影像無法使用的狀況 

Amazon SageMaker AI 影像分類演算法的建議輸入格式為 Apache MXNet [RecordIO](https://mxnet.apache.org/api/faq/recordio)。但您亦可使用 .jpg 或 .png 格式的原始影像。如需有效率資料準備與載入機器學習系統的粗略概觀，請參閱[此討論](https://mxnet.apache.org/api/architecture/note_data_loading)。

**注意**  
此演算法並非採用其他 Amazon SageMaker AI 演算法常用的 protobuf 資料格式，因此可以與現有深度學習架構保持較佳的互通性。

如需卷積網路的詳細資訊，請參閱：
+ [Deep residual learning for image recognition](https://arxiv.org/abs/1512.03385) Kaiming He 等，2016 IEEE 電腦視覺與模式辨識會議
+ [ImageNet image database](http://www.image-net.org/)
+ [使用 Gluon-CV 和 MXNet 進行影像分類](https://gluon-cv.mxnet.io/build/examples_classification/index.html)

**Topics**
+ [影像分類演算法的輸入/輸出介面](#IC-inputoutput)
+ [影像分類演算法的 EC2 執行個體建議事項](#IC-instances)
+ [影像分類範例筆記本](#IC-sample-notebooks)
+ [影像分類的運作方式](IC-HowItWorks.md)
+ [影像分類超參數](IC-Hyperparameter.md)
+ [調校影像分類模型](IC-tuning.md)

## 影像分類演算法的輸入/輸出介面
<a name="IC-inputoutput"></a>

SageMaker AI 影像分類演算法可支援使用 RecordIO (`application/x-recordio`) 和影像 (`image/png`、`image/jpeg` 和 `application/x-image`) 內容類型在檔案模式中進行訓練，並支援使用 RecordIO (`application/x-recordio`) 內容類型在管道模式中進行訓練。但是，您也可以利用擴增資訊清單格式，使用影像檔案 (`image/png`、`image/jpeg` 和 `application/x-image`) 在管道模式中訓練，而無須建立 RecordIO 檔案。

檔案模式和管道模式支援分散式訓練。在管道模式中使用 RecordIO 內容類型時，您必須將 `S3DataSource` 的 `FullyReplicated` 設定為 `S3DataDistributionType`。該演算法可支援完全複寫的模型，其中您的資料會被複製到每台機器上。

演算法則針對推論支援 `image/png`、`image/jpeg` 和 `application/x-image`。

### 以 RecordIO 格式進行訓練
<a name="IC-recordio-training"></a>

若您是採用 RecordIO 格式進行訓練，請將 `train` 與 `validation` 通道指定為 `InputDataConfig` 請求的 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 參數值。然後，在 `.rec` 通道中指定一個 RecordIO (`train`) 檔案，且 `validation` 通道中亦要指定一個 RecordIO 檔案。請接著將兩個通道的內容類型設定為 `application/x-recordio`。

### 以影像格式進行訓練
<a name="IC-image-training"></a>

若您是採用影像格式進行訓練，則請將 `train`、`validation`、`train_lst` 與 `validation_lst` 通道指定為 `InputDataConfig` 請求的 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 參數值。然後，分別為 `.jpg` 與 `.png` 通道指定個別的影像資料 (`train` 或 `validation` 檔案)；並在每個 `.lst` 與 `train_lst` 通道中指定一個 `validation_lst` 檔案。請接著將所有四個通道的內容類型設定為 `application/x-image`。

**注意**  
SageMaker AI 會從不同的通道個別讀取訓練和驗證資料，因此您必須將訓練和驗證資料存放在不同的資料夾中。

`.lst` 檔案屬於標籤分隔檔案，且其中的三個欄位將包含影像檔案清單。第一個欄位會指定影像索引，第二個欄位會指定影像的類別標籤索引，而第三個欄位則是指定影像檔案的相對路徑。第一個欄位中的影像索引在所有影像之間，不得重複。類別標籤索引組為連續編號，且應從 0 開始進行編號。例如，cat 類別的編號為 0，dog 類別的編號即為 1，其他類別則依此類推。

 以下是 `.lst` 檔案的範例：

```
5      1   your_image_directory/train_img_dog1.jpg
1000   0   your_image_directory/train_img_cat1.jpg
22     1   your_image_directory/train_img_dog2.jpg
```

舉例來說，假設您將訓練影像存放於 `s3://<your_bucket>/train/class_dog`、`s3://<your_bucket>/train/class_cat` 等，則請將 `train` 通道的路徑指定為 `s3://<your_bucket>/train`，其為資料的最上層目錄。而在 `.lst` 檔案中，請找到 `train_image_dog1.jpg` 類別目錄中名為 `class_dog` 的個別檔案，並將其相對路徑指定為 `class_dog/train_image_dog1.jpg`。您亦可以將一個子目錄下的所有影像檔案存放於 `train` 目錄中。在這種情況下，請將該子目錄做為相對路徑。例如 `s3://<your_bucket>/train/your_image_directory`。

### 以擴增的資訊清單影像格式進行訓練
<a name="IC-augmented-manifest-training"></a>

擴增的資訊清單格式可讓您在管道模式中使用影像檔案進行訓練，而無需建立 RecordIO 檔案。您需要為 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 請求的 `InputDataConfig` 參數值指定訓練和驗證通道。雖然使用該格式，但仍需產生包含影像清單及其對應註釋的 S3 資訊清單檔案。資訊清單檔案格式應為 [JSON Lines](http://jsonlines.org/) 格式，其中每一行都代表一個範例。影像會使用 `'source-ref'` 標籤指定，指向影像的 S3 位置。註釋則會在 `"AttributeNames"` 參數值底下提供，如 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 請求中所指定。它也可以在 `metadata` 標籤底下包含額外的中繼資料，但演算法會忽略這些內容。在下列範例中，`"AttributeNames"` 包含在影像和註釋參考 `["source-ref", "class"]` 的清單中。第一個影像的對應標籤值是 `"0"`，而第二個影像的對應標籤值則是 `“1”`：

```
{"source-ref":"s3://image/filename1.jpg", "class":"0"}
{"source-ref":"s3://image/filename2.jpg", "class":"1", "class-metadata": {"class-name": "cat", "type" : "groundtruth/image-classification"}}
```

輸入檔中 `"AttributeNames"` 的順序在訓練 ImageClassification 演算法時是很重要的。它會以特定的順序來接受排在管道中的資料，`image` 會排在第一個，接著是 `label`。因此系統會對此範例中的 “AttributeNames” 先提供 `"source-ref"`，接著提供 `"class"`。使用 ImageClassification 演算法與擴增資訊清單搭配時，`RecordWrapperType` 參數的值必須是 `"RecordIO"`。

指定標籤的 JSON 陣列也支援多值訓練。`num_classes` 超參數必須設定為符合類別總數。有兩種有效的標籤格式：multi-hot 及 class-id。

在 multi-hot 格式中，每個標籤是所有類別的multi-hot 編碼向量，其中每個類的值為 0 或 1。在下列範例中，有三種類別。第一個影像的類別標籤為 0 及 2，而第二個影像的類別標籤僅為 2：

```
{"image-ref": "s3://amzn-s3-demo-bucket/sample01/image1.jpg", "class": "[1, 0, 1]"}
{"image-ref": "s3://amzn-s3-demo-bucket/sample02/image2.jpg", "class": "[0, 0, 1]"}
```

在 class-id 格式中，每個標籤是類別 ID 的清單，來自 [0, `num_classes`)，其適用於資料點。上述範例外觀會如下所示：

```
{"image-ref": "s3://amzn-s3-demo-bucket/sample01/image1.jpg", "class": "[0, 2]"}
{"image-ref": "s3://amzn-s3-demo-bucket/sample02/image2.jpg", "class": "[2]"}
```

multi-hot 格式是預設的，但可以在具有 `label-format` 參數的內容類型中明確設定：`"application/x-recordio; label-format=multi-hot".`。class-id 格式，亦即由 GroundTruth 輸出的格式，則必須明確設定：`"application/x-recordio; label-format=class-id".`

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

### 增量訓練
<a name="IC-incremental-training"></a>

您也可以將您先前使用 SageMaker AI 訓練模型的成品，提供給新模型的訓練。增量訓練可以在您希望使用相同或相似資料訓練新模型時，節省訓練的時間。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`。您上傳至模型通道新模型和預先訓練模型的輸入超參數，必須擁有與 `num_layers`、`image_shape` 和 `num_classes` 輸入參數相同的設定。這些參數會定義網路架構。針對預先訓練模型檔案，請使用 SageMaker AI 輸出的壓縮後模型成品 (.tar.gz 格式)。您可以針對輸入資料使用 RecordIO 或影像格式。

### 使用影像分類演算法進行推論
<a name="IC-inference"></a>

您可以將產生的模型進行託管以取得推論，並支援以 `.jpg` 和 `.png` content-type 呈現的編碼 `image/png, image/jpeg` 和 `application/x-image` 影像格式。輸入影像會自動調整大小。輸出是所有以 JSON 格式，或是 [JSON Lines 文字格式](http://jsonlines.org/) (用於批次轉換) 編碼類別的機率值。影像分類模型會針對每個請求處理一個單一影像，因此只會以 JSON 或 JSON Lines 格式輸出一行程式碼。以下為 JSON Lines 格式的回應範例：

```
accept: application/jsonlines

 {"prediction": [prob_0, prob_1, prob_2, prob_3, ...]}
```

如需訓練與推論的詳細資訊，請參考簡介中參考的影像分類範例筆記本執行個體。

## 影像分類演算法的 EC2 執行個體建議事項
<a name="IC-instances"></a>

針對影像分類，我們可支援 P2、P3、G4dn 和 G5 執行個體。建議您使用記憶體容量較多的 GPU 執行個體來進行大批次訓練。如需進行分散式訓練，則可以在多 GPU 和多個機器設定上執行此演算法。CPU (例如 C4) 和 GPU (P2、P3、G4dn 或 G5) 執行個體都可用來進行推論。

## 影像分類範例筆記本
<a name="IC-sample-notebooks"></a>

如需使用 SageMaker AI 影像分類演算法的範例筆記本，請參閱[透過 SageMaker 管線建置並註冊 MXNet 影像分類模型](https://github.com/aws-samples/amazon-sagemaker-pipelines-mxnet-image-classification/blob/main/image-classification-sagemaker-pipelines.ipynb)。如需如何建立並存取 Jupyter 筆記本執行個體以用來執行 SageMaker AI 中範例的指示，請參閱[Amazon SageMaker 筆記本執行個體](nbi.md)。在建立並開啟筆記本執行個體後，請選取 **SageMaker AI 範例**索引標籤以查看所有 SageMaker AI 範例的清單。範例影像分類筆記本位於 **Amazon 演算法簡介**區段中。若要開啟筆記本，請按一下其**使用**標籤，然後選取**建立複本**。