함수를 사용한 이미지 분석 AWS Lambda - Rekognition

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

함수를 사용한 이미지 분석 AWS Lambda

AWS Lambda 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있는 컴퓨팅 서비스입니다. 예를 들어 애플리케이션 코드를 호스팅할 서버를 만들지 않고도 모바일 애플리케이션에서 제출된 이미지를 분석할 수 있습니다. 다음 지침은 Python에서 호출하는 Lambda 함수를 생성하는 방법을 보여줍니다. DetectCustomLabels 함수는 제공된 이미지를 분석하고 이미지에서 찾은 레이블 목록을 반환합니다. 지침에는 Amazon S3 버킷의 이미지 또는 로컬 컴퓨터에서 제공된 이미지를 사용하여 Lambda 함수를 직접 호출하는 방법을 보여주는 예제 Python 코드가 포함되어 있습니다.

1단계: AWS Lambda 함수 생성 (콘솔)

이 단계에서는 빈 AWS 함수와 함수가 DetectCustomLabels 작업을 호출할 수 있는 IAM 실행 역할을 만듭니다. 또한 분석용 이미지를 저장하는 Amazon S3 버킷에 대한 액세스 권한도 부여합니다. 그리고 다음에 대한 환경 변수를 지정합니다.

  • Lambda 함수에서 사용하려는 Amazon Rekognition Custom Labels 모델

  • 모델에 사용하려는 신뢰 한도

나중에 Lambda 함수에 소스 코드와 계층(선택 사항)을 추가합니다.

