Algorithme de classification d'images
L'algorithme de classification d'images Amazon SageMaker est un algorithme d'apprentissage supervisé qui prend en charge la classification multi-étiquette. Il prend une image comme entrée et génère une ou plusieurs étiquettes assignées à cette image. Il utilise un réseau neuronal convolutif qui peut être entraîné intégralement ou à l'aide de l'apprentissage de transfert lorsqu'un grand nombre d'images d'entraînement ne sont pas disponibles.
Le format en entrée recommandé pour les algorithmes de classification d'images Amazon SageMaker est Apache MXNet RecordIO
Pour conserver une meilleure interopérabilité avec les infrastructures de deep learning existantes, il diffère des formats de données protobuf couramment utilisés par les autres algorithmes Amazon SageMaker.
Pour plus d'informations sur les réseaux convolutifs, consultez :
-
Deep residual learning for image recognition
Kaiming He, et al., 2016 – Conférence IEEE sur la reconnaissance d'image et la reconnaissance de modèle
Rubriques
- Interface d'entrée/de sortie pour l'algorithme de classification d'images
- Recommandation pour l'instance EC2 relative à l'algorithme de classification d'images
- Exemples de blocs-notes de classification d'images
- Fonctionnement de la classification d'images
- Hyperparamètres de classification d'images
- Réglage d'un modèle de classification d'images
Interface d'entrée/de sortie pour l'algorithme de classification d'images
L'algorithme de classification d'images de SageMaker prend en charge les contenus du type RecordIO (application/x-recordio
) et image (image/png
, image/jpeg
et application/x-image
) pour l'entraînement en mode File (Fichier), et les contenus du type RecordIO (application/x-recordio
) pour l'entraînement en mode Pipe (Tube). Toutefois, vous pouvez également entraîner les modèles en mode pipe (tube) en utilisant les fichiers image (image/png
, image/jpeg
et application/x-image
), sans créer de fichiers RecordIO, en recourant au format manifeste augmenté.
L'entraînement distribué est pris en charge pour le mode file et le mode pipe. Lorsque vous utilisez le type de contenu RecordIO en mode pipe, vous devez définir le S3DataDistributionType
de S3DataSource
sur FullyReplicated
. L'algorithme prend en charge un modèle entièrement répliqué dans lequel vos données sont copiées sur chaque machine.
L'algorithme prend en charge image/png
, image/jpeg
et application/x-image
pour l'inférence.
Entraînement avec le format RecordIO
Si vous utilisez le format RecordIO pour l'entraînement, spécifiez les canaux train
et validation
en tant que valeurs pour le paramètre InputDataConfig
de la demande CreateTrainingJob
. Spécifiez un fichier RecordIO (.rec
) dans le canal train
et un fichier RecordIO dans le canal validation
. Définissez le type de contenu des deux canaux dans application/x-recordio
.
Entraînement avec le format Image
Si vous utilisez le format Image pour l'entraînement, spécifiez les canaux train
, validation
, train_lst
et validation_lst
en tant que valeurs pour le paramètre InputDataConfig
de la requête CreateTrainingJob
. Spécifiez les données d'image individuelle (fichiers .jpg
ou .png
) pour les canaux train
et validation
. Spécifiez un fichier .lst
dans chacun des canaux train_lst
et validation_lst
. Définissez le type de contenu pour les quatre canaux dans application/x-image
.
SageMaker lit les données d'entraînement et de validation séparément à partir de canaux différents. Vous devez donc stocker les données d'entraînement et de validation dans des dossiers différents.
Un fichier .lst
est un fichier de valeurs séparées par des tabulations à trois colonnes qui contient une liste de fichiers image. La première colonne spécifie l'index de l'image, la deuxième colonne spécifie l'index d'étiquette de classe pour l'image, et la troisième colonne spécifie le chemin d'accès relatif du fichier image. L'index d'image de la première colonne doit être unique parmi toutes les images. L'ensemble des index d'étiquette de classe est numéroté successivement, la numérotation devant commencer par 0. Par exemple, 0 pour la classe « cat », 1 pour la classe « dog », et ainsi de suite pour les classes supplémentaires.
Voici un exemple de fichier .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
Par exemple, si vos images d'entraînement sont stockées dans s3://<your_bucket>/train/class_dog
, s3://<your_bucket>/train/class_cat
, et ainsi de suite, spécifiez le chemin d'accès de votre canal train
sous la forme s3://<your_bucket>/train
, qui est le répertoire de niveau supérieur pour vos données. Dans le fichier .lst
, spécifiez le chemin d'accès relatif à un fichier individuel nommé train_image_dog1.jpg
dans le répertoire de classe class_dog
sous la forme class_dog/train_image_dog1.jpg
. Vous pouvez également stocker tous vos fichiers image dans un sous-répertoire du répertoire train
. Dans ce cas, utilisez ce sous-répertoire comme chemin d'accès relatif. Par exemple, s3://<your_bucket>/train/your_image_directory
.
Entraînement avec le format d'image 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. Vous devez spécifier les canaux d'entraînement et de validation en tant que valeurs du paramètre InputDataConfig
de la demande CreateTrainingJob
. Si vous utilisez ce format, un fichier manifeste S3 contenant la liste des images et leurs annotations associées doit être généré. Le fichier manifeste doit être au format JSON Lines'source-ref'
qui pointe vers l'emplacement S3 de l'image. Les annotations 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", "class"]
. La valeur d'étiquette correspondante est "0"
pour la première image et “1”
pour la deuxième image :
{"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"}}
L'ordre de "AttributeNames"
dans les fichiers d'entrée est important lors de l'entraînement de l'algorithme ImageClassification. Ce dernier accepte les données acheminées dans un ordre spécifique, avec image
en premier, suivi de label
. Les AttributeNames de cet exemple sont donc fournis avec "source-ref"
en premier, suivi de "class"
. Lorsque vous utilisez l'algorithme ImageClassification avec Augmented Manifest, la valeur du paramètre RecordWrapperType
doit être "RecordIO"
.
L'entraînement avec plusieurs étiquettes est également pris en charge en spécifiant un tableau de valeurs JSON. L'hyperparamètre num_classes
doit être défini pour correspondre au nombre total de classes. Il existe deux formats d'étiquette valides : multi-hot et class-id.
Dans le format multi-hot, chaque étiquette est un vecteur multi-hot codé de toutes les classes, où chaque classe prend la valeur 0 ou 1. Dans l'exemple suivant, il existe trois classes. La première image est étiquetée avec les classes 0 et 2, tandis que la deuxième image est étiquetée avec la classe 2 seulement :
{"image-ref": "s3://mybucket/sample01/image1.jpg", "class": "[1, 0, 1]"} {"image-ref": "s3://mybucket/sample02/image2.jpg", "class": "[0, 0, 1]"}
Dans le format class-id, chaque étiquette est une liste des ID de classe, issues de [0, num_classes
), qui s'appliquent au point de données. L'exemple précédent devient alors :
{"image-ref": "s3://mybucket/sample01/image1.jpg", "class": "[0, 2]"} {"image-ref": "s3://mybucket/sample02/image2.jpg", "class": "[2]"}
Le format multi-hot est le format par défaut, mais il peut être défini explicitement dans le type de contenu avec le paramètre label-format
: "application/x-recordio;
label-format=multi-hot".
Le format class-id, qui est le format généré par GroundTruth, doit être défini explicitement : "application/x-recordio;
label-format=class-id".
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 amorcer l'entraînement d'un nouveau modèle avec les artefacts issus d'un modèle précédemment entraîné avec SageMaker. L'entraînement progressif permet de gagner du temps lorsque vous souhaitez entraîner un nouveau modèle avec des données identiques ou similaires. Les modèles de classification d'images SageMaker peuvent être alimentés uniquement avec un autre modèle de classification d'images intégrée entraîné dans SageMaker.
Pour utiliser un modèle préentraîné dans la demande CreateTrainingJob
, spécifiez ChannelName
comme « modèle » dans le paramètre InputDataConfig
. Définissez le canal de modèle ContentType
sur application/x-sagemaker-model
. Les valeurs des hyperparamètres en entrée du nouveau modèle et du modèle préentraîné que vous chargez sur le canal de modèle doivent être identiques à celles des paramètres d'entrée num_layers
, image_shape
et num_classes
. Ces paramètres définissent l'architecture réseau. Pour le fichier de modèle préentraîné, utilisez les artefacts de modèles compressés (au format .tar.gz) générés par SageMaker. Pour les données d'entrée, vous pouvez utiliser les formats RecordIO ou image.
Pour obtenir un exemple de bloc-notes illustrant la façon d'utiliser l'entraînement progressif avec l'algorithme de classification d'images SageMaker, consultez l'article relatif à l'exemple de classification d'images pour l'entraînement progressif de bout en bout
Inférence avec l'algorithme de classification d'images
Les modèles générés peuvent être hébergés pour l'inférence et prennent en charge les formats d'image .jpg
et .png
encodés en tant que type de contenu image/png,
image/jpeg
et application/x-image
. L'image d'entrée est redimensionnée automatiquement. La sortie correspond aux valeurs de probabilité pour toutes les classes encodées au format JSON ou au format texte JSON Lines
accept: application/jsonlines {"prediction": [prob_0, prob_1, prob_2, prob_3, ...]}
Pour plus d'informations sur l'entraînement et l'inférence, consultez les exemples d'instance de bloc-notes de classification d'images référencés dans l'introduction.
Recommandation pour l'instance EC2 relative à l'algorithme de classification d'images
Pour la classification d'images, nous prenons 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
et ml.p3.16xlarge
. Nous recommandons d'utiliser les instances GPU avec davantage de mémoire pour l'entraînement avec des tailles de lot importantes. Cependant, les instances CPU (par exemple, C4) et GPU (par exemple, P2 et P3) peuvent toutes deux être utilisées pour l'inférence. Vous pouvez également exécuter l'algorithme sur plusieurs GPU et des paramètres multi-machines pour un entraînement distribué.
Les instances P2 et P3 sont toutes deux prises en charge dans l'algorithme de classification d'images.
Exemples de blocs-notes de classification d'images
Pour obtenir un exemple de bloc-notes utilisant l'algorithme de classification d'images SageMaker afin d'entraîner un modèle sur le jeu de données caltech-256 avant de le déployer pour procéder aux inférences, consultez l'article End-to-End Multiclass Image Classification Example