面部 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
。我希望这能回答你的问题!
我正在使用 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
。我希望这能回答你的问题!