Lambda와 Python을 사용하여 이미지에서 레이블 감지 - Amazon Rekognition

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

Lambda와 Python을 사용하여 이미지에서 레이블 감지

AWS Lambda 는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행하는 데 사용할 수 있는 컴퓨팅 서비스입니다. Lambda 함수 내에서 Rekognition API 작업을 직접 호출할 수 있습니다. 다음 지침은 DetectLabels를 직접 호출하는 Lambda 함수를 Python에서 생성하는 방법을 보여줍니다.

Lambda 함수가 DetectLabels를 직접 호출하면 이미지에서 감지된 레이블 배열과 해당 레이블 감지의 신뢰도 수준을 반환합니다.

이 지침에는 Amazon S3 버킷 또는 로컬 컴퓨터에서 가져온 이미지를 사용하여 Lambda 함수를 직접 호출하는 방법을 보여주는 샘플 Python 코드가 포함되어 있습니다.

선택한 이미지가 Rekognition의 제한을 충족하는지 확인하세요. 이미지 파일 유형 및 크기 제한에 대한 자세한 내용은 Rekognition의 지침 및 할당량DetectLabels API 참조를 참조하세요.

Lambda 함수 생성(콘솔)

이 단계에서는 빈 Lambda 함수와 Lambda 함수가 DetectLabels 작업을 직접 호출하게 해 주는 IAM 실행 역할을 생성합니다. 나중 단계에서 Lambda 함수에 소스 코드와 계층(선택 사항)을 추가합니다.

Amazon S3 버킷에 저장된 문서를 사용하는 경우, 이 단계에서는 문서를 저장하는 버킷에 대한 액세스 권한을 부여하는 방법도 보여줍니다.

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

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

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

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

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

    • 런타임의 경우 최신 버전의 Python을 선택합니다.

    • 아키텍처에서는 x86_64를 선택합니다.

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

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

  6. 권한 창의 실행 역할에서 IAM 콘솔의 해당 역할을 열 역할 이름을 선택합니다.

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

  8. JSON을 선택하고 정책을 다음 정책으로 바꿉니다.

    { "Version": "2012-10-17", "Statement": [ { "Action": "rekognition:DetectLabels", "Resource": "*", "Effect": "Allow", "Sid": "DetectLabels" } ] }
  9. 정책 검토를 선택합니다.

  10. 정책의 이름을 입력합니다(예: DetectLabels-access).

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

  12. Amazon S3 버킷에 분석용 문서를 저장하는 경우 반드시 Amazon S3 액세스 정책을 추가해야 합니다. 이를 위해서는 AWS Lambda 콘솔에서 7~11단계를 반복하고 다음과 같이 변경합니다.

    1. 8단계에서는 다음 정책을 사용하세요. 버킷/폴더 경로를 Amazon S3 버킷 및 분석하려는 문서의 폴더 경로로 바꿉니다.

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

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

Lambda 함수 및 DetectLabels 직접 호출을 사용하기 위해 이 단계를 수행할 필요는 없습니다.

DetectLabels 작업은 AWS SDK for Python(Boto3)의 일부로 기본 Lambda Python 환경에 포함됩니다.

Lambda 함수의 다른 부분에서 기본 Lambda Python 환경에 없는 최신 AWS 서비스 업데이트가 필요한 경우이 단계를 수행하여 최신 Boto3 SDK 릴리스를 함수에 계층으로 추가할 수 있습니다.

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

계층을 생성하고 추가하려면(콘솔)
  1. 명령 프롬프트를 열고 다음 명령을 입력하여 AWS SDK의 최신 버전으로 배포 패키지를 생성합니다.

    pip install boto3 --target python/. zip boto3-layer.zip -r python/
  2. 이 절차의 8단계에서 사용하는 zip 파일(boto3-layer.zip)의 이름을 기록해 둡니다.

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

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

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

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

  7. 코드 항목 유형에서 .zip 파일 업로드를 선택하고 업로드를 선택합니다.

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

  9. 호환 런타임의 경우 최신 버전의 Python을 선택하세요.

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

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

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

  13. 리소스 목록에서 에서 생성한 함수를 선택합니다.

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

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

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

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

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

  19. 추가를 선택합니다.

Python 코드 추가(콘솔)

이 단계에서는 Lambda 콘솔 코드 편집기를 사용하여 Lambda 함수에 Python 코드를 추가합니다. 이 코드는 DetectLabels 작업을 사용하여 이미지에서 레이블을 감지합니다. 이미지에서 감지된 레이블 배열과 해당 레이블 감지의 신뢰도 수준이 반환됩니다.

DetectLabels 작업에 제공하는 문서는 Amazon S3 버킷 또는 로컬 컴퓨터에 위치할 수 있습니다.

