Membuat file manifes klasifikasi dari CSV file - Amazon Lookout for Vision

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Membuat file manifes klasifikasi dari CSV file

Contoh skrip Python ini menyederhanakan pembuatan file manifes klasifikasi dengan menggunakan file Comma Separated Values (CSV) untuk memberi label gambar. Anda membuat CSV file.

File manifes menjelaskan gambar yang digunakan untuk melatih model. File manifes terdiri dari satu atau lebih JSON baris. Setiap JSON baris menggambarkan satu gambar. Untuk informasi selengkapnya, lihat Mendefinisikan JSON garis untuk klasifikasi gambar.

CSVFile mewakili data tabular selama beberapa baris dalam file teks. Bidang pada baris dipisahkan dengan koma. Untuk informasi selengkapnya, lihat nilai yang dipisahkan koma. Untuk skrip ini, setiap baris dalam CSV file Anda menyertakan lokasi S3 gambar dan klasifikasi anomali untuk gambar (normalatau). anomaly Setiap baris memetakan ke JSON Baris dalam file manifes.

Sebagai contoh, CSV File berikut menjelaskan beberapa gambar dalam contoh gambar.

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

Skrip menghasilkan JSON Garis untuk setiap baris. Sebagai contoh, berikut ini adalah JSON Line untuk baris pertama (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"}}

Jika CSV file Anda tidak menyertakan jalur Amazon S3 untuk gambar, gunakan argumen baris --s3-path perintah untuk menentukan jalur Amazon S3 ke gambar.

Sebelum membuat file manifes, skrip memeriksa gambar duplikat dalam CSV file dan klasifikasi gambar apa pun yang tidak normal atau. anomaly Jika duplikat kesalahan klasifikasi gambar atau gambar ditemukan, skrip melakukan hal berikut:

  • Merekam entri gambar valid pertama untuk semua gambar dalam file deduplikasi. CSV

  • Merekam kejadian duplikat gambar dalam file kesalahan.

  • Merekam klasifikasi gambar yang tidak normal atau anomaly dalam file kesalahan.

  • Tidak membuat file manifes.

File kesalahan mencakup nomor baris di mana gambar duplikat atau kesalahan klasifikasi ditemukan dalam CSV file input. Gunakan CSV file kesalahan untuk memperbarui CSV file input dan kemudian jalankan skrip lagi. Atau, gunakan CSV file kesalahan untuk memperbarui CSV file deduplikasi, yang hanya berisi entri gambar unik dan gambar tanpa kesalahan klasifikasi gambar. Jalankan kembali skrip dengan file deduplikasi CSV yang diperbarui.

Jika tidak ada duplikat atau kesalahan yang ditemukan dalam CSV file input, skrip menghapus file gambar deduplikat dan CSV file kesalahan, karena mereka kosong.

Dalam prosedur ini, Anda membuat CSV file dan menjalankan skrip Python untuk membuat file manifes. Script telah diuji dengan Python versi 3.7.

Untuk membuat file manifes dari CSV file
  1. Buat CSV file dengan bidang berikut di setiap baris (satu baris per gambar). Jangan menambahkan baris header ke CSV file.

    Bidang 1 Bidang 2

    Nama gambar atau jalur Amazon S3 pada gambar. Misalnya, s3://s3bucket/circuitboard/train/anomaly/train-anomaly_10.jpg. Anda tidak dapat memiliki campuran gambar dengan jalur Amazon S3 dan gambar tanpa.

    Klasifikasi anomali untuk gambar (normalatauanomaly).

    Misalnya s3://s3bucket/circuitboard/train/anomaly/image_10.jpg,anomaly atau image_11.jpg,normal

  2. Simpan file CSV.

  3. Jalankan skrip Python berikut. Berikan argumen berikut:

    • csv_file— CSV File yang Anda buat di langkah 1.

    • (Opsional) --s3-path s3://path_to_folder/ - Jalur Amazon S3 untuk ditambahkan ke nama file gambar (bidang 1). Gunakan --s3-path jika gambar di bidang 1 belum berisi jalur S3.

    # 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. Jika gambar duplikat terjadi atau kesalahan klasifikasi terjadi:

    1. Gunakan file kesalahan untuk memperbarui file dedupulisasi atau CSV file input. CSV

    2. Jalankan skrip lagi dengan file deduplikat yang diperbarui atau CSV file input CSV yang diperbarui.

  5. Jika Anda berencana menggunakan kumpulan data pengujian, ulangi langkah 1—4 untuk membuat file manifes untuk kumpulan data pengujian Anda.

  6. Jika perlu, salin gambar dari komputer Anda ke jalur bucket Amazon S3 yang Anda tentukan di kolom 1 CSV file (atau ditentukan dalam baris --s3-path perintah). Untuk menyalin gambar, masukkan perintah berikut pada prompt perintah.

    aws s3 cp --recursive your-local-folder/ s3://your-target-S3-location/
  7. Ikuti petunjuk di Membuat kumpulan data dengan file manifes (konsol) untuk membuat kumpulan data. Jika Anda menggunakan AWS SDK, lihatMembuat kumpulan data dengan file manifes () SDK.