Amazon Rekognition Custom Labels 모델 훈련 - Rekognition

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon Rekognition Custom Labels 모델 훈련

Amazon Rekognition Custom Labels 콘솔 또는 Amazon Rekognition Custom Labels API를 사용하여 모델을 훈련할 수 있습니다. 모델 훈련이 실패할 경우 실패한 모델 훈련 디버깅의 정보를 사용하여 실패 원인을 찾아내세요.

참고

모델을 성공적으로 훈련하는 데 걸리는 시간만큼 요금이 부과됩니다. 일반적으로 교육을 완료하는 데 30분에서 24시간이 소요됩니다. 자세한 정보는 훈련 시간 섹션을 참조하세요.

모델을 훈련할 때마다 새 버전의 모델이 생성됩니다. Amazon Rekognition Custom Labels는 프로젝트 이름과 모델 생성 당시의 타임스탬프를 조합하여 모델 이름을 생성합니다.

모델을 훈련하기 위해 Amazon Rekognition Custom Labels는 소스 훈련 및 테스트 이미지의 사본을 만듭니다. 기본적으로 복사된 이미지는 AWS가 소유하고 관리하는 키로 암호화됩니다. 사용자의 AWS KMS key 항목을 사용하는 방법도 있습니다. 자체 KMS 키를 사용하는 경우 KMS 키에 다음 권한이 필요합니다.

  • kms:CreateGrant

  • kms:DescribeKey

자세한 내용은 AWS Key Management Service 개념을 참조하세요. 소스 이미지는 영향을 받지 않습니다.

KMS 서버 측 암호화(SSE-KMS)를 사용하여 Amazon S3 버킷의 훈련 및 테스트 이미지를 암호화한 후 Amazon Rekognition Custom Labels에서 복사할 수 있습니다. Amazon Rekognition Custom Labels가 이미지에 액세스할 수 있도록 허용하려면 AWS 계정에 KMS 키에 대한 다음 권한이 필요합니다.

  • kms:GenerateDataKey

  • kms:Decrypt

자세한 내용은 AWS Key Management Service에 저장된 KMS 키를 사용한 서버 측 암호화(SSE-KMS)를 사용하여 데이터 보호를 참조하세요.

모델을 훈련한 후 성능을 평가하고 개선할 수 있습니다. 자세한 내용은 훈련된 Amazon Rekognition Custom Labels 모델 개선 섹션을 참조하세요.

모델 태그 지정과 같은 다른 모델 작업에 대한 내용은 Amazon Rekognition Custom Labels 모델 관리 항목을 참조하세요.

모델 훈련(콘솔)

Amazon Rekognition Custom Labels 콘솔을 사용하여 모델을 훈련할 수 있습니다.

훈련을 하려면 훈련 데이터 세트와 테스트 데이터 세트를 갖춘 프로젝트가 필요합니다. 프로젝트에 테스트 데이터 세트가 없는 경우 Amazon Rekognition Custom Labels 콘솔은 훈련 중에 훈련 데이터 세트를 분할하여 프로젝트용 데이터 세트를 생성합니다. 선택한 이미지는 대표적인 샘플이며 훈련 데이터 세트에 사용되지 않습니다. 사용할 수 있는 대체 테스트 데이터 세트가 없는 경우에만 훈련 데이터 세트를 분할하는 것이 좋습니다. 훈련 데이터 세트를 분할하면 훈련에 사용할 수 있는 이미지 수가 줄어듭니다.

참고

모델을 훈련하는 데 걸리는 시간만큼 요금이 부과됩니다. 자세한 정보는 훈련 시간 섹션을 참조하세요.

