Crear un archivo de manifiesto a partir de un CSV archivo - Rekognition

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Crear un archivo de manifiesto a partir de un CSV archivo

Este script de Python de ejemplo simplifica la creación de un archivo de manifiesto mediante el uso de un archivo de valores separados por comas (CSV) para etiquetar las imágenes. Usted crea el CSV archivo. El archivo de manifiesto se puede usar para la clasificación de imágenes de etiquetas múltiples o Clasificación de imágenes de etiquetas múltiples. Para obtener más información, consulte Buscar objetos, escenas y conceptos.

nota

Este script no crea un archivo de manifiesto adecuado para buscar ubicaciones de objetos o ubicaciones de marcas.

El archivo de manifiesto describe las imágenes utilizadas para entrenar un modelo. Por ejemplo, las ubicaciones de las imágenes y las etiquetas asignadas a las imágenes. Un archivo de manifiesto se compone de una o más JSON líneas. Cada JSON línea describe una sola imagen. Para obtener más información, consulte Importación de etiquetas a nivel de imagen en archivos de manifiesto.

Un CSV archivo representa datos tabulares en varias filas de un archivo de texto. Los campos de las filas están separados por comas. Para obtener más información, consulte valores separados por comas. En este script, cada fila del CSV archivo representa una sola imagen y se asigna a una JSON línea del archivo de manifiesto. Para crear un CSV archivo de manifiesto que admita la clasificación de imágenes con varias etiquetas, añada una o más etiquetas a nivel de imagen a cada fila. Para crear un archivo de manifiesto adecuado para Clasificación de imágenes, agregue una sola etiqueta de imagen a cada fila.

Por ejemplo, en el siguiente CSV archivo se describen las imágenes del proyecto Getting Clasificación de imágenes de etiquetas múltiples Started (Flowers).

camellia1.jpg,camellia,with_leaves camellia2.jpg,camellia,with_leaves camellia3.jpg,camellia,without_leaves helleborus1.jpg,helleborus,without_leaves,not_fully_grown helleborus2.jpg,helleborus,with_leaves,fully_grown helleborus3.jpg,helleborus,with_leaves,fully_grown jonquil1.jpg,jonquil,with_leaves jonquil2.jpg,jonquil,with_leaves jonquil3.jpg,jonquil,with_leaves jonquil4.jpg,jonquil,without_leaves mauve_honey_myrtle1.jpg,mauve_honey_myrtle,without_leaves mauve_honey_myrtle2.jpg,mauve_honey_myrtle,with_leaves mauve_honey_myrtle3.jpg,mauve_honey_myrtle,with_leaves mediterranean_spurge1.jpg,mediterranean_spurge,with_leaves mediterranean_spurge2.jpg,mediterranean_spurge,without_leaves

El script genera JSON líneas para cada fila. Por ejemplo, la siguiente es la JSON línea de la primera fila (camellia1.jpg,camellia,with_leaves).

{"source-ref": "s3://bucket/flowers/train/camellia1.jpg","camellia": 1,"camellia-metadata":{"confidence": 1,"job-name": "labeling-job/camellia","class-name": "camellia","human-annotated": "yes","creation-date": "2022-01-21T14:21:05","type": "groundtruth/image-classification"},"with_leaves": 1,"with_leaves-metadata":{"confidence": 1,"job-name": "labeling-job/with_leaves","class-name": "with_leaves","human-annotated": "yes","creation-date": "2022-01-21T14:21:05","type": "groundtruth/image-classification"}}

En el ejemploCSV, la ruta de Amazon S3 a la imagen no está presente. Si el CSV archivo no incluye la ruta de Amazon S3 para las imágenes, utilice el argumento de la línea de --s3_path comandos para especificar la ruta de Amazon S3 a la imagen.

El script graba la primera entrada de cada imagen en un archivo de imagen CSV deduplicado. El CSV archivo de imagen deduplicada contiene una sola instancia de cada imagen que se encuentra en el archivo de entrada. CSV Las demás apariciones de una imagen en el CSV archivo de entrada se graban en un archivo de imagen CSV duplicado. Si el script encuentra imágenes duplicadas, revise el archivo de imagen duplicada y actualice el CSV archivo de imagen deduplicada según sea CSV necesario. Vuelva a ejecutar el script con el archivo deduplicado. Si no se encuentra ningún duplicado en el archivo de entrada, el script elimina el CSV archivo de imagen deduplicada y la imagen CSV duplicada, ya que están vacíos. CSVfile

