Я работаю с 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
};
Похоже, вы не запрашиваете атрибуты 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/)
Привет, Николас. Кажется, вы знаете об использовании Microsoft Face API. Мне удалось успешно выполнить руководство, в котором я написал код в Visual Studio для создания группы людей, добавления в нее людей, предоставления изображений для людей, а затем обучения группы людей, и я использовал Android Studio для идентификации человека и оно работает. Однако мне не удалось найти руководство, в котором объясняется, как все это делать на Android, потому что моя конечная цель - создать приложение для распознавания лиц. Не могли бы вы указать мне источник, где я могу узнать, как это сделать?
Когда я пробую следующий код в Android: CreatePersonResult createPersonResult = faceServiceClient.createPerson(personGroupId, "Bob", "Hi"); в операторе try catch, он просто печатает "" с пробелом. Вы знаете, как я могу создать человека в Android?
Спасибо большое, Николас! Я не осознавал, что не обрабатываю атрибут эмоции в
AsnycTask, поэтому теперь он работает. Большое спасибо!