Eine Klassifizierungsmanifestdatei aus einer CSV-Datei erstellen - Amazon Lookout für Vision

Hinweis zum Ende des Supports: Am 31. Oktober 2025 AWS wird der Support für Amazon Lookout for Vision eingestellt. Nach dem 31. Oktober 2025 können Sie nicht mehr auf die Lookout for Vision Vision-Konsole oder die Lookout for Vision Vision-Ressourcen zugreifen. Weitere Informationen finden Sie in diesem Blogbeitrag.

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Eine Klassifizierungsmanifestdatei aus einer CSV-Datei erstellen

Dieses Python-Beispielskript vereinfacht die Erstellung einer Klassifikationsmanifestdatei, indem es eine CSV-Datei (Comma Separated Values) zur Kennzeichnung von Bildern verwendet. So erstellen Sie die CSV-Datei

Eine Manifestdatei beschreibt die Bilder, die zum Trainieren eines Modells verwendet werden. Eine Manifestdatei besteht aus einer oder mehreren JSON-Zeilen. Jede JSON-Zeile beschreibt ein einzelnes Bild. Weitere Informationen finden Sie unter Definition von JSON-Zeilen für die Bildklassifizierung.

Eine CSV-Datei stellt tabellarische Daten über mehrere Zeilen in einer Textdatei dar. Felder in einer Zeile werden durch ein Komma getrennt. Weitere Informationen finden Sie unter Kommagetrennte Werte. Bei diesem Skript enthält jede Zeile in Ihrer CSV-Datei den S3-Speicherort eines Bilds und die Anomalieklassifizierung für das Bild (normaloderanomaly). Jede Zeile ist einer JSON-Zeile in der Manifestdatei zugeordnet.

In der folgenden CSV-Datei werden beispielsweise einige der Bilder in den Beispielbildern beschrieben.

s3://s3bucket/circuitboard/train/anomaly/train-anomaly_1.jpg,anomaly s3://s3bucket/circuitboard/train/anomaly/train-anomaly_10.jpg,anomaly s3://s3bucket/circuitboard/train/anomaly/train-anomaly_11.jpg,anomaly s3://s3bucket/circuitboard/train/normal/train-normal_1.jpg,normal s3://s3bucket/circuitboard/train/normal/train-normal_10.jpg,normal s3://s3bucket/circuitboard/train/normal/train-normal_11.jpg,normal

