Я пытаюсь отформатировать этот словарь внутри словаря
Полный код:
for image in url_images:
detected_faces = face_client.face.detect_with_url(url=image, return_face_attributes=face_attributes)
if not detected_faces:
await ctx.send('No faces detected in this image')
for face in detected_faces:
age = str(face.face_attributes.age)
age_fin = age.split(".")
gender = str(face.face_attributes.gender)
gender_fin = gender.split(".")
await ctx.send('Facial attributes detected:\nAge: '+ age_fin[0] +
'\nGender: ' + gender_fin[1] +
'\nEmotion: ' + str(face.face_attributes.emotion))
Вывод, который я получаю с кодом
Facial attributes detected:
Gender: male
Emotion: {'additional_properties': {}, 'anger': 0.001, 'contempt': 0.002, 'disgust': 0.0, 'fear': 0.0, 'happiness': 0.542, 'neutral': 0.455, 'sadness': 0.0, 'surprise': 0.0}
Пример форматирования желаемого:
Facial attributes detected:
Gender: male
Emotion: 0% anger, 0% contempt, 0% disgust, 0% fear, 0% happiness, 98% neutral, 0% sadness, 0% surprise
Что я пробовал:
Ошибка: TypeError: 'Emotion' object is not subscriptable
. Вот скриншот моего кода с попыткой решения
emotions = ["anger", "contempt", "disgust", "fear", "happiness", "neutral", "sadness", "surprise"]
print('Emotion: ')
for emo in emotions:
value = face.face_attributes.emotion[emo]
print(f'{value} {emo},', end='')
print('\n')
API, который я использую https://azure.microsoft.com/en-us/services/cognitive-services/face/#demo
Можете ли вы уточнить, пожалуйста
Я имел в виду значение, которое вы получаете из переменной face.face_attributes
В этом вопросе много лишней информации. Сводится ли это к тому, что у вас есть словарь: {'additional_properties': {}, 'anger': 0.001, 'contempt': 0.002, 'disgust': 0.0, 'fear': 0.0, 'happiness': 0.542, 'neutral': 0.455, 'sadness': 0.0, 'surprise': 0.0}
, и вы хотите отформатировать его как Emotion: 0% anger, 0% contempt, 0% disgust, 0% fear, 0% happiness, 98% neutral, 0% sadness, 0% surprise
?
да, это правда @MarkTolonen
{'additional_properties': {}, 'age': 53.0, 'gender': <Gender.male: 'male'>, 'smile': 1.0, 'facial_hair': <azure.cognitiveservices.vision.face.models._models_py3.FacialHair object at 0x00000162A1BCDEB0>, 'glasses': <GlassesType.no_glasses: 'noGlasses'>, 'head_pose': None, 'emotion': <azure.cognitiveservices.vision.face.models._models_py3.Emotion object at 0x00000162A1BF9070>, 'hair': None, 'makeup': None, 'occlusion': None, 'accessories': None, 'blur': None, 'exposure': None, 'noise': None}
Это результат, который я получаю, когда просто print(face.face_attributes)
Разве это не то же самое, что и ваш предыдущий вопрос stackoverflow.com/questions/65244655/formatting-of-dictionaries
Ошибка указывает на то, что значение face.face_attributes.emotion
на самом деле не является словарем, даже если оно печатается как словарь. Это экземпляр класса с именем Emotion
.
Поскольку Emotion
не является стандартным классом Python, вероятно, он определен библиотекой API. Вам нужно будет проверить его документацию, чтобы узнать, как получить динамический доступ к эмоциям.
Похоже, что функция ToRankedList()
, упомянутая на этой странице справки, может вернуть словарь.
learn.microsoft.com/en-us/python/api/… Более подробную информацию я нашел здесь
Данный:
d = {'additional_properties': {}, 'anger': 0.001, 'contempt': 0.002, 'disgust': 0.0, 'fear': 0.0, 'happiness': 0.542, 'neutral': 0.455, 'sadness': 0.0, 'surprise': 0.0}
Это форматирует клавиши эмоций как желаемую строку:
print(', '.join([f'{v:.0%} {k}' for k,v in d.items() if k != 'additional_properties']))
Выход:
0% anger, 0% contempt, 0% disgust, 0% fear, 54% happiness, 46% neutral, 0% sadness, 0% surprise
Почему вы думаете, что у класса Emotion
есть метод items()
, как у словарей?
это не так, поэтому я получаю ошибку 'Emotion' object has no attribute 'items'
@ Бармар, я не знаю. У меня нет библиотеки, но, учитывая d
выше, она работает. Всегда можно сделать d = ast.literal_eval(str(face.face_attributes.emotion))
, так как он печатается как словарь :^)
не могли бы вы обновить свой ответ, пожалуйста? @МаркТолонен
from azure.cognitiveservices.vision.face import FaceClient
from msrest.authentication import CognitiveServicesCredentials
import os
import json
endpoint = ''
key = ''
face_client = FaceClient(endpoint, CognitiveServicesCredentials(key))
single_face_image_url = 'https://azurecomcdn.azureedge.net/cvt-4c22a847f7d6cb9f6d140f4927646992a7343e54da079181e641d3aae5d130bb/images/shared/cognitive-services-demos/face-detection/detection-1-thumbnail.jpg'
single_image_name = os.path.basename(single_face_image_url)
face_attributes = ['emotion']
detected_faces = face_client.face.detect_with_url(
url=single_face_image_url,
detectionModel='detection_02',
return_face_attributes=face_attributes)
if not detected_faces:
raise Exception('No face detected from image {}'.format(single_image_name))
for face in detected_faces:
emotionObject = face.face_attributes.emotion.as_dict()
print(', '.join([f'{v:.0%} {k}' for k, v in emotionObject.items(
) if k != 'additional_properties']))
Ответил Джим Сюй здесь
Можете ли вы добавить образец ответа, который вы получаете от API?