모델을 훈련하려면(콘솔)
  1. https://console.aws.amazon.com/rekognition/에서 Amazon Rekognition 콘솔을 엽니다.

  2. 사용자 지정 레이블 사용을 선택합니다.

  3. 왼쪽 탐색 창에서 프로젝트를 선택합니다.

  4. 프로젝트 페이지에서 훈련하려는 모델이 포함된 프로젝트를 선택합니다.

  5. 프로젝트 페이지에서 Train model을 선택합니다.

  6. (선택 사항) 자체 AWS KMS 암호화 키를 사용하려면 다음을 수행하세요.

    1. 이미지 데이터 암호화에서 암호화 설정 사용자 지정(고급)을 선택합니다.

    2. encryption.aws_kms_key에서 키의 Amazon 리소스 이름(ARN)을 입력하거나 기존 AWS KMS 키를 선택합니다. 새 키를 생성하려면 AWS IMS 키 생성을 선택합니다.

  7. (선택 사항) 모델에 태그를 추가하려면 다음을 수행합니다.

    1. 태그 항목에서 새로운 태그 추가를 선택합니다.

    2. 다음을 입력합니다.

      1. 에 있는 키의 이름

      2. 에 있는 키의 값

    3. 태그를 더 추가하려면 6a단계와 6b단계를 반복합니다.

    4. (선택 사항) 태그를 제거하려면 제거할 태그 옆의 제거를 선택합니다. 이전에 저장한 태그를 제거하는 경우 변경 내용을 저장하면 해당 태그가 제거됩니다.

  8. 모델 훈련 페이지에서 모델 훈련을 선택합니다. 프로젝트 선택 편집 상자에 프로젝트의 Amazon 리소스 이름(ARN)이 보일 겁니다. 그렇지 않은 경우 프로젝트의 ARN을 입력합니다.

  9. 모델을 훈련하고 싶으신가요? 대화 상자에서 모델 훈련을 선택합니다.

  10. 프로젝트 페이지의 모델 항목에서 훈련이 진행 중인 Model Status 열의 현재 상태를 확인할 수 있습니다. 모델 훈련은 완료하는 데 다소 시간이 걸립니다.

  11. 훈련이 완료되면 모델 이름을 선택합니다. 모델 상태가 TRAINING_COMPLETED로 표시되면 훈련이 끝났다는 뜻입니다. 훈련이 실패하면 실패한 모델 훈련 디버깅 항목을 읽어 보세요.

  12. 다음 단계: 모델 평가 자세한 내용은 훈련된 Amazon Rekognition Custom Labels 모델 개선 항목을 참조하세요.

모델 훈련(SDK)

CreateProjectVersion을 호출하여 모델을 훈련합니다. 모델을 훈련하려면 다음 정보가 필요합니다.

  • 이름: 모델 버전의 고유 이름

  • 프로젝트 ARN: 모델을 관리하는 프로젝트의 Amazon 리소스 이름(ARN)

  • 훈련 결과 위치: 결과가 배치되는 Amazon S3 위치 콘솔 Amazon S3 버킷과 동일한 위치를 사용하거나 다른 위치를 선택할 수 있습니다. 다른 위치를 선택하는 것이 좋습니다. 이렇게 하면 권한을 설정하고 Amazon Rekognition Custom Labels 콘솔 사용의 훈련 출력과 이름 충돌이 발생할 가능성을 방지할 수 있기 때문입니다.

훈련은 프로젝트와 관련된 훈련 및 테스트 데이터 세트를 사용합니다. 자세한 내용은 데이터 세트 관리 섹션을 참조하세요.

참고

선택 사항으로 프로젝트 외부에 있는 훈련 및 테스트 데이터 세트 매니페스트 파일을 지정할 수 있습니다. 외부 매니페스트 파일로 모델을 훈련한 후 콘솔을 열면 Amazon Rekognition Custom Labels가 훈련에 사용된 마지막 매니페스트 파일 세트를 사용하여 데이터 세트를 생성합니다. 더 이상 외부 매니페스트 파일을 지정하여 프로젝트의 모델 버전을 훈련할 수 없습니다. 자세한 내용은 CreateProjectVersion을 참조하세요.

CreateProjectVersion의 응답은 후속 요청에서 모델 버전을 식별하는 데 사용하는 ARN입니다. ARN을 사용하여 모델 버전을 보호할 수도 있습니다. 자세한 내용은 Amazon Rekognition Custom Labels 프로젝트의 보안 섹션을 참조하세요.

모델 버전 훈련을 완료하는 데 시간이 걸립니다. 이 주제의 Python 및 Java 예제는 훈련이 완료될 때까지 기다리는 데에 waiter를 사용합니다. Waiter는 특정 상태에 대해 폴링되는 유틸리티 메서드입니다. 또는 DescribeProjectVersions 항목을 호출하여 현재 훈련 상태를 확인할 수도 있습니다. Status 필드 값이 TRAINING_COMPLETED면 훈련이 완료된 것입니다. 훈련을 완료한 후 평가 결과를 검토하여 모델의 품질을 평가할 수 있습니다.

모델 훈련(SDK)

다음 예제는 프로젝트와 관련된 훈련 및 테스트 데이터 세트를 사용하여 모델을 훈련하는 방법을 보여줍니다.