Das Skript generiert JSON-Zeilen für jede Zeile. Das Folgende ist beispielsweise die JSON-Zeile für die erste Zeile (s3://s3bucket/circuitboard/train/anomaly/train-anomaly_1.jpg,anomaly).

{"source-ref": "s3://s3bucket/csv_test/train_anomaly_1.jpg","anomaly-label": 1,"anomaly-label-metadata": {"confidence": 1,"job-name": "labeling-job/anomaly-classification","class-name": "anomaly","human-annotated": "yes","creation-date": "2022-02-04T22:47:07","type": "groundtruth/image-classification"}}

Wenn Ihre CSV-Datei den Amazon S3 S3-Pfad für die Bilder nicht enthält, verwenden Sie das --s3-path Befehlszeilenargument, um den Amazon S3-Pfad zu den Bildern anzugeben.

Vor der Erstellung der Manifestdatei sucht das Skript nach doppelten Bildern in der CSV-Datei und nach Bildklassifizierungen, bei denen es sich nicht um normal oder anomaly handelt. Wenn duplizierte Bilder oder Fehler bei der Bildklassifizierung gefunden werden, geht das Skript wie folgt vor:

  • Zeichnet den ersten gültigen Bildeintrag für alle Bilder in einer deduplizierten CSV-Datei auf.

  • Zeichnet doppelte Vorkommen eines Bilds in der Fehlerdatei auf.

  • Zeichnet Bildklassifizierungen auf, die nicht normal oder anomaly in der Fehlerdatei enthalten sind.

  • Erstellt keine Manifestdatei.

Die Fehlerdatei enthält die Zeilennummer, in der ein doppeltes Bild oder ein Klassifizierungsfehler in der CSV-Eingabedatei gefunden wurde. Verwenden Sie die CSV-Fehlerdatei, um die CSV-Eingabedatei zu aktualisieren, und führen Sie das Skript dann erneut aus. Verwenden Sie alternativ die CSV-Datei mit Fehlern, um die deduplizierte CSV-Datei zu aktualisieren, die nur eindeutige Bildeinträge und Bilder ohne Fehler bei der Bildklassifizierung enthält. Führen Sie das Skript mit der aktualisierten deduplizierten CSV-Datei erneut aus.

Wenn in der CSV-Eingabedatei keine Duplikate oder Fehler gefunden werden, löscht das Skript die deduplizierte CSV-Bilddatei und die Fehlerdatei, da sie leer sind.

In diesem Verfahren erstellen Sie die CSV-Datei und führen das Python-Skript aus, um die Manifestdatei zu erstellen. Das Skript wurde mit Python Version 3.7 getestet.

So erstellen Sie eine Manifestdatei aus einer CSV-Datei
  1. Erstellen Sie eine CSV-Datei mit den folgenden Feldern in jeder Zeile (eine Zeile pro Bild). Fügen Sie der CSV-Datei keine Kopfzeile hinzu.

    Feld 1 Feld 2

    Der Bildname oder der Amazon S3-Pfad des Bildes. Beispiel, s3://s3bucket/circuitboard/train/anomaly/train-anomaly_10.jpg. Sie können keine Mischung aus Bildern mit dem Amazon S3-Pfad und Bildern ohne ihn verwenden.

    Die Anomalieklassifizierung für das Bild (normaloderanomaly).

    Zum Beispiel s3://s3bucket/circuitboard/train/anomaly/image_10.jpg,anomaly oder image_11.jpg,normal

  2. Speichern Sie die CSV-Datei.

  3. Führen Sie das folgende Python-Skript aus. Stellen Sie die folgenden Argumente bereit:

    • csv_file – Die CSV-Datei, die Sie in Schritt 1 erstellt haben.

    • (Optional) --s3-path s3://path_to_folder/ – Der Amazon S3-Pfad, der den Bilddateinamen hinzugefügt werden soll (Feld 1). Verwenden Sie --s3-path, wenn die Bilder in Feld 1 noch keinen S3-Pfad enthalten.

    # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 """ Purpose Shows how to create an Amazon Lookout for Vision manifest file from a CSV file. The CSV file format is image location,anomaly classification (normal or anomaly) For example: s3://s3bucket/circuitboard/train/anomaly/train_11.jpg,anomaly s3://s3bucket/circuitboard/train/normal/train_1.jpg,normal If necessary, use the bucket argument to specify the Amazon S3 bucket folder for the images. """ from datetime import datetime, timezone import argparse import logging import csv import os import json logger = logging.getLogger(__name__) def check_errors(csv_file): """ Checks for duplicate images and incorrect classifications in a CSV file. If duplicate images or invalid anomaly assignments are found, an errors CSV file and deduplicated CSV file are created. Only the first occurrence of a duplicate is recorded. Other duplicates are recorded in the errors file. :param csv_file: The source CSV file :return: True if errors or duplicates are found, otherwise false. """ logger.info("Checking %s.", csv_file) errors_found = False errors_file = f"{os.path.splitext(csv_file)[0]}_errors.csv" deduplicated_file = f"{os.path.splitext(csv_file)[0]}_deduplicated.csv" with open(csv_file, 'r', encoding="UTF-8") as input_file,\ open(deduplicated_file, 'w', encoding="UTF-8") as dedup,\ open(errors_file, 'w', encoding="UTF-8") as errors: reader = csv.reader(input_file, delimiter=',') dedup_writer = csv.writer(dedup) error_writer = csv.writer(errors) line = 1 entries = set() for row in reader: # Skip empty lines. if not ''.join(row).strip(): continue # Record any incorrect classifications. if not row[1].lower() == "normal" and not row[1].lower() == "anomaly": error_writer.writerow( [line, row[0], row[1], "INVALID_CLASSIFICATION"]) errors_found = True # Write first image entry to dedup file and record duplicates. key = row[0] if key not in entries: dedup_writer.writerow(row) entries.add(key) else: error_writer.writerow([line, row[0], row[1], "DUPLICATE"]) errors_found = True line += 1 if errors_found: logger.info("Errors found check %s.", errors_file) else: os.remove(errors_file) os.remove(deduplicated_file) return errors_found def create_manifest_file(csv_file, manifest_file, s3_path): """ Read a CSV file and create an Amazon Lookout for Vision 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 Amazon S3 path to the folder that contains the images. """ logger.info("Processing CSV file %s.", csv_file) image_count = 0 anomalous_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 the CSV file. for row in image_classifications: # Skip empty lines. if not ''.join(row).strip(): continue source_ref = str(s3_path) + row[0] classification = 0 if row[1].lower() == 'anomaly': classification = 1 anomalous_count += 1 # Create the JSON line. json_line = {} json_line['source-ref'] = source_ref json_line['anomaly-label'] = str(classification) metadata = {} metadata['confidence'] = 1 metadata['job-name'] = "labeling-job/anomaly-classification" metadata['class-name'] = row[1] 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['anomaly-label-metadata'] = metadata output_file.write(json.dumps(json_line)) output_file.write('\n') image_count += 1 logger.info("Finished creating manifest file %s.\n" "Images: %s\nAnomalous: %s", manifest_file, image_count, anomalous_count) return image_count, anomalous_count def add_arguments(parser): """ Add 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 Amazon S3 bucket and folder path for the images." " If not supplied, column 1 is assumed to include the Amazon 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 = "" csv_file = args.csv_file csv_file_no_extension = os.path.splitext(csv_file)[0] manifest_file = csv_file_no_extension + '.manifest' # Create manifest file if there are no duplicate images. if check_errors(csv_file): print(f"Issues found. Use {csv_file_no_extension}_errors.csv "\ "to view duplicates and errors.") print(f"{csv_file}_deduplicated.csv contains the first"\ "occurrence of a duplicate.\n" "Update as necessary with the correct information.") print(f"Re-run the script with {csv_file_no_extension}_deduplicated.csv") else: print('No duplicates found. Creating manifest file.') image_count, anomalous_count = create_manifest_file(csv_file, manifest_file, s3_path) print(f"Finished creating manifest file: {manifest_file} \n") normal_count = image_count-anomalous_count print(f"Images processed: {image_count}") print(f"Normal: {normal_count}") print(f"Anomalous: {anomalous_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. Wenn doppelte Bilder oder Klassifizierungsfehler auftreten:

    1. Verwenden Sie die Fehlerdatei, um die deduplizierte CSV-Datei oder die CSV-Eingabedatei zu aktualisieren.

    2. Führen Sie das Skript erneut mit der aktualisierten deduplizierten CSV-Datei oder der aktualisierten CSV-Eingabedatei aus.

  5. Wenn Sie einen Testdatensatz verwenden möchten, wiederholen Sie die Schritte 1—4, um eine Manifestdatei für Ihren Testdatensatz zu erstellen.

  6. Kopieren Sie bei Bedarf die Bilder von Ihrem Computer in den Amazon S3 S3-Bucket-Pfad, den Sie in Spalte 1 der CSV-Datei (oder in der --s3-path Befehlszeile) angegeben haben. Um die Bilder zu kopieren, geben Sie in der Befehlszeile den folgenden Befehl ein.

    aws s3 cp --recursive your-local-folder/ s3://your-target-S3-location/
  7. Folgen Sie den Anweisungen unterEinen Datensatz mit einer Manifestdatei erstellen (Konsole), um einen Datensatz zu erstellen. Wenn Sie das AWS SDK verwenden, finden Sie weitere Informationen unterEinen Datensatz mit einer Manifestdatei (SDK) erstellen.