Algorithme de détection d'objets - Amazon SageMaker

Algorithme de détection d'objets

L'algorithme de détection d'objets Amazon SageMaker détecte et classe les objets des images à l'aide d'un seul réseau neuronal profond. Il s'agit d'un algorithme d'apprentissage supervisé qui accepte les images en tant qu'entrée et identifie toutes les instances d'objets au sein de l'image. L'objet est classé dans l'une des classes d'une collection spécifiée avec un score de fiabilité qu'il appartient à la classe. Son emplacement et son échelle dans l'image sont indiqués par un cadre de délimitation rectangulaire. Il utilise l'infrastructure SSD (Single Shot Detector) et prend en charge deux réseaux de base : VGG et ResNet. Le réseau peut être entraîné à partir de rien ou à l'aide de modèles qui ont été préalablement entraînés sur l'ensemble de données ImageNet.

Interface d'entrée/sortie pour l'algorithme de détection d'objets

L'algorithme de détection d'objets SageMaker prend en charge à la fois les types de contenu RecordIO (application/x-recordio) et image (image/png, image/jpeg et application/x-image) pour l'entraînement en mode File (fichier) et prend en charge 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é. Le format en entrée recommandé pour les algorithmes de détection d'objet Amazon SageMaker est le format Apache MXNet RecordIO. Toutefois, vous pouvez également utiliser des images brutes au format .jpg ou .png. L'algorithme prend en charge uniquement application/x-image pour l'inférence.

Note

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 formats de données, consultez Exemples de blocs-notes de détection d'objet.

Entraîner avec le format RecordIO

Si vous utilisez le format RecordIO pour l'entraînement, spécifiez les canaux d'entraînement et de validation comme valeurs du paramètre InputDataConfig de la demande CreateTrainingJob. Spécifiez un fichier RecordIO (.rec) dans le canal d'entraînement et un fichier RecordIO dans le canal de validation. Définissez le type de contenu des deux canaux dans application/x-recordio. Voici un exemple de la façon de générer RecordIO disponible dans l'exemple de bloc-notes de détection d'objet. Vous pouvez également utiliser les outils du GluonCV de MXNet pour générer les fichiers RecordIO de jeux de données populaires comme les classes d'objets visuels PASCAL et les objets COCO (Common Objects in Context, objets communs en contexte).

Entraîner avec le format Image

Si vous utilisez le format Image pour l'entraînement, spécifiez les canaux train, validation, train_annotation et validation_annotation en tant que valeurs du paramètre InputDataConfig de la demande CreateTrainingJob. Spécifiez les données d'image individuelle (fichiers .jpg ou .png) pour les canaux d'entraînement et de validation. Pour les données d'annotation, vous pouvez utiliser le format JSON. Spécifiez les fichiers .json correspondants dans les canaux train_annotation et validation_annotation. Définissez le type de contenu pour les quatre canaux au format image/png ou image/jpeg en fonction du type d'image. Vous pouvez également utiliser le type de contenu application/x-image lorsque votre ensemble de données contient à la fois des images .png et des images .jpg. Voici un exemple de fichier .json.

{ "file": "your_image_directory/sample_image1.jpg", "image_size": [ { "width": 500, "height": 400, "depth": 3 } ], "annotations": [ { "class_id": 0, "left": 111, "top": 134, "width": 61, "height": 128 }, { "class_id": 0, "left": 161, "top": 250, "width": 79, "height": 143 }, { "class_id": 1, "left": 101, "top": 185, "width": 42, "height": 130 } ], "categories": [ { "class_id": 0, "name": "dog" }, { "class_id": 1, "name": "cat" } ] }

Chaque image a besoin d'un fichier .json pour l'annotation et le fichier .json doit avoir le même nom que l'image correspondante. Le nom du fichier .json ci-dessus doit être « sample_image1.json ». Il existe quatre propriétés dans le fichier d'annotation .json. La propriété « fichier » spécifie le chemin d'accès relatif du fichier image. Par exemple, si vos images d'entraînement et les fichiers correspondants .json sont stockés dans s3://votre_compartiment/train/sample_image et s3://votre_compartiment/train_annotation, spécifiez le chemin d'accès de vos canaux d'entraînement et d'annotation_entraînement (train_annotation) sous la forme s3://votre_compartiment/train et s3://votre_compartiment/train_annotation, respectivement.

