Aviso de fim do suporte: em 31 de outubro de 2025, o suporte para o Amazon Lookout for Vision AWS será interrompido. Depois de 31 de outubro de 2025, você não poderá mais acessar o console do Lookout for Vision ou os recursos do Lookout for Vision. Para obter mais informações, visite esta postagem do blog
As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Criar um arquivo de manifesto de classificação de um arquivo CSV
Esse exemplo de script Python simplifica a criação de um arquivo de manifesto de classificação usando um arquivo CSV (Comma Separated Values) para rotular imagens. Você cria o arquivo CSV.
Um arquivo de manifesto descreve as imagens usadas para treinar um modelo. Um arquivo de manifesto é composto por uma ou mais linhas JSON. Cada linha JSON descreve uma única imagem. Para obter mais informações, consulte Definindo linhas JSON para classificação de imagens.
Um arquivo CSV representa dados tabulares em várias linhas em um arquivo de texto. Os campos em uma linha são separados por vírgulas. Para obter mais informações, consulte Comma-separated valuesnormal
ou anomaly
). Cada linha é mapeada para uma linha JSON no arquivo de manifesto.
Por exemplo, o arquivo CSV a seguir descreve algumas das imagens nas imagens de exemplo.
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
O script gera linhas JSON para cada linha. Por exemplo, a seguir está a linha JSON para a primeira linha (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"}}
Se o arquivo CSV não incluir o caminho do Amazon S3 para as imagens, use o argumento da linha de comando --s3-path
para especificar o caminho do Amazon S3 para as imagens.
Antes de criar o arquivo de manifesto, o script verifica se há imagens duplicadas no arquivo CSV e em qualquer classificação de imagem que não seja normal
ou anomaly
. Se forem encontrados erros de imagem ou classificação de imagem duplicados, o script fará o seguinte:
Registra a primeira entrada de imagem válida para todas as imagens em um arquivo CSV desduplicado.
Registra ocorrências duplicadas de uma imagem no arquivo de erros.
Registra as classificações de imagens que não sejam
normal
ouanomaly
no arquivo de erros.Não cria um arquivo de manifesto.
O arquivo de erros inclui o número da linha em que uma imagem duplicada ou um erro de classificação é encontrado no arquivo CSV de entrada. Use o arquivo CSV de erros para atualizar o arquivo CSV de entrada e, em seguida, execute o script novamente. Como alternativa, use o arquivo CSV de erros para atualizar o arquivo CSV desduplicado, que contém somente entradas de imagem exclusivas e imagens sem erros de classificação de imagem. Execute novamente o script com o arquivo CSV desduplicado atualizado.
Se nenhuma duplicata ou erro for encontrado no arquivo CSV de entrada, o script excluirá o arquivo CSV de imagem desduplicada e o arquivo de erros, pois eles estão vazios.
Nesse procedimento, você cria o arquivo CSV e executa o script Python para criar o arquivo de manifesto. O script foi testado com a versão 3.7 do Python.
Para criar um arquivo de manifesto de um arquivo CSV
-
Crie um arquivo CSV com os seguintes campos em cada linha (uma linha por imagem). Não adicione uma linha de cabeçalho ao arquivo CSV.
Campo 1 Campo 2 O nome da imagem ou o caminho do Amazon S3 para a imagem. Por exemplo,
s3://s3bucket/circuitboard/train/anomaly/train-anomaly_10.jpg
. Você não pode ter uma mistura de imagens com o caminho do Amazon S3 e imagens sem.A classificação da anomalia para a imagem (
normal
ouanomaly
).Por exemplo,
s3://s3bucket/circuitboard/train/anomaly/image_10.jpg,anomaly
ouimage_11.jpg,normal
-
Salve o arquivo CSV.
-
Execute o seguinte script em Python. Forneça os seguintes argumentos:
-
csv_file
: O arquivo CSV que você criou na etapa 1. -
(Opcional)
--s3-path
: i caminho do Amazon S3 a ser adicionado aos nomes dos arquivos de imagem (campo 1). Uses3://path_to_folder/
--s3-path
se as imagens no campo 1 ainda não contiverem um caminho do 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()
-
Se ocorrerem imagens duplicadas ou ocorrerem erros de classificação:
Use o arquivo de erros para atualizar o arquivo CSV desduplicado ou o arquivo CSV de entrada.
Execute o script novamente com o arquivo CSV desduplicado atualizado ou o arquivo CSV de entrada atualizado.
-
Se você planeja usar um conjunto de dados de teste, repita as etapas de 1 a 4 para criar um arquivo de manifesto para seu conjunto de dados de teste.
-
Se necessário, copie as imagens do seu computador para o caminho do bucket do Amazon S3 que você especificou na coluna 1 do arquivo CSV (ou especificado na linha de comando
--s3-path
). Para copiar as imagens, insira o comando a seguir no prompt de comando.aws s3 cp --recursive
your-local-folder/
s3://your-target-S3-location/
-
Siga as instruções em Criação de um conjunto de dados com um arquivo de manifesto (console) para criar um conjunto de dados. Se você estiver usando o AWS SDK, consulteCriação de um conjunto de dados com um arquivo de manifesto (SDK).