Служба познания Microsoft Azure - сбой распознавания лиц в альбомном режиме - PullRequest
0 голосов
/ 22 октября 2018

Я использую сервис MS Cognition через API для анализа изображений и заметил, что когда изображения находятся в ландшафтном режиме («лица не выровнены по вертикали»), он возвращает пустой результат.Я очень озадачен и мне интересно, делаю ли я что-то не так, или так работает служба MS.Вот простой пример, чтобы воспроизвести проблему.

Вы должны иметь ключ подписки MS Face, чтобы иметь возможность пользоваться услугой!

import requests
# If you are using a Jupyter notebook, uncomment the following line.
#%matplotlib inline
import matplotlib.pyplot as plt
from PIL import Image
from matplotlib import patches
from io import BytesIO

# send request to MS, use YOUR subscription key
subscription_key = "982374kwhXXXxxxx"
assert subscription_key

face_api_url ='https://westus.api.cognitive.microsoft.com/face/v1.0/detect'
header = {'Ocp-Apim-Subscription-Key': face_api_url }
headers  = {'Ocp-Apim-Subscription-Key': subscription_key, "Content-Type": "application/octet-stream" }

params = {
    'returnFaceId': 'true',
    'returnFaceLandmarks': 'false',
    'returnFaceAttributes': 'age,gender,headPose,smile,facialHair,glasses,' +
    'emotion,hair,makeup,occlusion,accessories,blur,exposure,noise'
}

# get a random image and convert to numpy array
image_url = 'https://how-old.net/Images/faces2/main007.jpg'
image = Image.open(BytesIO(requests.get(image_url).content))
image_np = np.array(image)

вотизображение:

enter image description here

, затем выполните анализ распознавания лиц MS:

    # save image into a buffer
    buf = io.BytesIO()
    plt.imsave(buf, image_np, format='jpg')


    response = requests.post(face_api_url, params=params, headers=headers, data=buf.getvalue())
    faces = response.json()
    print(faces)

При правильном выводе:

[{'faceId': '56afb612-f737-44da-8b62-511070527e18',   'faceRectangle': {'top': 209, 'left': 229, 'width': 91, 'height': 91},   'faceAttributes': {'smile': 1.0,    'headPose': {'pitch': 0.0, 'roll':
3.7, 'yaw': 1.2},    'gender': 'female',    'age': 29.0,    'facialHair': {'moustache': 0.0, 'beard': 0.0, 'sideburns': 0.0},    'glasses': 'NoGlasses',    'emotion': {'anger': 0.0,
    'contempt': 0.0,
    'disgust': 0.0,
    'fear': 0.0,
    'happiness': 1.0,
    'neutral': 0.0,
    'sadness': 0.0,
    'surprise': 0.0},    'blur': {'blurLevel': 'low', 'value': 0.02},    'exposure': {'exposureLevel': 'goodExposure', 'value': 0.65},    'noise': {'noiseLevel': 'medium', 'value': 0.31},    'makeup': {'eyeMakeup': True, 'lipMakeup': True},    'accessories': [],    'occlusion': {'foreheadOccluded': False,
    'eyeOccluded': False,
    'mouthOccluded': False},    'hair': {'bald': 0.05,
    'invisible': False,
    'hairColor': [{'color': 'brown', 'confidence': 1.0},
     {'color': 'blond', 'confidence': 0.48},
     {'color': 'black', 'confidence': 0.35},
     {'color': 'red', 'confidence': 0.27},
     {'color': 'gray', 'confidence': 0.19},
     {'color': 'other', 'confidence': 0.03}]}}},  {'faceId': 'dfb667ba-3fe7-42fc-b9ba-06a86619e94d',   'faceRectangle': {'top': 110, 'left': 125, 'width': 76, 'height': 76},   'faceAttributes': {'smile': 1.0,    'headPose': {'pitch': 0.0, 'roll': 2.3, 'yaw': 2.2}, 'gender': 'male',    'age': 32.0,    'facialHair': {'moustache': 0.4, 'beard': 0.4, 'sideburns': 0.1},    'glasses': 'NoGlasses',    'emotion': {'anger': 0.0,
    'contempt': 0.0,
    'disgust': 0.0,
    'fear': 0.0,
    'happiness': 1.0,
    'neutral': 0.0,
    'sadness': 0.0,
    'surprise': 0.0},    'blur': {'blurLevel': 'low', 'value': 0.02},    'exposure': {'exposureLevel': 'goodExposure', 'value': 0.72},    'noise': {'noiseLevel': 'low', 'value': 0.01},    'makeup': {'eyeMakeup': False, 'lipMakeup': True},    'accessories': [],    'occlusion': {'foreheadOccluded': False,
    'eyeOccluded': False,
    'mouthOccluded': False},    'hair': {'bald': 0.02,
    'invisible': False,
    'hairColor': [{'color': 'brown', 'confidence': 1.0},
     {'color': 'blond', 'confidence': 0.92},
     {'color': 'red', 'confidence': 0.66},
     {'color': 'gray', 'confidence': 0.25},
     {'color': 'other', 'confidence': 0.02},
     {'color': 'black', 'confidence': 0.01}]}}}]

Однако, если я поменять оси (транспонировать изображение), я получу нулевой результат («пустой»)

# save image into a buffer
buf = io.BytesIO()
plt.imsave(buf, np.swapaxes(image_np, 0,1), format='jpg')

enter image description here

response = requests.post(face_api_url, params=params, headers=headers, data=buf.getvalue())
faces = response.json()
print(faces)

Результатом будет пустой список:

[]

Мне интересно, сталкивался ли кто-нибудь с этой проблемой и что можно сделать, чтобы служба MS работала правильно, независимо от поворота или положенияизображение.

1 Ответ

0 голосов
/ 23 октября 2018

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

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

Вместо этого вы можете справиться со своей стороной, обнаруживНаправление лиц, поверните изображение в соответствии с этим, а затем отправьте его!

...