Dans le fichier .json, le chemin d'accès relatif d'une image nommée sample_image1.jpg doit être sample_image/sample_image1.jpg. La propriété "image_size" spécifie les dimensions de l'image globale. L'algorithme de détection d'objet SageMaker ne prend actuellement en charge que les images à trois canaux. La propriété "annotations" spécifie les catégories et les cadres de délimitation des objets au sein de l'image. Chaque objet est annotée par un index "class_id" et par quatre coordonnées du cadre de délimitation ("left", "top", "width", "height"). Les valeurs "left" (coordonnée x) et "top" (coordonnée y) représentent le coin supérieur gauche du cadre de délimitation. Les valeurs "width" (coordonnée x) et "height" (coordonnée y) représentent les dimensions du cadre de délimitation. L'origine (0, 0) est le coin supérieur gauche de la totalité de l'image. Si vous avez plusieurs objets dans une seule image, toutes les annotations doivent être incluses dans un seul fichier .json. La propriété "categories" stocke le mappage entre l'index de la classe et le nom de la classe. Les indices de la classe doivent être numérotés successivement, la numérotation commençant à 0. La propriété "categories" est facultative pour le fichier .json d'annotation.

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, où chaque ligne représente un exemple. Les images sont spécifiées à l'aide de la balise '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, les "AttributeNames figurent dans la liste ["source-ref", "bounding-box"] :

{"source-ref": "s3://your_bucket/image1.jpg", "bounding-box":{"image_size":[{ "width": 500, "height": 400, "depth":3}], "annotations":[{"class_id": 0, "left": 111, "top": 134, "width": 61, "height": 128}, {"class_id": 5, "left": 161, "top": 250, "width": 80, "height": 50}]}, "bounding-box-metadata":{"class-map":{"0": "dog", "5": "horse"}, "type": "groundtruth/object-detection"}} {"source-ref": "s3://your_bucket/image2.jpg", "bounding-box":{"image_size":[{ "width": 400, "height": 300, "depth":3}], "annotations":[{"class_id": 1, "left": 100, "top": 120, "width": 43, "height": 78}]}, "bounding-box-metadata":{"class-map":{"1": "cat"}, "type": "groundtruth/object-detection"}}

L'ordre des "AttributeNames" dans les fichiers d'entrée est important lors de l'entraînement de l'algorithme de détection d'objet. Ce dernier accepte les données acheminées dans un ordre spécifique, avec image en premier, suivi de annotations. Les AttributeNames de cet exemple sont donc fournis avec "source-ref" en premier, suivi de "bounding-box". Lorsque vous utilisez la détection d'objets avec manifeste augmenté, la valeur de paramètre RecordWrapperType doit être définie en tant que "RecordIO".

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 détection d'objets SageMaker peuvent être alimentés uniquement avec un autre modèle de détection d'objets 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 modèle (model) doivent être identiques à celles des paramètres d'entrée base_network 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 plus d'informations sur l'entraînement incrémentiel et pour obtenir des instructions sur son utilisation, consultez Entraînement progressif dans Amazon SageMaker.

Recommandation sur les instances EC2 pour l'algorithme de détection d'objet

Pour la détection d'objet, 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. Vous pouvez également exécuter l'algorithme sur plusieurs GPU et des paramètres multi-machines pour un entraînement distribué. Cependant, les instances CPU (comme C5 et M5) et GPU (P2 et P3) peuvent toutes deux être utilisées pour l'inférence. Tous les types d'instances pris en charge pour l'inférence sont détaillés sur Types d'instances ML Amazon SageMaker.

Exemples de blocs-notes de détection d'objet

Pour obtenir un exemple de bloc-notes qui montre comment utiliser l'algorithme de détection d'objets SageMaker pour entraîner et héberger un modèle sur le jeu de données

Oiseaux Caltech (CUB 200 2011) à l'aide de l'algorithme SSD (Single Shot Detector), veuillez consulter Amazon SageMaker Object Detection for Bird Species (Détection d'objets Amazon SageMaker pour les espèces d'oiseaux). Pour savoir comment créer des instances de blocs-notes Jupyter et y accéder afin de les utiliser pour exécuter l'exemple dans SageMaker, consultez Utilisation des instances de bloc-notes Amazon SageMaker. Une fois que vous avez créé une instance de bloc-notes et que vous l'avez ouverte, sélectionnez l'onglet SageMaker Examples (Exemples SageMaker) pour afficher la liste de tous les exemples SageMaker. L'exemple de bloc-notes de détection d'objets à l'aide de l'algorithme de détection d'objets se trouve dans la section Présentation des algorithmes Amazon . Pour ouvrir un bloc-notes, cliquez sur son onglet Use (Utiliser) et sélectionnez Create copy (Créer une copie).