Transformation d'un COCO jeu de données - Rekognition

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Transformation d'un COCO jeu de données

Utilisez l'exemple Python suivant pour transformer les informations du cadre de délimitation d'un ensemble de données de COCO format en un fichier manifeste Amazon Rekognition Custom Labels. Le code charge le fichier manifeste créé dans votre compartiment Amazon S3. Le code fournit également une AWS CLI commande que vous pouvez utiliser pour télécharger vos images.

Pour transformer un COCO ensemble de données (SDK)
  1. Si vous ne l’avez pas déjà fait :

    1. Vérifiez que vous disposez des autorisations AmazonS3FullAccess. Pour de plus amples informations, veuillez consulter Configurer les SDK autorisations.

    2. Installez et configurez le AWS CLI et le AWS SDKs. Pour de plus amples informations, veuillez consulter Étape 4 : Configurez le AWS CLI and AWS SDKs.

  2. Utilisez le code Python suivant pour transformer un COCO ensemble de données. Définissez les valeurs suivantes.

    • s3_bucket : nom du compartiment S3 dans lequel vous souhaitez stocker les images et le fichier manifeste Étiquettes personnalisées Amazon Rekognition.

    • s3_key_path_images : chemin d’accès vers l’endroit où vous souhaitez placer les images dans le compartiment S3 (s3_bucket).

    • s3_key_path_manifest_file : chemin d’accès vers l’endroit où vous souhaitez placer le fichier manifeste Étiquettes personnalisées dans le compartiment S3 (s3_bucket).

    • local_path— Le chemin local vers lequel l'exemple ouvre le jeu de COCO données en entrée et enregistre également le nouveau fichier manifeste des étiquettes personnalisées.

    • local_images_path : chemin local vers les images que vous souhaitez utiliser pour l’entraînement.

    • coco_manifest— Nom du fichier du COCO jeu de données en entrée.

    • cl_manifest_file : nom du fichier manifeste créé par l’exemple. Ce fichier est enregistré à l’emplacement indiqué par local_path. Par convention, il possède l’extension .manifest, mais cela n’est pas obligatoire.

    • job_name : nom de la tâche Étiquettes personnalisées.

    import json import os import random import shutil import datetime import botocore import boto3 import PIL.Image as Image import io #S3 location for images s3_bucket = 'bucket' s3_key_path_manifest_file = 'path to custom labels manifest file/' s3_key_path_images = 'path to images/' s3_path='s3://' + s3_bucket + '/' + s3_key_path_images s3 = boto3.resource('s3') #Local file information local_path='path to input COCO dataset and output Custom Labels manifest/' local_images_path='path to COCO images/' coco_manifest = 'COCO dataset JSON file name' coco_json_file = local_path + coco_manifest job_name='Custom Labels job name' cl_manifest_file = 'custom_labels.manifest' label_attribute ='bounding-box' open(local_path + cl_manifest_file, 'w').close() # class representing a Custom Label JSON line for an image class cl_json_line: def __init__(self,job, img): #Get image info. Annotations are dealt with seperately sizes=[] image_size={} image_size["width"] = img["width"] image_size["depth"] = 3 image_size["height"] = img["height"] sizes.append(image_size) bounding_box={} bounding_box["annotations"] = [] bounding_box["image_size"] = sizes self.__dict__["source-ref"] = s3_path + img['file_name'] self.__dict__[job] = bounding_box #get metadata metadata = {} metadata['job-name'] = job_name metadata['class-map'] = {} metadata['human-annotated']='yes' metadata['objects'] = [] date_time_obj = datetime.datetime.strptime(img['date_captured'], '%Y-%m-%d %H:%M:%S') metadata['creation-date']= date_time_obj.strftime('%Y-%m-%dT%H:%M:%S') metadata['type']='groundtruth/object-detection' self.__dict__[job + '-metadata'] = metadata print("Getting image, annotations, and categories from COCO file...") with open(coco_json_file) as f: #Get custom label compatible info js = json.load(f) images = js['images'] categories = js['categories'] annotations = js['annotations'] print('Images: ' + str(len(images))) print('annotations: ' + str(len(annotations))) print('categories: ' + str(len (categories))) print("Creating CL JSON lines...") images_dict = {image['id']: cl_json_line(label_attribute, image) for image in images} print('Parsing annotations...') for annotation in annotations: image=images_dict[annotation['image_id']] cl_annotation = {} cl_class_map={} # get bounding box information cl_bounding_box={} cl_bounding_box['left'] = annotation['bbox'][0] cl_bounding_box['top'] = annotation['bbox'][1] cl_bounding_box['width'] = annotation['bbox'][2] cl_bounding_box['height'] = annotation['bbox'][3] cl_bounding_box['class_id'] = annotation['category_id'] getattr(image, label_attribute)['annotations'].append(cl_bounding_box) for category in categories: if annotation['category_id'] == category['id']: getattr(image, label_attribute + '-metadata')['class-map'][category['id']]=category['name'] cl_object={} cl_object['confidence'] = int(1) #not currently used by Custom Labels getattr(image, label_attribute + '-metadata')['objects'].append(cl_object) print('Done parsing annotations') # Create manifest file. print('Writing Custom Labels manifest...') for im in images_dict.values(): with open(local_path+cl_manifest_file, 'a+') as outfile: json.dump(im.__dict__,outfile) outfile.write('\n') outfile.close() # Upload manifest file to S3 bucket. print ('Uploading Custom Labels manifest file to S3 bucket') print('Uploading' + local_path + cl_manifest_file + ' to ' + s3_key_path_manifest_file) print(s3_bucket) s3 = boto3.resource('s3') s3.Bucket(s3_bucket).upload_file(local_path + cl_manifest_file, s3_key_path_manifest_file + cl_manifest_file) # Print S3 URL to manifest file, print ('S3 URL Path to manifest file. ') print('\033[1m s3://' + s3_bucket + '/' + s3_key_path_manifest_file + cl_manifest_file + '\033[0m') # Display aws s3 sync command. print ('\nAWS CLI s3 sync command to upload your images to S3 bucket. ') print ('\033[1m aws s3 sync ' + local_images_path + ' ' + s3_path + '\033[0m')
  3. Exécutez le code.

  4. Dans la sortie du programme, notez la commande s3 sync. Vous en aurez besoin à l’étape suivante.

  5. À partir d’une invite de commande, exécutez la commande s3 sync. Vos images sont importées dans le compartiment S3. Si la commande échoue pendant le chargement, exécutez-la à nouveau jusqu’à ce que les images locales soient synchronisées avec le compartiment S3.

  6. Dans la sortie du programme, notez le URL chemin S3 vers le fichier manifeste. Vous en aurez besoin à l’étape suivante.

  7. Suivez les instructions sous Création d'un ensemble de données à l'aide d'un fichier manifeste de SageMaker Ground Truth (Console) pour créer un jeu de données avec le fichier manifeste chargé. Pour l'étape 8, dans l'emplacement du fichier .manifest, entrez l'Amazon S3 que URL vous avez noté à l'étape précédente. Si vous utilisez le AWS SDK, faites-leCréation d'un jeu de données avec un fichier manifeste de SageMaker Ground Truth (SDK).