Algorithme de segmentation sémantique - Amazon SageMaker

Algorithme de segmentation sémantique

L'algorithme de segmentation sémantique SageMaker fournit une approche granulaire, au niveau du pixel; pour développer les applications de reconnaissance d'image. Il balise chaque pixel d'une image avec une étiquette de classe d'un ensemble prédéfini de classes. Le balisage est fondamental pour la compréhension des scènes, aspect crucial d'un nombre croissant d'applications de vision par ordinateur, telles que les véhicules à conduite automatique, les diagnostics par imagerie médicale et la détection par robot.

À titre de comparaison, l'algorithme Algorithme de classification d'images de SageMaker est un algorithme d'apprentissage supervisé qui analyse uniquement les images dans leur ensemble et les classe dans l'une des catégories de sortie multiples. L'algorithme Algorithme de détection d'objets est un algorithme d'apprentissage supervisé qui détecte et classifie toutes les instances d'un objet dans une image. Il indique l'emplacement et l'échelle de chaque objet dans l'image avec un cadre de délimitation rectangulaire.

Comme l'algorithme de segmentation sémantique classe chaque pixel d'une image, il fournit également des informations sur les formes des objets contenus dans l'image. La sortie de la segmentation est représentée sous la forme d'une image en niveaux de gris, appelée masque de segmentation. Un masque de segmentation est une image avec la même forme que l'image d'entrée.

L'algorithme de segmentation sémantique SageMaker est construit à l'aide du cadre MXNet Gluon et de la boîte à outils Gluon CV. Il vous offre le choix entre trois algorithmes intégrés pour entraîner un réseau neuronal profond. Vous pouvez utiliser l'algorithme FCN (Fully-Convolutional Network) , l'algorithme PSP (Pyramid Scene Parsing) ou DeepLabV3.

Chacun des trois algorithmes possède deux composants distincts :

  • Le backbone (ou encodeur) : réseau qui produit des cartes d'activation de fonctions fiables.

  • Le décodeur : réseau qui construit le masque de segmentation à partir des cartes d'activation codées.

Vous avez également le choix de backbones pour les algorithmes FCN, PSP et DeepLabV3 : ResNet50 ou ResNet101. Ces backbones incluent des artefacts préentraînés qui ont été initialement entraînés sur la tâche de classification initialement ImageNet. Vous pouvez ajuster ces backbones en vue de la segmentation à l'aide de vos propres données. Vous pouvez également initialiser et entraîner ces réseaux à partir de zéro à l'aide de vos seules données. Les décodeurs ne sont jamais préentraînés.

Pour déployer le modèle entraîné en vue de l'inférence, utilisez le service d'hébergement SageMaker. Pendant l'inférence, vous pouvez demander le masque de segmentation soit comme une image PNG ou sous la forme d'un ensemble de probabilités pour chaque classe pour chaque pixel. Vous pouvez utiliser ces masques dans le cadre d'un pipeline plus grand qui inclut un traitement supplémentaire d'images en aval ou d'autres applications.

Exemples de blocs-notes de segmentation sémantique

Pour obtenir un exemple de bloc-notes Jupyter qui utilise l'algorithme de segmentation sémantique SageMaker pour entraîner un modèle et le déployer pour exécuter des inférences, consultez l'exemple de segmentation sémantique. Pour obtenir des instructions sur la création et l'accès aux instances de bloc-notes Jupyter que vous pouvez utiliser pour exécuter l'exemple dans SageMaker, consultez Utilisation des instances de bloc-notes Amazon SageMaker.

Pour afficher la liste de tous les exemples SageMaker, créez et ouvrez une instance de bloc-notes et choisissez l'onglet SageMaker Examples (Exemples SageMaker). Les blocs-notes d'exemples de segmentation sémantiques sont situés sous Introduction aux algorithmes d'Amazon. Pour ouvrir un bloc-notes, choisissez son onglet Use (Utiliser), puis Create copy (Créer une copie).

Interface d'entrée/sortie pour l'algorithme de segmentation sémantique

La segmentation sémantique SageMaker s'attend à ce que le jeu de données d'entraînement du client se trouve sur Amazon Simple Storage Service (Amazon S3). Une fois entraîné, il génère les artefacts du modèle résultant sur Amazon S3. Le format de l'interface d'entrée pour la segmentation sémantique SageMaker est similaire à celui de la plupart des jeux de données de comparaison normalisés de définition de points de référence. Le jeu de données dans Amazon S3 devrait être présenté dans deux canaux, un pour train et un pour validation à l'aide de quatre répertoires, deux pour les images et deux pour les annotations. Les annotations sont censées être des images PNG décompressées. L'ensemble de données peut également avoir une carte d'étiquettes qui décrit la façon dont les mappages d'annotation sont établis. Dans le cas contraire, l'algorithme utilise une valeur par défaut. Il prend également en charge le format image du manifeste augmenté (application/x-image) pour l'entraînement en mode d'entrée Pipe directement à partir d'Amazon S3. Pour l'inférence, un point de terminaison accepte les images avec un type de contenu image/jpeg.