모델을 훈련하려면(SDK)
  1. 아직 하지 않았다면 AWS CLI 및 AWS SDK를 설치하고 구성하세요. 자세한 내용은 4단계: 및 SDK 설정 AWS CLIAWS 섹션을 참조하세요.

  2. 프로젝트를 훈련하려면 다음 예제 코드를 사용하세요.

    AWS CLI

    다음 예제에서는 모델을 생성합니다. 훈련 데이터 세트를 분할하여 테스트 데이터 세트를 생성합니다. 다음을 바꿉니다.

    • my_project_arn 항목을 프로젝트의 Amazon 리소스 이름(ARN)으로 바꿉니다.

    • version_name 항목을 선택한 고유한 버전 이름으로 바꿉니다.

    • output_bucket 항목을 Amazon Rekognition Custom Labels 훈련 결과를 저장하는 Amazon S3 버킷의 이름으로 바꿉니다.

    • output_folder 항목을 훈련 결과가 저장되는 폴더의 이름으로 변경합니다.

    • (선택적 파라미터) --kms-key-id 항목을 AWS Key Management Service 고객 마스터 키의 식별자로 변경합니다.

    aws rekognition create-project-version \ --project-arn project_arn \ --version-name version_name \ --output-config '{"S3Bucket":"output_bucket", "S3KeyPrefix":"output_folder"}' \ --profile custom-labels-access
    Python

    다음 예제에서는 모델을 생성합니다. 다음 명령줄 인수를 제공하세요.

    • project_arn: 프로젝트의 Amazon 리소스 이름(ARN)

    • version_name: 선택한 모델의 고유한 버전 이름

    • output_bucket: Amazon Rekognition Custom Labels가 훈련 결과를 저장하는 Amazon S3 버킷의 이름

    • output_folder: 훈련 결과가 저장되는 폴더의 이름

    다음 명령줄 파라미터를 제공하여 모델에 태그를 첨부할 수도 있습니다.

    • tag: 모델에 첨부할 태그의 이름

    • tag_value: 태그 값

    #Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. #PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-custom-labels-developer-guide/blob/master/LICENSE-SAMPLECODE.) import argparse import logging import json import boto3 from botocore.exceptions import ClientError logger = logging.getLogger(__name__) def train_model(rek_client, project_arn, version_name, output_bucket, output_folder, tag_key, tag_key_value): """ Trains an Amazon Rekognition Custom Labels model. :param rek_client: The Amazon Rekognition Custom Labels Boto3 client. :param project_arn: The ARN of the project in which you want to train a model. :param version_name: A version for the model. :param output_bucket: The S3 bucket that hosts training output. :param output_folder: The path for the training output within output_bucket :param tag_key: The name of a tag to attach to the model. Pass None to exclude :param tag_key_value: The value of the tag. Pass None to exclude """ try: #Train the model status="" logger.info("training model version %s for project %s", version_name, project_arn) output_config = json.loads( '{"S3Bucket": "' + output_bucket + '", "S3KeyPrefix": "' + output_folder + '" } ' ) tags={} if tag_key is not None and tag_key_value is not None: tags = json.loads( '{"' + tag_key + '":"' + tag_key_value + '"}' ) response=rek_client.create_project_version( ProjectArn=project_arn, VersionName=version_name, OutputConfig=output_config, Tags=tags ) logger.info("Started training: %s", response['ProjectVersionArn']) # Wait for the project version training to complete. project_version_training_completed_waiter = rek_client.get_waiter('project_version_training_completed') project_version_training_completed_waiter.wait(ProjectArn=project_arn, VersionNames=[version_name]) # Get the completion status. describe_response=rek_client.describe_project_versions(ProjectArn=project_arn, VersionNames=[version_name]) for model in describe_response['ProjectVersionDescriptions']: logger.info("Status: %s", model['Status']) logger.info("Message: %s", model['StatusMessage']) status=model['Status'] logger.info("finished training") return response['ProjectVersionArn'], status except ClientError as err: logger.exception("Couldn't create model: %s", err.response['Error']['Message'] ) raise def add_arguments(parser): """ Adds command line arguments to the parser. :param parser: The command line parser. """ parser.add_argument( "project_arn", help="The ARN of the project in which you want to train a model" ) parser.add_argument( "version_name", help="A version name of your choosing." ) parser.add_argument( "output_bucket", help="The S3 bucket that receives the training results." ) parser.add_argument( "output_folder", help="The folder in the S3 bucket where training results are stored." ) parser.add_argument( "--tag_name", help="The name of a tag to attach to the model", required=False ) parser.add_argument( "--tag_value", help="The value for the tag.", 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() print(f"Training model version {args.version_name} for project {args.project_arn}") # Train the model. session = boto3.Session(profile_name='custom-labels-access') rekognition_client = session.client("rekognition") model_arn, status=train_model(rekognition_client, args.project_arn, args.version_name, args.output_bucket, args.output_folder, args.tag_name, args.tag_value) print(f"Finished training model: {model_arn}") print(f"Status: {status}") except ClientError as err: logger.exception("Problem training model: %s", err) print(f"Problem training model: {err}") except Exception as err: logger.exception("Problem training model: %s", err) print(f"Problem training model: {err}") if __name__ == "__main__": main()
    Java V2

    다음 예제는 모델을 훈련합니다. 다음 명령줄 인수를 제공하세요.

    • project_arn: 프로젝트의 Amazon 리소스 이름(ARN)

    • version_name: 선택한 모델의 고유한 버전 이름

    • output_bucket: Amazon Rekognition Custom Labels가 훈련 결과를 저장하는 Amazon S3 버킷의 이름

    • output_folder: 훈련 결과가 저장되는 폴더의 이름

    /* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ package com.example.rekognition; import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; import software.amazon.awssdk.core.waiters.WaiterResponse; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.rekognition.RekognitionClient; import software.amazon.awssdk.services.rekognition.model.CreateProjectVersionRequest; import software.amazon.awssdk.services.rekognition.model.CreateProjectVersionResponse; import software.amazon.awssdk.services.rekognition.model.DescribeProjectVersionsRequest; import software.amazon.awssdk.services.rekognition.model.DescribeProjectVersionsResponse; import software.amazon.awssdk.services.rekognition.model.OutputConfig; import software.amazon.awssdk.services.rekognition.model.ProjectVersionDescription; import software.amazon.awssdk.services.rekognition.model.RekognitionException; import software.amazon.awssdk.services.rekognition.waiters.RekognitionWaiter; import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; public class TrainModel { public static final Logger logger = Logger.getLogger(TrainModel.class.getName()); public static String trainMyModel(RekognitionClient rekClient, String projectArn, String versionName, String outputBucket, String outputFolder) { try { OutputConfig outputConfig = OutputConfig.builder().s3Bucket(outputBucket).s3KeyPrefix(outputFolder).build(); logger.log(Level.INFO, "Training Model for project {0}", projectArn); CreateProjectVersionRequest createProjectVersionRequest = CreateProjectVersionRequest.builder() .projectArn(projectArn).versionName(versionName).outputConfig(outputConfig).build(); CreateProjectVersionResponse response = rekClient.createProjectVersion(createProjectVersionRequest); logger.log(Level.INFO, "Model ARN: {0}", response.projectVersionArn()); logger.log(Level.INFO, "Training model..."); // wait until training completes DescribeProjectVersionsRequest describeProjectVersionsRequest = DescribeProjectVersionsRequest.builder() .versionNames(versionName) .projectArn(projectArn) .build(); RekognitionWaiter waiter = rekClient.waiter(); WaiterResponse<DescribeProjectVersionsResponse> waiterResponse = waiter .waitUntilProjectVersionTrainingCompleted(describeProjectVersionsRequest); Optional<DescribeProjectVersionsResponse> optionalResponse = waiterResponse.matched().response(); DescribeProjectVersionsResponse describeProjectVersionsResponse = optionalResponse.get(); for (ProjectVersionDescription projectVersionDescription : describeProjectVersionsResponse .projectVersionDescriptions()) { System.out.println("ARN: " + projectVersionDescription.projectVersionArn()); System.out.println("Status: " + projectVersionDescription.statusAsString()); System.out.println("Message: " + projectVersionDescription.statusMessage()); } return response.projectVersionArn(); } catch (RekognitionException e) { logger.log(Level.SEVERE, "Could not train model: {0}", e.getMessage()); throw e; } } public static void main(String args[]) { String versionName = null; String projectArn = null; String projectVersionArn = null; String bucket = null; String location = null; final String USAGE = "\n" + "Usage: " + "<project_name> <version_name> <output_bucket> <output_folder>\n\n" + "Where:\n" + " project_arn - The ARN of the project that you want to use. \n\n" + " version_name - A version name for the model.\n\n" + " output_bucket - The S3 bucket in which to place the training output. \n\n" + " output_folder - The folder within the bucket that the training output is stored in. \n\n"; if (args.length != 4) { System.out.println(USAGE); System.exit(1); } projectArn = args[0]; versionName = args[1]; bucket = args[2]; location = args[3]; try { // Get the Rekognition client. RekognitionClient rekClient = RekognitionClient.builder() .credentialsProvider(ProfileCredentialsProvider.create("custom-labels-access")) .region(Region.US_WEST_2) .build(); // Train model projectVersionArn = trainMyModel(rekClient, projectArn, versionName, bucket, location); System.out.println(String.format("Created model: %s for Project ARN: %s", projectVersionArn, projectArn)); rekClient.close(); } catch (RekognitionException rekError) { logger.log(Level.SEVERE, "Rekognition client error: {0}", rekError.getMessage()); System.exit(1); } } }
  3. 훈련이 실패하면 실패한 모델 훈련 디버깅 항목을 읽어 보세요.