3
votes

ClientError: le canal de train n'est pas spécifié avec AWS object_detection_augmented_manifest_training à l'aide d'images de vérité terrain

J'ai terminé un travail d'étiquetage dans AWS terrain vérité et j'ai commencé à travailler sur le modèle de bloc-notes pour la détection d'objets.

J'ai 2 manifestes qui ont 293 images étiquetées pour les oiseaux dans un train et un ensemble de validation comme celui-ci: p >

{"label_width": "350", "early_stopping_min_epochs": "10", "epochs": "5", "overlap_threshold": "0.5", "lr_scheduler_factor": "0.1", "_num_kv_servers": "auto", "weight_decay": "0.0005", "mini_batch_size": "1", "use_pretrained_model": "1", "freeze_layer_pattern": "", "lr_scheduler_step": "3,6", "early_stopping": "False", "early_stopping_patience": "5", "momentum": "0.9", "num_training_samples": "11", "optimizer": "rmsprop", "_tuning_objective_metric": "", "early_stopping_tolerance": "0.0", "learning_rate": "0.001", "kv_store": "device", "nms_threshold": "0.45", "num_classes": "1", "base_network": "resnet-50", "nms_topk": "400", "_kvstore": "device", "image_shape": "300"}

Voici les paramètres que j'utilise pour l'instance de notebook:

Line 1
{"source-ref":"s3://XXXXX/Train/Blackbird_1.JPG","TrainBird":{"annotations":[{"class_id":0,"width":1613,"top":840,"height":766,"left":1293}],"image_size":[{"width":3872,"depth":3,"height":2592}]},"TrainBird-metadata":{"job-name":"labeling-job/trainbird","class-map":{"0":"Blackbird"},"human-annotated":"yes","objects":[{"confidence":0.09}],"creation-date":"2019-02-09T14:21:29.829003","type":"groundtruth/object-detection"}}


Line 2
{"source-ref":"s3://xxxxx/Train/Blackbird_2.JPG","TrainBird":{"annotations":[{"class_id":0,"width":897,"top":665,"height":1601,"left":1598}],"image_size":[{"width":3872,"depth":3,"height":2592}]},"TrainBird-metadata":{"job-name":"labeling-job/trainbird","class-map":{"0":"Blackbird"},"human-annotated":"yes","objects":[{"confidence":0.09}],"creation-date":"2019-02-09T14:22:34.502274","type":"groundtruth/object-detection"}}


Line 3
{"source-ref":"s3://XXXXX/Train/Blackbird_3.JPG","TrainBird":{"annotations":[{"class_id":0,"width":1040,"top":509,"height":1695,"left":1548}],"image_size":[{"width":3872,"depth":3,"height":2592}]},"TrainBird-metadata":{"job-name":"labeling-job/trainbird","class-map":{"0":"Blackbird"},"human-annotated":"yes","objects":[{"confidence":0.09}],"creation-date":"2019-02-09T14:20:26.660164","type":"groundtruth/object-detection"}}

Je finirais par être imprimé après avoir exécuté mon ml.p3.2xlarge instance:

training_params = \
{
    "AlgorithmSpecification": {
        "TrainingImage": training_image, # NB. This is one of the named constants defined in the first cell.
        "TrainingInputMode": "Pipe"
    },
    "RoleArn": role,
    "OutputDataConfig": {
        "S3OutputPath": s3_output_path
    },
    "ResourceConfig": {
        "InstanceCount": 1,   
        "InstanceType": "ml.p3.2xlarge",
        "VolumeSizeInGB": 50
    },
    "TrainingJobName": job_name,
    "HyperParameters": { # NB. These hyperparameters are at the user's discretion and are beyond the scope of this demo.
         "base_network": "resnet-50",
         "use_pretrained_model": "1",
         "num_classes": "3",
         "mini_batch_size": "1",
         "epochs": "5",
         "learning_rate": "0.001",
         "lr_scheduler_step": "3,6",
         "lr_scheduler_factor": "0.1",
         "optimizer": "rmsprop",
         "momentum": "0.9",
         "weight_decay": "0.0005",
         "overlap_threshold": "0.5",
         "nms_threshold": "0.45",
         "image_shape": "300",
         "label_width": "350",
         "num_training_samples": str(num_training_samples)
    },
    "StoppingCondition": {
        "MaxRuntimeInSeconds": 86400
    },
    "InputDataConfig": [
        {
            "ChannelName": "train",
            "DataSource": {
                "S3DataSource": {
                    "S3DataType": "AugmentedManifestFile", # NB. Augmented Manifest
                    "S3Uri": s3_train_data_path,
                    "S3DataDistributionType": "FullyReplicated",
                    "AttributeNames": attribute_names # NB. This must correspond to the JSON field names in your **TRAIN** augmented manifest.
                }
            },
            "ContentType": "application/x-recordio",
            "RecordWrapperType": "RecordIO",
            "CompressionType": "None"
        },
        {
            "ChannelName": "validation",
            "DataSource": {
                "S3DataSource": {
                    "S3DataType": "AugmentedManifestFile", # NB. Augmented Manifest
                    "S3Uri": s3_validation_data_path,
                    "S3DataDistributionType": "FullyReplicated",
                    "AttributeNames": ["source-ref","ValidateBird"] # NB. This must correspond to the JSON field names in your **VALIDATION** augmented manifest.
                }
            },
            "ContentType": "application/x-recordio",
            "RecordWrapperType": "RecordIO",
            "CompressionType": "None"
        }
    ]
}

