【问题标题】:Face API - Variation in # of Emotion AttributesFace API - 情绪属性的变化
【发布时间】:2019-05-26 10:28:58
【问题描述】:

我正在使用 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");

(person 是 Face 类型的对象)

我想做的是将这 7 种情绪从最有可能到最不可能进行排序,但问题是 treeMap 的大小各不相同。例如,当我选择获取微笑的面部表情属性时,treeMap.size() 返回2。当我选择获取主要是中性的面部的情绪属性时,treeMap.size() 返回 3

即使我使用treeMap.put()treeMap 添加了7 个键值对,有谁知道为什么会发生这种行为?我发现treeMap确实存在的键值对是最有可能的情绪,但是即使其他属性为0,为什么它们仍然不被添加到@ 987654330@.

【问题讨论】:

    标签: android azure attributes microsoft-cognitive face-api


    【解决方案1】:

    发生此错误的原因是因为您使用的 TreeMap 只允许唯一键。这意味着如果有多个情绪具有0.0% 的信心,那么只会存储最后一个情绪,因为您的TreeMap 的密钥是Double

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

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

    现在,如果您想按值 Double 而不是键对 TreeMap 进行排序,则必须使用 Comparator。你可以找到good solution here 来了解如何做到这一点。

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

    【讨论】:

    • 感谢阿拉希的回答。虽然我已经让它按要求工作了,但您的详细回答应该可以帮助其他有同样问题的人。
    【解决方案2】:

    发生这种情况的原因是我使用了不允许重复键的TreeMap。因此,如果多个情绪属性返回 0.0,则只保留最近的一个,因为 0.0 是关键。

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

    【讨论】:

      猜你喜欢
      • 2014-05-16
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多