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 эмоций.