【问题标题】:Compressing image before sending to SageMaker TF Serving在发送到 SageMaker TF Serving 之前压缩图像
【发布时间】:2019-06-13 15:25:46
【问题描述】:

我能够成功地将批量图像作为 numpy 数组发送到我使用 TF 服务设置的 SageMaker 端点并获得响应,如下所示:。

def predict_random_batch(self, batch_size, verbose=0, initial_args=None): 
    batch = np.random.uniform(low=-1.0, high=1.0, size=(batch_size,self.size,self.size,3))
    data = {'instances': np.asarray(batch).astype(self.dtype)}
    if verbose: self.total_size(data)
    request_args = self._create_request_args(data, initial_args)
    response = self.sagemaker_session.sagemaker_runtime_client.invoke_endpoint(**request_args)
    probs = self._handle_response(response)['predictions']
    return probs

predictor.predict_random_batch(3)

但是,numpy 数组非常大。我正在尝试在发送之前压缩图像批次。这就是我正在尝试的:

def predict_random_batch_TEST(self, batch_size, verbose=0, initial_args=None): 
    import base64
    batch = np.random.uniform(low=-1.0, high=1.0, size=(batch_size,self.size,self.size,3))
    batch = batch.astype(self.dtype)
    encoded_input_string = base64.b64encode(batch)
    input_string = encoded_input_string.decode("utf-8")
    instance = [{"b64": input_string}]
    data = json.dumps({"instances": instance})        
    request_args = self._create_request_args(data, initial_args)
    if verbose: self.total_size(data)
    response = self.sagemaker_session.sagemaker_runtime_client.invoke_endpoint(**request_args)
    probs = self._handle_response(response)['predictions']
    return probs

但是这会返回错误:

ModelError:调用时发生错误(ModelError) InvokeEndpoint 操作:收到来自模型的客户端错误 (400) 消息“{“错误”:“JSON 值:. . .不是对象"}"

有人知道如何压缩一批图像以发送更大的批量吗?显然 SM 施加了 5MB 的有效负载限制,这在作为 numpy 数组发送时并不是很大。

【问题讨论】:

    标签: python-3.x rest tensorflow-serving image-compression amazon-sagemaker


    【解决方案1】:

    在将图像发送到端点之前,我使用单独的 API 来调整图像大小。这是代码sn-p,你应该没有问题适应它。

    h = body['height']
    w = body['width']
    image = base64.b64decode(body['data'])
    L = len(image)
    
    image = np.fromstring(image, np.uint8)
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)
    (H, W, _) = image.shape
    image = cv2.resize(image, (h, w,))
    image = cv2.imencode('.jpeg', image)
    data = base64.b64encode(image[1].tostring())
    

    全文在这里:https://medium.com/@julsimon/using-chalice-to-serve-sagemaker-predictions-a2015c02b033

    【讨论】:

    • 似乎无法让它工作。我是否需要修改我保存的模型或 Tensorflow 服务以使其接受 json 序列化 jpeg 字节字符串而不是 json 序列化 Numpy 数组?
    • 我会说不。为模型提供所需的任何东西感觉更简单,所以我只需使用上面的 cv2 代码调整图像大小,然后序列化 numpy 数组。
    • 我的问题是序列化的 Numpy 数组似乎效率不高,我遇到了 5MB 的最大有效负载大小和相当小的图像
    • 如果您想要大批量并且不需要实时请求/响应行为,也许SageMaker Batch Transform 会更合适?
    猜你喜欢
    • 1970-01-01
    • 2017-05-17
    • 2017-02-26
    • 2013-06-22
    • 2021-01-03
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多