Python 코드를 추가하려면(콘솔)
  1. 코드 탭으로 이동합니다.

  2. 코드 편집기에서 lambda_function.py의 코드를 다음과 같이 바꾸세요.

    import boto3 import logging from botocore.exceptions import ClientError import json import base64 # Instantiate logger logger = logging.getLogger(__name__) # connect to the Rekognition client rekognition = boto3.client('rekognition') def lambda_handler(event, context): try: image = None if 'S3Bucket' in event and 'S3Object' in event: s3 = boto3.resource('s3') s3_object = s3.Object(event['S3Bucket'], event['S3Object']) image = s3_object.get()['Body'].read() elif 'image' in event: image_bytes = event['image'].encode('utf-8') img_b64decoded = base64.b64decode(image_bytes) image = img_b64decoded elif image is None: raise ValueError('Missing image, check image or bucket path.') else: raise ValueError("Only base 64 encoded image bytes or S3Object are supported.") response = rekognition.detect_labels(Image={'Bytes': image}) lambda_response = { "statusCode": 200, "body": json.dumps(response) } labels = [label['Name'] for label in response['Labels']] print("Labels found:") print(labels) except ClientError as client_err: error_message = "Couldn't analyze image: " + client_err.response['Error']['Message'] lambda_response = { 'statusCode': 400, 'body': { "Error": client_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
  3. Lambda 함수를 배포하려면 배포를 선택합니다.

Python 코드를 추가하려면(콘솔)

이제 Lambda 함수를 생성했으므로 이를 간접적으로 호출하여 이미지에서 레이블을 감지할 수 있습니다.

이 단계에서는 컴퓨터의 Python 코드를 실행하여 로컬 이미지 또는 Amazon S3 버킷의 이미지를 Lambda 함수에 전달합니다.

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

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

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

Lambda 함수를 테스트하려면
  1. 아직 수행하지 않은 경우 다음 작업을 수행하세요.

    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 사용 설명서권한 세트 생성의 지침을 따릅니다.

      • 보안 인증 공급자를 통해 IAM에서 관리되는 사용자:

        ID 페더레이션을 위한 역할을 생성합니다. IAM 사용 설명서Create a role for a third-party identity provider (federation)의 지침을 따릅니다.

      • IAM 사용자:

        • 사용자가 맡을 수 있는 역할을 생성합니다. IAM 사용 설명서에서 Create a role for an IAM user의 지침을 따릅니다.

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

    2. AWS SDK for Python을 설치하고 구성합니다. 자세한 내용은 2단계: AWS CLI 및 AWS SDKs 설정 단원을 참조하십시오.

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

    import boto3 import json import base64 import pprint # Replace with the name of your S3 bucket and image object key bucket_name = "name of bucket" object_key = "name of file in s3 bucket" # If using a local file, supply the file name as the value of image_path below image_path = "" # Create session and establish connection to client[' session = boto3.Session(profile_name='developer-role') s3 = session.client('s3', region_name="us-east-1") lambda_client = session.client('lambda', region_name="us-east-1") # Replace with the name of your Lambda function function_name = 'RekDetectLabels' def analyze_image_local(img_path): print("Analyzing local image:") with open(img_path, 'rb') as image_file: image_bytes = image_file.read() data = base64.b64encode(image_bytes).decode("utf8") lambda_payload = {"image": data} # Invoke the Lambda function with the event payload response = lambda_client.invoke( FunctionName=function_name, Payload=(json.dumps(lambda_payload)) ) decoded = json.loads(response['Payload'].read().decode()) pprint.pprint(decoded) def analyze_image_s3(bucket_name, object_key): print("Analyzing image in S3 bucket:") # Load the image data from S3 into memory response = s3.get_object(Bucket=bucket_name, Key=object_key) image_data = response['Body'].read() image_data = base64.b64encode(image_data).decode("utf8") # Create the Lambda event payload event = { 'S3Bucket': bucket_name, 'S3Object': object_key, 'ImageBytes': image_data } # Invoke the Lambda function with the event payload response = lambda_client.invoke( FunctionName=function_name, InvocationType='RequestResponse', Payload=json.dumps(event), ) decoded = json.loads(response['Payload'].read().decode()) pprint.pprint(decoded) def main(path_to_image, name_s3_bucket, obj_key): if str(path_to_image) != "": analyze_image_local(path_to_image) else: analyze_image_s3(name_s3_bucket, obj_key) if __name__ == "__main__": main(image_path, bucket_name, object_key)
  3. 코드를 실행합니다. 문서가 Amazon S3 버킷에 있는 경우, 의 12단계에서 지정한 버킷과 동일한지 확인하세요.

    성공하면 코드는 문서에서 감지된 각 블록 유형에 대해 부분 JSON 응답을 반환합니다.