Сжатие изображения перед отправкой в ​​SageMaker TF Serving - PullRequest
0 голосов
/ 19 января 2019

Я могу успешно отправлять пакеты изображений в виде массива на мою конечную точку SageMaker, настроенную с использованием обслуживания TF, и получить ответ, например так:

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 устанавливает ограничение полезной нагрузки в 5 МБ, которое не очень велико при отправке в виде массива.

1 Ответ

0 голосов
/ 21 января 2019

Я использую отдельный API для изменения размера изображений перед отправкой их в конечную точку.Вот фрагмент кода, у вас не должно возникнуть проблем с его адаптацией.

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

...