Face API-情感属性数量的变化

时间:2018-12-28 16:03:37

标签: android azure attributes microsoft-cognitive 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

即使我使用treeMaptreeMap.put()添加了7个键值对,有人知道为什么会发生这种现象吗?我发现treeMap中存在 do 的键值对是最有可能出现的情绪,但是即使其他属性为0,为什么还不添加它们呢?到treeMap

2 个答案:

答案 0 :(得分:1)

发生此错误的原因是因为您使用的TreeMap仅允许唯一键。这意味着如果0.0%的自信中有一种以上的情绪,那么由于您的TreeMap的关键是Double,因此只会存储最后一种情绪。

因此,使用您发布的代码,您将仅收到具有不同置信度百分比百分比的情绪。要解决此问题,您应该像这样切换TreeMap的类型:

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

现在,如果要按TreeMap而不是键值对Double进行排序,则必须使用Comparator。您可以找到有关如何执行此操作的good solution here

基本上,该解决方案所做的是获取传入的Map,列出值,对值进行排序,然后返回排序后的Map。我希望这能回答您的问题!

答案 1 :(得分:0)

发生这种情况的原因是我使用的0不允许重复的键。因此,如果一个以上的情感属性返回0.0,则仅保留最新的情感属性,因为0.0是关键。

相反,如果我将TreeMap作为密钥(例如“幸福”或“愤怒”),那么String将包含所有7种情绪。