Fonctionnement de l'entraînement

Les données d'entraînement sont scindées en quatre répertoires : train, train_annotation, validation et validation_annotation. Il y a un canal pour chacun de ces répertoires. L'ensemble de données devrait également disposer d'un fichier label_map.json par canal pour train_annotation et pour validation_annotation, respectivement. Si vous ne fournissez pas ces fichiers JSON, SageMaker fournit la carte d'étiquettes de l'ensemble par défaut.

L'ensemble de données spécifiant ces fichiers doit ressembler à l'exemple suivant :

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

Chaque image JPG des répertoires train et validation dispose d'une image d'étiquette PNG correspondante avec le même nom dans les répertoires train_annotation et validation_annotation. Cette convention de dénomination contribue à l'algorithme permettant d'associer une étiquette à son image correspondante au cours de l'entraînement. Les canaux train, train_annotation, validation et validation_annotation sont obligatoires. Les annotations sont des images PNG à un seul canal. Le format fonctionne aussi longtemps que les métadonnées (modes) de l'image permettent à l'algorithme de lire les annotations d'image en un entier non signé 8 bits à canal unique. Pour plus d'informations sur notre prise en charge des modes, consultez la documentation sur la bibliothèque d'images Python. Nous vous recommandons d'utiliser le pixel 8 bits, en mode P couleur vraie.

L'image qui est encodée est un entier simple 8 bits lorsque vous utilisez les modes. Pour passer de ce mappage à la carte d'une étiquette, l'algorithme utilise un fichier de mappage par canal, appelé carte d'étiquette. La carte d'étiquette est utilisée pour mapper les valeurs de l'image avec les indices de l'étiquette réelle. Dans la carte de l'étiquette par défaut, qui est fournie par défaut si vous n'en fournissez pas une, la valeur de pixel dans une matrice d'annotation (image) indexe directement l'étiquette. Ces images peuvent être des fichiers PNG en niveaux de gris ou des fichiers PNG indexés 8 bits. Le fichier de la carte d'étiquette pour le cas par défaut non mis à l'échelle est le suivant :

{ "scale": "1" }

Pour fournir un certain contraste pour l'affichage, certains logiciels d'annotation dimensionnent les images d'étiquette par une valeur constante. Pour prendre en charge cet aspect, l'algorithme de segmentation sémantique SageMaker fournit une option de remise à l'échelle pour réduire les valeurs à celles des étiquettes réelles. Lorsque cette réduction ne convertit pas la valeur en un entier approprié, l'algorithme prend comme valeur par défaut le plus grand nombre entier inférieur ou égal à la valeur d'échelle. Le code suivant montre comment définir la valeur d'échelle pour redimensionner les valeurs d'étiquette :

{ "scale": "3" }

L'exemple suivant montre comment cette valeur "scale" est utilisée pour redimensionner les valeurs encoded_label de l'image d'annotation d'entrée lorsqu'elles sont mappées à des valeurs mapped_label à utiliser dans l'entraînement. Les valeurs d'étiquette de l'image d'annotation d'entrée sont 0, 3, 6, avec l'échelle 3. Par conséquent, elles sont mappées à 0, 1, 2 pour l'entraînement :

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

Dans certains cas, il se peut que vous ayez besoin de spécifier un mappage de couleur particulier pour chaque classe. Utilisez l'option de carte dans le mappage des étiquettes comme illustré dans l'exemple suivant d'un fichier label_map :

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

Le mappage d'étiquette pour cet exemple est le suivant :

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

Avec les mappages d'étiquette, vous pouvez utiliser différents systèmes d'annotation et logiciels d'annotation pour obtenir des données sans beaucoup de prétraitement. Vous pouvez fournir une carte d'étiquette par canal. Les fichiers d'une carte d'étiquette du canal label_map doivent suivre les conventions d'attribution de nom pour les quatre structures de répertoire. Si vous ne fournissez pas une carte d'étiquette, l'algorithme présume une échelle de 1 (valeur par défaut).

Entraînement avec le format de manifeste augmenté

