Face API - изменение количества атрибутов эмоций

Я использую Microsoft Face API для обнаружения лиц и эмоций в Android. у меня есть TreeMap чей ключ - это вероятность атрибута эмоции со значением, являющимся именем атрибута, например:

TreeMap<Double, String> treeMap = new TreeMap<>();
treeMap.put(person.faceAttributes.emotion.happiness, "Happiness");
treeMap.put(person.faceAttributes.emotion.anger, "Anger");
treeMap.put(person.faceAttributes.emotion.disgust, "Disgust");
treeMap.put(person.faceAttributes.emotion.sadness, "Sadness");
treeMap.put(person.faceAttributes.emotion.neutral, "Neutral");
treeMap.put(person.faceAttributes.emotion.surprise, "Surprise");
treeMap.put(person.faceAttributes.emotion.fear, "Fear");

(человек является объектом типа Face )

То, что я хочу сделать, это оценить эти 7 эмоций от наиболее вероятных до наименее вероятных, но проблема в том, что размер treeMap варьируется. Например, когда я выбираю эмоции лица, которое улыбается, treeMap.size() возвращает 2. Когда я выбираю эмоции лица, которое в основном нейтрально, treeMap.size() возвращает 3.

Кто-нибудь знает, почему это происходит, хотя я добавил 7 пар ключ-значение treeMap с помощью treeMap.put()? Я обнаружил, что пары ключ-значение, которые существуют в treeMap являются наиболее вероятными эмоциями, но даже если другие атрибуты должны были быть 0, почему они все еще не добавляются в treeMap,

2 ответа

Решение

Причиной возникновения этой ошибки является то, что вы используете TreeMap который позволяет только уникальные ключи. Это означает, что если есть более чем одна эмоция с 0.0% доверие, то будет храниться только последний, потому что ключ для вашего TreeMap это Double,

Следовательно, с кодом, который вы опубликовали, вы будете получать только те эмоции, которые имели различный процент уровней доверия. Чтобы решить эту проблему, вам нужно переключить типы TreeMap вот так:

TreeMap<String, Double> treeMap = new TreeMap<>();

Теперь, если вы хотите отсортировать TreeMap по значениям, Double, а не ключ, вам придется использовать Comparator, Вы можете найти хорошее решение здесь о том, как это сделать.

В основном то, что делает это решение, это взять Map передается, создает список значений, сортирует значения, а затем возвращает обратно отсортированный Map, Надеюсь, это ответит на ваш вопрос!

Причина этого состояла в том, что я использовал TreeMap который не позволяет дублировать ключи. Следовательно, если более одного атрибута эмоции вернул 0.0, тогда будет сохранен только самый последний атрибут, поскольку ключ является 0.0.

Вместо этого, если бы я сделал String ключ (например, "Счастье" или "Гнев"), затем TreeMap содержал бы значения для всех 7 эмоций.

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