Suivi de ce message d'erreur: 'ClientError: le canal de train n'est pas spécifié.'

Quelqu'un a-t-il des idées sur la façon dont je peux faire fonctionner cela sans erreur? Toute aide est très appréciée!

Exécution réussie: Voici les paramètres qui ont été utilisés, ainsi que les objets JSON du manifeste augmenté pour une exécution réussie.

InProgress Starting
InProgress Starting
InProgress Starting
InProgress Training
Failed Failed

Fichier manifeste augmenté d'entraînement généré lors de l'exécution de la tâche d'entraînement

training_params = \
{
    "AlgorithmSpecification": {
        "TrainingImage": training_image, # NB. This is one of the named constants defined in the first cell.
        "TrainingInputMode": "Pipe"
    },
    "RoleArn": role,
    "OutputDataConfig": {
        "S3OutputPath": s3_output_path
    },
    "ResourceConfig": {
        "InstanceCount": 1,   
        "InstanceType": "ml.p3.2xlarge",
        "VolumeSizeInGB": 5
    },
    "TrainingJobName": job_name,
    "HyperParameters": { # NB. These hyperparameters are at the user's discretion and are beyond the scope of this demo.
         "base_network": "resnet-50",
         "use_pretrained_model": "1",
         "num_classes": "1",
         "mini_batch_size": "16",
         "epochs": "5",
         "learning_rate": "0.001",
         "lr_scheduler_step": "3,6",
         "lr_scheduler_factor": "0.1",
         "optimizer": "rmsprop",
         "momentum": "0.9",
         "weight_decay": "0.0005",
         "overlap_threshold": "0.5",
         "nms_threshold": "0.45",
         "image_shape": "300",
         "label_width": "350",
         "num_training_samples": str(num_training_samples)
    },
    "StoppingCondition": {
        "MaxRuntimeInSeconds": 86400
    },
 "InputDataConfig": [
    {
        "ChannelName": "train",
        "DataSource": {
            "S3DataSource": {
                "S3DataType": "AugmentedManifestFile", # NB. Augmented Manifest
                "S3Uri": s3_train_data_path,
                "S3DataDistributionType": "FullyReplicated",
                "AttributeNames": ["source-ref","Bird-Label-Train"] # NB. This must correspond to the JSON field names in your augmented manifest.
            }
        },
        "ContentType": "image/jpeg",
        "RecordWrapperType": "None",
        "CompressionType": "None"
    },
    {
        "ChannelName": "validation",
        "DataSource": {
            "S3DataSource": {
                "S3DataType": "AugmentedManifestFile", # NB. Augmented Manifest
                "S3Uri": s3_validation_data_path,
                "S3DataDistributionType": "FullyReplicated",
                "AttributeNames": ["source-ref","Bird-Label"] # NB. This must correspond to the JSON field names in your augmented manifest.
            }
        },
        "ContentType": "image/jpeg",
        "RecordWrapperType": "None",
        "CompressionType": "None"
    }
]

Je décompresse ensuite le fichier model.tar pour obtenir les fichiers suivants: hyperparams .JSON, model_algo_1-0000.params et model_algo_1-symbol

hyperparams.JSON ressemble à ceci:

{"source-ref":"s3://XXXXXXX/Train/Blackbird_1.JPG","Bird-Label-Train":{"workerId":XXXXXXXX,"imageSource":{"s3Uri":"s3://XXXXXXX/Train/Blackbird_1.JPG"},"boxesInfo":{"annotatedResult":{"boundingBoxes":[{"width":1612,"top":841,"label":"Blackbird","left":1276,"height":757}],"inputImageProperties":{"width":3872,"height":2592}}}},"Bird-Label-Train-metadata":{"type":"groundtruth/custom","job-name":"bird-label-train","human-annotated":"yes","creation-date":"2019-01-16T17:28:23+0000"}}


0 commentaires

3 Réponses :


1
votes

Le paramètre 'AttributeNames' doit être ['source-ref', 'your label here'] à la fois dans votre train et votre canal de validation


1 commentaires

Salut Nilav, j'ai apporté de légères modifications au contenu ci-dessus. Je reçois toujours le même résultat. Est-ce que j'étiquette mal la partie «votre étiquette ici»? J'ai 7 étiquettes différentes pour les oiseaux et j'avais utilisé le nom du travail d'étiquetage pour cet attribut (qui correspond aux exemples que j'ai vus). Mon ensemble de données de train et de validation a également subi 2 tâches d'étiquetage différentes, d'où les deux attributs différents entre eux.



