使用 AWS Lambda 函数分析图像 - Rekognition

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 AWS Lambda 函数分析图像

AWS Lambda 是一项计算服务,允许您在不预置或管理服务器的情况下运行代码。例如,您可以分析从移动应用程序提交的图像,而不必创建服务器来托管应用程序代码。以下说明说明如何在 Python 中创建可调用的 Lambda 函数。DetectCustomLabels该函数会分析提供的图像并返回在图像中找到的标签列表。这些说明包括示例 Python 代码,该代码展示了如何使用 Amazon S3 存储桶中的图像或本地计算机提供的图像调用 Lambda 函数。

步骤 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 函数使用的模型的亚马逊资源名称 (ARN)。您可以ARN从 Amazon Rekognition 自定义标签控制台中模特详情页面的 “使用模型” 选项卡获取模型。

    CONFIDENCE

    模型的标签预测置信度的最小值 (0-100)。Lambda 函数不会返回置信度值低于此值的标签。

  8. 选择保存以保存环境变量。

  9. 在 “权限” 窗格的 “角色名称” 下,选择执行角色以在IAM控制台中打开该角色。

  10. 权限选项卡中,选择添加权限,然后选择创建内联策略

  11. 选择现有策略JSON并将其替换为以下策略。

    { "Version": "2012-10-17", "Statement": [ { "Action": "rekognition:DetectCustomLabels", "Resource": "*", "Effect": "Allow", "Sid": "DetectCustomLabels" } ] }
  12. 选择下一步

  13. 策略详细信息中,输入策略的名称,例如 DetectCustomLabels-acces s。

  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)的一部分包含在默认 Lambda AWS SDK Python 环境中。如果您的 Lambda 函数的其他部分需要不在默认 Lambda Python 环境中的最新 AWS 服务更新,请执行此步骤将最新的 Boto3 SDK 版本作为层添加到您的函数中。

首先,创建包含 B SDK oto3 的.zip 文件存档。然后,创建一个层并将 .zip 文件归档添加到该层。有关更多信息,请参阅组合使用层与 Lambda 函数

创建并添加层(控制台)
  1. 打开命令提示符,然后输入以下命令。

    pip install boto3 --target python/. zip boto3-layer.zip -r python/
  2. 记下压缩文件的名称 (boto3-layer.zip)。您需要在本过程的步骤 6 中使用它。

  3. 打开 AWS Lambda 控制台,网址为https://console.aws.amazon.com/lambda/

  4. 在导航窗格中,选择

  5. 选择创建层

  6. 名称描述输入值。

  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 控制台的函数概述中获取ARN适用于您的 Lambda 函数的函数。

    要提供访问权限,请为您的用户、组或角色添加权限:

    • 中的用户和群组 AWS IAM Identity Center:

      创建权限集合。按照《AWS IAM Identity Center 用户指南》创建权限集的说明进行操作。

    • IAM通过身份提供商管理的用户:

      创建适用于身份联合验证的角色。按照《IAM用户指南》中为第三方身份提供商创建角色(联合)中的说明进行操作。

    • IAM用户:

      • 创建您的用户可以担任的角色。按照《用户指南》为IAM用户创建角色中的IAM说明进行操作。

      • (不推荐使用)将策略直接附加到用户或将用户添加到用户组。按照《用户指南》中向用户(控制台)添加权限中的IAM说明进行操作。

  2. 为 Python 安装和配置 AWS SDK。有关更多信息,请参阅 步骤 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 函数时,请记得启动模型