サポート終了通知: 2025 年 10 月 31 日、 AWS は Amazon Lookout for Vision のサポートを終了します。2025 年 10 月 31 日以降、Lookout for Vision コンソールまたは Lookout for Vision リソースにアクセスできなくなります。詳細については、このブログ記事
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
CSV ファイルから分類マニフェストファイルを作成する
この Python スクリプトの例では、カンマ区切り値 (CSV) ファイルを使用してイメージにラベルを付けることで、分類マニフェストファイルの作成を簡素化します。CSV ファイルを作成します。
マニフェストファイルはモデルのトレーニングに使用される複数の画像について記述したものです。マニフェストファイルは 1 つ以上のJSON行で構成されます。各JSON行は 1 つのイメージを記述します。詳細については、「画像分類のJSON行の定義」を参照してください。
CSV ファイルは、テキストファイルの複数の行にわたる表形式データを表します。行内のフィールドはカンマで区切られます。詳細については、「カンマ区切り値normal
または ) が含まれますanomaly
。各行はマニフェストファイルのJSON行にマッピングされます。
例えば、次のCSVファイルでは、サンプルイメージ 内のイメージの一部について説明します。
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
スクリプトは、行ごとにJSON行を生成します。例えば、最初の行 (s3://s3bucket/circuitboard/train/anomaly/train-anomaly_1.jpg,anomaly
) のJSON行を次に示します。
{"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"}}
CSV ファイルにイメージの Amazon S3 パスが含まれていない場合は、--s3-path
コマンドライン引数を使用してイメージへの Amazon S3 パスを指定します。
マニフェストファイルを作成する前に、スクリプトはCSVファイル内の重複イメージと、 normal
または ではないイメージ分類をチェックしますanomaly
。重複画像または画像分類エラーが見つかった場合、スクリプトは次の処理を行います:
重複排除されたCSVファイル内のすべてのイメージの最初の有効なイメージエントリを記録します。
画像の重複発生をエラーファイルに記録します。
エラーファイルの、
normal
ではない、またはanomaly
な画像分類を記録します。マニフェストファイルは作成しません。
エラーファイルには、入力CSVファイルに重複したイメージまたは分類エラーが見つかった行番号が含まれます。エラーCSVファイルを使用して入力CSVファイルを更新し、スクリプトを再度実行します。または、エラーCSVファイルを使用して重複排除されたCSVファイルを更新します。これには、一意のイメージエントリとイメージ分類エラーのないイメージのみが含まれます。更新された重複排除CSVファイルを使用してスクリプトを再実行します。
入力CSVファイルに重複またはエラーが見つからない場合、スクリプトは重複排除されたイメージCSVファイルとエラーファイルを空のまま削除します。
この手順では、 CSV ファイルを作成し、Python スクリプトを実行してマニフェストファイルを作成します。スクリプトは Python 3.7 によりテストされました。
CSV ファイルからマニフェストファイルを作成するには
-
各行に次のフィールドを含むCSVファイルを作成します (イメージごとに 1 行)。ファイルにはヘッダー行を追加しないでくださいCSV。
フィールド 1 フィールド 2 画像名または Amazon S3 画像パス。例えば、
s3://s3bucket/circuitboard/train/anomaly/train-anomaly_10.jpg
と指定します。Amazon S3 パスによる画像と画像とパスがない画像を混在させることはできません。画像の異常分類 (
normal
またはanomaly
)。例えば、
s3://s3bucket/circuitboard/train/anomaly/image_10.jpg,anomaly
、image_11.jpg,normal
などです。 -
CSV ファイルを保存します。
-
以下の Python スクリプトを実行します。以下の情報を提供します:
-
csv_file
– ステップ 1 で作成したCSVファイル。 -
(オプション)
--s3-path
— 画像ファイル名に追加する Amazon S3 パス (フィールド 1)。フィールド 1 の画像がまだ S3 パスを含んでいない場合はs3://path_to_folder/
--s3-path
を使用します。
# 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()
-
画像が重複したり、分類エラーが発生したりする場合:
エラーファイルを使用して、重複排除されたCSVファイルまたは入力CSVファイルを更新します。
更新された重複排除CSVファイルまたは更新された入力CSVファイルを使用してスクリプトを再度実行します。
-
テストデータセットを使用する場合は、ステップ 1 ~ 4 を繰り返して、テストデータセットのマニフェストファイルを作成します。
-
必要に応じて、コンピュータから、CSVファイルの列 1 で指定した (または
--s3-path
コマンドラインで指定した) Amazon S3 バケットパスにイメージをコピーします。画像をコピーするには、コマンドプロンプトで次のコマンドを入力します。aws s3 cp --recursive
your-local-folder/
s3://your-target-S3-location/
-
マニフェストファイルを使用したデータセットの作成 (コンソール) の手引きに従ってデータセットを作成します。を使用している場合は AWS SDK、「」を参照してくださいマニフェストファイルを使用したデータセットの作成 (SDK)。