2
votes

Malheureusement, le mode pipe avec AugmentedManifestFile n'est pas pris en charge pour le type de contenu image / jpeg . Pour pouvoir utiliser cette fonctionnalité, vous devrez spécifier RecordWrapperType comme RecordIO et ContentType comme application / x-recordio .


0 commentaires

1
votes

Merci encore pour votre aide. Tout cela était valable pour m'aider à aller plus loin. Après avoir reçu une réponse sur les pages du forum AWS, je l'ai finalement fait fonctionner.

J'ai compris que mon JSON était légèrement différent du guide de formation du manifeste augmenté. Après être revenu à l'essentiel, j'ai créé un autre travail d'étiquetage, mais j'ai utilisé le type «Bounding Box» par opposition au «Custom - Bounding box template». Ma sortie correspondait à ce qui était attendu. Cela s'est déroulé sans erreur!

Comme mon but était d'avoir plusieurs étiquettes, j'ai pu modifier les fichiers et le mappage de mes manifestes de sortie, ce qui a également fonctionné!

ie p>

{"source-ref":"s3://xxxxx/Blackbird_15.JPG","ValidateBird":{"annotations":[{"class_id":0,"width":2023,"top":665,"height":1421,"left":1312}],"image_size":[{"width":3872,"depth":3,"height":2592}]},"ValidateBird-metadata":{"job-name":"labeling-job/validatebird","class-map":{"0":"Blackbird"},"human-annotated":"yes","objects":[{"confidence":0.09}],"creation-date":"2019-02-09T14:23:51.174131","type":"groundtruth/object-detection"}}
{"source-ref":"s3://xxxx/Pigeon_19.JPG","ValidateBird":{"annotations":[{"class_id":2,"width":784,"top":634,"height":1657,"left":1306}],"image_size":[{"width":3872,"depth":3,"height":2592}]},"ValidateBird-metadata":{"job-name":"labeling-job/validatebird","class-map":{"2":"Pigeon"},"human-annotated":"yes","objects":[{"confidence":0.09}],"creation-date":"2019-02-09T14:23:51.074809","type":"groundtruth/object-detection"}} 

Le mappage d'origine était 0: 'Oiseau' pour toutes les images via la tâche d'étiquetage.


7 commentaires

Pouvez-vous publier le JSON CreateTrainingJob complet qui a fonctionné pour vous? Nous luttons contre le même problème, et notre format AugmentedManifestFile semble correspondre à ce que vous avez publié ici. Lors du passage au format RecordIO, nous obtenons une erreur différente 'ClientError: Got empty batch from pipe'. Vous cherchez à voir ce que vous avez fait différemment pour que votre travail fonctionne.


Salut Ryan, j'ai publié des informations supplémentaires. J'espère que cela t'aides! Si vous avez besoin de plus, faites-le moi savoir.


Je cherchais en fait la version finale du JSON d'entrée (pas le fichier manifeste). Dans votre question initiale, vous avez posté ceci comme suit: training_params = \ {"AlgorithmSpecification": {"TrainingImage": training_image, # NB. Il s'agit de l'une des constantes nommées définies dans la première cellule. "TrainingInputMode": "Pipe"


Toutes mes excuses! J'ai également téléchargé plus d'informations sur les fichiers de sortie de ce travail de formation.


Je n'ai pas pu trouver ce fichier JSON qui n'est pas un fichier manifeste. Pourriez-vous être un peu plus précis. Les seuls fichiers qui ont été saisis étaient des fichiers manifestes augmentés (formation et validation).


Vous obtiendrez ce JSON en appelant aws sagemaker describe-training-job --training-job-name '' , où est le nom d'un travail de formation SageMaker réussi.


Je m'excuse vraiment, je suis très nouveau dans aws, mais heureux d'aider si possible. Faites-vous référence au JSON que j'ai publié dans le message d'origine? - ce qui est décompressé à partir de mon fichier model.tar créé à partir de mon travail d'entraînement réussi. Sinon, savez-vous quel serait le chemin du compartiment S3 pour ce fichier qui vous intéresse?