如何解决将具有 dicts 作为值的 dicts 列表转换为 ML 特征
我想将 Google Vision API 面部识别的输出转换为 ML 分类器的特征集。对于每个训练实例,我都会得到一个预测人脸列表,该列表表示为字典列表,其中值本身就是字典,而这些“值字典”的值本质上是分类的,如下所示:
$ faces[191:197]
[{'face_1': {'joy': 'VERY_UNLIKELY','surprise': 'UNLIKELY','anger': 'VERY_UNLIKELY','sorrow': 'VERY_UNLIKELY','headwear': 'VERY_UNLIKELY'}},{},{'face_1': {'joy': 'VERY_LIKELY','surprise': 'LIKELY','headwear': 'VERY_UNLIKELY'},'face_2': {'joy': 'VERY_UNLIKELY','surprise': 'VERY_UNLIKELY','headwear': 'VERY_LIKELY'}},'face_2': {'joy': 'POSSIBLE','headwear': 'VERY_UNLIKELY'}}]
我的目标是将其转换为 ML 可读格式。我想使用看起来像这样的编码(n 是整个数据集中预测的人脸的最大数量):
joy_1 surprise_1,....,anger_n sorrow_n headwear_n
img_1 1 2,0 0 0
img_2 0 0,0 0 0
img_3 0 0,0 0 0
img_4 5 4,0 0 0
.
.
.
我已经将 sklearn dictVectorizer 和 labelEncoder 用于其他作为字典列表的功能,但这些字典没有字典作为值,就像这个数据源的情况一样。
解决方法
我不知道有什么可以开箱即用的以用户定义的方式处理将序数值 (VERY_UNLIKELY
,...,VERY_LIKELY
) 映射到整数的东西同时还处理字典中可能的键。
类似以下的操作在这里可能最简单:
# Include `images` list-of-dicts from question
# images = [{'face_1': {'joy': 'VERY_UNLIKELY',# ...]
import numpy as np
observations = ["joy","surprise","anger","sorrow","headwear"]
levels = {
"VERY_UNLIKELY": 0,"UNLIKELY": 1,"POSSIBLE": 2,"LIKELY": 3,"VERY_LIKELY": 4,}
N_IMAGES = len(images)
N_OBSERVATIONS = len(observations)
N_PEOPLE_PER_IMAGE = 2
vector = np.zeros((N_IMAGES,N_PEOPLE_PER_IMAGE * N_OBSERVATIONS))
for i,image in enumerate(images):
for j,face in enumerate(image):
if not face:
continue
else:
t = (j * N_OBSERVATIONS)
e = (j * N_OBSERVATIONS) + N_OBSERVATIONS
obs_vector = [levels[image[face][obs]] for obs in observations]
vector[i][t:e] = obs_vector
print(vector)
结果:
[[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[4. 3. 0. 0. 0. 0. 0. 0. 0. 4.]
[4. 0. 0. 0. 0. 2. 0. 0. 0. 0.]]
如果每张图像中最多有 8 张人脸,则可以通过设置 N_PEOPLE_PER_IMAGE = 8
轻松扩展。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。