Le format manifeste augmenté permet de procéder à l'entraînement en mode Pipe (Tube) en utilisant des fichiers image sans avoir à créer de fichiers RecordIO. Le fichier manifeste augmenté contient des objets de données et doit être au format JSON Lines, comme décrit dans la demande CreateTrainingJob. Chaque ligne du manifeste est une entrée contenant l'URI Amazon S3 de l'image et l'URI de l'image d'annotation.

Chaque objet JSON du fichier manifeste doit contenir une clé source-ref. La clé source-ref doit contenir la valeur de l'URI Amazon S3 de l'image. Les étiquettes sont fournies sous la valeur du paramètre AttributeNames, comme indiqué dans la demande CreateTrainingJob. Il peut également contenir des métadonnées supplémentaires sous la balise metadata, mais celles-ci sont ignorées par l'algorithme. Dans l'exemple suivant, AttributeNames est contenu dans la liste d'images et les références d'annotation ["source-ref", "city-streets-ref"]. -ref doit être ajouté à ces noms. Lorsque vous utilisez l'algorithme Segmentation sémantique avec Augmented Manifest, la valeur du paramètre RecordWrapperType doit être "RecordIO" et la valeur du paramètre ContentType doit être application/x-recordio.

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

Pour plus d'informations sur les fichiers manifeste augmenté, consultez Fournir des métadonnées d'ensembles de données à des tâches d'entraînement avec un fichier manifeste augmenté.

Entraînement incrémentiel

Vous pouvez également contribuer à l'entraînement d'un nouveau modèle avec un modèle que vous avez entraîné précédemment avec SageMaker. Cet entraînement incrémentiel permet de gagner du temps lorsque vous souhaitez entraîner un nouveau modèle avec des données identiques ou similaires. Actuellement, l'entraînement progressif est pris en charge uniquement pour les modèles entraînés avec la segmentation sémantique SageMaker intégrée.

Pour utiliser votre propre modèle préentraîné, spécifiez ChannelName comme « modèle » dans InputDataConfig pour la demande CreateTrainingJob. Définissez le canal de modèle ContentType sur application/x-sagemaker-model. Les paramètres d'entrée backbone, algorithm, crop_size et num_classes qui définissent l'architecture réseau doivent être régulièrement spécifiés dans les hyperparamètres d'entrée du nouveau modèle et du modèle préentraîné que vous chargez sur le canal du modèle. Pour le fichier de modèle préentraîné, utilisez les artefacts compressés (au format .tar.gz) générés par SageMaker. Vous ne pouvez utiliser les formats d'image que pour les données d'entrée. Pour plus d'informations sur l'entraînement incrémentiel et pour obtenir des instructions sur son utilisation, consultez Entraînement progressif dans Amazon SageMaker.

Produire les inférences

Pour interroger un modèle entraîné qui est déployé sur un point de terminaison, vous devez fournir une image et un AcceptType qui indique le type de sortie requis. Le point de terminaison accepte les images JPEG avec un type de contenu image/jpeg. Si vous demandez un AcceptType de image/png, l'algorithme génère un fichier PNG avec un masque de segmentation dans le même format que les étiquettes elles-mêmes. Si vous demandez application/x-recordio-protobuf comme type d'acceptation, l'algorithme renvoie les probabilités de classe codées au format recordio-protobuf. Le dernier format génère un tenseur 3D où la troisième dimension est de la même taille que le nombre de classes. Cette composante désigne la probabilité de chaque étiquette de classe pour chaque pixel.

Recommandation sur les instances EC2 pour l'algorithme de segmentation sémantique

L'algorithme de segmentation sémantique SageMaker ne prend en charge que les instances GPU pour l'entraînement. Nous vous recommandons d'utiliser les instances GPU avec plus de mémoire pour l'entraînement avec de grandes tailles de lot. L'algorithme peut être entraîné à l'aide d'instances P2/P3 EC2 Amazon Elastic Compute Cloud (Amazon EC2) dans des configurations à machine unique. Il prend en charge les instances GPU suivantes pour l'entraînement :

  • ml.p2.xlarge

  • ml.p2.8xlarge

  • ml.p2.16xlarge

  • ml.p3.2xlarge

  • ml.p3.8xlarge

  • ml.p3.16xlarge

Pour l'inférence, vous pouvez utiliser les instances CPU (par exemple, c5 et m5) et les instances GPU (par exemple, p2 et p3), ou les deux. Pour plus d'informations sur les types d'instances qui fournissent différentes combinaisons en matière de capacités CPU, GPU, mémoire et réseau pour l'inférence, consultez Types d'instances ML Amazon SageMaker.