Python - Microsoft Cognitive Verify API (параметры)

Я пытаюсь использовать Microsoft Cognitive Verify API с python 2.7: https://dev.projectoxford.ai/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f3039523a

Код такой:

import httplib, urllib, base64

headers = {
    # Request headers
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': 'my key',
}

params = '{\'faceId1\': \'URL.jpg\',\'faceId2\': \'URL.jpg.jpg\'}'

try:
    conn = httplib.HTTPSConnection('api.projectoxford.ai')
    conn.request("POST", "/face/v1.0/verify?%s" % params, "{body}", headers)
    response = conn.getresponse()
    data = response.read()
    print(data)
    conn.close()
except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

Я попытался разрешить строку conn.request вот так:

conn.request("POST", "/face/v1.0/verify?%s" % params, "", headers)

Ошибка:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request</h2>
<hr><p>HTTP Error 400. The request is badly formed.</p>
</BODY></HTML>

Я уже пытался следовать и заставить работать следующие коды:

  1. https://github.com/Microsoft/Cognitive-Emotion-Python/blob/master/Jupyter%20Notebook/Emotion%20Analysis%20Example.ipynb

  2. Использование API эмоций Project Oxford

Однако я просто не могу заставить это работать. Я предполагаю, что что-то не так с аргументом params или body. Любая помощь очень ценится.


person Gustavo Rojo Blasquez    schedule 11.08.2016    source источник
comment
Я думаю, что в формате JSON используются двойные кавычки, а не одиночные. Я бы попробовал поменять их в парамах.   -  person Dawid    schedule 11.08.2016


Ответы (3)


Вы можете обратиться к этому вопросу.

Очевидно, вы не поняли код. "{body}" означает, что вы должны заменить его своим телом, содержащим URL-адрес вашего запроса, как сказано на сайте: < img src = "https://i.stack.imgur.com/s86gU.png" alt = "введите описание изображения здесь">

Таким образом, вы можете использовать этот api следующим образом:

body = {
            "url": "http://example.com/1.jpg"                          
       }
…………

conn = httplib.HTTPSConnection('api.projectoxford.ai')
conn.request("POST", "/face/v1.0/detect?%s" % params, str(body), headers)
person YJ. Yang    schedule 09.12.2016

Комментарий Давида выглядит так, как будто он должен исправить это (двойные кавычки), попробуйте это для python 2.7:

import requests

url = "https://api.projectoxford.ai/face/v1.0/verify"

payload = "{\n    \"faceId1\":\"A Face ID\",\n    \"faceId2\":\"A Face ID\"\n}"
headers = {
    'ocp-apim-subscription-key': "KEY_HERE",
    'content-type': "application/json"
    }

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)

для Python 3:

import http.client

conn = http.client.HTTPSConnection("api.projectoxford.ai")

payload = "{\n\"faceId1\": \"A Face ID\",\n\"faceId2\": \"Another Face ID\"\n}"

headers = {
    'ocp-apim-subscription-key': "keyHere",
    'content-type': "application/json"
    }

conn.request("POST", "/face/v1.0/verify", payload, headers)

res = conn.getresponse()
data = res.read()
person Ryan Galgon    schedule 12.08.2016
comment
Спасибо, @Dawid, @Ryan. Боюсь, это не сработало. Я пробовал, как вы говорите, и показывает ошибку ImportError: No module named http.client. Если я перехожу на conn = httplib.HTTPSConnection('api.projectoxford.ai') с двойными кавычками payload = "{\n\"faceId1\": \"A Face ID\",\n\"faceId2\": \"Another Face ID\"\n}", я получаю эту ошибку: {"error":{"code":"BadArgument","message":"Face ID is invalid."}} - person Gustavo Rojo Blasquez; 13.08.2016
comment
Извините, я не заметил, что вы используете python 2.7. http.client является частью Python 3. - person Ryan Galgon; 16.08.2016
comment
Также для полноты вам придется поменять местами действительные действительные идентификаторы лица, которые у вас есть, скажем, из предыдущего / обнаружения / вызова - person Ryan Galgon; 16.08.2016
comment
Совет по форматированию ... Используйте тройные кавычки / апострофы (ala docstrings) для включения сложных литералов .... payload = '''{"faceId1": "URL.jpg", ...}''' - person Basic; 16.08.2016

С вашим скриптом есть пара проблем:

  1. В REST API необходимо передавать идентификаторы лиц, а не URL-адреса или объекты файлов.
  2. Вы должны правильно сформулировать HTTP-запрос.

Однако вам может быть проще использовать Python API, а не REST API. Например, если у вас есть идентификаторы лиц, вы можете просто запустить result = CF.face.verify(faceid1, another_face_id=faceid2), не беспокоясь о настройке правильного запроса POST.

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

Чтобы упростить задачу, предположим, что у вас есть img1.jpg и img2.jpg на диске.

Вот пример использования REST API:

import cognitive_face as CF
from io import BytesIO
import json
import http.client

# Setup
KEY = "your subscription key"


# Get Face Ids
def get_face_id(img_file):
    f = open(img_file, 'rb')
    data = f.read()
    f.close()
    faces = CF.face.detect(BytesIO(data))

    if len(faces) != 1:
        raise RuntimeError('Too many faces!')

    face_id = faces[0]['faceId']
    return face_id


# Initialize API
CF.Key.set(KEY)

faceId1 = get_face_id('img1.jpg')
faceId2 = get_face_id('img2.jpg')


# Now that we have face ids, we can setup our request
headers = {
    # Request headers
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': KEY
}

params = {
    'faceId1': faceId1,
    'faceId2': faceId2
}

# The Content-Type in the header specifies that the body will
# be json so convert params to json
json_body = json.dumps(params)

try:
    conn = httplib.HTTPSConnection('https://eastus.api.cognitive.microsoft.com')
    conn.request("POST", "/face/v1.0/verify", body=json_body, headers=headers)
    response = conn.getresponse()
    data = response.read()
    data = json.loads(data)
    print(data)
    conn.close()
except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))
person Lantern Rouge    schedule 02.11.2018