face_recognition库读取CSV中人脸编码时触发_UFuncNoLoopError错误求助
face_recognition库读取CSV中人脸编码时触发_UFuncNoLoopError错误求助
看起来你遇到的问题核心是从CSV读取人脸编码时,把原本的数值数组当成字符串读进来了,导致numpy无法对字符串和float数组做减法运算,才抛出这个_UFuncNoLoopError错误。
错误原因分析
看报错信息里的dtype('<U2080'), dtype('float64'):
<U2080表示你的knownEncodedList里的元素是Unicode字符串类型- 而
encodeFaceF是face_recognition返回的float64数值数组
numpy的减法操作没法在这两种类型之间执行,所以触发了错误。
问题出在你读取CSV编码列的代码上:
encode = np.array(col[1])
CSV里存储的编码是字符串格式(比如类似"0.123,-0.456,..."),直接转成numpy数组只会得到一个单元素的字符串数组,不是我们需要的128维数值数组。
解决方案
需要分两步修正:正确写入编码到CSV + 正确从CSV读取编码
1. 先修正人脸编码的写入逻辑(步骤1的代码)
确保写入CSV时,把128维的人脸编码数组转成逗号分隔的字符串,而不是直接存数组的默认打印形式:
import csv import face_recognition as fr # 假设你已经有了名字列表names和对应的编码列表face_encodings with open('Facial Data.csv', 'w', newline='') as csv_file: writer = csv.writer(csv_file) writer.writerow(['Name', 'Encoding']) # 写入表头 for name, encoding in zip(names, face_encodings): # 将编码数组转成逗号分隔的字符串 encoding_str = ','.join(map(str, encoding)) writer.writerow([name, encoding_str])
2. 修正读取CSV的逻辑(步骤2的代码)
读取编码列时,把字符串按逗号分割,转成float列表后再转成numpy数组:
knownEncodedList = [] name_of_people = [] with open('Facial Data.csv') as data : data = csv.reader(data) next(data) # 跳过表头 for col in data : name_of_people.append(col[0]) # 解析编码字符串为float数组 enc_values = list(map(float, col[1].split(','))) encode = np.array(enc_values) knownEncodedList.append(encode)
更简洁的方式(用pandas)
如果你的环境安装了pandas,读取会更方便:
import pandas as pd import numpy as np df = pd.read_csv('Facial Data.csv') name_of_people = df['Name'].tolist() # 解析编码列 knownEncodedList = df['Encoding'].apply(lambda x: np.array(list(map(float, x.split(','))))).tolist()
验证修改效果
修改后,你可以打印type(knownEncodedList[0])和knownEncodedList[0].dtype,应该会得到<class 'numpy.ndarray'>和float64,和encodeFaceF的类型一致,此时再调用fr.compare_faces就不会报错了。
备注:内容来源于stack exchange,提问作者Zahin Fyz
相关产品推荐
相关产品推荐

