我正在使用InsightFace研究面部识别系统。我想使用np.array()
将我的标签和面孔存储到numpy数组中,并对它们应用一些过滤,以确保每个标签都有嵌入。
这是我的过滤函数
def filter_empty_embs(img_set: List, img_labels: List[str]):
# filtering where insightface could not generate an embedding
good_idx = [i for i,x in enumerate(img_set) if x]
if len(good_idx) == len(img_set):
clean_embs = [e[0].embedding for e in img_set]
clean_labels = img_labels
else:
# filtering eval set and labels based on good idx
clean_labels = np.array(img_labels)[good_idx]
clean_set = np.array(img_set, dtype=object)[good_idx]
# generating embs for good idx
clean_embs = [e[0].embedding for e in clean_set]
return clean_embs, clean_labels
这是我提取嵌入的函数:
# sorting files
files = os.listdir(YALE_DIR)
files.sort()
eval_set = list()
eval_labels = list()
probe_set = list()
probe_labels = list()
IMAGES_PER_IDENTITY = 11
for i in tqdm(range(1, len(files), IMAGES_PER_IDENTITY), unit_divisor=True): # ignore the README.txt file at files[0]
# print(i)
probe, eval = create_probe_eval_set(files[i:i+IMAGES_PER_IDENTITY])
# store eval embs and labels
eval_set_t, eval_labels_t = generate_embs(eval)
eval_set.extend(eval_set_t)
eval_labels.extend(eval_labels_t)
# store probe embs and labels
probe_set_t, probe_labels_t = generate_embs(probe)
probe_set.extend(probe_set_t)
probe_labels.extend(probe_labels_t)
最后,在这里我调用函数,一切都应该工作:
evaluation_embs, evaluation_labels = filter_empty_embs(eval_set, eval_labels)
probe_embs, probe_labels = filter_empty_embs(probe_set, probe_labels)
然而,我在filter_empty_embs
函数
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
~AppDataLocalTemp/ipykernel_488/1310330242.py in <module>
----> 1 evaluation_embs, evaluation_labels = filter_empty_embs(eval_set, eval_labels)
2 probe_embs, probe_labels = filter_empty_embs(probe_set, probe_labels)
~AppDataLocalTemp/ipykernel_488/117740786.py in filter_empty_embs(img_set, img_labels)
10 # filtering eval set and labels based on good idx
11 clean_labels = np.array(img_labels)[good_idx]
---> 12 clean_set = np.array(img_set, dtype=object)[good_idx]
13
14 # generating embs for good idx
ValueError: invalid __array_struct__
显然,问题是在我正在使用的img_set
变量。这是object
类型的列表,将包含图像,但我不知道究竟是什么问题,以及如何解决它。
Numpy版本:1.21.2,由于其他礼仪,我不能回到它。
提前感谢!!
你的问题是在嵌入由insightface返回的列表中包含了很多对Numpy无效的东西。
只获取嵌入,你必须使用:
emb_res = app.get(rgb_arr)
res = emb_res[0].embedding
你根本不需要过滤函数。只需将generate_embs函数替换为以下函数:
def generate_embs(img_fpaths: List[str]):
embs_set = list()
embs_label = list()
for img_fpath in img_fpaths:
print('tratamento: ',img_fpath)
# read grayscale img
img = Image.open(os.path.join(YALE_DIR, img_fpath))
img_arr = np.asarray(img)
# convert grayscale to rgb
im = Image.fromarray((img_arr * 255).astype(np.uint8))
rgb_arr = np.asarray(im.convert('RGB'))
# generate Insightface embedding
emb_res = app.get(rgb_arr)
try:
res = emb_res[0].embedding
# append emb to the eval set
embs_set.append(res)
# append label to eval_label set
embs_label.append(img_fpath.split("_")[0])
except:
print('no embedding found for this image')
return embs_set, embs_label
然后替换这两行:
evaluation_embs, evaluation_labels = filter_empty_embs(eval_set, eval_labels)
probe_embs, probe_labels = filter_empty_embs(probe_set, probe_labels)
evaluation_embs, evaluation_labels = eval_set, eval_labels
probe_embs, probe_labels = probe_set, probe_labels
使用try
,您可以直接检查嵌入是否已创建,而无需在创建集合后进行过滤
那么它应该可以在numpy 1.20.0下工作