我想将Google Vision API面部识别的输出转换为机器学习分类器的特征集。对于每个训练实例,我得到一个预测面部的列表,这些面部以字典列表的形式表示,其中值本身是字典,而这些“值字典”的值是分类性质的,如下所示:
$ 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', 'anger': 'VERY_UNLIKELY', 'sorrow': 'VERY_UNLIKELY', 'headwear': 'VERY_UNLIKELY'}, 'face_2': {'joy': 'VERY_UNLIKELY', 'surprise': 'VERY_UNLIKELY', 'anger': 'VERY_UNLIKELY', 'sorrow': 'VERY_UNLIKELY', 'headwear': 'VERY_LIKELY'}}, {'face_1': {'joy': 'VERY_LIKELY', 'surprise': 'VERY_UNLIKELY', 'anger': 'VERY_UNLIKELY', 'sorrow': 'VERY_UNLIKELY', 'headwear': 'VERY_UNLIKELY'}, 'face_2': {'joy': 'POSSIBLE', 'surprise': 'VERY_UNLIKELY', 'anger': 'VERY_UNLIKELY', 'sorrow': 'VERY_UNLIKELY', 'headwear': 'VERY_UNLIKELY'}}]
我的目标是将其转换为机器学习可读的格式。我希望使用如下所示的编码(n是整个数据集中预测面部的最大数量):
joy_1 surprise_1 , ...., anger_n sorrow_n headwear_nimg_1 1 2 , ...., 0 0 0img_2 0 0 , ...., 0 0 0img_3 0 0 , ...., 0 0 0img_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 npobservations = ["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 = 2vector = 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_vectorprint(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
来轻松扩展这一点。