面部 API - 情绪属性#的变化

Face API - Variation in # of Emotion Attributes

我正在使用 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()returns2。当我选择获取主要是中性treeMap.size()returns3.[=的人脸的情感属性时21=]

有谁知道为什么即使我使用 treeMap.put()treeMap 添加了 7 个键值对,也会出现这种行为?我发现do存在于treeMap中的键值对是最有可能的情绪,但即使其他属性都为0,为什么不呢仍在添加到 treeMap.

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

相反,如果我将 String 作为密钥,(例如 "Happiness" 或 "Anger"),那么 TreeMap 将包含所有 7 种情绪的值。

发生此错误的原因是您使用的 TreeMap 只允许唯一键。这意味着如果有超过一种情绪 0.0% 置信度,那么只有最后一种会被存储,因为你的 TreeMap 的密钥是 Double.

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

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

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

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