You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:45:02