選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

使用 AWS Lambda 函數分析影像

焦點模式
使用 AWS Lambda 函數分析影像 - Rekognition

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AWS Lambda 是一種運算服務,可讓您執行程式碼,而無需佈建或管理伺服器。例如,您可以分析從行動應用程式提交的圖像,而無需建立伺服器來託管應用程式的程式碼。下列指示展示如何在 Python 建立 Lambda 函數,可以呼叫 DetectCustomLabels。此函數會分析提供的圖像,並傳回圖像中找到的標籤列表。這些指引包括範例 Python 程式碼,展示如何使用 Amazon S3 儲存貯體中的圖像或本機電腦提供的圖像呼叫 Lambda 函數。

步驟 1:建立 AWS Lambda 函數 (主控台)

在此步驟中,您會建立空 AWS 函數和IAM執行角色,讓您的函數呼叫 DetectCustomLabels操作。它還授予對儲存圖像以供分析的 Amazon S3 儲存貯體的存取權限。您也可以為以下內容指定環境變數:

  • 您希望您的 Lambda 函數使用的 Amazon Rekognition 自訂標籤模型。

  • 您希望模型可使用的信賴度界限。

稍後,您可以將原始程式碼,和選擇性增加的圖層新增至 Lambda 函數。

建立 AWS Lambda 函數 (主控台)
  1. 登入 AWS Management Console 並在 開啟 AWS Lambda 主控台https://console.aws.amazon.com/lambda/

  2. 選擇建立函數 。如需更多詳細資訊,請參閱 使用主控台建立 Lambda 函數

  3. 選擇下列選項:

    • 選擇從頭開始撰寫

    • 輸入 函數的名稱 的值。

    • 針對 執行期,選擇 Python 3.10

  4. 選擇 建立函數 來建立 AWS Lambda 函數。

  5. 在函數頁面上,選擇 配置 標籤。

  6. 環境變數 視窗中,選擇 編輯

  7. 新增以下環境變數。針對每個變數,選擇新增環境變數,然後輸入可變金鑰和值。

    金鑰

    MODEL_ARN

    您希望 Lambda 函數使用的模型 Amazon Resource Name (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,請使用以下政策。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,請選擇不同的政策名稱,例如 S3 儲存貯體-存取權

步驟 2:(可選) 建立圖層 (主控台)

若要執行此範例,您不需要執行此步驟。DetectCustomLabels 操作包含在預設的 Lambda Python 環境中,做為 for Python (Boto3) AWS SDK的一部分。如果 Lambda 函數的其他部分需要不在預設 Lambda Python 環境中的最新 AWS 服務更新,請執行此步驟,將最新的 Boto3 SDK版本做為 layer 新增至函數。

首先,您要建立包含 Boto3 的 .zip 檔案封存SDK。然後,您需要建立一個圖層並將該 .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 主控台程式碼編輯器將 Python 程式碼新增至 Lambda 函數。此程式碼會分析 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 區域中執行程式碼。您可以在 AWS Lambda 主控台函數詳細資訊頁面的導覽列中檢視 Lambda 函數的區域。

如果 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的 。

    若要提供存取權,請新增權限至您的使用者、群組或角色:

  2. 安裝和設定 AWS SDK Python。如需詳細資訊,請參閱步驟 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 函數時 啟動模型

隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。