En este procedimiento, se crea el CSV archivo y se ejecuta el script de Python para crear el archivo de manifiesto.

Para crear un archivo de manifiesto a partir de un CSV archivo
  1. Cree un CSV archivo con los siguientes campos en cada fila (una fila por imagen). No añada una fila de encabezado al CSV archivo.

    Campo 1 Campo 2 Campo n

    El nombre de la imagen o la ruta de Amazon S3 de la imagen. Por ejemplo, s3://my-bucket/flowers/train/camellia1.jpg. No se pueden mezclar imágenes con la ruta de Amazon S3 e imágenes sin dicha ruta.

    La primera etiqueta de imagen de la imagen.

    Una o varias etiquetas adicionales de imagen separadas por comas. Añádalas solo si desea crear un archivo de manifiesto que admita la clasificación de imágenes con etiquetas múltiples.

    Por ejemplo, camellia1.jpg,camellia,with_leaves o s3://my-bucket/flowers/train/camellia1.jpg,camellia,with_leaves

  2. Guarde el archivo CSV.

  3. Ejecute el siguiente script de Python. Proporcione los siguientes argumentos:

    • csv_file— El CSV archivo que creó en el paso 1.

    • manifest_file: El nombre del archivo de manifiesto que desea crear.

    • (Opcional)--s3_path s3://path_to_folder/: la ruta de Amazon S3 que se quiera agregar de los archivos de imagen (campo 1). Use --s3_path si las imágenes del campo 1 aún no contienen una ruta de S3.

    # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 from datetime import datetime, timezone import argparse import logging import csv import os import json """ Purpose Amazon Rekognition Custom Labels model example used in the service documentation. Shows how to create an image-level (classification) manifest file from a CSV file. You can specify multiple image level labels per image. CSV file format is image,label,label,.. If necessary, use the bucket argument to specify the S3 bucket folder for the images. https://docs.aws.amazon.com/rekognition/latest/customlabels-dg/md-gt-cl-transform.html """ logger = logging.getLogger(__name__) def check_duplicates(csv_file, deduplicated_file, duplicates_file): """ Checks for duplicate images in a CSV file. If duplicate images are found, deduplicated_file is the deduplicated CSV file - only the first occurence of a duplicate is recorded. Other duplicates are recorded in duplicates_file. :param csv_file: The source CSV file. :param deduplicated_file: The deduplicated CSV file to create. If no duplicates are found this file is removed. :param duplicates_file: The duplicate images CSV file to create. If no duplicates are found this file is removed. :return: True if duplicates are found, otherwise false. """ logger.info("Deduplicating %s", csv_file) duplicates_found = False # Find duplicates. with open(csv_file, 'r', newline='', encoding="UTF-8") as f,\ open(deduplicated_file, 'w', encoding="UTF-8") as dedup,\ open(duplicates_file, 'w', encoding="UTF-8") as duplicates: reader = csv.reader(f, delimiter=',') dedup_writer = csv.writer(dedup) duplicates_writer = csv.writer(duplicates) entries = set() for row in reader: # Skip empty lines. if not ''.join(row).strip(): continue key = row[0] if key not in entries: dedup_writer.writerow(row) entries.add(key) else: duplicates_writer.writerow(row) duplicates_found = True if duplicates_found: logger.info("Duplicates found check %s", duplicates_file) else: os.remove(duplicates_file) os.remove(deduplicated_file) return duplicates_found def create_manifest_file(csv_file, manifest_file, s3_path): """ Reads a CSV file and creates a Custom Labels classification manifest file. :param csv_file: The source CSV file. :param manifest_file: The name of the manifest file to create. :param s3_path: The S3 path to the folder that contains the images. """ logger.info("Processing CSV file %s", csv_file) image_count = 0 label_count = 0 with open(csv_file, newline='', encoding="UTF-8") as csvfile,\ open(manifest_file, "w", encoding="UTF-8") as output_file: image_classifications = csv.reader( csvfile, delimiter=',', quotechar='|') # Process each row (image) in CSV file. for row in image_classifications: source_ref = str(s3_path)+row[0] image_count += 1 # Create JSON for image source ref. json_line = {} json_line['source-ref'] = source_ref # Process each image level label. for index in range(1, len(row)): image_level_label = row[index] # Skip empty columns. if image_level_label == '': continue label_count += 1 # Create the JSON line metadata. json_line[image_level_label] = 1 metadata = {} metadata['confidence'] = 1 metadata['job-name'] = 'labeling-job/' + image_level_label metadata['class-name'] = image_level_label metadata['human-annotated'] = "yes" metadata['creation-date'] = \ datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%S.%f') metadata['type'] = "groundtruth/image-classification" json_line[f'{image_level_label}-metadata'] = metadata # Write the image JSON Line. output_file.write(json.dumps(json_line)) output_file.write('\n') output_file.close() logger.info("Finished creating manifest file %s\nImages: %s\nLabels: %s", manifest_file, image_count, label_count) return image_count, label_count def add_arguments(parser): """ Adds command line arguments to the parser. :param parser: The command line parser. """ parser.add_argument( "csv_file", help="The CSV file that you want to process." ) parser.add_argument( "--s3_path", help="The S3 bucket and folder path for the images." " If not supplied, column 1 is assumed to include the S3 path.", required=False ) def main(): logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") try: # Get command line arguments parser = argparse.ArgumentParser(usage=argparse.SUPPRESS) add_arguments(parser) args = parser.parse_args() s3_path = args.s3_path if s3_path is None: s3_path = '' # Create file names. csv_file = args.csv_file file_name = os.path.splitext(csv_file)[0] manifest_file = f'{file_name}.manifest' duplicates_file = f'{file_name}-duplicates.csv' deduplicated_file = f'{file_name}-deduplicated.csv' # Create manifest file, if there are no duplicate images. if check_duplicates(csv_file, deduplicated_file, duplicates_file): print(f"Duplicates found. Use {duplicates_file} to view duplicates " f"and then update {deduplicated_file}. ") print(f"{deduplicated_file} contains the first occurence of a duplicate. " "Update as necessary with the correct label information.") print(f"Re-run the script with {deduplicated_file}") else: print("No duplicates found. Creating manifest file.") image_count, label_count = create_manifest_file(csv_file, manifest_file, s3_path) print(f"Finished creating manifest file: {manifest_file} \n" f"Images: {image_count}\nLabels: {label_count}") except FileNotFoundError as err: logger.exception("File not found: %s", err) print(f"File not found: {err}. Check your input CSV file.") if __name__ == "__main__": main()
  4. Si tiene pensado usar un conjunto de datos de prueba, repita los pasos del 1 al 3 para crear un archivo de manifiesto para su conjunto de datos de prueba.

  5. Si es necesario, copie las imágenes en la ruta del bucket de Amazon S3 que especificó en la columna 1 del CSV archivo (o que especificó en la línea de --s3_path comandos). Puede utilizar el siguiente comando de AWS S3.

    aws s3 cp --recursive your-local-folder s3://your-target-S3-location
  6. Cargue los archivos de manifiesto en el bucket de Amazon S3 que desee utilizar para almacenar el archivo de manifiesto.

    nota

    Asegúrese de que Amazon Rekognition Custom Labels tenga acceso al depósito de Amazon S3 al que se hace referencia source-ref en el campo de las líneas del archivo de manifiesto. JSON Para obtener más información, consulte Acceso a buckets de Amazon S3 externos. Si el trabajo en Ground Truth almacena imágenes en el bucket de consola de Etiquetas personalizadas de Amazon Rekognition, no necesitará agregar permisos.

  7. Siga las instrucciones que aparecen en Creación de un conjunto de datos con un archivo de manifiesto de SageMaker Ground Truth (consola) para crear un conjunto de datos con el archivo de manifiesto cargado. Para el paso 8, en la ubicación del archivo.manifest, introduzca Amazon S3 URL como ubicación del archivo de manifiesto. Si está utilizando el AWS SDK, hágaloCrear un conjunto de datos con un archivo de manifiesto de SageMaker Ground Truth (SDK).