使用face_recognition库单人脸比对出现AxisError的解决求助
人脸比对报错:AxisError 问题解决
问题描述
执行matches = face_recognition.compare_faces(pessoas[c], original_face_encodings[b])进行单张人脸比对时触发AxisError,但直接传入整个pessoas数组进行批量比对时能正常运行。
报错信息
Traceback (most recent call last): File "face.py", line 43, in <module> matches = face_recognition.compare_faces(pessoas[c], original_face_encodings[b]) File "C:\face-recognition\course\face_recognition\api.py", line 226, in compare_faces return list(face_distance(known_face_encodings, face_encoding_to_check) <= tolerance) File "C:\face-recognition\course\face_recognition\api.py", line 75, in face_distance return np.linalg.norm(face_encodings - face_to_compare, axis=1) File "C:\Users\user\Anaconda3\lib\site-packages\numpy\linalg\linalg.py", line 2481, in norm return sqrt(add.reduce(s, axis=axis, keepdims=keepdims)) numpy.AxisError: axis 1 is out of bounds for array of dimension 1
相关代码
a = 110 pessoas = [] photos = [] b = 0 c = 0 r = 0 for i in range(100,a): test_image = cv2.imread('test1/' + str(i) + '.jpeg') all_face_locations = face_recognition.face_locations(test_image, model='CNN') original_face_encodings = face_recognition.face_encodings(test_image, all_face_locations) print(i) for b in range(len(all_face_locations)): if not pessoas: for r in range(len(all_face_locations)): pessoas.insert(r, original_face_encodings[r]) else: for c in range(len(pessoas)): matches = face_recognition.compare_faces(pessoas[c], original_face_encodings[b]) if(matches): photos.insert(i, i) else: pessoas.insert(i, original_face_encodings[b]) print(pessoas) print(photos)
解决方法
face_recognition.compare_faces的第一个参数known_face_encodings要求传入人脸编码的列表/数组,而不是单个人脸编码。你传入的pessoas[c]是单个维度为1的人脸编码数组,导致内部计算时axis=1超出维度范围。
修改方法很简单,把单个编码包装成列表传入:
matches = face_recognition.compare_faces([pessoas[c]], original_face_encodings[b])
另外注意代码里的其他潜在问题:
pessoas.insert(i, original_face_encodings[b])这里的i是100-109的循环变量,当pessoas长度小于i时,会在列表末尾插入(Python列表insert索引超出长度时自动追加),但逻辑上可能应该用pessoas.append(original_face_encodings[b])更合理。photos.insert(i, i)同样存在索引问题,建议改用photos.append(i)。
内容的提问来源于stack exchange,提问作者Pedro Gonçalves
相关产品推荐
相关产品推荐

