Атрибут Face API Emotion выдает ошибку нулевого объекта

Я работаю с Microsoft Face API, чтобы определять такие атрибуты лиц, как возраст, пол и эмоции. У меня работает следующий код: faces[position].faceAttributes.age, и я могу узнать примерный возраст. (faces[] - это массив типа Face)

Однако когда я пытаюсь получить вероятность того, что лицо счастливое, я сталкиваюсь со следующей ошибкой:

Attempt to read from field 'double com.microsoft.projectoxford.face.contract.Emotion.happiness' on a null object reference.

Вот как я получаю вероятность того, что человек счастливый:
faces[position].faceAttributes.emotion.happiness

Точно так же, когда я пытаюсь: faces[position].faceAttributes.emotion, он возвращает null.

Я знаю, что faces[position].faceAttributes - это не null, потому что он работает с другими атрибутами, такими как возраст и пол, но я не могу понять, почему он не работает с эмоциями. Кто-нибудь знает, почему это происходит и что я могу сделать, чтобы это работало?


Обновлять:

Для тех, кто сталкивается с той же проблемой, в AsnycTask, где вы обрабатываете лица, вы должны включить атрибуты, которые вы хотите обнаружить, в противном случае будет указано, что это ссылка на нулевой объект, когда вы обратитесь к ним позже. Изначально у меня был FaceServiceClient.FaceAttributeType.Smile, поэтому он выдавал ошибку при попытке определить эмоции. Следующий код входит в метод doInBackground:

FaceServiceClient.FaceAttributeType[] faceAttr = new FaceServiceClient.FaceAttributeType[]{
    FaceServiceClient.FaceAttributeType.HeadPose,
    FaceServiceClient.FaceAttributeType.Age,
    FaceServiceClient.FaceAttributeType.Gender,
    FaceServiceClient.FaceAttributeType.Emotion,
    FaceServiceClient.FaceAttributeType.FacialHair
};
1
0
555
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы не запрашиваете атрибуты emotion во время вашего запроса. Все эти атрибуты лица являются необязательными, поэтому возвращаемый объект будет содержать только тот, который вы запросили. Например со следующим запросом:

POST https://westeurope.api.cognitive.microsoft.com/face/v1.0/detect?returnFaceId=true&returnFaceLandmarks=false&returnFaceAttributes=age,gender HTTP/1.1
Host: westeurope.api.cognitive.microsoft.com
Content-Type: application/json
Ocp-Apim-Subscription-Key: ••••••••••••••••••••••••••••••••

{
    "url": "https://pbs.twimg.com/profile_images/907936570342338560/qHCX1E2B_400x400.jpg"
}

Я получу следующий ответ, где JSON при разборе отправляет объект с null для эмоции

[{
  "faceId": "e97a0554-99a9-44f7-9de9-614ef6d8843b",
  "faceRectangle": {
    "top": 117,
    "left": 106,
    "width": 219,
    "height": 219
  },
  "faceAttributes": {
    "gender": "male",
    "age": 32.0
  }
}]

Если я добавлю emotion в returnFaceAttributes запроса:

[{
  "faceId": "da7c416f-3eb4-4132-8b3e-e317daf58c7d",
  "faceRectangle": {
    "top": 117,
    "left": 106,
    "width": 219,
    "height": 219
  },
  "faceAttributes": {
    "gender": "male",
    "age": 32.0,
    "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
    }
  }
}]

Я не знаю, как вы использовали API (прямой вызов или использование пакета), но вам обязательно стоит взглянуть на эти параметры, они доступны на вашем уровне. Если это не так, используйте непосредственно API (документ: https://westeurope.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/)

Спасибо большое, Николас! Я не осознавал, что не обрабатываю атрибут эмоции в AsnycTask, поэтому теперь он работает. Большое спасибо!

Ishaan Javali 27.12.2018 15:01

Привет, Николас. Кажется, вы знаете об использовании Microsoft Face API. Мне удалось успешно выполнить руководство, в котором я написал код в Visual Studio для создания группы людей, добавления в нее людей, предоставления изображений для людей, а затем обучения группы людей, и я использовал Android Studio для идентификации человека и оно работает. Однако мне не удалось найти руководство, в котором объясняется, как все это делать на Android, потому что моя конечная цель - создать приложение для распознавания лиц. Не могли бы вы указать мне источник, где я могу узнать, как это сделать?

Ishaan Javali 28.12.2018 00:33

Когда я пробую следующий код в Android: CreatePersonResult createPersonResult = faceServiceClient.createPerson(personGroupId, "Bob", "Hi"); в операторе try catch, он просто печатает "" с пробелом. Вы знаете, как я могу создать человека в Android?

Ishaan Javali 28.12.2018 00:34

Другие вопросы по теме