Numpy np.array() ValueError: invalid __array_struct__



我正在使用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下工作

相关内容

最新更新