【问题标题】:AWS Lambda send image file to Amazon SagemakerAWS Lambda 将图像文件发送到 Amazon Sagemaker
【发布时间】:2021-08-11 18:11:41
【问题描述】:

我有下一个问题,我尝试将 base64 中的图像文件发送到 Lambda 函数(用 Python 编写),用于调用 Sagemaker Endpoint,这是我的 Lambda 函数:

import os
import io
import boto3
import json
import base64

# grab environment variables
ENDPOINT_NAME = os.environ['ENDPOINT_NAME']
runtime= boto3.client('runtime.sagemaker')

def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))
    
    data = json.loads(json.dumps(event))
    payload = data['foto']
    img = base64.b64decode(payload)
    #body = json.dumps({"instances": img})

    try:
        response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,
                                            Body=img)
        print(response)
    except Exception as e:
        print("Inference Error:")
        print(e)

    return { "img":"ok" }

Jupyter 中的 sagemaker 端点调用可以正常使用此代码,

from tensorflow.keras.preprocessing.image import ImageDataGenerator

test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory('./data/val', target_size=(224,224))

instance = test_generator[1][0]
print(instance.shape)
array = instance.reshape((1,) + instance.shape)
payload = { 'instances': array.tolist() }

resp = tf_predictor.predict(payload)['predictions']
print(resp)

Lambda 中的错误表示数据类型未知,CloudWatch 维度错误。

我认为,错误出现在 invoke_endpoint 方法的正文中,但我没有找到如何将字节类型转换为带有图像数据的列表。我需要带有 numpy 或其他库的自定义 Lambda 函数吗?或者不需要

【问题讨论】:

    标签: python amazon-web-services tensorflow aws-lambda amazon-sagemaker


    【解决方案1】:

    您如何调用 Lambda 函数?如果您使用 API Gateway 将图像数据传递到 SageMaker Runtime 端点,您可能需要在集成上设置 contentHandling 属性以处理二进制编码。见这里:

    https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings.html

    【讨论】:

    • 我在 JSON 文件中传递 base64 字符串并用 Lambda 提取,在这种情况下我需要这个吗?
    • 谢谢,您的架构不清楚 - 如果您不使用 API Gateway 调用 Lambda 函数,请忽略之前的评论。为了找出根本问题,看看您是否可以直接调用 SageMaker Runtime invokeEndpoint API - 请参阅此处:boto3.amazonaws.com/v1/documentation/api/latest/reference/…
    【解决方案2】:

    解决方法很简单 使用bytes(img) 将base64 转换为字节,并将ContentType='image/jpeg' 添加到调用端点。

    经过两次小改动,您的 Lambda 函数现在应该是这样的:

    import os
    import io
    import boto3
    import json
    import base64
    
    # grab environment variables
    ENDPOINT_NAME = os.environ['ENDPOINT_NAME']
    runtime= boto3.client('runtime.sagemaker')
    
    def lambda_handler(event, context):
        print("Received event: " + json.dumps(event, indent=2))
    
        data = json.loads(json.dumps(event))
        payload = data['foto']
        img = base64.b64decode(payload)
        
        payload = bytes(img) # convert base64 to bytes 
    
        try:
            response = runtime.invoke_endpoint
            (
                EndpointName=ENDPOINT_NAME,
                ContentType='image/jpeg' ,
                Body=payload
            )
            print(response)
        except Exception as e:
            print("Inference Error:")
            print(e)
    
        return {"img": "ok"}
    

    【讨论】:

      猜你喜欢
      • 2020-11-11
      • 2021-09-29
      • 2021-01-18
      • 2014-10-24
      • 2018-09-26
      • 2023-03-22
      • 2019-05-27
      • 1970-01-01
      • 2018-03-01
      相关资源
      最近更新 更多