語意分段演算法 - Amazon SageMaker

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

語意分段演算法

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

為了進行比較,這 SageMaker 影像分類-MXNet是一種僅分析整個圖像的監督學習算法,將它們分類為多個輸出類別之一。物件偵測 - MXNet則是一種監督式的學習演算法,可偵測和分類影像中物件的所有執行個體。它會使用一個矩形的週框方塊,指出影像中每個物件的位置和尺度。

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

SageMaker 語義分割算法是使用 MXNet 膠子框架和膠子 CV 工具包構建的。它可提供三種內建演算法供您選擇,以訓練深度神經網路。您可以使用全卷積網路 (FCN) 演算法金字塔場景剖析 (PSP) 演算法或 V3。DeepLab

這三種演算法中,每一種都具有兩個相異元件:

  • 骨幹(或編碼器)——可產生可靠功能啟用映射的網路。

  • 編碼器——可從編碼啟用映射建構分段遮罩的網路。

您也可以選擇 FCN、PSP 和 DeepLab V3 演算法的骨幹:ResNet50 或 101。 ResNet這些主幹包括最初針對ImageNet分類工作進行訓練的預先訓練成品。您可以微調這些分段的骨幹,以使用您自己的資料。或者,您可以初始化並只使用您自己的資料,從頭訓練這些網路。解碼器一律不會預先訓練。

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

語意分段範例筆記本

如需使用 SageMaker 語意分割演算法來訓練模型並部署模型以執行推論的範例 Jupyter 筆記本,請參閱語意分割範例。如需如何建立及存取 Jupyter 筆記本執行個體 (您可以用來執行中範例) 的指示 SageMaker,請參閱。Amazon SageMaker Notebook 執行個體

若要查看所有範例的清單,請建立並開啟記事 SageMaker 本執行個體,然後選擇 [SageMaker 範例] 索引標籤。範例語意分段筆記本位於 Amazon 演算法簡介下方。若要開啟筆記本,請選擇其 Use (使用) 標籤,然後選擇 Create copy (建立複本)

語意分段演算法的輸入/輸出界面

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

訓練的運作方式

訓練資料分成四個目錄:traintrain_annotationvalidationvalidation_annotation。這是這些目錄中每一個目錄的通道。資料集預期會分別針對 train_annotationvalidation_annotation 的每個通道具備一個 label_map.json 檔案。如果您未提供這些 JSON 檔案,則會 SageMaker 提供預設的設定標籤對映。

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

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_annotationvalidation_annotation 目錄中擁有一個具備相同名稱的對應 PNG 標籤影像。此命名慣例可協助演算法在訓練期間,將標籤與其對應的影像建立關聯。traintrain_annotationvalidationvalidation_annotation 通道為必要通道。標註則是單一通道的 PNG 影像。只要影像中的中繼資料 (格式) 有助於演算法將標註影像讀取到單一通道的 8 位元不含正負號整數,格式便能正常運作。如需我們模式支援的詳細資訊,請參閱 Python Image Library documentation。我們建議使用 8 位元的像素,並使用全彩 (P) 模式。

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

{ "scale": "1" }

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

{ "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 (預設)。

使用擴增資訊清單格式進行訓練

擴增的資訊清單格式可讓您在管道模式中使用影像檔案進行訓練,而無需建立 RecordIO 檔案。擴增資訊清單檔案包含資料物件,並且其格式應為 JSON Lines 格式,如 CreateTrainingJob 請求中所說明。資訊清單中的每一行都是一個項目,包含影像的 Amazon S3 URI 和標註影像的 URI。

資訊清單檔案中的每個 JSON 物件都必須包含 source-ref 鍵。source-ref 鍵應包含指向影像的 Amazon S3 URI 值。標籤則會在 AttributeNames 參數值底下提供,如 CreateTrainingJob 請求中所指定。它也可以在中繼資料標籤底下包含額外的中繼資料,但演算法會忽略這些內容。在下列範例中,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", }}

如需擴增資訊清單檔案的詳細資訊,請參閱訓練任務的增強型清單檔案

增量訓練

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

若要使用您自己的預先訓練模型,請在 CreateTrainingJob 請求的 InputDataConfig 中,指定 ChannelName 為 "model"。將模型通道的 ContentType 設為 application/x-sagemaker-model。定義網路架構的 backbonealgorithmcrop_sizenum_classes 輸入參數必須在新模型及您上傳到模型通道的預先訓練模型輸入超參數中以一致的方式指定。對於預先訓練的模型檔案,您可以使用輸出中的壓縮 (.tar.gz) 加工品。 SageMaker 您只能使用用於輸入資料的影像格式。如需增量訓練的詳細資訊及其使用方式說明,請參閱在 Amazon 使用增量培訓 SageMaker

產生推論

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

語意分段演算法的 EC2 執行個體建議事項

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

針對推論,您可以使用 CPU 執行個體(例如 C5 和 M5)和 GPU 執行個體(例如 P3 和 G4dn),或是兩者皆使用。如需針對推論提供不同 CPU、GPU、記憶體和聯網容量組合的執行個體類型的相關資訊,請參閱 Amazon SageMaker ML 執行個體類型