AWS Lambda 함수를 만들려면 (콘솔)
  1. 에 AWS Management Console 로그인하고 에서 AWS Lambda 콘솔을 엽니다 https://console.aws.amazon.com/lambda/.

  2. 함수 생성(Create function)을 선택합니다. 자세한 내용은 콘솔로 Lambda 함수 생성을 참조하세요.

  3. 다음과 같은 옵션을 선택하세요.

    • 새로 작성을 선택합니다.

    • 함수 이름의 값을 입력합니다.

    • 런타임에는 Python 3.10을 선택합니다.

  4. 함수 생성을 선택하여 AWS Lambda 함수를 생성합니다.

  5. 함수 페이지에서 구성 탭을 선택합니다.

  6. 환경 변수 창에서 편집을 선택합니다.

  7. 다음 환경 변수를 추가합니다. 각 변수에 대해 환경 변수 추가를 선택한 다음 변수 키와 값을 입력합니다.

    MODEL_ARN

    Lambda 함수에서 사용하려는 모델의 Amazon 리소스 이름 (ARN). Amazon Rekognition ARN 사용자 지정 레이블 콘솔의 모델 세부 정보 페이지에 있는 모델 사용 탭에서 모델을 가져올 수 있습니다.

    CONFIDENCE

    레이블 예측에 대한 모델 신뢰도의 최소값(0~100) Lambda 함수는 신뢰도 값이 이 값보다 낮은 레이블을 반환하지 않습니다.

  8. 저장을 선택하여 환경 변수를 저장합니다.

  9. 권한 창의 역할 이름에서 실행 역할을 선택하여 콘솔에서 역할을 엽니다. IAM

  10. 권한 탭에서 권한 추가, 그다음 인라인 정책 생성을 선택합니다.

  11. 기존 정책을 JSON선택하고 다음 정책으로 교체합니다.

    { "Version": "2012-10-17", "Statement": [ { "Action": "rekognition:DetectCustomLabels", "Resource": "*", "Effect": "Allow", "Sid": "DetectCustomLabels" } ] }
  12. Next(다음)를 선택합니다.

  13. 정책 세부 정보에 정책 이름 (예: DetectCustomLabels-access) 을 입력합니다.

  14. 정책 생성을 선택합니다.

  15. Amazon S3 버킷에 분석용 이미지를 저장하는 경우 10~14단계를 반복합니다.

    1. 11단계에서는 다음 정책을 사용하십시오. Replace bucket/folder path 분석하려는 이미지의 Amazon S3 버킷 및 폴더 경로를 사용합니다.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "S3Access", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket/folder path/*" } ] }
    2. 13단계에서는 S3Bucket-access와 같은 다른 정책 이름을 선택합니다.

2단계: (선택 사항) 계층 생성 (콘솔)

이 단계는 예제를 실행하는 데 필수 사항이 아닙니다. DetectCustomLabels작업은 Python (Boto3) AWS SDK 의 일부로 기본 Lambda Python 환경에 포함됩니다. Lambda 함수의 다른 부분에서 기본 Lambda Python 환경에 없는 AWS 최신 서비스 업데이트가 필요한 경우, 이 단계를 수행하여 최신 SDK Boto3 릴리스를 함수에 계층으로 추가하십시오.

먼저 Boto3가 포함된.zip 파일 아카이브를 생성합니다. SDK 그런 다음 계층을 생성하고 .zip 파일 아카이브를 계층에 추가합니다. 자세한 내용은 Lambda 함수에서 계층 사용을 참조하세요.

계층을 생성하고 추가하려면(콘솔)
  1. 명령 프롬프트를 열고 다음 명령을 입력합니다.

    pip install boto3 --target python/. zip boto3-layer.zip -r python/
  2. zip 파일(boto3-layer.zip)의 이름을 기록해 두세요. 이 절차의 6단계에서 필요합니다.

  3. 에서 콘솔을 엽니다. AWS Lambda https://console.aws.amazon.com/lambda/

  4. 탐색 창에서 계층을 선택합니다.

  5. 계층 생성을 선택합니다.

  6. Name(이름)과 Description(설명)을 입력합니다.

  7. .zip 파일 업로드를 선택한 후 업로드를 선택합니다.

  8. 대화 상자에서 이 절차의 1단계에서 만든.zip 파일 아카이브 (boto3-layer.zip)를 선택합니다.

  9. 호환되는 런타임은 Python 3.9를 선택하세요.

  10. 생성을 선택하여 계층을 생성합니다.

  11. 탐색 창 메뉴 아이콘을 선택합니다.

  12. 탐색 창에서 함수를 선택합니다.

  13. 리소스 목록에서 1단계: AWS Lambda 함수 생성 (콘솔) 항목에서 생성한 함수를 선택합니다.

  14. 코드 탭을 선택합니다.

  15. 계층 영역에서 계층 추가를 선택합니다.

  16. 사용자 지정 계층을 선택합니다.

  17. 사용자 지정 계층에서 6단계에서 입력한 계층 이름을 선택합니다.

  18. 버전에서 계층 버전을 선택합니다. 계층 버전은 1이어야 합니다.

  19. 추가를 선택합니다.

3단계: Python 코드 추가 (콘솔)

이 단계에서는 Lambda 콘솔 코드 편집기를 사용하여 Lambda 함수에 Python 코드를 추가합니다. 해당 코드는 DetectCustomLabels로 제공된 이미지를 분석하고 이미지에서 찾은 레이블 목록을 반환합니다. 제공된 이미지는 Amazon S3 버킷에 있거나 byte64로 인코딩된 이미지 바이트로 제공될 수 있습니다.

Python 코드를 추가하려면 (콘솔)
  1. Lambda 콘솔을 사용하지 않는 경우 다음을 수행합니다.

    1. 에서 AWS Lambda 콘솔을 엽니다 https://console.aws.amazon.com/lambda/.

    2. 1단계: AWS Lambda 함수 생성 (콘솔)에서 생성한 Lambda 함수를 엽니다.

  2. 코드 탭을 선택합니다.

  3. 코드 소스에서 lambda_function.py의 코드를 다음과 같이 바꾸세요.

    # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 """ Purpose An AWS lambda function that analyzes images with an the Amazon Rekognition Custom Labels model. """ import json import base64 from os import environ import logging import boto3 from botocore.exceptions import ClientError # Set up logging. logger = logging.getLogger(__name__) # Get the model ARN and confidence. model_arn = environ['MODEL_ARN'] min_confidence = int(environ.get('CONFIDENCE', 50)) # Get the boto3 client. rek_client = boto3.client('rekognition') def lambda_handler(event, context): """ Lambda handler function param: event: The event object for the Lambda function. param: context: The context object for the lambda function. return: The labels found in the image passed in the event object. """ try: # Determine image source. if 'image' in event: # Decode the image image_bytes = event['image'].encode('utf-8') img_b64decoded = base64.b64decode(image_bytes) image = {'Bytes': img_b64decoded} elif 'S3Object' in event: image = {'S3Object': {'Bucket': event['S3Object']['Bucket'], 'Name': event['S3Object']['Name']} } else: raise ValueError( 'Invalid source. Only image base 64 encoded image bytes or S3Object are supported.') # Analyze the image. response = rek_client.detect_custom_labels(Image=image, MinConfidence=min_confidence, ProjectVersionArn=model_arn) # Get the custom labels labels = response['CustomLabels'] lambda_response = { "statusCode": 200, "body": json.dumps(labels) } except ClientError as err: error_message = f"Couldn't analyze image. " + \ err.response['Error']['Message'] lambda_response = { 'statusCode': 400, 'body': { "Error": err.response['Error']['Code'], "ErrorMessage": error_message } } logger.error("Error function %s: %s", context.invoked_function_arn, error_message) except ValueError as val_error: lambda_response = { 'statusCode': 400, 'body': { "Error": "ValueError", "ErrorMessage": format(val_error) } } logger.error("Error function %s: %s", context.invoked_function_arn, format(val_error)) return lambda_response
  4. Lambda 함수를 배포하려면 배포를 선택합니다.

4단계: Lambda 함수 테스트

이 단계에서는 컴퓨터의 Python 코드를 사용하여 로컬 이미지 또는 Amazon S3 버킷의 이미지를 Lambda 함수에 전달합니다. 로컬 컴퓨터에서 전달된 이미지는 6291456바이트보다 작아야 합니다. 이미지가 더 크면 Amazon S3 버킷에 이미지를 업로드하고 이미지에 대한 Amazon S3 경로를 사용하여 스크립트를 호출합니다. Amazon S3 버킷에 이미지 파일을 업로드하는 방법에 대한 자세한 내용은 객체 업로드를 참조하세요.

Lambda 함수를 생성한 동일한 AWS 리전에서 코드를 실행해야 합니다. Lambda 콘솔에 있는 함수 세부 정보 페이지의 탐색 표시줄에서 Lambda 함수의 AWS 지역을 볼 수 있습니다.

AWS Lambda 함수가 타임아웃 오류를 반환하는 경우 Lambda 함수 타임아웃 기간을 연장하십시오. 자세한 내용은 함수 타임아웃 구성 (콘솔) 을 참조하십시오.

코드에서 Lambda 함수를 호출하는 방법에 대한 자세한 내용은 함수 호출을 참조하십시오. AWS Lambda

Lambda 함수를 테스트하는 방법
  1. lambda:InvokeFunction 권한이 있는지 확인합니다. 다음 정책을 사용할 수 있습니다.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "InvokeLambda", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "ARN for lambda function" } ] }

    Lambda 콘솔의 함수 개요에서 Lambda 함수 함수에 ARN 대한 정보를 얻을 수 있습니다.

    액세스 권한을 제공하려면 사용자, 그룹 또는 역할에 권한을 추가하세요:

    • 사용자 및 그룹: AWS IAM Identity Center

      권한 세트를 생성합니다. AWS IAM Identity Center 사용 설명서권한 세트 생성의 지침을 따릅니다.

    • ID 공급자를 IAM 통해 관리되는 사용자:

      ID 페더레이션을 위한 역할을 생성합니다. 사용 IAM설명서의 타사 ID 공급자 (페더레이션) 를 위한 역할 생성의 지침을 따르십시오.

    • IAM사용자:

      • 사용자가 맡을 수 있는 역할을 생성합니다. 사용 설명서의 IAM사용자 역할 생성에 나와 있는 지침을 따르십시오. IAM

      • (권장되지 않음)정책을 사용자에게 직접 연결하거나 사용자를 사용자 그룹에 추가합니다. 사용 설명서의 사용자 (콘솔) 에 권한 추가의 IAM 지침을 따르십시오.

  2. AWS SDKPython을 설치하고 구성합니다. 자세한 내용은 4단계: 설정 AWS CLI 그리고 AWS SDKs 단원을 참조하십시오.

  3. 1단계: AWS Lambda 함수 생성 (콘솔)의 7단계에서 지정한 모델을 시작합니다.

  4. 다음 코드를 client.py 이름의 파일에 저장합니다.

    # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 """ Purpose Test code for running the Amazon Rekognition Custom Labels Lambda function example code. """ import argparse import logging import base64 import json import boto3 from botocore.exceptions import ClientError logger = logging.getLogger(__name__) def analyze_image(function_name, image): """Analyzes an image with an AWS Lambda function. :param image: The image that you want to analyze. :return The status and classification result for the image analysis. """ lambda_client = boto3.client('lambda') lambda_payload = {} if image.startswith('s3://'): logger.info("Analyzing image from S3 bucket: %s", image) bucket, key = image.replace("s3://", "").split("/", 1) s3_object = { 'Bucket': bucket, 'Name': key } lambda_payload = {"S3Object": s3_object} # Call the lambda function with the image. else: with open(image, 'rb') as image_file: logger.info("Analyzing local image image: %s ", image) image_bytes = image_file.read() data = base64.b64encode(image_bytes).decode("utf8") lambda_payload = {"image": data} response = lambda_client.invoke(FunctionName=function_name, Payload=json.dumps(lambda_payload)) return json.loads(response['Payload'].read().decode()) def add_arguments(parser): """ Adds command line arguments to the parser. :param parser: The command line parser. """ parser.add_argument( "function", help="The name of the AWS Lambda function that you want " \ "to use to analyze the image.") parser.add_argument( "image", help="The local image that you want to analyze.") def main(): """ Entrypoint for script. """ try: logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") # Get command line arguments. parser = argparse.ArgumentParser(usage=argparse.SUPPRESS) add_arguments(parser) args = parser.parse_args() # Get analysis results. result = analyze_image(args.function, args.image) status = result['statusCode'] if status == 200: labels = result['body'] labels = json.loads(labels) print(f"There are {len(labels)} labels in the image.") for custom_label in labels: confidence = int(round(custom_label['Confidence'], 0)) print( f"Label: {custom_label['Name']}: Confidence: {confidence}%") else: print(f"Error: {result['statusCode']}") print(f"Message: {result['body']}") except ClientError as error: logging.error(error) print(error) if __name__ == "__main__": main()
  5. 코드를 실행합니다. 명령줄 인수에 Lambda 함수 이름과 분석하려는 이미지를 제공하세요. 로컬 이미지에 대한 경로 또는 Amazon S3 버킷에 저장된 이미지에 대한 S3 경로를 제공할 수 있습니다. 예제:

    python client.py function_name s3://bucket/path/image.jpg

    이미지가 Amazon S3 버킷에 있는 경우, 1단계: AWS Lambda 함수 생성 (콘솔)의 15단계에서 지정한 것과 동일한 버킷인지 확인하세요.

    성공하면 이미지에서 찾은 레이블 목록이 출력됩니다. 레이블이 반환되지 않는 경우 1단계: AWS Lambda 함수 생성 (콘솔)의 7단계에서 설정한 신뢰도 값을 낮추는 것이 좋습니다.

  6. Lambda 함수 사용을 마쳤지만 다른 애플리케이션에서 해당 모델을 사용하지 않는 경우 모델을 중지하세요. 다음에 Lambda 함수를 사용하려는 경우 모델을 시작해야 한다는 점을 기억하십시오.