Правильный способ сделать запрос к модели, развернутой с помощью Azure ML Designer

#python #azure #computer-vision #classification #azureml

#python #azure #компьютерное зрение #классификация #azure-machine-learning-service

Вопрос:

Я пытаюсь отправить запрос POST в конечную точку Azure ML Designer (модель, которую я развернул). Вот мой код:

 import requests

scoring_uri = 'http:some-url/score'
key = 'someKey'

headers = {'Content-Type': 'application/json'}
headers['Authorization'] = f'Bearer {key}'

response = requests.get('https://www.okino.ua/media/var/news/2019/12/04/Quentin_Tarantino.jpg')

input_data = "{"data": ["   str(response.content)   "]}"
resp = requests.post(scoring_uri, data=response.content, headers=headers)
print(resp.text)
 

И я получаю и ошибка:

 {"error": {"code": 400, "message": "Input Data Error. Input data are inconsistent with schema.nSchema: {'WebServiceInput0': {'columnAttributes': [{'name': 'image', 'type': 'Bytes', 'isFeature': True, 'elementType': {'typeName': 'bytes', 'isNullable': False}, 'properties': {'mime_type': 'image/png', 'image_ref': 'image_info'}}, {'name': 'id', 'type': 'NumerinData: b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x01,\x01,\x00\x00\xff\xfe\x00[Copyright Shutterstock 2019;82139424;3600;2400;1563865756;Tue, 23 Jul 2019 07:09:16 GMT;0\xff\xed\x04\x16Photoshop 3.0\x008BIM\x04\x04\x00\x00\x00\x00\x03\xf9\x1c\x02\x05\x00\n103nTraceback (most recent call last):n  File "/azureml-envs/azureml_c1330288c44b762b0282b6f129c5292f/lib/python3.6/site-packages/azureml/designer/serving/dagengine/processor.py", line 18, in runn    webservice_input, global_parameters = self.pre_process(raw_data)n  File "/azureml-envs/azureml_c1330288c44b762b0282b6f129c5292f/lib/python3.6/site-packages/azureml/designer/serving/dagengine/processor.py", line 45, in pre_processn    json_data = json.loads(raw_data)n  File "/azureml-envs/azureml_c1330288c44b762b0282b6f129c5292f/lib/python3.6/json/__init__.py", line 349, in loadsn    s = s.decode(detect_encoding(s), 'surrogatepass')nUnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byten", "details": ""}}

 

Кто-нибудь знает, как я должен передавать данные изображения в конечную точку, предоставляемую Azure ML?

Комментарии:

1. на самом деле URL-адрес изображения, который я использовал в GET в приведенном выше примере, кажется, защищен CORS, но результат не меняется после использования любого другого URL-адреса изображения

Ответ №1:

Причина, по которой вы получаете приведенную ниже ошибку, заключается в том, что вы не передали входные данные / текст сообщения в требуемом формате / схеме.

Чтобы получить схему, вы можете либо следовать схеме, указанной в ошибке, либо получить ее из файла SWAGGER.JSON.

Я предпочитаю SWAGGER.JSON, потому что он предоставляет примеры использования и доступные конечные точки. Итак, подробно описываем шаги, приведенные ниже. Но если вам удобно создавать текст сообщения с ошибкой, это хорошо и хорошо.

Примечание: Ниже приведен только один процесс, как только вы ознакомитесь с тем, как использовать, вам не понадобятся приведенные ниже шаги.

Обычно это GET https://ServiceURI.io/Swagger.json так. Если вы получаете 404 или любую другую ошибку, вы можете проверить в журналах развертывания, вы можете найти путь к Swagger.JSON.

введите описание изображения здесь

Так что в моем случае это было https://<ServiceURI.io>/swagger.json

Вы можете нажать на указанный выше URL-адрес с помощью метода GET, и вам будет предоставлен вывод JSON.

Ответ, подобный приведенному ниже :

введите описание изображения здесь

Скопируйте выходные данные в формате JSON и вставьте их в редактор Swagger (https://editor.swagger.io /) [Вы также можете попробовать прочитать файл JSON напрямую, не анализируя его в редакторе Swagger]

У вас будет проанализированная версия файла Swagger, и вы быстро поймете, как должна использоваться ваша конечная точка (какие глаголы и параметры можно использовать с образцом)

введите описание изображения здесь

Теперь разверните конечную точку оценки. Это конечная точка, на которой вам нужно будет сосредоточиться.

Вы увидите пример ввода полезной нагрузки тела для ввода.

 {
  "Inputs": {
    "WebServiceInput0": [
      {
        "image": "data:image/png;base64,/9j/4AAQSkZJRgA.............k=",
        "id": 134,
        "category": "dog"
      }
    ]
  },
  "GlobalParameters": {}
}
 

Для вас это может отличаться от приведенного выше.

Но основная цель — отправить данные или (тело) в указанном выше формате в дополнение к передаче содержимого в байтах.

 POST <ENDPOINT>/SCORE
HEADERS : Authorization Header
BODY : REQUIRED DATA IN the ABOVE MENTIONED FORMAT