使用InsightFace做人脸识别调用np.array报invalid __array_struct__错误如何解决
问题成因
该报错是Numpy 1.21+版本的兼容问题:InsightFace返回的人脸检测结果是C扩展实现的自定义对象,未实现Numpy要求的数组协议接口__array_struct__。当你尝试将包含这类对象的列表转换为dtype=object的Numpy数组时,Numpy会尝试解析对象的数组结构,解析失败就抛出该错误。
你的原有逻辑中完全不需要将img_set转换为Numpy数组,你已经拿到了有效样本的索引列表good_idx,直接通过列表推导过滤原始的img_set即可,绕开转换报错的问题。
修复方案
修改filter_empty_embs函数,删除将img_set转换为Numpy数组的逻辑,修改后的代码如下:
from typing import List import numpy as np def filter_empty_embs(img_set: List, img_labels: List[str]): # 过滤InsightFace无法生成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: # 标签过滤可保留原numpy数组逻辑 clean_labels = np.array(img_labels)[good_idx] # 直接通过索引过滤原始列表,无需转numpy数组,彻底避开兼容问题 clean_set = [img_set[i] for i in good_idx] # 提取有效样本的embedding clean_embs = [e[0].embedding for e in clean_set] return clean_embs, clean_labels
可选优化
如果你不需要clean_labels为Numpy数组格式,也可以统一用列表推导过滤,整个函数完全不涉及自定义对象转Numpy数组的操作,兼容性更强:
clean_labels = [img_labels[i] for i in good_idx]
内容的提问来源于stack exchange,提问作者Mohammed Abed
相关产品推荐
相关产品推荐

