Face API - изменение количества атрибутов эмоций - PullRequest
0 голосов
/ 28 декабря 2018

Я использую 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()?Я обнаружил, что пары ключ-значение, которые do существуют в treeMap, являются наиболее вероятными эмоциями, но даже если другие атрибуты должны были быть 0, почему они все еще не добавляются в treeMap.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

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

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

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

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

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

0 голосов
/ 29 декабря 2018

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

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

...